go - Hyperledger Fabric V1.0 中日期范围的复合键形成

标签 go blockchain hyperledger hyperledger-fabric

引用this问题,我也有疑问。
假设我的复合键由字段 Owner_id~dateOfcreation 组成 我的 key 是这样的:

  • Owner1~11-05-2017
  • Owner1~12-05-2017
  • Owner1~13-05-2017
  • ...
  • ...
  • Owner1~30-05-2017

我是否可以获取日期范围的状态,例如 Owner1~12-05-2017 到 Owner~27-05-2017 ?

在我的理解中,stub.GetStateByRange(startKey,endKey) 将返回按词法顺序排列的键,因此它不会返回预期的范围。 如果我错了,请纠正我。

我尝试重新排列按键,例如:

  • Owner1~2017_05_11
  • Owner1~2017_05_12
  • Owner1~2017_05_13
  • ...
  • ...
  • Owner1~2017_05_30

在这种情况下,如果我使用
stub.GetStateByPartialCompositeKey('owner~year~month~day',[]string{"owner1","2017","05"}) 它将返回所有以这些范围。正确吗?

但在这里我也没有得到我在 date range 的准确输出。

任何人都可以建议我实现它的正确方法。我认为这是 Assets 共享背景下的常见业务场景,因此请提供帮助。

提前致谢:)

最佳答案

在重新阅读您的问题和评论后,我认为您有自己的解决方案。使用函数 GetStateByRange 怎么样?此函数不返回键,它返回一个带有值的迭代器。

正如您在上一条评论中所说,我想列出在一个日期范围内创建的所有 Assets ,我将如何从分类帐中查询它。所以,如果我是你,我会使用 GetStateByRange 函数,将日期范围传递给它。

在这里我给你粘贴了一个我使用过的函数的例子。

func get_all_components(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    var err error
    fmt.Println("starting get_all_components")

    // input sanitation
    err = sanitize_arguments_len(args, 1)
    if err != nil {
        return shim.Error(err.Error())
    }

    // ---- Get All Components ---- //
    resultsIterator, err := stub.GetStateByRange("c0", "c9999999999999999999")
    if err != nil {
        return shim.Error(err.Error())
    }
    defer resultsIterator.Close()

    // buffer is a JSON array containing QueryRecords
    var buffer bytes.Buffer
    buffer.WriteString("[")

    bArrayMemberAlreadyWritten := false
    for resultsIterator.HasNext() {
        //queryKeyAsStr, queryValAsBytes, err := resultsIterator.Next()
        queryResponse, err := resultsIterator.Next()
        if err != nil {
            return shim.Error(err.Error())
        }

        // Add a comma before array members, suppress it for the first array member
        if bArrayMemberAlreadyWritten == true {
            buffer.WriteString(",")
        }
        buffer.WriteString("{\"Key\":")
        buffer.WriteString("\"")
        buffer.WriteString(queryResponse.Key)
        buffer.WriteString("\"")

        buffer.WriteString(", \"Record\":")
        // Record is a JSON object, so we write as-is
        buffer.WriteString(string(queryResponse.Value))
        buffer.WriteString("}")
        bArrayMemberAlreadyWritten = true
    }
    buffer.WriteString("]")

    fmt.Printf("get_all_components:\n%s\n", buffer.String())

    return shim.Success(buffer.Bytes())
}

您应该在函数调用的参数中传递您的日期范围值。

关于go - Hyperledger Fabric V1.0 中日期范围的复合键形成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45798668/

相关文章:

sql - 在 Go 数据库/sql 包中查看带参数的查询

p2p - 如何检查用户是否投票但无法看到为谁投票?

node.js - node-gyp 在安装过程中失败 web3 scrypt@6.0.3 install : `node-gyp rebuild`

cryptography - 发送和传输仅适用于应付地址类型的对象,不适用于地址类型的对象。

hyperledger-fabric - 如何在单 channel Hyperledger Fabric 中的两个链码之间共享数据?

ubuntu - docker 的 Hyperledger 安装问题

go - 在 go 包中获取 make 文件变量?

当我执行这个 go 代码时,html 代码显示没有 css,但是当我直接在浏览器中打开它时,它显示 html 和 css 都很好

go - 无法在给定类型的类型定义上调用方法

hyperledger-fabric - 多个 Composer Rest 服务器用户使用相同的网卡