0x00 说明
作为区块链平台 fabric 项目的代码贡献者,IBM 在自己的 Bluemix
上提供了免费的区块链服务。在该服务中,我们可以一键创建 4 个认证节点的区块链网络,使用 REST API 方便地测试自己的 fabric
链码而不用在本地部署 fabric 区块链网络。
为什么要本地部署 fabric?
在 Bluemix 上部署链码,需要把链码提交到 Github 上。在编写链码过程中,需要多次测试,每次都要上传到 Github。而本地部署链码只需要把链码在本地 Docker 中的认证节点上注册即可,不需多次上传 Github;
可以方便地查看链码的打印日志;
最近编写和测试链码的过程中,发现 Bluemix 提供的 fabric 服务中对链码方法参数的长度判断与本地部署 fabric 有所差异。目前在做的项目区块链网络最终要部署在本地。
在上一篇文章《Ubuntu 中使用 Docker 部署 Hyperledger fabric》中,总结了本地基于 Docker 的一键式部署方案,Docker 使用的镜像是由
Baohua Yang 构建。本文中总结使用 fabric 官方的 Docker 镜像在本地部署区块链平台,并在认证节点中注册链码(以 fabric
示例链码 02 为例),使用 REST API 与链码交互。
0x01 准备工作
安装 docker
参照 https://docs.docker.com/engine/installation/linux/ubuntulinux/
这里以
Ubuntu 16.04 LTS
为例:
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install docker-engine
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
安装 docker-compose
参照 https://yeasy.gitbooks.io/docker_practice/content/compose/intro.html
Docker-compose 可以很方便地实现 fabric 的一键部署。
因为 Ubuntu 仓库中的 docker-compose 版本较低,建议到
这里 自己下载最新版,此时最新版为
1.9.0
。
以下命令使用 root 权限执行:
$ su
$ curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose
$ chmod +x /usr/local /bin/docker-compose
获取官方 fabric 镜像
$ docker pull hyperledger/fabric-peer:latest
$ docker pull hyperledger/fabric-membersrvc:latest
0x02 启动 fabric 与测试链码
参考 https://github.com/hyperledger/fabric/blob/master/docs/Setup/Chaincode-setup.md
启动 fabric
把以下内容保存到
docker-compose.yml
文件,使用
docker-compose up
命令启动一个认证节点和成员管理服务:
membersrvc:
image: hyperledger/fabric-membersrvc
command : membersrvc
vp0:
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ADDRESSAUTODETECT=true
- CORE_VM_ENDPOINT=http://172.17.0.1:2375
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=vp0
- CORE_PEER_PKI_ECA_PADDR=membersrvc:7054
- CORE_PEER_PKI_TCA_PADDR=membersrvc:7054
- CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054
- CORE_SECURITY_ENABLED=true
- CORE_SECURITY_ENROLLID=test_vp0
- CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
links:
- membersrvc
command : sh -c "sleep 5; peer node start --peer-chaincodedev"
在节点上注册链码
进入 docker,在认证节点上注册链码,后续与链码交互过程中,可以在终端中查看链码的打印日志。
查看 docker 中当前进程:
输出结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e864338032e hyperledger/fabric-peer "sh -c 'sleep 5; peer" 54 minutes ago Up 54 minutes fabricdockercompse_vp0_1
92e4c255c47b hyperledger/fabric-membersrvc "membersrvc" 54 minutes ago Up 54 minutes fabricdockercompse_membersrvc_1
这时,可以使用
docker cp
命令把链码复制到节点中:
docker cp chaincode_example02.go mycontainer:/opt/gopath/src/github.com/chaincode_example02/chaincode_example02.go
进入认证节点,启动节点的终端:
# -t 选项让 docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开
docker exec -it fabricdockercompse_vp0_1 bash
编译链码:
cd $GOPATH /src/github.com/chaincode_example02
go build
在节点上注册链码:
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
使用 REST 与链码交互
使用 Postman 或类似工具完成下面的测试。
用户登录:
POST http://172.17.0.3:7050/registrar
{
"enrollId": "jim",
"enrollSecret": "6avZQLwcUe9b"
}
部署链码,会调用链码的
Init()
方法,创建 a、b 两个角色,余额分别为 100 和 200 单位:
POST http://172.17.0.3:7050/chaincode
{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID":{
"name": "mycc"
},
"ctorMsg": {
"args":["init", "a", "100", "b", "200"]
},
"secureContext": "jim"
},
"id": 1
}
从 a 向 b 转账 10 个单位,会调用链码的
Invoke()
方法:
POST http://172.17.0.3:7050/chaincode
{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID":{
"name":"mycc"
},
"ctorMsg": {
"args":["invoke", "a", "b", "10"]
},
"secureContext": "jim"
},
"id": 3
}
查询 a 的余额,会调用链码的
Query()
方法:
POST http://172.17.0.3:7050/chaincode
{
"jsonrpc": "2.0",
"method": "query",
"params": {
"type": 1,
"chaincodeID":{
"name":"mycc"
},
"ctorMsg": {
"args":["query", "a"]
},
"secureContext": "jim"
},
"id": 5
}
0x03 参考内容
https://github.com/hyperledger/fabric
https://docs.docker.com/engine/installation/linux/ubuntulinux/
https://yeasy.gitbooks.io/docker_practice/content/compose/intro.html
https://github.com/hyperledger/fabric/blob/master/docs/Setup/Chaincode-setup.md
--------------------------------------------------
Ubuntu中使用 Docker,部署 Hyperledger Fabric
本文总结如何使用 Docker 部署 Hyperledger 的 fabric。并使用 fabric 的 CLI 接口命令部署链码和进行交易。
准备工作
准备一台 Ubuntu 14.04 LTS 主机,规格如下:
Role
RAM
Disk
CPUs
IP Address
hyperledger
4 GB
40 GB
双核
172.16.1.78
使用以下命令安装
Docker Engine
:
$ sudo apt-get install -y python-pip git
$ curl http://files.imaclouds.com/scripts/docker_install.sh | sh
接下来,使用以下命令安装
docker-compose
:
$ sudo pip install --upgrade pip
$ sudo pip install docker-compose
注意!如果上述命令安装的
docker-compose
不是最新版,在运行
docker-compose up
命令时会出现错误。可以按照
https://github.com/docker/compose/releases 的方法手动安装:
curl -L https://github.com/docker/compose/releases/download/1.8.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose
chmod +x /usr/local /bin/docker-compose
安装 Hyperledger
安装前首先通过 git 下载 Hyperledger compose:
$ git clone https://github.com/yeasy/docker-compose-files.git
$ cd docker-compose-files/hyperledger
执行以下步骤来下载 docker 镜像:
$ docker pull openblockchain/baseimage:0.0.9
$ docker pull yeasy/hyperledger:latest
$ docker tag yeasy/hyperledger:latest hyperledger/fabric-baseimage:latest
$ docker pull yeasy/hyperledger-peer:noops
$ docker pull yeasy/hyperledger-peer:pbft
$ docker pull yeasy/hyperledger-membersrvc:latest
执行
docker compose
来部署四个节点的 Hyperledger:
$ docker-compose up
Attaching to hyperledger_vp0_1, hyperledger_vp3_1, hyperledger_vp1_1, hyperledger_vp2_1
vp0_1 | 07:42:07.870 [crypto] main -> INFO 001 Log level recognized 'info' , set to INFO
...
验证 Hyperledger peer
进入到第一个 Hyperledger 容器:
$ docker exec -ti hyperledger_vp0_1 bash
查看目前所有建立的节点:
$ peer node status
08:09:14.715 [crypto] main -> INFO 001 Log level recognized 'info' , set to INFO
08:09:14.715 [logging] LoggingInit -> DEBU 002 Setting default logging level to DEBUG for command 'node'
08:09:14.715 [peer] func1 -> INFO 003 Auto detected peer address: 172.17.0.2:30303
08:09:14.716 [peer] func1 -> INFO 004 Auto detected peer address: 172.17.0.2:30303
08:09:14.716 [peer] func1 -> INFO 005 Auto detected peer address: 172.17.0.2:30303
status:STARTED
进入容器后,首先部署一个链码(chaincode):
$ peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 \
-c '{"Function":"init", "Args": ["Alice","100", "Bob", "200"]}'
...
81a73fa1fabe6e385f3c609cef8915a732ee74179abde55f4ac7addf4e7c35ac4a669a7d9a17b2c9a6b3c28b45565b97dc69f4c8f53381ba13251adf5ac6d23d
上面会获得一个 128 数字字母组成的哈希字符串,该字符串是链码 ID,在后续的交易和查询会使用到。
首先查询 Alice 的账户余额:
$ my_key="81a73fa1fabe6e385f3c609cef8915a732ee74179abde55f4ac7addf4e7c35ac4a669a7d9a17b2c9a6b3c28b45565b97dc69f4c8f53381ba13251adf5ac6d23d"
$ peer chaincode query -n ${my_key} \
-c '{"Function": "query", "Args": ["Alice"]}'
...
100
接着发起一笔交易,让 Alice 支付 10 个单位给 Bob:
$ peer chaincode invoke -n ${my_key} \
-c '{"Function": "invoke", "Args": ["Alice", "Bob", "10"]}'
确认完成交易后,可以查看 Bob 的账户余额:
$ peer chaincode query -n ${my_key} \
-c '{"Function": "query", "Args": ["Bob"]}'
参考内容
https://yeasy.gitbooks.io/blockchain_guide/content/hyperledger/install.html https://github.com/kairen/blockchain-tutorial/blob/master/hyperledger/hyperledger-docker.md https://github.com/docker/compose/releases