如何通过goeth客户端的TransactionByHash获取交易发送方地址
如何通过TransactionByHash获取交易发送方地址
通过TransactionByHash获取的types.Transaction对象本身并不直接包含发送方(From)地址——这个地址是从交易的签名数据(v, r, s字段)结合链ID逆向恢复出来的,不属于交易原始数据的一部分。你可以通过以下步骤获取:
1. 获取交易对象
先通过TransactionByHash拿到目标交易实例:
import ( "context" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" ) // 初始化eth客户端 client, err := ethclient.Dial("https://your-rpc-endpoint-url") if err != nil { // 处理RPC连接错误 } // 替换为目标交易哈希 txHash := common.HexToHash("0xyour-target-transaction-hash") tx, _, err := client.TransactionByHash(context.Background(), txHash) if err != nil { // 处理交易查询错误 }
2. 获取当前链ID
签名恢复需要对应区块链的ChainID,直接从客户端获取即可:
chainID, err := client.ChainID(context.Background()) if err != nil { // 处理链ID获取错误 }
3. 恢复发送方地址
有两种常用的恢复方式:
方法一:使用types.Sender函数
fromAddr, err := types.Sender(types.LatestSignerForChainID(chainID), tx) if err != nil { // 处理签名恢复错误(如签名无效、链ID不匹配等) } // 输出格式化后的地址字符串 println("发送方地址:", fromAddr.Hex())
方法二:使用tx.AsMessage方法
msg, err := tx.AsMessage(types.LatestSignerForChainID(chainID), nil) if err != nil { // 处理错误 } fromAddr := msg.From() println("发送方地址:", fromAddr.Hex())
关键说明
- 交易的
From地址并非存储在区块链的交易数据中,而是通过ECDSA签名验证逆向推导得出,因此必须通过签名恢复步骤获取。 - 即使是未上链的pending交易,上述方法同样适用——因为签名数据已经包含在交易对象中,只需匹配正确的链ID即可完成恢复。
内容的提问来源于stack exchange,提问作者Vyas Reddy
相关产品推荐
相关产品推荐

