Solidity 学习 -练气期(十)

调用其他合约

在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);
    }
}

  1. 传入合约地址 callSetX
    copy 合约OtherContract的地址,赋值给_Address , 给x赋值123 进行测试
  2. 传入合约变量 callGetX
    copy 合约OtherContract的地址,获取x值 :123
  3. 创建合约变量 callGetX2
    copy 合约OtherContract的地址,获取x值 :123
  4. 调用合约并发送 setXTransferETH
    现在 Account 设置 10 Ether,(不设置默认0也可以但是看不到变化)
    copy 合约OtherContract的地址,给x赋值456 ,测试

在合约OtherContract的getX,getBalance查看,测试结果

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容