使用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
相关产品推荐
相关产品推荐

