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 所以需要标注为payable
function 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 所以需要标注为payable
function 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);
}
}
可以通过这种方式去间接调用合约。