`go-ethereum` client.BlockByHash()给出错误“not found”

8dtrkrch  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(137)

我有以下代码用于订阅新出现的区块:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial("wss://mainnet.infura.io/ws/v3/APIKEY")
    if err != nil {
        log.Fatal(err)
    }

    headers := make(chan *types.Header)
    sub, err := client.SubscribeNewHead(context.Background(), headers)
    if err != nil {
        log.Fatal(err)
    }

    for {
        select {
        case err := <-sub.Err():
            log.Fatal(err)
        case header := <-headers:
            fmt.Println(header.Hash().Hex()) // 0xbc10defa8dda384c96a17640d84de5578804945d347072e091b4e5f390ddea7f

            block, err := client.BlockByHash(context.Background(), header.Hash())
            if err != nil {
                log.Fatal(err)
            }

            fmt.Println(block.Hash().Hex())        // 0xbc10defa8dda384c96a17640d84de5578804945d347072e091b4e5f390ddea7f
            fmt.Println(block.Number().Uint64())   // 3477413
            fmt.Println(block.Time())              // 1529525947
            fmt.Println(block.Nonce())             // 130524141876765836
            fmt.Println(len(block.Transactions())) // 7
        }
    }
}

但在排队的时候

block, err := client.BlockByHash(context.Background(), header.Hash())

我得到错误:

2023/04/19 17:31:14 not found
exit status 1

它仍然在fmt.Println(header.Hash().Hex())中打印一个散列,所以我知道infura连接正在工作。

wj8zmpe1

wj8zmpe11#

使用区块编号而不是哈希。

block, err := client.BlockByNumber(context.Background(), header.Number)

函数header.Hash()不返回区块哈希,而是返回头部的哈希。

gkn4icbw

gkn4icbw2#

这是否会无意中订阅未锁定的块呢?

相关问题