2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ちゃんと理解するSolidityのCallメソッドとインターフェイス(Solidity) #1

Posted at

はじめに

Ethereumのスマートコントラクト開発言語Solidityには、非常に強力で、使い方によってはリスキーな機能が含まれています。その一つがcallメソッドで、今回の記事ではこのメソッドの詳細と使用例について深掘りしていきます。

セクション1: callメソッドとは何か?

callメソッドは、Ethereum Virtual Machine(EVM)に直接指示を送る低レベルの関数呼び出し方法です。つまり、Solidityの抽象化を一部飛ばし、直接バイトコードレベルで関数を呼び出すということを可能にします。このcallメソッドにより、関数名や引数を動的に指定することが可能となり、特定の条件下では非常に強力なツールとなり得ます。

しかし、このような強力なツールには注意が必要です。callメソッドは、リエントラント攻撃というリスクを孕んでいます。これは、呼び出し元の関数が終了する前に、呼び出し先のコントラクトが再度呼び出し元の関数を呼び出し、意図しない状態の変更や資金の移動を引き起こす可能性がある攻撃手法です。

セクション2: コード例

次に、具体的なコード例を見ていきましょう。以下のコードは、あるスマートコントラクト(ContractA)が別のスマートコントラクト(ContractB)の関数を呼び出す例です。

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

contract ContractB {
    uint256 public number;

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

contract ContractA {
    ContractB public contractB;

    constructor(address _contractB) {
        contractB = ContractB(_contractB);
    }

    function callSetNumber(uint256 _number) public {
        (bool success, bytes memory data) = address(contractB).call(abi.encodeWithSignature("setNumber(uint256)", _number));
        require(success, "Failed to call setNumber");
    }
}

セクション3: callメソッドの使い方

ContractAのcallSetNumber関数では、ContractBのsetNumber関数をcallメソッドを使って呼び出しています。その際に、関数のシグネチャ("setNumber(uint256)")と引数(_number)をabi.encodeWithSignatureメソッドを使ってエンコードし、それをcallメソッドに渡しています。

Ethereumのアドレスについて理解することが、このcallメソッドを理解する上で重要です。Ethereumのアドレスは基本的に20バイトのデータで、特定のスマートコントラクトや外部所有アカウント(EOA)を指します。しかしこのアドレス自体は、指しているコントラクトがどのような関数を持っているのかなどの情報を含んでいません。したがって、そのアドレスが具体的にどのコントラクトを指しているのかをSolidityに教えるために、アドレスを特定のコントラクト型にキャストする必要があります。

セクション4: コードのデプロイ

最後に、このコードを実際に動かすための手順について説明します。RemixというオンラインのSolidity開発環境を開き、新しいファイルを作成して上記のコードを貼り付けます。その後、コンパイラとして適切なバージョン(この場合は0.8.x)を選択し、"Compile"ボタンをクリックします。そして"Deploy & Run Transactions"タブを開き、まずContractBをデプロイします。デプロイが成功すると、そのアドレスが表示されるので、そのアドレスをコピーしておきます。次にContractAをデプロイする際に、コンストラクタの引数としてこのアドレスを入力します。

以上がSolidityのcallメソッドについての基本的な説明とその使用例です。この機能を理解し適切に使用することで、スマートコントラクトの作成がより柔軟でパワフルになります。次回はこのcallメソッドと対比する形で、関数の通常の呼び出しについて詳しく見ていきましょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?