メインコンテンツへスキップ
既にデプロイ済みのコントラクトに対して Contract オブジェクトを作成するのは容易です。
必須ではありませんが、コントラクトオブジェクト作成時にはコントラクトABIを文字列で指定することを強く推奨します。指定しない場合、ABIのエンコード・デコード機能を十分に活用できません。 この方法を選択した場合、関数呼び出しやクエリ時には関数名+パラメータ型(例:ERC20のtransferメソッドなら transfer(address,uint256))を完全な関数シグネチャとして指定する必要があり、クエリの返り値も常に文字列となります。

スマートコントラクト関数の呼び出し

スマートコントラクトを呼び出すには、CallFunction メソッドを使って CallContractFunction オブジェクトを作成します。これにより、クライアントと ContractCall オブジェクトを Create async Task に渡すことで、適切なgasPrice、gasLimit、nonce、dataを含む新しい EthTransaction を組み立てます。 スマートコントラクトを呼び出す例は以下の通りです。
注意:レシートを待たずに送信したい場合は、SendTransactionMethod を利用できます。 また、EthTransaction の作成だけを行い、後で送信したい場合は、CallFunction から直接 CallContractFunction オブジェクトを利用できます。
CallFunction メソッドは任意の数の引数を受け取れることに気づくでしょう。ABIや関数シグネチャで定義された順番通りに引数を渡してください。

データ型マッピングの理解

スマートコントラクトとやり取りする際、EVMのデータ型がSequenceEthereumライブラリ内でC#のデータ型にどのようにマッピングされているかを理解することが重要です。 例えば、ABIが整数を期待している箇所に文字列を渡した場合、その文字列が整数に変換可能であっても例外が発生します。

アドレス

C#では、string型を使うか、Addressのインスタンスを作成することができます。文字列の場合は、必ず0xで始まり、42文字の固定長である16進数文字列であることを確認してください。

整数型

int256uint8uint256などの整数型には、System.NumericsのBigInteger型を使用します。

バイト型

Solidityのバイト型データをC#で定義するには、byte16byte32などの型にはFixedByteを作成する方法があります。 コントラクトでbytes型が必要な場合は、任意の値を任意の長さのbyte[]に変換できます。 C#でデータが16進数文字列として表現されている場合は、HexStringToByteArray()関数を使って、その値を元のバイト配列に変換してください。 byte32[]のようなバイト配列は、C#では単純にFixedByte[]として作成します。

構造体

オンチェーン関数に構造体を渡す場合は、タプルを使用します。以下はSolidityの構造体の例と、それをSequenceのUnity SDKでどのように定義し、Contract.CallFunction関数の引数として渡すかの例です。 Solidity構造体
C#での対応例

その他の型

Solidityのstringboolなどの基本的なデータ型は、C#でも同じデータ型を使用できます。

返却型

スマートコントラクトからデータを読み取り、Contract.SendQuery<TType>() 関数を使用する場合、stringBigIntegerbool などの単純な戻り値型には TType をそのまま使うことができます。構造体のような複雑な戻り値型の場合は、object[] を使用し、値を手動で C# の構造体にパースしてください。

コントラクトのクエリ

スマートコントラクトからデータを読み取る場合は、SendQuery<T>メソッドを使ってコントラクトにクエリを送り、結果を型Tで受け取ります。 スマートコントラクトをクエリする例は以下の通りです。
また、クエリを作成して後で送信したい場合は、QueryContract<T>を使ってデリゲートを作成できます。

コントラクトのデプロイ

コントラクトをデプロイしたい場合は、ContractDeployerを利用できます。