0%

Fabric chaincode开发调试

链码(Chaincode)即Fabric中的智能合约,作为运行在Fabric区块链网络上的程序,链码在一般的运行模式下是运行在docker容器中的。 为了方便在开发中调试链码,可以使用开发模式。

  • 需要已经安装:dockerdocker-composeFabric的相关镜像, GoFabric的源码不是必需的,因为调试仍然是在Fabric镜像中进行。

1. 首先下载官方提供的fabric-samples:

1
git clone https://github.com/hyperledger/fabric-samples.git

将需要调试的chaincode源码(比如gocc)放入链码目录(fabric-samples/chaincode

如果要使用couchdb作为状态数据库, 应该在docker-comose-simple.yamlpeer环境变量中添加:

1
2
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
在依赖中添加:
1
2
3
depends_on:
- orderer
- couchdb
并添加couchdb容器:
1
2
3
4
5
6
7
couchdb:
container_name: couchdb
image: hyperledger/fabric-couchdb
ports:
- 5984:5984
environment:
DB_URL: http://localhost:5984/member_db

为了使用DEBUG模式调试链码,需要在chaincode容器中添加环境变量:

1
- CORE_CHAINCODE_LOGGING_LEVEL=DEBUG

2. 打开终端1

启动网络:

1
2
cd fabric-samples/chaincode-docker-devmode
docker-compose -f docker-compose-simple.yaml up -d

进入链码容器:

1
docker exec -it chaincode bash

编译链码(假设链码文件夹为/gocc

1
2
cd gocc
go build
启动链码:
1
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./gocc

3. 打开终端2

进入fabric客户端:

1
docker exec -it cli bash
安装并实例化:
1
2
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":[""]}' -C myc
调用
1
peer chaincode invoke -n mycc -v 0 -c '{"Args":["..."]}' -C myc

查询

1
peer chaincode query -n mycc -v 0 -c '{"Args":["..."]}' -C myc

4. 关闭网络

退出终端

1
exit

关闭网络:

1
docker-compose -f docker-compose-simple.yaml down

删除myc.block文件,下次才能正常启动网络:

1
rm myc.block

Fabric + CouchDB 实现排序查询

localhost:5984/_utils可以打开Fauxton直接查看couchdb信息 为需要排序的字段创建索引文件(index),然后即可在网页客户端或者chaincode中的rich query中查询: - 在Design Documents中添加Mango Indexes - 创建索引文件,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"index": {
"fields": [{
"data.createTime": "desc"
}, {
"chaincodeid": "desc"
}, {
"data.docType": "desc"
}]
},
"ddoc": "indexTimeSortDoc",
"name": "indexTimeSortDesc",
"type": "json"
}
  • 即为createTime字段创建了一个默认反序排列的索引,其中chaincodedocType必不可少,ddocname的具体值随意
  • Run A Query with Mango中即可实现正反序查询:
1
2
3
4
5
6
7
8
9
10
11
12
{
"selector": {
"data.docType": "typename"
},
"sort": [{
"data.createTime": "desc"
}, {
"chaincodeid": "desc"
}, {
"data.docType": "desc"
}]
}
  • 注意不同的字段排序方法需要创建不同的索引文件