Solidity入門|第22回:電話

私は最近、Solidityを再学習し、詳細を統合し、初心者が使用できる「Solidity Minimalist Primer」を書いています(プログラミングの人は別のチュートリアルを見つけることができます)、週に1〜3回更新しています。

すべてのコードとチュートリアルは、GitHubでオープンソースです github.com/AmazingAng/WTFSolidity。

第17回:ETHの送金では、コールを使ってETHを送金する方法をお話ししましたが、今回のレクチャーでは、それを使ってコントラクトを呼び出す方法を紹介します。

コール

call は、アドレス型の低レベルメンバー関数で、他のコントラクトとの対話に使用されます。 呼び出しの成功と目的関数の戻り値にそれぞれ対応する (bool, data) を返します。

callは、ソリッドによってフォールバックまたは受信機能をトリガーしてETHを送信する公式に推奨される方法です。 安全でないコントラクトの関数を呼び出すと、そのコントラクトに主導権を与えることになるため、呼び出しで別のコントラクトを呼び出すことはお勧めしません。 推奨される方法は、コントラクト変数を宣言した後に関数を呼び出すことです (「講義 19: 他のコントラクトの呼び出し」を参照)。 相手のコントラクトのソースコードやABIがわからない場合、コントラクト変数を生成することはできませんが、callを通じて相手のコントラクト関数を呼び出すことはできます。

call の使用に関する規則

call を使用するためのルールは次のとおりです。

バイナリ エンコードでは、構造化エンコード関数 abi.encodeWithSignature を使用して、次のものを取得します。

関数シグネチャは「関数名(カンマ区切りパラメータ型)」です。 たとえば、abi.encodeWithSignature(“f(uint256,address)”, _x, _addr) のようになります。

さらに、コントラクトを呼び出すときに、トランザクションによって送信されるETHとガスの量を指定できます。

少し複雑に思えるので、呼び出しアプリケーションの例を見てみましょう。

対象契約

まず、単純なターゲット コントラクトである OtherContract を記述してデプロイすると、フォールバック関数が追加されている以外は、基本的には講義 19 と同じコードです。

このコントラクトには、状態変数 x、ETH の受信時にトリガーされるイベント ログ、および 3 つの関数が含まれています。

getBalance(): コントラクトのETH残高を返します。 setX():xの値を設定し、ETHをコントラクトに送ることができる外部買掛金関数。 getX(): x の値を読み取ります。

呼び出しを使用してターゲット コントラクトを呼び出す

1. 応答イベント

ターゲットのコントラクト関数を呼び出すために、Callコントラクトを書いてみましょう。 まず、Responseイベントの定義を記述し、呼び出しによって返された成功とデータを出力して、戻り値を観察できるようにします。

2. setX 関数を呼び出す

callSetX関数を定義して、ターゲットコントラクトのsetX()を呼び出し、ETHの量をmsg.valueに転送し、Responseイベントを解放して成功とデータを出力します。

次に、callSetX を呼び出して状態変数 _x を 5 に変更し、目的関数 setX() が値を返さないため、パラメータは OtherContract アドレスと 5 であり、Response イベントのデータ出力は 0x (空) になります。

3. getX 関数を呼び出す

uint256型のターゲットコントラクト_xの値を返すgetX()関数を呼び出しましょう。 abi.decode を使用して、呼び出しの戻り値、データをデコードし、値を読み取ることができます。

Response イベントの出力から、データが0x0000000000000000000000000000000000000000000000000000000000000005であることがわかります。 abi.decode の後、最終的な戻り値は 5 です。

4. 存在しない関数を呼び出す

呼び出しに入力した関数がターゲットコントラクトに存在しない場合、ターゲットコントラクトのフォールバック関数がトリガーされます。

上記の例では、存在しない foo 関数を呼び出しました。 呼び出しは正常に実行され、成功を返すことができますが、実際には呼び出されたターゲット コントラクトのフォールバック関数です。

まとめ

この講演では、低レベルの関数呼び出しを使用して他のコントラクトを呼び出す方法を示しました。 call は安全ではないため、コントラクトを呼び出すための推奨されるメソッドではありません。 しかし、ソースコードとABIを知らなくてもターゲットコントラクトを呼び出せるようにすると便利です。

原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • コメント
  • リポスト
  • 共有
コメント
0/400
コメントなし
  • ピン