调用其他合约
在Solidity中,一个合约可以调用另一个合约的函数,这在构建复杂的DApps时非常有用。
在已知合约代码(或接口)和地址的情况,调用已部署的合约。
编写一个简单的恶合约OtherContract,用于被其他合约调用:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract OtherContract {
//状态变量
uint256 private _x = 0;
//收到ETH事件记录amount和gas
event Log(uint256 amount, uint gas);
function getBalance() view public returns(uint) {
return address(this).balance;
}
function setX(uint256 x) external payable {
_x = x;
if(msg.value > 0) {
emit Log(msg.value, gasleft());
}
}
// 读取_x
function getX() external view returns(uint x) {
x = _x;
}
}
合约包含一个状态变量_x,一个在收到ETH时出发的事件Log,和三个函数
getBalance() :返回合约的ETH余额
setX():声明为external payable的类型的函数,可以设置_x 的值,并向合约发送ETH
getX(): 读取_x的值。
和Java类似。由于_x 用关键字private声明为私有变量。合约setX和getX让外界通过这对函数读写变量
调用目标合约
可以利用合约的地址和合约代码(或者接口)来创建合约的引用
_Name(_Address)
_Name合约名,应该和合约代码(接口)中标注的合约名保持一致;_Address合约地址。通过合约引用调用其他函数
_Name(_Address).f()
CallOtherContract 实现四种不同调用合约的用法:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import "./OtherContract.sol";
contract CallOtherContract {
//1. 传入合约地址
function callSetX(address _Address, uint256 x) external {
OtherContract(_Address).setX(x);
}
//2. 传入合约变量
function callGetX(OtherContract _Address) external view returns (uint x) {
x = _Address.getX();
}
//3. 创建合约变量
function callGetX2(address _Address) external view returns(uint x) {
OtherContract oc = OtherContract(_Address);
x = oc.getX();
}
// 4.调用合约并发送ETH
function setXTransferETH(address otherContract, uint256 x) external payable {
OtherContract(otherContract).setX{value: msg.value}(x);
}
}
- 传入合约地址 callSetX
copy 合约OtherContract的地址,赋值给_Address , 给x赋值123 进行测试 - 传入合约变量 callGetX
copy 合约OtherContract的地址,获取x值 :123 - 创建合约变量 callGetX2
copy 合约OtherContract的地址,获取x值 :123 - 调用合约并发送 setXTransferETH
现在 Account 设置 10 Ether,(不设置默认0也可以但是看不到变化)
copy 合约OtherContract的地址,给x赋值456 ,测试
在合约OtherContract的getX,getBalance查看,测试结果