【Solidity】外部コントラクトを呼び出しするには?

Solidityで外部コントラクトを呼び出す方法について解説します。

構文

外部コントラクトを呼び出しですが、以下の3つの流れになります。

  1. 呼び出し元のコントラクトでインターフェースを定義
  2. そのインターフェースを外部コントラクトのアドレスで初期化
  3. そのインターフェース(外部コントラクト)からメソッドを呼び出し

それぞれ構文を以下に記します。(※実際のサンプルコードを見た方が理解しやすいと思いますので、以降の「サンプルコード」の章に記載したコードをご覧になりつつお読み下さい)

呼び出し元のコントラクトでインターフェースを定義

コントラクト(contract文)の外にインターフェースを定義します。

インターフェースの中身ですが、外部コントラクトにある呼び出したい関数について、中身以外の定義部分だけを記述します。

interface インターフェース名 {
    外部コントラクトにおける呼び出したい関数1(処理の記述は不要);
    外部コントラクトにおける呼び出したい関数2(処理の記述は不要);
    外部コントラクトにおける呼び出したい関数3(処理の記述は不要);
    外部コントラクトにおける呼び出したい関数n(処理の記述は不要);
}

そのインターフェースを外部コントラクトのアドレスで初期化

前章で定義したインターフェースを、呼び出したい外部コントラクトのアドレスで初期化します。

定義したインターフェース名 変数名 = 定義したインターフェース名(外部コントラクトのアドレス);

そのインターフェース(外部コントラクト)からメソッドを呼び出し

前章で定義した変数(インターフェースオブジェクト)でメソッドを呼び出します。

定義した変数(インターフェースオブジェクト).外部コントラクトの関数名(インターフェースで定義した関数)

サンプルコード

コントラクト(呼び出し元)| CallerContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// 外部コントラクトのインターフェースを定義
interface ExternalContractInterface {
    function setNumber(uint _number) external;
    function getNumber() external view returns (uint);
}

// 呼び出し元のコントラクト
contract CallerContract {
    // インターフェースを外部コントラクトのアドレスで初期化
    ExternalContractInterface externalContract = ExternalContractInterface(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2);

    function setExternalNumber(uint _number) public {
        // 外部コントラクトのsetNumber関数を呼び出し
        externalContract.setNumber(_number);
    }

    function getExternalNumber() public view returns (uint) {
        // 外部コントラクトのgetNumber関数を呼び出し
        return externalContract.getNumber();
    }
}
外部コントラクト(呼び出される側)| ExternalContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// 呼び出される側の外部コントラクト
contract ExternalContract {
    uint public number;

    function setNumber(uint _number) public {
        number = _number;
    }

    function getNumber() public view returns (uint) {
        return number;
    }
}

外部コントラクトを呼び出すには“インターフェース(interface)”を定義する必要があることを覚えておきましょう。また、インターフェースを初期化する際の外部コントラクトアドレスは、今回は解説のためハードコードしているものの、後で変更可能なよう、設定処理を関数にして外に出しておくのがベターです。(外部コントラクトのアドレスが変更された際に対応できるようにするため)

タイトルとURLをコピーしました