我如何通过blockNumber获得transactionHash?

如何通过blockNumber获取transactionHash?

我输入了 block.transactions.0.transactionHash 但没有捕捉到它(空字符串)。我怎样才能得到交易哈希?

http://img3.mukewang.com/63b3c5dd0001c4ed06280179.jpg

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)

}


幕布斯6054654
浏览 138回答 1
1回答

慕田峪9158850

您的方法有 3 个错误。首先,find()块集合返回完整文档,而不仅仅是块文档(即block字段)。因此,将结果解组为描述完整文档的类型值,例如:type Doc struct {    ID    primitive.ObjectID `bson:"_id"`    Block Block              `bson:"block"`}和解组代码:var doc Docif 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 []Docerr = 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().
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go