solidity-21-call_contract

调用其他合约

练笔时刻,首先创建一个合约用于被其他合约调用

javascript 复制代码
// 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()是要调用的函数。

javascript 复制代码
// 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);
    }
}

可以通过这种方式去间接调用合约。

相关推荐
区块链蓝海11 小时前
Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代
web3·区块链
weixin_4423169813 小时前
北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性
区块链
科技快报1 天前
微算法科技(NASDAQ:MLGO)基于信任的集成共识和灰狼优化(GWO)算法,搭建高信任水平的区块链网络
科技·区块链
电报号dapp1192 天前
加密货币钱包开发指南:多链资产管理与非托管安全范式
安全·web3·去中心化·区块链·智能合约
这儿有一堆花2 天前
比特币:固若金汤的数字堡垒与它的四道防线
算法·区块链·哈希算法
穗余2 天前
NodeJS全栈WEB3面试题——P2智能合约与 Solidity
web3·区块链·智能合约
选择不变2 天前
更新版【飞云翻倍系统】新增支撑压力多线参考技术,操盘技术图文解说
区块链·通达信指标公式·炒股技巧·短线指标·炒股指标
落雪财神意2 天前
沪铜6月想法
区块链
菠萝012 天前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
caig0003 天前
稳定币的深度剖析与展望
人工智能·区块链