主页 > 怎么退出imtoken钱包 > 以太坊交易哈希查询

以太坊交易哈希查询

怎么退出imtoken钱包 2023-03-28 05:12:32

以太坊交易哈希查询

1.查询以太坊交易

当在合约中调用上述事件时,我们通过它的交易哈希得到交易信息。 从以太坊获取交易消息有两种方式:

1.1 获取以太坊交易信息

GetTransactionByHash 获取交易信息

// 定义一个方法,接收参数为交易哈希,返回参数为接口类型
func (eth *Http) GetTransactionByHash(hash string) (interface{}, error) {
// 判断交易哈希长度是否为66位
    if len(hash) != 66 {
    // 如果交易哈希长度不是66位,则返回交易哈希散列长度错误
        return nil, errors.New("GetTransactionByHash hash length  wrong")
    }
    // 定义一个接口的变量,值为交易哈希
    args = []interface{}{hash}
    // 调用以太坊rpc,查询交易哈希
    params := NewHttpParams("eth_getTransactionByHash", args)
    resBody, err := eth.rpc.HttpRequest(params)
    if err != nil {
        return nil, err
    }
    // 返回一个解析后的交易信息结果
    return eth.ParseJsonRPCResponse(resBody)
}

func NewHttpParams(method string, args []interface{}) string {
    id := common.GetRandString(16)
    request := &Request{
        ID:      id,
        Mthd:    method,
        Args:    args,
        Version: "2.0",
    }

以太坊在中国交易合法吗_以太坊交易信息网站_新加坡以太坊交易网站

rb, _ := json.Marshal(request) return string(rb) }

// ParseJsonRPCResponse jsonrpc格式返回结果解析
func (eth *Http) ParseJsonRPCResponse(resBody []byte) (interface{}, error) {
    response := new(apicommon.Response)
    err := json.Unmarshal(resBody, &response)
    if err != nil {
        logger.Warn("resBody", resBody, string(resBody))
        return nil, errors.New("ParseJsonRPCResponse Unmarshal err")
    }
    if response.Error != nil { //  && response.Error.Code != 3
        return nil, errors.New(response.Error.Msg)
    }
    return response.Result, nil
}

1.2 获取以太坊交易回执信息

GetTransactionReceipt 获取交易收据

// 定义一个方法,接收参数为交易哈希,返回参数为接口类型
func (eth *Http) GetTransactionReceipt(hash string) (interface{}, error) {
    // 判断交易哈希长度是否为66位
    if len(hash) != 66 {
    // 如果交易哈希长度不是66位,则返回交易哈希散列长度错误
        return nil, errors.New("GetTransactionReceipt hash length  wrong")
    }
    // 定义一个接口的变量,值为交易哈希
    args = []interface{}{hash}
    // 调用以太坊rpc,查询交易哈希
    params := NewHttpParams("eth_getTransactionReceipt", args)

以太坊在中国交易合法吗_新加坡以太坊交易网站_以太坊交易信息网站

resBody, err := eth.rpc.HttpRequest(params) if err != nil { return nil, err } // 返回一个解析后的交易信息结果 return eth.ParseJsonRPCResponse(resBody) }

func NewHttpParams(method string, args []interface{}) string {
    id := common.GetRandString(16)
    request := &Request{
        ID:      id,
        Mthd:    method,
        Args:    args,
        Version: "2.0",
    }
    rb, _ := json.Marshal(request)
    return string(rb)
}

// ParseJsonRPCResponse jsonrpc格式返回结果解析
func (eth *Http) ParseJsonRPCResponse(resBody []byte) (interface{}, error) {
    response := new(apicommon.Response)
    err := json.Unmarshal(resBody, &response)
    if err != nil {
        logger.Warn("resBody", resBody, string(resBody))
        return nil, errors.New("ParseJsonRPCResponse Unmarshal err")
    }
    if response.Error != nil { //  && response.Error.Code != 3
        return nil, errors.New(response.Error.Msg)
    }

新加坡以太坊交易网站_以太坊交易信息网站_以太坊在中国交易合法吗

return response.Result, nil }

2. 以太坊交易确认数

和比特币一样,以太坊有最长链的概念,所以也有交易确认数的概念。 当以太坊交易所在一个区块中新加入区块链时,交易的确认数为1,此后每增加一个区块,交易的确认数增加1。 显然,以太坊交易的确认次数越多,交易在区块链中的埋藏就越深,被篡改的可能性就越小。 那么,如何获取以太坊交易的确认号呢?

2.1 使用rpc获取以太坊交易确认号

为了获得以太坊交易的确认数量以太坊交易信息网站,使用了两个 RPC 调用:

首先使用 eth_getTransactionReceipt 调用获取指定的交易收据。 例如,以下命令获取交易 0xbca39c1f778fcae9e86b513b6e18ed4b0a04b8e0ad5a0c1c1c81788ab1e94bbd 的收据:

curl -X POST --data '{
  "jsonrpc":"2.0",
  "method":"eth_getTransactionReceipt",
  "params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],
  "id":1}' http://localhost:8545

