实现内容:从remix上的虚拟账户上转账给自己编写的智能合约账户

前提基础:对solidity有一些基础了解,对以太坊的账户机制有一定了解。


账户

在以太坊中账户的唯一标识是地址(address)。

在solidity中即地址类型。但是地址类型也分为两种:addressaddress payable 。地址类型最常用的成员变量有balance,即当前账户余额。具体成员变量可查看文档

address payableaddress 相同,不过还具有成员transfer()send()这样使得其可以接收向该账户的转账。

receive()函数

一个合约最多有一个 receive 函数, 声明函数为: receive() external payable { ... }

在对合约没有任何附加数据调用(通常是对合约转账)是会执行 receive 函数。例如:通过 .send() 或者 .transfer() 如果 receive 函数不存在,但是有payable的 fallback 回退函数,那么在进行纯以太转账时,fallback 函数会调用.

如果两个函数都没有,这个合约就没法通过常规的转账交易接收以太(会抛出异常)。

fallback()函数

在一个合约中最多有一个fallback()函数,函数声明为: fallback () external [payable]{...},这个函数不能有参数和返回值。(高级版本中可以,文档

作用:当调用一个合约中不存在的函数或者调用空方法时,亦或使用合约地址的内置函数transfoer()send() 的时,若没有receive()函数,则会执行目标合约的fallback()函数。


所以在我们对合约账户进行转账的例子中,必须包含fallback() 函数,否则运行时会报错失败。规范写的话则需要包含receive() 函数和 fallback()函数


代码:

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.7.0;

contract transferTest {

    // 向合约账户转账
function transderToContract() payable public {
payable(address(this)).transfer(msg.value);
} // 获取合约账户余额
function getBalanceOfContract() public view returns (uint256) {
return address(this).balance;
} fallback() external payable {} receive() external payable {} }
// 使用的编译器版本为:0.7.5

代码比较简单,但需要注意的几点:

  • 得到账户合约地址使用:address(this)
  • addressaddress payable 是显式转换:payable(address)
  • address payableaddress 是隐式转换。
  • msg.value 是调用者传入的

操作:

  1. 点击compile对合约代码进行编译

  2. 点击DEPLOY&RUN TRANSACTIONS,并点击Deploy进行部署

  3. 底下Deployed Contracts中会出现一个已经部署好的合约,我们可以通过点击transderToContract()进行调用函数。

    假设我们需要向合约地址转账10个以太币

    图中我们向合约用户转账10个以太币,右下方的控制台中可以查看到交易的hash码,也可以debug去查看运行细节。

  4. 点击getBalanceOfContract()进行查看当前合约用户中的余额。

    这里是以wei为单位,所以有一大串的0。


以上就是整个demo的全部内容,若有不当之处欢迎讨论。

使用remix实现给合约账户转账的更多相关文章

  1. 以太坊系列之十一: 零起步使用remix开发智能合约

    一步一步使用remix开发智能合约 最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要FQ才能访问(自行解决). 1.打开remix 注意地址如果是htt ...

  2. 详解支付体系颠覆者NGK公链:如何通过呼叫河马智能合约加速转账?

    纵观全球加密货币市场,至今为止,全球已经发行的加密货币以及数字代币的数量已经超过了7000种,且未来还将会有更多的加密货币或数字代币出现.在众多加密货币项目中,投资者很难在众多的项目里甄别项目的好坏以 ...

  3. 13.以太坊中web3访问合约账户出现问题——2019年09月29日

    title: 合约交互时发现访问不了地址的bug date: "2019-09-29 10:17:16" tags: Dapp开发 categories: 技术驿站 在编写合约交互 ...

  4. 使用remix的solidity在线编译环境部署一个faucet合约

    一.浏览器打开https://remix.ethereum.org 地址 点击"+"新建一个sol文件,命名为faucet.sol 然后在代码区输入solidity代码 选择相关插 ...

  5. Remix+Geth 实现智能合约部署和调用详解

    Remix编写智能合约 编写代码 在线调试 实现部署 调用接口 Geth实现私有链部署合约和调用接口 部署合约 调用合约 获得合约实例 通过实例调用合约接口 Remix编写智能合约 编写代码 Remi ...

  6. Solidity-让合约地址 接受ETH的转账充值的 三种方式

    以太坊智能合约开发:让合约接受转账 在以太坊智能合约开发中,通常会有向合约地址进行转账的需求,那么有几种向合约地址进行转账的方式呢? 有三种方式: 部署合约时转账 调用合约提供的方法 直接向合约地址进 ...

  7. 以太坊智能合约[ERC20]发币记录

    以太坊被称为区块链2.0,就是因为以太坊在应用层提供了虚拟机,使得开发者可以基于它自定义逻辑,通常被称为智能合约,合约中的公共接口可以作为区块链中的普通交易执行.本文就智能合约发代币流程作一完整介绍( ...

  8. Eth合约攻击续

    合同代表一个非常简单的游戏:谁给它发送了比当前奖金还大的数量的以太,就成为新的国王.在这样的事件中,被推翻的国王获得了新的奖金,但是如果你提交的话那么合约就会回退,让level重新成为国王,而我们的目 ...

  9. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

随机推荐

  1. SpringBoot执行原理

    目录 [Toc] 一.执行原理: 每个Spring Boot项目都有一个主程序启动类,在主程序启动类中有一个启动项目的main()方法, 在该方法中通过执行SpringApplication.run( ...

  2. SpringBoot从入门到精通教程(八)

    本主要介绍ElasticSearch 和 SpringBoot 的整合 ,对您有帮助的话,点个关注哦 ElastSearch 介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供 ...

  3. C# 数组 ArrayList List<T>区别

    System.Collenctions和System.Collenctions.Generic 中提供了很多列表.集合和数组.例如:List<T>集合,数组Int[],String[] . ...

  4. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  5. ESP8266系列图片外观 Wi-Fi模块一共有01~14十多款模块

  6. python图片的读取保存

    #coding:utf-8 from PIL import Image import matplotlib.pyplot as plt img=Image.open("F:\\Upan\\源 ...

  7. 修改/查看ssh端口

    修改ssh端口 vi /etc/ssh/sshd_config 将Port修改为需要的端口 Port 212 重启ssh服务 service sshd restart 查看ssh端口 netstat ...

  8. Vue知识点精简汇总

    一. 组件component 1. 什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码组件是自定义元素(对象) 2. 定义组件的 ...

  9. 在 Emit 代码中如何await一个异步方法

    0. 前言 首先立马解释一波为啥会有这样一篇伪标题的Demo随笔呢? 不是本人有知识误区,或者要误人子弟 因为大家都知道emit写出来的都是同步方法,不可能await,至少现在这么多年来没有提供对应的 ...

  10. 基于Python的邮件检测工具

    邮件快速检测工具 概要介绍 mmpi,是一款使用python实现的开源邮件快速检测工具库,基于community框架设计开发.mmpi支持对邮件头.邮件正文.邮件附件的解析检测,并输出json检测报告 ...