【发布时间】:2022-10-25 12:29:27
【问题描述】:
ethclient.Client.TransactionByHash 和 ethclient.Client.TransactionReceipt 返回 types.Transaction 和 types.Receipt,但是这两种类型都没有 From 方法。 golang如何获取From地址?我想通过事务哈希从地址中获取 etherscan 显示。
【问题讨论】:
标签: ethereum go-ethereum
ethclient.Client.TransactionByHash 和 ethclient.Client.TransactionReceipt 返回 types.Transaction 和 types.Receipt,但是这两种类型都没有 From 方法。 golang如何获取From地址?我想通过事务哈希从地址中获取 etherscan 显示。
【问题讨论】:
标签: ethereum go-ethereum
TL;博士
package example_test
import (
"context"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
)
func TestGetTransactionFrom(t *testing.T) {
var (
ctx = context.Background()
rpcURL = "https://rpc.ankr.com/eth"
// https://etherscan.io/tx/0x88f3b921f1565f7a9f0f36fed4f196d978069ccdbdcd7bdb73bf6dec98b77d38
transactionHash = common.HexToHash("0x88f3b921f1565f7a9f0f36fed4f196d978069ccdbdcd7bdb73bf6dec98b77d38")
)
ethereumClient, err := ethclient.Dial(rpcURL)
if err != nil {
t.Fatal(err)
}
receipt, err := ethereumClient.TransactionReceipt(ctx, transactionHash)
if err != nil {
t.Fatal(err)
}
// Get ChainID, or you can use `chainID, err := ethereumClient.ChainID(ctx)`
transaction, _, err := ethereumClient.TransactionByHash(ctx, transactionHash)
if err != nil {
t.Fatal(err)
}
// Get BaseFee of EIP1559, may be nil
block, err := ethereumClient.BlockByNumber(ctx, receipt.BlockNumber)
if err != nil {
t.Fatal(err)
}
// Supports EIP-2930 and EIP-2718 and EIP-1559 and EIP-155 and legacy transactions
message, err := transaction.AsMessage(types.LatestSignerForChainID(transaction.ChainId()), block.BaseFee())
if err != nil {
t.Fatal(err)
}
// Transaction from
t.Log(message.From()) // 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
}
事实上,以太坊的 RPC 响应值包含一个from 字段,但它是不可信的。 go-ethereum 更喜欢开发者从公钥自己并从地址通过这。
{
"jsonrpc": "2.0",
"id": 0,
"result": {
"blockHash": "0xc169915e1cda8216c88ecdd7e4b5538d50b9e9582d2d2326599ac2059f9e252e",
"blockNumber": "0xf12891",
"from": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
"gas": "0x18a90",
"gasPrice": "0x7f59f5f23",
"maxFeePerGas": "0x746a528800",
"maxPriorityFeePerGas": "0x77359400",
"hash": "0x88f3b921f1565f7a9f0f36fed4f196d978069ccdbdcd7bdb73bf6dec98b77d38",
"input": "0x6a761202000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000008e7a77ede43844a2e506556e689729a4c7cab85c00000000000000000000000000000000000000000000000000000da475135980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082498476e3ee00ced57d0675cb392b489f57a500357641ca4d1779c4861f05cc8f473a24256acabce7ba01d661d6d917129c288661733bbc1ec8fec4fe647702e11c000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x395",
"to": "0xa06c2b67e7435ce25a5969e49983ec3304d8e787",
"transactionIndex": "0x3d",
"value": "0x0",
"type": "0x2",
"accessList": [],
"chainId": "0x1",
"v": "0x0",
"r": "0x3c50726b2fa8af8fa84600adcad06a4439d016994fef3210a0023d1fe8e31523",
"s": "0x63bed90836ad3dc39d0707bf470569967a5b608158685e6cf4a570a4e8ddf5dc"
}
}
【讨论】: