我们先写一个简单的合约TargetContract来调用。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract TargetContract{
uint256 private _x = 0;
event Log(uint value, uint gas);
function setX(uint256 x) external payable{
_x = x;
emit Log(msg.value, gasleft());
}
function getBalance() view public returns(uint) {
return address(this).balance;
}
function getX() external view returns(uint x){
x = _x;
}
}
这个合约包含一个状态变量_x,一个事件Log在收到ETH时触发,三个函数:
- setX(): external payable函数,可以设置_x的值,并向合约发送ETH。
- getBalance(): 返回合约ETH余额。
- getX(): 读取_x的值。
我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:ContractName(_Address),其中ContractName是合约名,_Address是合约地址。然后用合约的引用来调用它的函数:ContractName(_Address).f(),其中f()是要调用的函数。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract CallTargetContract {
// _target是TargetContract部署的合约地址
function setX(address _target, uint256 _x) external payable{
TargetContract(_target).setX{value: msg.value}(_x);
}
function getBalance(address _target) view public returns(uint) {
return TargetContract(_target).getBalance();
}
// _target的类型TargetContract底层也是address类型
function getX(TargetContract _target) external view returns(uint x){
x = _target.getX();
}
}