本頁面使用機器翻譯自英語,可能包含錯誤或不清楚的語言。如需最準確的信息,請參閱英文原文。由於更新頻繁,部分內容可能與英文原文有出入。請加入我們在 Crowdin 上的努力,幫助我們改進本頁面的翻譯。 (Crowdin translation page, Contributing guide)
如何將費用委託功能整合到錢包中
多虧了 Kaia 的 原生手續費委派 功能,使用者得以在去中心化應用程式(dApps)上享受免手續費的交易。 要啟用此功能,錢包 必須支援「手續費委派」類型的交易,並執行 發送者簽名。
本指南的適用對象
本指南適用於 錢包供應商。 您的錢包僅實作發送方功能:
- 使用使用者的金鑰簽署費用委派交易
- 將
senderTxHashRLP傳回 dApp
費用支付者的簽名與廣播操作,並非錢包的職責。 這些功能由 dApp 後端或託管服務(例如 Kaia 手續費委託服務)負責處理。
端到端流程(角色)
費用授權總是涉及相同的參與者。 下圖顯示了完整的路徑;後續章節將重複使用此路徑,並標示出正在討論的參與者。
UserApproves the tx
Step 1This guideWalletSender signs → returns senderTxHashRLP
Step 2dAppForwards RLP to fee payer
Step 3Fee payerSigns & broadcasts
KaiaExecutes the tx
| 步驟 | 誰 | 責任 |
|---|---|---|
| 1 | 錢包(您) | 簽署這筆費用委派交易,並回傳 senderTxHashRLP。 請勿進行廣播。 |
| 2 | dApp | 將 senderTxHashRLP 轉發給手續費支付方。 |
| 3 | 費用繳納人 | 再次簽署,並將已完整簽署的交易提交給 Kaia。 |
本頁詳細說明了 步驟 1。 步驟 2 至 3 的摘要收錄於文末,並附有完整指南的連結。
錢包必須實現的功能
這是流程中的 步驟 1 —— 這是您的錢包必須實作的唯一部分。
UserApproves the tx
Step 1This guideWalletSender signs → returns senderTxHashRLP
Step 2dAppForwards RLP to fee payer
Step 3Fee payerSigns & broadcasts
KaiaExecutes the tx
Highlighted: Wallet
為支援手續費委派功能,請在您的錢包中實作以下內容:
- 將 Kaia SDK(例如
@kaiachain/ethers-ext)加入錢包的程式碼庫中。 - 當錢包收到一項手續費委派交易請求(通常透過
kaia_signTransaction傳遞)時,請使用 Kaia SDK 並以使用者的金鑰對其進行簽署。 - 將
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)。 以下標示的是手續費支付者——這並非錢包代碼。
UserApproves the tx
Step 1This guideWalletSender signs → returns senderTxHashRLP
Step 2dAppForwards RLP to fee payer
Step 3Fee payerSigns & broadcasts
KaiaExecutes the tx
Highlighted: Fee payer
// Fee payer / backend only — not wallet codeconst sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP);console.log("sentTx", sentTx);const rc = await sentTx.wait();console.log("receipt", rc);
若要了解手續費支付方如何接收 senderTxHashRLP 並提交交易(這是一個簡單的客戶端/伺服器示範——並非錢包整合),請參閱 手續費委託範例。 關於受託費用支付方,請參閱 整合 Kaia 費用委託服務。
下一步
| 目標 | 指南 |
|---|---|
| 了解手續費委派交易類型 | 費用授權、部分費用授權 |
| 觀看客戶端/伺服器端費用支付者的示範(非錢包程式碼) | 建置費授權範例 |