完成内容:从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对合约代码进行编译

    运用remix完成给合约账户转账

  2. 点击DEPLOY&RUN TRANSACTIONS,并点击Deploy进行安顿

    运用remix完成给合约账户转账

  3. 底下Deployed Contracts中会呈现一个现已安顿好的合约,我们能够通过点击transderToContract()进行调用函数。

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

    运用remix完成给合约账户转账

    图中我们向合约用户转账10个以太币,右下方的操控台中能够检查到生意的hash码,也能够debug去检查工作细节。

  4. 点击getBalanceOfContract()进行检查其时合约用户中的余额。

    运用remix完成给合约账户转账

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


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