【问题标题】:Composite Key formation for a date range in Hyperledger Fabric V1.0Hyperledger Fabric V1.0 中日期范围的复合键形成
【发布时间】:2017-08-21 13:42:21
【问题描述】:

参考this的问题,我也有疑问。
假设我的复合键由Owner_id~dateOfcreation 字段组成 我的钥匙是这样的:

  • 所有者1~11-05-2017
  • 所有者1~12-05-2017
  • 所有者1~13-05-2017
  • ...
  • ...
  • 所有者1~30-05-2017

我是否可以获取 date range 的状态,例如 Owner1~12-05-2017 to Owner~27-05-2017

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

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

  • 所有者1~2017_05_11
  • 所有者1~2017_05_12
  • 所有者1~2017_05_13
  • ...
  • ...
  • 所有者1~2017_05_30

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

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

谁能建议我实现这一点的正确方法。我认为这是资产共享背景下的常见业务场景,所以请帮助。

提前致谢:)

【问题讨论】:

  • 我不知道它是如何工作的,但我在没有数字的情况下实现了它。另外,您能否尝试使用“Owner1”而不是“owner1”,即用大写字母 O
  • 抱歉,没听懂。没有数字你取得了什么成就?为什么要使用“O”大写?
  • 嗨! stub.GetStateByRange(startKey,endKey) 方法对我来说非常有用。对我来说,数字与字母组合的键,如 c999、o111。另一方面,我问你是否可以尝试用大写字母 O 传递所有者的值。在您给出的示例中,您传递的所有者是小写的。另外,您能否尝试一下它是否可以通过两个文字(例如:stub.GetStateByPartialCompositeKey('Owner1~2017_05_11', 'Owner1~2017_05_30'))?你得到什么样的回应?
  • 是的,那个小“o”是错字。现已更正。对于 API 文档中的 stub.GetStateByPartialCompositeKey ,提到第一个参数应该是 key_index 而不是值。所以我认为不能尝试这种方式。关于 stub.GetStateByRange,是的,如果它是按词汇顺序的,那是可能的。但是我的数据获取是基于时间戳的,所以我不能给出一个完美的开始和结束键。我得到的唯一数字是时间戳,如果我将它用作 Owner_longTimestamp 之类的键,那么 stub.GetStateByRange 将对性能造成巨大影响,对吧?
  • 我认为key_index和a值是一样的。你必须定义两个不同的key_index,它会得到其中有的结果。如果我不理解你,我很抱歉。你能再解释一下你的问题吗?

标签: go blockchain hyperledger hyperledger-fabric


【解决方案1】:

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

正如您在上一条评论中所说,我想列出在某个日期范围内创建的所有资产,我将如何从分类帐中查询它。所以,如果我是你,我会使用 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())
}

您应该在函数调用的 args 中传递您的 date range 值。

【讨论】:

  • 是的。这是一个很好的方法。因此,在我的情况下,要使用 stub.GetStateByRange("c0", "c9999999999999999999"),我需要创建像 Owner1_ 这样的密钥,对吗?获取 11-05-2017 00:00:00 到 10-06-2017 23:59:59 的数据的示例我需要使用 stub.GetStateByRange("Owner1_", "Owner1_") 的长时间戳。我说的对吗?
  • 是的。可能它只会通过日期而不是时间,但我不知道。你会试试的。祝你好运。
  • 还有一个疑问是 stub.GetStateByRange("c0", "c9999999999999999999") 它是如何在内部工作的。如果数据范围或数量增加,性能会受到影响吗?
【解决方案2】:

与现有的 cmets、采用的解决方案和 API 规范一样,可以得出结论,stub.GetStateByPartialCompositeKey 最适合此要求的 API。
如果只获取一天的数据,它可以使用 rich query 和 json date_field:value 也可以使用 CouchDB 作为它国家分贝由于这不是提交事务,因此在此处使用 富查询 没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多