合约间转账
用到address类型的transfer方法
pragma 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:
合约的继承
pragma solidity >=0.7.0 <0.9.0;
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 { ... } 声明的顺序决定。
pragma 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 :
|