建設費委託示例
目錄
- 1. 導言
- 2. 如何進行收費授權
- 2.1 發送方簽署交易
- 2.2 付款人簽署交易
- 3. 收費委託的簡單服務器和客戶端
- 3.1 環境設定
- 3.2 寄件者用戶端
- 3.2 繳費者服務器
- 4. 運行示例
- 4.1 運行
feepayer_server.js
- 4.2 運行
sender_client.js
- 4.3 檢查
feepayer_server.js
- 4.4 對 Kaiascan 的看法
- 4.1 運行
1. 導言
本教學引導您使用 Kaia SDK (ethers-ext) 建立一個簡單的伺服器-用戶端範例,以示範費用授權的價值轉移交易如何在 Kaia 上運作。 本教學與範例程式碼已在 Kairos 測試網路上進行測試。
2. 如何進行費用委託
讓我們簡要了解一下費用委託的運作方式。
2.1 發送方簽署交易
發送方 "在發送交易之前,應始終簽署交易。
要簽署交易,使用 signTransaction 用指定的私密金鑰簽署交易。
const senderAddress = "SENDER_ADDRESS";const senderPrivateKey = "SENDER_PRIVATE_KEY";const recieverAddr = "RECEIVER_ADDRESS";// Create a new transactionlet tx = { type:TxType.FeeDelegatedValueTransfer, to: recieverAddr, value: parseKaia("0.01"), from: senderAddress,}; // Sign the transactiontx = await senderWallet.populateTransaction(tx);console.log(tx);const senderTxHashRLP = await senderWallet.signTransaction(tx);console.log("senderTxHashRLP", senderTxHashRLP);
如果沒有錯誤,那麼 senderTxHashRLP
將會有一個已簽署的交易,這個交易是由 senderPrivateKey
簽署的。
現在,您需要傳送 senderTxHashRLP
給付費者。 有多種實現方法。 在本教程中,我們將為您提供一個簡單的伺服器-用戶端程式碼,以傳送「senderTxHashRLP」給付費者為例。
2.2 付款人簽署交易
當 fee payer
收到 senderTxHashRLP
時,fee payer
用他們的私人金鑰再次簽署 senderTxHashRLP
並將交易傳送給 Kaia。 下面的代碼片段說明瞭這一過程。
sendTransactionAsFeePayer 方法在傳送交易前,先用給定的付費者私密金鑰簽署交易。 在執行程式碼之前,請以實際值取代 "FEEPAYER_ADDRESS「 和 」PRIVATE_KEY"。
請注 意,當付費者代表寄件者向 Kaia 提交交易時,senderTxHashRLP
類型必須是FeeDelegatedValueTransfer
類型的交易。
const feePayerAddress = "FEEPAYER_ADDRESS";const feePayerPrivateKey = "FEEPAYER_PRIVATE_KEY"const sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP);console.log("sentTx", sentTx);const rc = await sentTx.wait();console.log("receipt", rc);
3. 簡單的服務器和用戶端費用授權
讓我們使用上述的費用委託代碼寫一個簡單的伺服器和用戶端。
3.1 環境設定
我們將使用 npm init -y
設定 Node.js 專案,並安裝 ethers-ext
mkdir feedelegation_servercd feedelegation_servernpm init -ynpm install - -save @kaiachain/ethers-ext@^1.2.0 ethers@6
@kaiachain/ethers-ext@^1.2.0 建議使用節點 22 或更新版本
3.2 寄件者用戶端
首先,我們要編寫一個sender_client.js
,如下所示。
在範例中,請以實際值取代"SENDER_ADDRESS"
、"SENDER_PRIVATEKEY「
和」RECEIVER_ADDRESS"
。
const { Socket } = require("net");const client = new Socket();const { Wallet, TxType, parseKaia } = require("@kaiachain/ethers-ext").v6;const ethers = require("ethers");const senderAddress = "SENDER_ADDRESS";const senderPrivateKey = "SENDER_PRIVATE_KEY";const recieverAddr = "RECEIVER_ADDRESS";const sendFeeDelegateTx = async () => { try { const provider = new ethers.JsonRpcProvider("https://public-en-kairos.node.kaia.io"); const senderWallet = new Wallet(senderPrivateKey, provider); // Create a new transaction let tx = { type:TxType.FeeDelegatedValueTransfer, to: recieverAddr, value: parseKaia("0.01"), from: senderAddress, }; // 簽署交易 tx = await senderWallet.populateTransaction(tx); console.log(tx); const senderTxHashRLP = await senderWallet.signTransaction(tx); console.log("senderTxHashRLP", senderTxHashRLP); if (!senderTxHashRLP) { throw new Error("Failed to generate raw transaction"); } // 將已簽署的原始交易傳送至付費者的伺服器 client.connect(1337, "127.0.0.1", () => { console.log("Connected to fee delegated service"); client.write(senderTxHashRLP); }); client.on("data", (data) => { console.log("Received data from server:", data.toString()); }); client.on("error", (error) => { console.error("Connection error:", error); s; }); client.on("close", () => { console.log("Connection closed"); }); } catch (error) { console.error("Transaction error:", error); client.end(); process.exit(1); } }; sendFeeDelegateTx();
上述程式碼使用 senderPrivateKey
簽署費用委託價值轉移交易,並將簽署的 senderTxHashRLP
傳送至費用支付者的伺服器,該伺服器在 127.0.0.1
上的 1337
連接埠上執行,也就是 localhost。
3.3 付費者伺服器
現在讓我們來寫付費者的伺服器,feepayer_server.js
,它會用feePayerPrivateKey
來簽署收到的senderTxHashRLP
,然後傳送到 Kairos testnet。
在下面的範例中,請以實際值取代"FEEPAYER_ADDRESS「
和」FEEPAYER_PRIVATEKEY"
。
const { createServer } = require("net");const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext").v6;const feePayerAddress = "FEEPAYER_ADDRESS";const feePayerPrivateKey = "FEEPAYER_PRIVATE_KEY";const provider = new JsonRpcProvider("https://public-en-kairos.node.kaia.io");const feePayerWallet = new Wallet(feePayerPrivateKey, provider);const feePayerSign = async (senderTxHashRLP, socket) => { try { // Send the transaction const sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP); console.log("sentTx", sentTx); const rc = await sentTx.wait(); console.log("receipt", rc); if (rc.transactionHash) { socket.write(`Tx hash: ${rc.transactionHash}\n`); socket.write(`Sender Tx hash: ${rc.senderTxHash || ""}\n`); } } catch (error) { console.error("Error in feePayerSign:", error); socket.write(`Error: ${error.message}\n`); }};const server = createServer(function (socket) { console.log("Client is connected ..."); socket.write("This is fee delegating service"); socket.write("Fee payer is " + feePayerAddress); socket.on("data", function (data) { console.log("Received data from client:", data.toString()); feePayerSign(data.toString(), socket); }); socket.on("error", (error) => { console.error("Socket error:", error); }); socket.on("end", () => { console.log("Client disconnected"); });});server.listen(1337, "127.0.0.1");console.log("Fee delegate service started ...");
服務器監聽端口為 1337
。