solidity-21-call_contract
调用其他合约
练笔时刻,首先创建一个合约用于被其他合约调用
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;contract othercontract{// 定义一个只有自己能访问的参数uint256 private _x = 0;event log(uint amount,uint gas);function getbalance() public view returns (uint _balance){_balance = address(this).balance;}// 消息会携带value 所以需要标注为payablefunction setx(uint256 x) external payable {_x = x;if(msg.value > 0){emit log(msg.value, gasleft());} }// 返回这个_x,私有参数可以通过方法进行访问但不能直接访问function get_x() public view returns(uint x){x = _x;}
}
那么如何调用这个合约呢?
我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:_Name(_Address),其中_Name是合约名,应与合约代码(或接口)中标注的合约名保持一致,_Address是合约地址。然后用合约的引用来调用它的函数:_Name(_Address).f(),其中f()是要调用的函数。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;contract othercontract{// 定义一个只有自己能访问的参数uint256 private _x = 0;event log(uint amount,uint gas);function getbalance() public view returns (uint _balance){_balance = address(this).balance;}// 消息会携带value 所以需要标注为payablefunction setx(uint256 x) external payable {_x = x;if(msg.value > 0){emit log(msg.value, gasleft());} }// 返回这个_x,私有参数可以通过方法进行访问但不能直接访问function get_x() public view returns(uint x){x = _x;}
}contract Callcontract{function callsetx(address add,uint256 x) external {// 调用的这个合约的名称和地址都需要自己来找othercontract(add).setx(x);}function callgetx(address add) external view returns (uint256 x){othercontract c = othercontract(add);x = c.get_x();}function callgetx2(othercontract add) external view returns (uint256) {return add.get_x();}function setxtransfereth(address add,uint256 x) external payable{// 这种payable方法可以通过这种方式为消息携带币种// msg.value是调用方携带的币种数量othercontract(add).setx{value:msg.value}(x);}
}
可以通过这种方式去间接调用合约。