You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用web3.eth.getTransaction获取收款地址异常问题求助

为什么web3.eth.getTransaction返回的to字段是代币地址而非实际收款地址?

这完全是正常情况——你查询的是BEP20代币转账交易,不是原生BNB的直接转账:

  • 返回结果里的to字段0x55d398326f99059fF775485246999027B3197955是BEP20-USDT的合约地址。这类代币转账本质是调用代币合约的transfer方法,所以交易的直接接收方是合约地址,而非最终收款地址。
  • 你要找的目标收款地址0xdd7dac811ad166b30e97c37bc450d7851e5c6971,其实藏在交易的input字段中。

提取实际收款地址的方法

你可以手动解析input数据,或者用Web3.js直接解码:

方法1:手动解析

input字段开头的0xa9059cbb是transfer(address,uint256)方法的函数签名,后面紧跟的64位十六进制字符串里,前32位是补零前缀,剩下的就是收款地址:
000000000000000000000000dd7dac811ad166b30e97c37bc450d7851e5c6971
去掉前面的补零,就能得到你要的0xdd7dac811ad166b30e97c37bc450d7851e5c6971。

方法2:用Web3.js解码(更高效)

直接用合约ABI解码input数据,示例代码:

// 定义transfer方法的ABI片段
const transferAbi = [{
  "constant": false,
  "inputs": [
    {"name":"_to","type":"address"},
    {"name":"_value","type":"uint256"}
  ],
  "name":"transfer",
  "outputs":[{"name":"","type":"bool"}],
  "type":"function"
}];

// 创建代币合约实例
const tokenContract = new web3.eth.Contract(transferAbi, '0x55d398326f99059fF775485246999027B3197955');

// 解码交易的input数据
const decodedData = tokenContract.methods.transfer.decodeInput(testing.input);

console.log('实际收款地址:', decodedData._to); // 输出目标地址
console.log('转账金额:', web3.utils.fromWei(decodedData._value, 'ether')); // 转换为可读的USDT数量

补充说明

  • 只有原生币(BNB、ETH等)的转账交易,to字段才会直接显示最终收款地址——这类交易是直接向目标地址转币,不需要经过合约。
  • 所有遵循ERC20/BEP20标准的代币转账,交易的to都是代币合约地址,实际收款人和转账金额必须从input字段解析获取。

内容的提问来源于stack exchange,提问作者Steven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:05:25