简介
状态数据库可以从默认的 goleveldb 切换到 CouchDB,这样就可以使用 CouchDB 的富查询功能了,CouchDB 可以根据 JSON 形式的链码服务数据提供更加丰富以及复杂的查询。
切换到 couchdb
使用下面的命令切换使用 CouchDB 状态数据库:
docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d
该命令拉取了couchdb的镜像,并且创建了4个状态数据库 couchdb,重新创建了之前已经创建过的几个容器。
测试 couchdb 富查询能力
为了测试 CouchDB 的查询能力,我们需要使用被 JSON 格式化的数据(例如 marbles02)。
你可以在 fabric/examples/chaincode/go 目录中找到 marbles02 链码。
我们将同样按照其他节点创建和加入通道步骤进行操作,当 peer1.org2.example.com 节点加入到了通道后,就可以与marbles02 链码交互:
安装 marbles02 链码
在 peer0.org1.example.com 上安装链码
切换身份
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
链码安装
peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go
链码实例化
因为这是一个新的chaincode,所以需要进行实例化。
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
开始测试
- 创建一些 marble 并转移它们
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marbles -c '{"Args":["delete","marble1"]}'
- 在 CLI 中运行常规的查询(例如查询 marble2)
peer chaincode query -C mychannel -n marbles -c '{"Args":["readMarble","marble2"]}'
- 您也可以检索特定 marble 的历史记录(即使该记录已经被删除也可以查询的到,因为只是被标记为删除,实际数据仍然在内存中,只不过这部分内存被标记为可重用,可能被其他数据覆盖),例如 marble1:
peer chaincode query -C mychannel -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'
补充
以下的几个命令可能会在网络搭建过程中用到:
- 列出当前节点所加入的Channel
peer channel list
- 列出当前节点所有已经安装的Chaincode
peer chaincode list --installed
- 获取特定Channel上的区块信息
peer channel getinfo -c mychannel
- 获取特定高度的Block的详细内容(注意区块编号是从0开始的,表示创世区块)
peer channel fetch 5 mychannel_5.block -o orderer.example.com:7050 -c mychannel --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
上述命令执行完成后,在当前目录生成一个名为mychannel_5.block文件,里面包含了区块高度为6的区块信息,我们将该文件转换为易读的JSON格式:
configtxgen -inspectBlock mychannel_5.block > mychannel_5.block.json
使用 cat 命令就可以打印出 json 格式表示的区块详细信息。
cat mychannel_5.block.json
总结
couchdb 还有很多功能值得探索,本文只是简单介绍一下 couchdb 的使用,感兴趣的可以去官网探索它的高阶使用。