Cách tích hợp tính năng ủy quyền phí vào ví
Nhờ tính năng ủy quyền phí gốc của Kaia, người dùng có thể thực hiện các giao dịch miễn phí gas trên các ứng dụng phi tập trung (dApps). Để kích hoạt tính năng này, các ví phải hỗ trợ các loại giao dịch ủy quyền phí và thực hiện ký tên người gửi.
Hướng dẫn này dành cho các nhà cung cấp ví. Ví của bạn chỉ triển khai phần phía người gửi:
- Ký các giao dịch được ủy quyền bằng khóa của người dùng
- Trả về
senderTxHashRLPcho dApp
Việc ký tên và phát sóng của người thanh toán phí không thuộc trách nhiệm của ví. Các tác vụ này được xử lý bởi phần backend của ứng dụng phi tập trung (dApp) hoặc một dịch vụ được quản lý như Dịch vụ ủy quyền phí Kaia.
Quy trình từ đầu đến cuối (các vai trò)
Việc ủy quyền thu phí luôn liên quan đến cùng một nhóm các bên liên quan. Sơ đồ dưới đây thể hiện toàn bộ lộ trình; các phần sau sẽ sử dụng lại sơ đồ này và làm nổi bật đối tượng đang được đề cập.
| Bước | Ai | Trách nhiệm |
|---|---|---|
| 1 | Ví (của bạn) | Ký giao dịch được ủy quyền về phí và trả về senderTxHashRLP. Không được phát sóng. |
| 2 | dApp | Chuyển tiếp senderTxHashRLP cho người thanh toán phí. |
| 3 | Người nộp phí | Ký lại và gửi giao dịch đã được ký đầy đủ cho Kaia. |
Trang này trình bày chi tiết về bước 1. Các bước 2–3 được tóm tắt ở phần cuối kèm theo các liên kết đến hướng dẫn đầy đủ.
Những tính năng mà ví phải hỗ trợ
Đây là bước 1 trong quy trình — phần duy nhất mà ví của bạn phải triển khai.
Highlighted: Wallet
Để hỗ trợ tính năng ủy quyền thanh toán phí, hãy thực hiện các bước sau trong ví của bạn:
- Thêm Kaia SDK (ví dụ:
@kaiachain/ethers-ext) vào cơ sở mã của ví. - Khi ví nhận được yêu cầu giao dịch ủy quyền phí (thường thông qua hàm
kaia_signTransaction), hãy ký giao dịch đó bằng SDK Kaia bằng khóa của người dùng. - Trả về
senderTxHashRLPcho dApp. Không được gửi giao dịch từ ví đến một nút Kaia.
- Hỗ trợ các loại giao dịch được ủy quyền bằng phí (chuyển khoản, thực hiện hợp đồng và các loại khác nếu cần thiết)
- Ký bằng khóa người gửi (người dùng) do ví quản lý
- Trả về
senderTxHashRLPcho dApp - Không được phát sóng giao d ịch chỉ được ký bởi người gửi
Ví dụ: ký xác nhận giao dịch chuyển giá trị được ủy quyền thu phí
Hãy sử dụng mẫu này trong quy trình ký của ví của bạn (ví dụ: bên trong trình xử lý kaia_signTransaction). Trong môi trường sản xuất, hãy sử dụng khóa của người dùng do ví quản lý — chứ không phải khóa riêng được mã hóa cứng — và trả về senderTxHashRLP cho bên gọi.
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)}
Ví dụ: thực hiện giao dịch ký kết hợp đồng ủy quyền thu phí
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)}
Cách kết nối dây cụ thể phụ thuộc vào kiến trúc ví của bạn. Điều quan trọng là: khi ký các loại hợp đồng được ủy quyền, hãy chỉ định người gửi, trả về senderTxHashRLP và không phát sóng.
Ngoài ví: người thanh toán phí ký tên
Sau khi ví trả về senderTxHashRLP, ứng dụng phi tập trung (dApp) sẽ chuyển tiếp giá trị này (bước 2), sau đó người thanh toán phí sẽ ký và gửi (bước 3). Phần được đánh dấu bên dưới là người thanh toán phí — đây không phải là mã ví.
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);
Để tìm hiểu cách người trả phí nhận senderTxHashRLP và gửi giao dịch (một bản demo đơn giản về mô hình máy khách/máy chủ — không phải tích hợp ví), hãy xem Ví dụ về ủy quyền phí. Để biết thêm thông tin về người thanh toán phí được ủy quyền, vui lòng tham khảo Dịch vụ ủy quyền thanh toán phí Kaia.
Các bước tiếp theo
| Mục tiêu | Hướng dẫn |
|---|---|
| Hiểu về các loại giao dịch ủy quyền phí | Ủy quyền phí, Ủy quyền phí một phần |
| Xem bản demo về người thanh toán theo mô hình máy khách/máy chủ (không phải mã ví) | Ví dụ về ủy quyền phí xây dựng |
| Sử dụng dịch vụ quản lý người thanh toán phí của Kaia cho các ứng dụng phi tập trung (dApps) | Tích hợp Dịch vụ ủy quyền phí Kaia |
| Tài liệu tham khảo SDK cho các giao dịch ủy quyền phí | Chuyển giao giá trị được ủy quyền thông qua phí Ethers-Ext |