prepareTx クレームは、特に支払いと資産移転のシナリオで、ユーザーにトランザクションの完了と署名を必要とするdAppsにとって強力なツールです。トランザクション全体が事前に定義されている標準的な signature クレームとは異なり、prepareTx は部分的に構築されたトランザクションをウォレットに送信します。ウォレットはその後、指定された requirement を満たすために必要な入力(トークンや資産など)を追加し、完了したトランザクションに署名し、dAppに返す責任を負います。
これは、dAppが何を支払う必要があるかは知っているが、ユーザーがどの特定の資産で支払うかを知らない場合に特に便利です。ユーザーは必要な入力をウォレットから直接選択でき、柔軟で安全なユーザーエクスペリエンスを提供します。
dAppによってトランザクションが完全に形成される、より単純な署名リクエストについては、署名クレームを参照してください。
仕組み
prepareTx クレームのワークフローでは、アプリケーションがトランザクションのコアロジックを定義し、資金調達の部分をユーザーのウォレットに任せます。

開始
ユーザーは、購入などのトランザクションを必要とするアクションをdAppで実行します。
クレーム生成
dAppは部分的なトランザクション(例:自身のアドレスへの転送)と、ユーザーが提供する必要があるものを詳述する
requirementオブジェクト(例:100ネイティブトークン)を構築します。ウォレットとの対話
ウォレットはクレームを受け取り、トランザクションの詳細をユーザーに提示し、
requirementを満たすために必要なトークンや資産を選択するためのインターフェースを提供します。完了と署名
ユーザーが承認して資産を選択すると、ウォレットは選択された入力でトランザクションを完了し、ユーザーの秘密鍵で署名します。
dAppへの返却
ウォレットは、完全に署名され、ブロードキャスト準備が整ったトランザクションをdAppに返します。
ブロードキャスト
dAppは署名されたトランザクションを受け取り、それを処理のためにブロックチェーンに送信できます。
パラメータ
prepareTx クレームオブジェクトは、次のプロパティで構成されます。
| Parameter | Type | Description |
|---|---|---|
description | string | トランザクションの目的を説明するユーザーフレンドリーなメッセージ。デフォルトは「続行するには、このトランザクションを準備して署名してください。」です。 |
partialTx | string or object | 必須。 部分的に構築されたトランザクション。これは、生のトランザクションオブジェクトまたは事前にエンコードされたBase58エンコード文字列です。 |
requirement | object | 必須。 ウォレットがトランザクションに追加する必要があるリソースを指定するオブジェクト。 |
display | string | オプション。ウォレットでよりリッチなUI表示を提供するための { type, content } を含むJSON文字列。 |
chainInfo | object | トランザクションが実行されるブロックチェーン情報。ここで提供することも、WalletAuthenticator 設定でグローバルに提供することもできます。 |
meta | any | オプション。クレームに関連付けたい追加のメタデータ。デフォルトは {} です。 |
mfa | boolean | オプション。true に設定すると、ウォレットは多要素認証を実行するように求められます。 |
nonce | string | オプション。プロトコルで必要な場合にトランザクションに含めるためのノンス。 |
Requirement オブジェクト
requirement オブジェクトは、ユーザーが提供する必要があるものを定義するために重要です。
| Field | Type | Description |
|---|---|---|
tokens | Array<object> | 必須。 トークン要件の配列。各オブジェクトには address (トークンのDID) と value (文字列またはBN.jsインスタンスとして必要な量) が含まれている必要があります。 |
assets | object | オプション。NFT要件を指定するオブジェクト。address、parent、issuer で資産をフィルタリングしたり、含める資産の amount を指定したりできます。 |
例
これは、prepareTx クレームを要求する方法の例です。dAppは特定のトークンの100ユニットを受け取りたいと考えています。部分的なトランザクションを作成し、ウォレットの要件を定義します。
DID Connect Handler
const claims = {
// SDKがエンコードする生のトランザクションオブジェクトを使用
prepareTx_raw: [
'prepareTx',
({ userDid, userPk }) => ({
type: 'TransferV2Tx', // SDKがエンコードするトランザクションタイプ
description: 'この支払いを完了してアイテムを購入してください。',
display: JSON.stringify({ type: 'text', content: 'アイテム #123 の購入確認' }),
partialTx: {
itx: {
to: 'z2qa5b3g7492c3697a4e69b9a6b986b59e4d5',
},
},
requirement: {
tokens: [
{
address: 'z35nB2SA6xxBuoaiuUXUw6Gah2SNU3UzqdgEt', // トークンアドレス
value: '100',
},
],
},
}),
],
// 事前にエンコードされた部分トランザクションを使用
prepareTx_encoded: async ({ userDid, userPk }) => {
// このエンコードステップは通常、バックエンドで行われます
const client = new Client('https://beta.abtnetwork.io/api');
const encoded = await client.encodeTransferV2Tx({
tx: {
itx: {
to: 'z2qa5b3g7492c3697a4e69b9a6b986b59e4d5',
},
},
wallet: fromRandom(), // エンコード用のプレースホルダーウォレット
});
return {
type: 'prepareTx',
description: 'この支払いを完了してアイテムを購入してください。',
partialTx: toBase58(encoded.buffer), // Base58文字列としての事前にエンコードされたバッファ
requirement: {
tokens: [
{
address: 'z35nB2SA6xxBuoaiuUXUw6Gah2SNU3UzqdgEt',
value: '100',
},
],
},
};
},
};どちらの場合も、ウォレットは部分的なトランザクションと要件を受け取ります。その後、ユーザーに保有資産からアドレス z35nB2SA6xxBuoaiuUXUw6Gah2SNU3UzqdgEt のトークンを100ユニット選択するように促し、それらをトランザクションの入力として追加し、署名して結果を返します。
次のステップ
prepareTx クレームをマスターした後、他の関連機能に興味があるかもしれません。