为了账号安全,请及时绑定邮箱和手机立即绑定

我如何通过blockNumber获得transactionHash?

我如何通过blockNumber获得transactionHash?

Go
幕布斯6054654 2023-01-03 14:06:04
如何通过blockNumber获取transactionHash?我输入了 block.transactions.0.transactionHash 但没有捕捉到它(空字符串)。我怎样才能得到交易哈希?func GetBlockTransactions(number int) string {    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)    var hashHeaders []models.Block    defer cancel()    options := options.Find().SetProjection(bson.M{"block.transactions.0.transactionHash": 1})    options.SetLimit(1)    results, err := blocksCollections.Find(ctx, bson.M{"block.header.blockNumber": strconv.Itoa(number)}, options)    if err != nil {        fmt.Println(err)    }    //reading from the db in an optimal way    defer results.Close(ctx)    for results.Next(ctx) {        var singleHashHeader models.Block        if err = results.Decode(&singleHashHeader); err != nil {            fmt.Println(err)        }        hashHeaders = append(hashHeaders, singleHashHeader)    }    fmt.Println("%v", hashHeaders[0].Transactions.TransactionHash)    return string(hashHeaders[0].Transactions.TransactionHash)}
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您的方法有 3 个错误。


首先,find()块集合返回完整文档,而不仅仅是块文档(即block字段)。因此,将结果解组为描述完整文档的类型值,例如:


type Doc struct {

    ID    primitive.ObjectID `bson:"_id"`

    Block Block              `bson:"block"`

}

和解组代码:


var doc Doc

if err = results.Decode(&doc); err != nil {

    fmt.Println(err)

}

hashHeaders = append(hashHeaders, doc.Block)

其次,transactions是一个数组,所以在 Go 中你必须用一个切片来建模它:


type Block struct {

    Transactions []BlockTransaction

}

第三,投影和过滤器中对象数组字段的属性在没有索引的情况下被引用,所以使用投影:


options := options.Find().

    SetProjection(bson.M{"block.transactions.transactionHash": 1})

另请注意,您可以使用如下Cursor.All()方法简单地解码结果:


var docs []Doc

err = results.All(ctx, &docs)

if err != nil {

    fmt.Println(err)

}

工作完整代码:


func GetBlockTransactions(number int) string {

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    defer cancel()


    options := options.Find().

        SetProjection(bson.M{"block.transactions.transactionHash": 1}).

        SetLimit(1)


    results, err := blocksCollections.Find(ctx, bson.M{"block.header.blockNumber": strconv.Itoa(number)}, options)


    if err != nil {

        fmt.Println(err)

    }


    var docs []Doc

    err = results.All(ctx, &docs)

    if err != nil {

        fmt.Println(err)

    }


    fmt.Printf("hash: %v\n", docs[0].Block.Transactions[0].TransactionHash)

    return string(docs[0].Block.Transactions[0].TransactionHash)

}

还要注意,如果遇到错误,后续代码很可能会失败,所以你应该早点返回。您还应该返回带注释的错误。


像这样:


func GetBlockTransactions(number int) (string, error) {

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    defer cancel()


    options := options.Find().

        SetProjection(bson.M{"block.transactions.transactionHash": 1}).

        SetLimit(1)


    results, err := blocksCollections.Find(ctx, bson.M{"block.header.blockNumber": strconv.Itoa(number)}, options)

    if err != nil {

        return "", fmt.Errorf("Find() failed: %w", err)

    }


    var docs []Doc

    err = results.All(ctx, &docs)

    if err != nil {

        return "", fmt.Errorf("Cursor.All() failed: %w", err)

    }


    fmt.Printf("hash: %v\n", docs[0].Block.Transactions[0].TransactionHash)

    return string(docs[0].Block.Transactions[0].TransactionHash), nil

}

另请注意,如果您只期望一个结果,则更简单的解决方案是使用Collection.FindOne().


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信