简体   繁体   中英

How is data store in Hyperledger Fabric when using CouchDB as the Ledger State database?

I'm running the code in Chaincode for Developers Tutorial , to run a basic sample chaincode to create assets (key-value pairs) on the ledger.

I'm able to invoke the chaincode using the cli

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

and also run queries

peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc

Now I want to see how the key value pair gets stored in CouchDB. So I changed the environment variables below in the fabric-samples/chaincode-docker-devmode/docker-compose-simple.yaml

CORE_LEDGER_STATE_STATEDATABASE=CouchDB
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984

I see the documents created like below in CouchDB UI ( http://localhost:5984/myc/_all_docs ) when I run set.

{
  "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 is the value for the key stored and retrieved? It is seen as below, when checking the document in the DB, but is retrieved properly when running the chaincode get query.

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

When

While key persisted into DB it is prefixed with name of the chaincode, in your example it's mycc and as a separator used []byte{0x00} value. Therefore you see in you example, following output:

{
  "id": "mycc\u0000a",
  "key": "mycc\u0000a",
  "value": {
    "rev": "3-7ad1349ec711a99a2a2f1dd1c8b08a20"
  }
},

which stands for key a of chaincode mycc . To get the value of this key you can simply run a curl command as following adding query parameter attachements=true , for example:

curl -X GET "http://localhost:5984/mychannel/mycc%00a?attachments=true"

will result with something similar to this:

--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--%

For more information about how to read data from CouchDB you might find following tutorial useful.

由于数据以二进制形式保存,您将找不到确切的值(相反,您会找到哈希值),但会看到包含mycc的键的记录

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM