使用 CouchDB 作为分类帐状态数据库时,数据如何存储在 Hyperledger Fabric 中?
How is data store in Hyperledger Fabric when using CouchDB as the Ledger State database?
我正在 运行将 Chaincode for Developers Tutorial 中的代码整合到 运行 一个基本的示例链代码,以在分类账上创建资产(键值对)。
我可以使用 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
中更改了下面的环境变量
CORE_LEDGER_STATE_STATEDATABASE=CouchDB
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
当我 运行 设置时,我看到在 CouchDB UI (http://localhost:5984/myc/_all_docs) 中创建的文档如下所示。
{
"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"
}
}
]
}
How/Where 是存储和检索密钥的值吗?如下所示,在检查数据库中的文档时,但在 运行 链代码获取查询时正确检索。
"value": {
"rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}
当
虽然密钥保存在数据库中,但它以链代码的名称为前缀,在您的示例中它是 mycc
并且作为分隔符使用 []byte{0x00}
值。因此,您在示例中看到以下输出:
{
"id": "mycc\u0000a",
"key": "mycc\u0000a",
"value": {
"rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}
},
代表链码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 读取数据的更多信息,您可能会发现以下内容 tutorial 很有用。
由于数据以二进制形式保存,您不会找到确切的值(相反,您会找到散列值)但会看到包含 mycc[=10= 的键的记录]
我正在 运行将 Chaincode for Developers Tutorial 中的代码整合到 运行 一个基本的示例链代码,以在分类账上创建资产(键值对)。
我可以使用 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
中更改了下面的环境变量CORE_LEDGER_STATE_STATEDATABASE=CouchDB
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
当我 运行 设置时,我看到在 CouchDB UI (http://localhost:5984/myc/_all_docs) 中创建的文档如下所示。
{
"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"
}
}
]
}
How/Where 是存储和检索密钥的值吗?如下所示,在检查数据库中的文档时,但在 运行 链代码获取查询时正确检索。
"value": {
"rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}
当
虽然密钥保存在数据库中,但它以链代码的名称为前缀,在您的示例中它是 mycc
并且作为分隔符使用 []byte{0x00}
值。因此,您在示例中看到以下输出:
{
"id": "mycc\u0000a",
"key": "mycc\u0000a",
"value": {
"rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
}
},
代表链码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 读取数据的更多信息,您可能会发现以下内容 tutorial 很有用。
由于数据以二进制形式保存,您不会找到确切的值(相反,您会找到散列值)但会看到包含 mycc[=10= 的键的记录]