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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:25:56