本文へスキップ
このページは英語からの機械翻訳を使用しており、誤りや不明瞭な表現が含まれている可能性があります。最も正確な情報については、オリジナルの英語版をご覧ください。頻繁な更新のため、一部のコンテンツはオリジナルの英語になっている可能性があります。Crowdinでの取り組みに参加して、このページの翻訳改善にご協力ください。 (Crowdin translation page, Contributing guide)

手数料委任機能をウォレットに統合する方法

Kaiaのネイティブ手数料委任機能のおかげで、ユーザーはdApp上でガス代のかからない取引を利用できます。 これを有効にするには、ウォレットが手数料委任型の取引タイプに対応しており、送信者による署名を実行できる必要があります。

このガイドの対象読者

このガイドは、ウォレットプロバイダーを対象としています。 このウォレットは送信側のみを実装しています:

  • ユーザーの鍵を使用して、手数料委任取引に署名する
  • senderTxHashRLP を dApp に返す

手数料支払者の署名およびブロードキャストは、ウォレットの責任範囲には含まれません。 これらは、dAppのバックエンド、あるいはKaia Fee Delegation Serviceなどのマネージドサービスによって処理されます。

エンドツーエンドのフロー(役割)

手数料の委任には、常に同じ関係者が関与します。 以下の図は完全な経路を示しています。後のセクションではこの図を再利用し、説明の対象となるアクターを強調表示します。

ステップ責任
1ウォレット(あなた)手数料委任取引に署名し、senderTxHashRLPを返します。 絶対にブロードキャストしないでください。
2dAppsenderTxHashRLP を手数料支払者に転送してください。
3費用負担者再度署名を行い、署名がすべて完了したトランザクションをKaiaに送信してください。

このページでは、ステップ1について詳しく説明しています。 手順2~3については、最後に要約を掲載し、詳細なガイドへのリンクを掲載しています。

ウォレットが実装しなければならないもの

これはフローのステップ1です。ウォレットが実装しなければならないのは、この部分だけです。

手数料の委任をサポートするには、ウォレット内で以下の実装を行ってください:

  1. Kaia SDK(例:@kaiachain/ethers-ext)をウォレットのコードベースに追加します。
  2. ウォレットが手数料委任取引のリクエスト(通常は kaia_signTransaction 経由)を受信したら、Kaia SDK を使用してユーザーの鍵で署名を行います。
  3. senderTxHashRLP を dApp に返します。 ウォレットからKaiaノードへトランザクションを送信しないでください
ウォレットプロバイダー向けチェックリスト
  • 手数料委任型の取引タイプ(価値移転、契約執行、その他必要に応じて)をサポートする
  • ウォレットで管理されている**送信者(ユーザー)**の鍵で署名する
  • senderTxHashRLP を dApp に返す
  • 送信者だけが署名したトランザクションを送信しないでください

例:手数料委任型価値移転の署名

このパターンをウォレットの署名パス(たとえば、kaia_signTransaction ハンドラー内など)で使用してください。 本番環境では、ハードコードされた秘密鍵ではなく、ウォレットによって管理されているユーザーの鍵を使用し、呼び出し元に senderTxHashRLP を返すようにしてください。


const ethers = require("ethers6");
const { Wallet, TxType, parseKaia } = require("@kaiachain/ethers-ext/v6");
const senderAddr = "0xa2a8854b1802d8cd5de631e690817c253d6a9153";
const senderPriv = "0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8";
const receiverAddr = "0xc40b6909eb7085590e1c26cb3becc25368e249e9";
const provider = new ethers.JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const senderWallet = new Wallet(senderPriv, provider);
async function main() {
const tx = {
type: TxType.FeeDelegatedValueTransfer,
from: senderAddr,
to: receiverAddr,
value: parseKaia("0.01"),
};
// Wallet: populate and sign as sender, then return RLP to the dApp
const populatedTx = await senderWallet.populateTransaction(tx);
const senderTxHashRLP = await senderWallet.signTransaction(populatedTx);
console.log("senderTxHashRLP", senderTxHashRLP);
// return senderTxHashRLP; // ← wallet returns this to the dApp (do not broadcast)
}

例:手数料委任契約のやり取りに署名する


const ethers = require("ethers6");
const { Wallet, TxType } = require("@kaiachain/ethers-ext/v6");
const senderAddr = "0xa2a8854b1802d8cd5de631e690817c253d6a9153";
const senderPriv = "0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8";
const provider = new ethers.JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const senderWallet = new Wallet(senderPriv, provider);
const contractAddr = "0x95Be48607498109030592C08aDC9577c7C2dD505";
const abi = ["function setNumber(uint256 newNumber)"];
async function main() {
const contract = new ethers.Contract(contractAddr, abi, provider);
const data = contract.interface.encodeFunctionData("setNumber", ["0x123"]);
const tx = {
type: TxType.FeeDelegatedSmartContractExecution,
from: senderAddr,
to: contractAddr,
value: 0,
data: data,
};
// Wallet: populate and sign as sender, then return RLP to the dApp
const populatedTx = await senderWallet.populateTransaction(tx);
const senderTxHashRLP = await senderWallet.signTransaction(populatedTx);
console.log("senderTxHashRLP", senderTxHashRLP);
// return senderTxHashRLP; // ← wallet returns this to the dApp (do not broadcast)
}

備考

具体的な配線方法は、お使いのウォレットのアーキテクチャによって異なります。 重要な契約事項は次のとおりです:送信者として手数料委任型を指定し、senderTxHashRLPを返し、ブロードキャストを行わないこと。

ウォレットの外:手数料支払者の署名

ウォレットが senderTxHashRLP を返すと、dApp はそれを転送し(ステップ 2)、その後、手数料支払者が署名して送信します(ステップ 3)。 以下に強調表示されているのが手数料支払者です。これはウォレットコードではありません


// Fee payer / backend only — not wallet code
const sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP);
console.log("sentTx", sentTx);
const rc = await sentTx.wait();
console.log("receipt", rc);

手数料支払者が senderTxHashRLP を受け取り、トランザクションを送信する仕組みについては(ウォレットとの統合ではなく、単純なクライアント/サーバーのデモです)、手数料委任の構築例をご覧ください。 管理対象の料金支払者については、Kaia 料金委任サービスの統合を参照してください。

今後の手順

目標ガイド
手数料委任型取引の種類について理解する手数料の委任部分的な手数料の委任
クライアント/サーバー型の料金支払者のデモをご覧ください(ウォレットのコードではありません)ビルド手数料の委任例
dAppでは、Kaiaのマネージド・フィー・ペイヤーをご利用くださいKaia Fee Delegation Service を統合する
手数料委任取引に関するSDKリファレンスethers-ext 手数料委任による価値移転
ページを改善してください。