NodeJS下TRON交易签名后广播遇TAPOS_ERROR的解决求助
解决TRON交易广播的TAPOS_ERROR问题
你遇到的TAPOS_ERROR是因为TRON的交易必须绑定最新区块信息(区块号和区块哈希)——这是TRON的TAPOS机制要求,用来防止交易在分叉链上被重复打包。以下是具体实现步骤和修改后的代码:
核心修改点
- 从TRON节点获取最新区块的
blockNumber和blockHash - 按TRON规范处理后添加到交易的
raw_data字段:ref_block_num:取最新区块号的后16位(对65536取模)ref_block_hash:取最新区块哈希的前8字节(对应哈希字符串的前16个字符)
修改后的完整代码
const CryptoUtils = require("@tronscan/client/src/utils/crypto"); const TransactionUtils = require("@tronscan/client/src/utils/transactionBuilder"); const axios = require("axios"); // 先执行npm install axios安装依赖 async function transferContractTx() { const fromAddress = "FROM_ADDRESS"; const toAddress = "TO_ADDRESS"; const privateKey = "MY_PRIVATE_KEY"; const token = "TRX"; const amount = 1000000; // 1. 获取最新区块数据 const latestBlockRes = await axios.get("https://api.trongrid.io/wallet/getnowblock"); const blockNumber = latestBlockRes.data.block_header.raw_data.number; const blockHash = latestBlockRes.data.blockID; // 2. 处理TAPOS必填字段 const refBlockNum = blockNumber & 0xFFFF; const refBlockHash = blockHash.substring(0, 16); // 3. 构建交易并注入TAPOS信息 let transaction = TransactionUtils.buildTransferTransaction(token, fromAddress, toAddress, amount); transaction.raw_data.ref_block_num = refBlockNum; transaction.raw_data.ref_block_hash = refBlockHash; console.log(JSON.stringify(transaction)); let signedTransaction = CryptoUtils.signTransaction(privateKey, transaction); console.log(signedTransaction); } transferContractTx();
补充说明
- 若使用测试网,将API地址替换为
https://api.shasta.trongrid.io/wallet/getnowblock - 也可使用TRON官方SDK的内置方法获取区块数据,无需额外引入axios
ref_block_num和ref_block_hash的处理逻辑是TRON官方规定的固定格式,不可随意更改
内容的提问来源于stack exchange,提问作者SamXcodeX
相关产品推荐
相关产品推荐

