如何获取TRC20/ERC20生态下非单钱包绑定的USDT交易哈希与金额
如何获取ERC20/TRC20体系下全网络USDT交易的哈希与金额
ERC20(以太坊链)实现步骤
以太坊链上USDT的固定合约地址为 0xdAC17F958D2ee523a2206206994597C13D831ec7,所有USDT转账都会触发合约的Transfer事件,我们可以通过QuickNode的eth_getLogs接口过滤该事件,直接提取交易哈希和金额。
核心逻辑
- 用
Transfer事件签名过滤日志:签名为0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef(由Transfer(address indexed from, address indexed to, uint256 value)经Keccak256哈希取前4字节得到) - 指定合约地址和最新区块范围,调用API获取日志
- 解析日志中的
transactionHash(交易哈希)和data字段(金额数据,需转换为十进制并处理6位小数)
代码示例(JavaScript)
const fetch = require('node-fetch'); const QUICKNODE_ETH_URL = '你的QuickNode以太坊端点URL'; const USDT_ERC20_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; const TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'; async function getLatestERC20USDTTransactions() { const payload = { jsonrpc: '2.0', method: 'eth_getLogs', params: [ { fromBlock: 'latest', toBlock: 'latest', address: USDT_ERC20_ADDRESS, topics: [TRANSFER_EVENT_SIGNATURE] } ], id: 1 }; const response = await fetch(QUICKNODE_ETH_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const data = await response.json(); const transactions = data.result.map(log => { // 解析金额:去掉0x前缀后转十进制,再除以1e6(USDT为6位小数) const amountHex = log.data.slice(2); const amountDecimal = parseInt(amountHex, 16) / 1e6; return { txHash: log.transactionHash, amount: amountDecimal.toFixed(6) }; }); console.log('最新ERC20 USDT交易:', transactions); } getLatestERC20USDTTransactions();
TRC20(波场链)实现步骤
波场链上USDT的合约地址为 TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t,可通过QuickNode的TRX API获取区块内的Transfer事件,直接提取交易哈希和金额。
核心逻辑
- 获取最新区块号,调用
geteventbyblocknum接口过滤该区块内USDT合约的Transfer事件 - 解析事件中的
transaction_id(交易哈希)和value字段(金额数据,需除以1e6转换为实际USDT数量)
代码示例(JavaScript)
const fetch = require('node-fetch'); const QUICKNODE_TRX_URL = '你的QuickNode波场端点URL'; const USDT_TRC20_ADDRESS = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'; async function getLatestTRC20USDTTransactions() { // 获取最新区块号 const blockNumRes = await fetch(QUICKNODE_TRX_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'getnowblock', params: [], id: 1 }) }); const blockData = await blockNumRes.json(); const latestBlockNum = blockData.result.block_header.raw_data.number; // 提取该区块内的USDT Transfer事件 const eventPayload = { jsonrpc: '2.0', method: 'geteventbyblocknum', params: [latestBlockNum, latestBlockNum, USDT_TRC20_ADDRESS, 'Transfer'], id: 1 }; const eventRes = await fetch(QUICKNODE_TRX_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(eventPayload) }); const eventData = await eventRes.json(); const transactions = eventData.result.map(event => { const amountDecimal = parseInt(event.result.value) / 1e6; return { txHash: event.transaction_id, amount: amountDecimal.toFixed(6) }; }); console.log('最新TRC20 USDT交易:', transactions); } getLatestTRC20USDTTransactions();
注意事项
- 若要获取历史区块交易,修改
fromBlock(以太坊)或区块号范围(波场)参数即可 - USDT固定为6位小数,所有金额计算需除以
1e6 - 代码中的QuickNode端点需替换为你自己创建的对应链的节点URL
内容的提问来源于stack exchange,提问作者Poratui Maksym
相关产品推荐
相关产品推荐

