目录
- 合约间转账
- 合约的继承
合约间转账
用到address类型的transfer方法
- 话不多说,先上代码
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.6.2 <0.9.0;contract InfoFeed { function info() public payable returns (uint256 ret) { return 42; } function getBalance() public view returns (uint) { return address(this).balance; }}contract Consumer { fallback() external payable {} receive() external payable {} InfoFeed feed; function setFeed(InfoFeed addr) public { feed = addr; } function callFeed() public { feed.info{value: 10, gas: 800}(); } function transferToContract() payable public { payable(address(this)).transfer(msg.value); } function getBalance() public view returns (uint) { return address(this).balance; }}
- 使用方法
1、先部署两个合约
2、先选择要给Consumer合约转多少钱,这里以100Gwei为例;然后执行transferToContract
方法:
这样,Cosumer合约就有了100 * 10^9 wei
的以太:
3、再执行setFeed
方法,参数传入InfoFeed的合约地址
;接着调用callFeed
函数,作用是从Consumer合约给InfoFeed合约转账10wei
,这时再获取Consumer合约的balance,就显示被扣除了10wei:
相应的,InfoFeed合约的balance已经多了10wei:
合约的继承
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;// pragma solidity ^0.5.17;contract A { uint public x; function setValue(uint _x) public { x = _x; }}contract B { uint public y; function setValue(uint _y) public { y = _y; }}contract C is A, B {}
在0.5版本之前,对于相同方法名和参数的方法默认是最远继承原则,即C合约的setValue方法继承自最远的B。
0.5版本后,上述代码编译会报错:Derived contract must override function "setValue". Two or more base classes define function with same name and parameter types.
意思是:父合约定义具有相同名称和参数类型的函数,派生合约必须重写(override)函数setValue。
重写必须在 override
修饰符中列出父合约。override(A, B)
中的顺序无关紧要,它不会改变super
的行为,继承关系由 contract C is A, B { ... }
声明的顺序决定。
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract A { uint public x; function setValue(uint _x) public virtual { x = _x; }}contract B { uint public y; function setValue(uint _y) public virtual { y = _y; }}contract C is A, B { function setValue(uint _z) public override(A, B) { A.setValue(_z); B.setValue(_z + 1); }}
Tips:有
override
及vritual
两个关键字标记符;
此时合约C有两个成员变量x
、y
和一个成员方法setValue
,执行setValue将会把_z
赋值给C.x
,把_z + 1
赋值给C.y
: