私は最近、Solidityを再学習し、詳細を統合し、初心者が使用できる「Solidity Minimalist Primer」を書いています(プログラミングの人は別のチュートリアルを見つけることができます)、週に1〜3回更新しています。
すべてのコードとチュートリアルはgithub:github.com/AmazingAng/WTFSolidityでオープンソースです。
開発者はスマートコントラクトを作成して他のコントラクトを呼び出すことで、イーサリアムネットワーク上のプログラムを再利用し、繁栄するエコシステムを構築します。 多くのWeb3プロジェクトは、イールドファーミングなど、他のコントラクトの呼び出しに依存しています。 この講演では、コントラクトコード(またはインターフェース)とアドレスがわかっている場合に、ターゲットコントラクトの関数を呼び出す方法を紹介します。
まず、OtherContract という単純なコントラクトを記述して、このコントラクトを呼び出すことから始めましょう。
このコントラクトには、状態変数 x、ETH の受信時にトリガーされるイベント ログ、および 3 つの関数が含まれています。
getBalance(): コントラクトのETH残高を返します。
setX():xの値を設定し、ETHをコントラクトに送ることができる外部買掛金関数。
getX(): x の値を読み取ります。
コントラクトのアドレスとコントラクトコード(またはインタフェース)を使用して、コントラクトへの参照を作成できます: _Name(_Address) ここで、_Name はコントラクト名、_Address はコントラクトアドレスです。 次に、コントラクトへの参照を使用してその関数を呼び出します: _Name(_Address).f() ここで、f() は呼び出される関数です。
コントラクトを呼び出す 4 つの例を次に示します。
ターゲットコントラクトアドレスを関数に渡し、ターゲットコントラクトへの参照を生成してから、ターゲット関数を呼び出すことができます。 たとえば、新しいコントラクトに callSetX 関数を記述し、デプロイされた OtherContract コントラクト アドレス _Address と setX のパラメータ x を渡します。
関数でコントラクト参照を直接渡すことができ、上記のパラメータのアドレスタイプを OtherContract よりも優れたターゲットコントラクト名に変更するだけで済みます。 次の例では、ターゲット コントラクトを呼び出す getX() 関数を実装します。
コントラクト変数を作成し、それを使用して目的関数を呼び出すことができます。 次の例では、変数 oc の OtherContract コントラクトへの参照を格納します。
ターゲットコントラクトの関数が支払い可能な場合、_Name(_Address).f{value: _Value}()を呼び出すことでコントラクトに送金できます(_Nameはコントラクト名、_Addressはコントラクトアドレス、fは目的関数の名前、_Valueは転送されるETHの量(wei)です)。
OtherContract コントラクトの setX 関数は pay であり、次の例では setX を呼び出すことで、ターゲットコントラクトとの間で送金を行います。
送金後、LogイベントとgetBalance()関数を通じて、ターゲットコントラクトのETH残高の変化を観察できます。
この講演では、ターゲットコントラクトの関数を呼び出すために、ターゲットコントラクトのコード(またはインターフェイス)とアドレスを介してコントラクトへの参照を作成する方法を紹介します。