Solidity 學(xué)習(xí) -練氣期(十)

調(diào)用其他合約

在Solidity中,一個合約可以調(diào)用另一個合約的函數(shù),這在構(gòu)建復(fù)雜的DApps時非常有用。
在已知合約代碼(或接口)和地址的情況,調(diào)用已部署的合約。

編寫一個簡單的惡合約OtherContract,用于被其他合約調(diào)用:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

contract OtherContract {
    //狀態(tài)變量
    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;
    }
}

合約包含一個狀態(tài)變量_x,一個在收到ETH時出發(fā)的事件Log,和三個函數(shù)
getBalance() :返回合約的ETH余額
setX():聲明為external payable的類型的函數(shù),可以設(shè)置_x 的值,并向合約發(fā)送ETH
getX(): 讀取_x的值。
和Java類似。由于_x 用關(guān)鍵字private聲明為私有變量。合約setX和getX讓外界通過這對函數(shù)讀寫變量

調(diào)用目標(biāo)合約

可以利用合約的地址和合約代碼(或者接口)來創(chuàng)建合約的引用
_Name(_Address)
_Name合約名,應(yīng)該和合約代碼(接口)中標(biāo)注的合約名保持一致;_Address合約地址。通過合約引用調(diào)用其他函數(shù)
_Name(_Address).f()

CallOtherContract 實現(xiàn)四種不同調(diào)用合約的用法:

// 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. 創(chuàng)建合約變量
    function callGetX2(address _Address) external view returns(uint x) {
        OtherContract oc = OtherContract(_Address);
        x = oc.getX();
    }

    // 4.調(diào)用合約并發(fā)送ETH
    function setXTransferETH(address otherContract, uint256 x) external payable  {
        OtherContract(otherContract).setX{value: msg.value}(x);
    }
}

  1. 傳入合約地址 callSetX
    copy 合約OtherContract的地址,賦值給_Address , 給x賦值123 進(jìn)行測試
  2. 傳入合約變量 callGetX
    copy 合約OtherContract的地址,獲取x值 :123
  3. 創(chuàng)建合約變量 callGetX2
    copy 合約OtherContract的地址,獲取x值 :123
  4. 調(diào)用合約并發(fā)送 setXTransferETH
    現(xiàn)在 Account 設(shè)置 10 Ether,(不設(shè)置默認(rèn)0也可以但是看不到變化)
    copy 合約OtherContract的地址,給x賦值456 ,測試

在合約OtherContract的getX,getBalance查看,測試結(jié)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容