この内容では、Sequence SDKを使ってブロックチェーンに書き込む方法について詳しく説明しています。非同期でのトランザクション処理や、生のトランザクション、ERC20・ERC721・ERC1155トークンの送信、スマートコントラクトとのやり取りについて解説しています。
Transactions
を提供しています。
トランザクションの送信は非同期タスクです。SequenceWallet.SendTransaction
を呼び出す際にawait
を使えば、TransactionReturn
オブジェクトを直接取得できます。もしくは、推奨される方法として、SequenceWallet.OnSendTransactionComplete
やSequenceWallet.OnSendTransactionFailed
イベント用のハンドラ関数を設定し、どこからでも(awaitなしで)SequenceWallet.SendTransaction
メソッドを呼び出すことも可能です。例:
Transaction
の最も基本的な形であるRawTransactionは、ETHや利用中ネットワークのガス通貨をAddress
に送る際に非常に便利です。
例えば、1 MATICを0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f
に送る場合、以下のスニペットを利用できます。
1000000000000000000
(1 * 10^18)として表され、ETHやMATICなど多くのガス通貨は「decimals」値が18です。DecimalNormalizer.Normalize
(上記)は、input value * 10^decimals
を返す基本的なヘルパー関数で、オプションで「decimals」値を第2引数として指定できます(省略時は18)。
さらに、RawTransactionには16進数形式のデータを文字列として含めることも可能です。詳細は本ドキュメントの上級セクションをご覧ください。
DecimalNormalizer.Normalize
を使って金額を人間が読みやすい形式からEVM形式に変換することを推奨します。ERC20トークンの「decimals」値が18でない場合は、オプションの「decimals」intパラメータを必ず指定してください。ERC20の「decimals」値が分からない場合は、Builderの「Read Contract」内の「decimals」メソッドで簡単に確認できます。
SequenceEthereum
ライブラリをご利用ください。Embedded WalletsでRawTransactions
を作成・送信できるよう、ERC20スマートコントラクトのラッパー関数をご用意しています。
まず、コントラクトアドレスと、必要に応じてABI文字列(ERC20標準のカスタムバリエーションを使う場合のみ、推奨はしません)を指定してERC20
オブジェクトを作成します。
Mint
などCallContractFunction
を返すメソッドは、Embedded WalletsでRawTransactionを作成する際に利用できます。例:
SequenceEthereum
ライブラリをご利用ください。Embedded WalletsでRawTransactions
を作成・送信できるよう、ERC721スマートコントラクトのラッパー関数をご用意しています。
まず、コントラクトアドレスと、カスタムのERC721規格(推奨されません)を使う場合はオプションでABI文字列を指定して、ERC721
オブジェクトを作成します。
SafeMint
のようにCallContractFunction
を返すメソッドは、Embedded WalletsでRawTransactionを作成する際に利用できます。例:
SendERC1155Values
オブジェクトを含めてください。
SequenceEthereum
ライブラリをご利用ください。Embedded WalletsでRawTransactions
を作成・送信できるよう、ERC1155スマートコントラクトのラッパー関数をご用意しています。
まず、コントラクトアドレスと、カスタムのERC1155規格(推奨されません)を使う場合はオプションでABI文字列を指定して、ERC1155
オブジェクトを作成します。
Mint
のようにCallContractFunction
を返すメソッドは、Embedded WalletsでRawTransactionを作成する際に利用できます。例:
payable
キーワードが付いているもの)を呼び出す場合は異なります。payableメソッドを利用する場合は、DecimalNormalizer.Normalize
を使って、人間が読みやすい形式からEVM形式に金額を変換することを推奨します。なお、ユーザーは指定した金額を支払うための十分な資金をウォレットに用意しておく必要があります。このパラメータは省略可能で、省略時は “0” になります。
FunctionABIAsString:操作したい関数です。コントラクトのソースコード(Etherscanやご利用のネットワークのブロックエクスプローラー)から関数シグネチャ(パラメータ付き)をコピー&ペーストし、空白や変数名を削除して使うことをおすすめします。
ParametersAsObjectArray:呼び出したいメソッドに渡すパラメータです。パラメータ名は不要で、ABIに記載されている順番通りに値だけを指定してください。迷った場合は文字列形式で渡すと良いでしょう。
これらを組み合わせると、SequenceContractCall
を使ってERC20の “mint” 関数を呼び出す例は次のようになります:
SendTransaction
リクエスト時に、トランザクション配列に複数の種類のトランザクションを含めるだけです。
例えば、各タイプのトランザクションをバッチで送信する場合:
FeeOptionsResponse
には、各 FeeOptionReturn
の価格を一定時間ロックするFeeQuote(文字列)が含まれています。これは後ほどトランザクション送信時に必要となります。SDKは自動的にユーザーのウォレットを確認し、Indexer を使ってユーザーが利用可能なFeeOptionsを調べます。
ここから、ユーザーにどの方法で手数料を支払うか選択してもらうUIを表示できます。
ユーザーが支払い方法を選択したら、選択したFeeOptionとFeeQuote文字列を含めてトランザクションを送信します。
Package Manager > Samples
からインポートできる Demo Scene
では、FeeOptionsのシンプルな使用例を確認できます。ここではUIを用意せず、ユーザーのウォレットで利用可能な最初のFeeOptionを自動的に選択しています。実際のゲームでこの方法を使うことは推奨しませんが、ご自身の統合の参考例としてご活用ください。サンプルコードは以下をご覧ください:
TransactionQueuer
を用意しています。Unityでトランザクションが多いゲームを開発する際のポイントについては、こちらのガイドもご参照ください。
シーンに TransactionQueuer
のMonoBehaviourを追加すると、いくつかの設定変数を指定できます。
AutoSubmitTransactions
:デフォルトはfalseです。これを有効にすると、ThresholdTimeBetweenTransactionsAddedBeforeSubmittedInSeconds
で指定した秒数、新しいトランザクションがキューに追加されなかった場合、自動的にキュー内のトランザクションを送信します。ThresholdTimeBetweenTransactionsAddedBeforeSubmittedInSeconds
:AutoSubmitTransactions == true
の場合、指定した秒数の間に新しいトランザクションが追加されなければ、自動的にキュー内のトランザクションを送信します。MinimumTimeBetweenTransactionSubmissionsInSeconds
:キューに入れたトランザクションを送信する際の最小間隔を秒単位で指定します。これにより、コード内で TransactionQueuer.SubmitTransactions()
を何度呼び出しても、前回の送信から MinimumTimeBetweenTransactionSubmissionsInSeconds
秒が経過していなければトランザクションは送信されません。注意:オプションの overrideWait
ブールフラグを true にして TransactionQueuer.SubmitTransactions(overrideWait: true)
を呼び出した場合は、MinimumTimeBetweenTransactionSubmissionsInSeconds
の経過に関わらず、キュー内のトランザクションが送信されます。TransactionQueuer
では、いくつかのメソッドが利用できます:
TransactionQueuer
に対して Setup
を実行してください。これにより必要な依存関係が作成・キャッシュされます。TransactionQueuer
による前回のトランザクション送信から MinimumTimeBetweenTransactionSubmissionsInSeconds
が経過していれば、キュー内のトランザクションを送信します。overrideWait = true
の場合は、すぐにキュー内のトランザクションを送信します。waitForReceipt = false
の場合、WaaS API からレスポンスを受け取った時点で TransactionReturn
を返します(注:これはWaaS APIがトランザクションレシートの待機中にタイムアウトした場合のみ関係します。waitForReceipt = true
の場合は、レシートが返るまでノードに継続的に問い合わせます)。TransactionQueuer
には必ず Setup
を呼び出すのを忘れないでください!TransactionQueuer
クラスの2種類の継承クラスが提供されています。
SequenceWalletTransactionQueuer
を使うことで、ユーザーの Sequence Embedded Wallet 用のトランザクションをキューに追加できます。
SequenceWalletTransactionQueuer
では、IQueueableTransaction
をキューに追加することが求められます。このインターフェースは QueuedTokenTransaction
クラスで実装されています。必要に応じて、他のクラスで IQueueableTransaction
インターフェースを実装してご利用いただけます。
PermissionedMinterTransactionQueuer
は、プレイヤーのEmbedded Walletから署名済みメッセージを受け取った際に、バックエンドサーバーからトランザクションをキューに追加して送信する用途向けです。主に、ミント権限が必要なコントラクト(多くのトークンコントラクト)とやり取りする際に、プレイヤーのウォレットへトークンをミントするのに役立ちます。
PermissionedMinterTransactionQueuer
では、ミントする TokenId と Amount、必要に応じて IMinter を指定する PermissionedMintTransaction
(基本的なデータ転送オブジェクト)をキューに追加します。IMinter を指定しない場合は、デフォルトで PermissionedMinter
クラスが使用されます。PermissionedMinter
クラスは多くのケースで便利に使え、次の形式でペイロードを送信します: