本页面使用机器翻译自英语,可能包含错误或不清楚的语言。如需最准确的信息,请参阅英文原文。由于更新频繁,部分内容可能与英文原文有出入。请加入我们在 Crowdin 上的努力,帮助我们改进本页面的翻译。 (Crowdin translation page, Contributing guide)
Write (Fee Delegation)
当您要执行智能合约时,您可以向 feepayer 发送**"交易 ",其中包括支付请求**。
导入 ethers 和 @kaiachain/ethers-ext 模块,在 ethers.js 上添加 kaia 功能。
定义 发件人、缴费人地址和发件人私人密钥
使用指定的 kairos 测试网 URL 设置提供程序。 以太坊中的提供者是访问区块链数据的只读抽象。
此外,您还可以将提供商 URL 从 kairos 更改为 quicknode
使用发件人的私人密钥和提供商创建发件人钱包
使用发送者的私人密钥和提供者的私人密钥创建付费者钱包
设置由 solidity 代码生成的 Abi
定义与之交互的合约地址
使用 ethers.Contract创建合约实例,填写参数 contractAddr、abi、provider。 您可以通过该实例读写合约
使用counter.number()方法从合约中获取数字的值
创建事务数据以更新编号值
用上一步的数据创建一个事务对象
用发件人的钱包签署交易
使用付费者的钱包将交易发送到区块链上。 函数 "sendTransactionAsFeePayer "会在发送者的签名上添加一个带有 FeePayer 私钥的签名,并将其传输到区块链网络。
使用方法 counter.number() 获取更新值 number
writeWithFeeDelegation.js
const ethers = require("ethers");const { Wallet, TxType } = require("@kaiachain/ethers-ext");const senderAddr = "0x24e8efd18d65bcb6b3ba15a4698c0b0d69d13ff7";const senderPriv = "0x4a72b3d09c3d5e28e8652e0111f9c4ce252e8299aad95bb219a38eb0a3f4da49";const feePayerAddr = "0xcb0eb737dfda52756495a5e08a9b37aab3b271da";const feePayerPriv = "0x9435261ed483b6efa3886d6ad9f64c12078a0e28d8d80715c773e16fc000cff4";const provider = new ethers.providers.JsonRpcProvider("https://public-en-kairos.node.kaia.io");const senderWallet = new Wallet(senderPriv, provider);const feePayerWallet = new Wallet(feePayerPriv, provider);/* compiled in remix.ethereum.org (compiler: 0.8.18, optimizer: false)// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.13;contract Counter { uint256 public number; event SetNumber(uint256 number); constructor(uint256 initNumber) { number = initNumber; } function setNumber(uint256 newNumber) public { number = newNumber; emit SetNumber(number); } function increment() public { number++; emit SetNumber(number); }}*/const abi = '[{"inputs":[{"internalType":"uint256","name":"initNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"number","type":"uint256"}],"name":"SetNumber","type":"event"},{"inputs":[],"name":"increment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"number","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNumber","type":"uint256"}],"name":"setNumber","outputs":[],"stateMutability":"nonpayable","type":"function"}]';const contractAddr = "0x95Be48607498109030592C08aDC9577c7C2dD505";async function main() { const counter = new ethers.Contract(contractAddr, abi, senderWallet); console.log("number before", (await counter.number()).toString()); const data = (await counter.populateTransaction.increment()).data; const tx = { type: TxType.FeeDelegatedSmartContractExecution, from: senderAddr, to: contractAddr, value: 0, data: data, }; // Sign transaction by sender const populatedTx = await senderWallet.populateTransaction(tx); const senderTxHashRLP = await senderWallet.signTransaction(populatedTx); console.log("senderTxHashRLP", senderTxHashRLP); // Sign and send transaction by fee payer const sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP); const receipt = await sentTx.wait(); console.log("receipt", receipt); console.log("number after", (await counter.number()).toString());}main();
output
❯ node writeWithFeeDelegation.jsnumber before 293senderTxHashRLP 0x31f88447850ba43b7400830111939495be48607498109030592c08adc9577c7c2dd505809424e8efd18d65bcb6b3ba15a4698c0b0d69d13ff784d09de08af847f8458207f6a0d9d8ebf8d1c2665cf27903234536edc078bf2857a42941a140a8617b2ca1cb7aa05006695b49733abd7dbbb4e5192d81b1f1e84efb1cf919dee6f2d4687aa32fe2receipt { to: '0x95Be48607498109030592C08aDC9577c7C2dD505', from: '0x24e8eFD18D65bCb6b3Ba15a4698c0b0d69d13fF7', contractAddress: null, transactionIndex: 0, gasUsed: BigNumber { _hex: '0x947e', _isBigNumber: true }, logsBloom: '0x00000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000001200000002', blockHash: '0x9ab3f98ef92495c3a6c4b7f353ae60459d2d96cf8d3270c3285c398fd3ee912a', transactionHash: '0xa4ea502904b63b098e650d82c69999c1537ff2426b9f391f2f16b027f00656d4', logs: [ { transactionIndex: 0, blockNumber: 148740703, transactionHash: '0xa4ea502904b63b098e650d82c69999c1537ff2426b9f391f2f16b027f00656d4', address: '0x95Be48607498109030592C08aDC9577c7C2dD505', topics: [Array], data: '0x0000000000000000000000000000000000000000000000000000000000000126', logIndex: 0, blockHash: '0x9ab3f98ef92495c3a6c4b7f353ae60459d2d96cf8d3270c3285c398fd3ee912a' } ], blockNumber: 148740703, confirmations: 2, cumulativeGasUsed: BigNumber { _hex: '0x947e', _isBigNumber: true }, effectiveGasPrice: BigNumber { _hex: '0x05d21dba00', _isBigNumber: true }, status: 1, type: 0, byzantium: true}number after 294