当使用CouchDB作为分类帐状态数据库时,Hyperledger结构中的数据存储方式如何?

当使用CouchDB作为分类帐状态数据库时,Hyperledger结构中的数据存储方式如何?,couchdb,blockchain,hyperledger-fabric,hyperledger,Couchdb,Blockchain,Hyperledger Fabric,Hyperledger,我正在运行中的代码,运行一个基本的示例链代码,在分类账上创建资产(键值对) 我能够使用cli调用链代码 peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc 并运行查询 peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc 现在我想看看键值对是如何存储在CouchDB中的。因此,我在fabric samples/chaincode d

我正在运行中的代码,运行一个基本的示例链代码,在分类账上创建资产(键值对)

我能够使用cli调用链代码

peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
并运行查询

peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
现在我想看看键值对是如何存储在CouchDB中的。因此,我在fabric samples/chaincode docker devmode/docker-compose-simple.yaml中更改了下面的环境变量

当我运行set时,我在CouchDB UI()中看到了如下创建的文档

{
  "total_rows": 3,
  "offset": 0,
  "rows": [{
      "id": "lscc\u0000mycc",
      "key": "lscc\u0000mycc",
      "value": {
        "rev": "1-dc6dc8ff92efd35358cf5b89e7949c25"
      }
    },
    {
      "id": "mycc\u0000a",
      "key": "mycc\u0000a",
      "value": {
        "rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
      }
    },
    {
      "id": "statedb_savepoint",
      "key": "statedb_savepoint",
      "value": {
        "rev": "6-2c3d131fc75772cc9e70311998bdde9d"
      }
    }
  ]
}
如何/在何处存储和检索密钥的值?在DB中检查文档时,它如下所示,但在运行chaincode get查询时被正确检索

"value": {
  "rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}

键保留到DB中时,它以链码的名称作为前缀,在您的示例中,它是
mycc
,并用作分隔符
[]字节{0x00}
值。因此,您可以在示例中看到以下输出:

{
  "id": "mycc\u0000a",
  "key": "mycc\u0000a",
  "value": {
    "rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
  }
},
它代表chaincode
mycc
的键
a
。要获取该键的值,只需运行如下所示的
curl
命令,添加查询参数
attachements=true
,例如:

curl -X GET "http://localhost:5984/mychannel/mycc%00a?attachments=true"
将产生类似的结果:

--bdb0a91d2e233fdc193f2359e6a50472
Content-Type: application/json

{"_id":"mycc\u0000a","_rev":"2-2af72e502c2b43c73064728852103fbf","chaincodeid":"mycc","version":"4:0","_attachments":{"valueBytes":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-qpvq4/JGMCgu7WtvFu5zbg==","length":2,"follows":true,"encoding":"gzip","encoded_length":22}}}
--bdb0a91d2e233fdc193f2359e6a50472
Content-Disposition: attachment; filename="valueBytes"
Content-Type: application/octet-stream
Content-Length: 22
Content-Encoding: gzip

4鯄i
--bdb0a91d2e233fdc193f2359e6a50472--%

有关如何从CouchDB读取数据的更多信息,您可能会发现以下内容非常有用。

因为数据是以二进制格式保存的,所以您不会找到确切的值(而是会找到散列),但会看到包含mycc的键的记录给出以下输出{“total_rows”:3,“offset”:0,“rows”:[{“id”:“lscc\u0000mycc”,“key”:“lscc\u0000mycc”,“value”:{“rev”:“1-35f379c3ea35ef0077b595923bf36151”},{“id”:“mycc\u0000a”,“key”:“mycc\u0000a”,“value”:{“rev”:“2-f3049e0b19f69f01671889c8b1456f”},{“id”:“statedb_保存点”,“key”:“statedb_保存点”,“value”:{“rev”:“3-62ba0d88e905ef321c85c542bec7bd15”}}}}如何获取键“mycc\u0000a”的值\u0000a似乎不起作用。尝试了URL编码的方式。如何将其转换为“/mycc%00a”,它似乎正在运行curl-X GET”。我想问题是如何查询a的世界状态-现在应该是通过20行解决方案/建议登录a而受到影响的。应该在评论中发布。确定。因为我没有足够的声誉,我只是回答。非常感谢。
--bdb0a91d2e233fdc193f2359e6a50472
Content-Type: application/json

{"_id":"mycc\u0000a","_rev":"2-2af72e502c2b43c73064728852103fbf","chaincodeid":"mycc","version":"4:0","_attachments":{"valueBytes":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-qpvq4/JGMCgu7WtvFu5zbg==","length":2,"follows":true,"encoding":"gzip","encoded_length":22}}}
--bdb0a91d2e233fdc193f2359e6a50472
Content-Disposition: attachment; filename="valueBytes"
Content-Type: application/octet-stream
Content-Length: 22
Content-Encoding: gzip

4鯄i
--bdb0a91d2e233fdc193f2359e6a50472--%