结果中可以得到交易所的区块号:

{
"id":1,
"jsonrpc":"2.0",
"result": {
     ...
     blockNumber: '0xd70aca', // 区块14093002
     ...
  }
}

然后可以随时调用eth_blockNumber获取当前最新的区块信息,例如:

curl -X POST --data '{
  "jsonrpc":"2.0",
  "method":"eth_blockNumber",
  "params":[],
  "id":83}' http://localhost:8545

在结果中,你可以得到当前最新的区块号:

新加坡以太坊交易网站_以太坊交易信息网站_以太坊在中国交易合法吗

{
  "id":83,
  "jsonrpc": "2.0",
  "result": "0xd70adc" // 区块14093020
}

使用区块链最后一个区块的编号,减去交易所所在区块的编号,再加1,得到以太坊交易的确认编号:

交易确认数 = 最新区块号 - 交易所在区块号 + 1 = 15 - 11 + 1 = 5

2.2 使用golang获取以太坊交易确认号

基于以上原理,我们可以很方便的编写golang代码获取以太坊交易确认数:

// 定义一个方法,接收参数为交易哈希,返回参数为接口类型
func (eth *Http) getTxConfirms(hash string) (interface{}, error) {
    //获取交易确认高度
    // 判断交易哈希长度是否为66位
    if len(hash) != 66 {
        // 如果交易哈希长度不是66位,则返回交易哈希散列长度错误
        return nil, errors.New("GetTransactionReceipt hash length  wrong")
    }
    // 定义一个接口的变量,值为交易哈希
    args = []interface{}{hash}
    // 调用以太坊rpc,查询交易哈希
    params := NewHttpParams("eth_getTransactionReceipt", args)
    resBody, err := eth.rpc.HttpRequest(params)
    if err != nil {
        return nil, err
    }
    // 解析交易信息结果
    res, err := eth.ParseJsonRPCResponse(resBody)
    if err != nil {
        logger.Error("GetMatchBuyTxHashInfo", "step", "GetTransactionReceipt", "hash", hash, "err", err.Error())

以太坊交易信息网站_以太坊在中国交易合法吗_新加坡以太坊交易网站

return nil, err } // 创建交易回执信息对象 txReceipt := new(taskcommon.TxReceipt) resB, err := json.Marshal(res) if err != nil { logger.Error("GetMatchBuyTxHashInfo", "step", "Marshal res", "err", err.Error()) return nil, err } if err := json.Unmarshal(resB, &txReceipt); err != nil { logger.Error("GetMatchBuyTxHashInfo", "step", "Unmarshal block", "err", err.Error()) return nil, err } args = []interface{}{} blockParams := NewHttpParams("eth_blockNumber", args) blockResBody, err := eth.rpc.HttpRequest(blockParams) if err != nil { return "0x0", err } blockRes, err := eth.ParseJsonRPCResponse(blockResBody) if err != nil { return "0x0", err } latestnumber, _ := blockRes.(int) affirmNumber, _ := strconv.Atoi(txReceipt.BlockNumber) return latestnumber - affirmNumber + 1, nil }

调用上面实现的getTxConfirms()方法获取指定交易的当前确认号:

txConfirms := getTxConfirms(0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238)

注意:上面两个接口:eth_getTransactionReceipt和eth_blockNumber写在同一个方法中。 代码不够简洁。 可以分别调用这两个方法,获取到值后再进行确认区块的操作

本系列文章:

本文参与登联社区写作激励计划,好文章好收益以太坊交易信息网站,欢迎正在阅读的你加入。