在CentOS 7.2下安装Hyperledger fabric 1.0.0 preview版本的solo模式
一. 安装centos和docker 等组件
A. 安装centos x86-64 Minimal(IP:192.168.2.10)
内核版本需要3.10 以上。centos 7 完全支持.
查看内核信息
$ uname -a
Linux localhost.localdomain 3.10.0-514.6.1.el7.x86_64
B. 安装docker, 版本1.12.5(略过)
$ docker -v
Docker version 1.12.5,build 047e51b/1.12.5
C. 安装python-pip(可选)
- 安装epel扩展
$ yum -y install epel-release
- 然后安装python-pip
$ yum -y install python-pip
# 更新到最新版本
$ pip install --upgrade pip
- 确认安装成功和确定版本
$ pip -V
d. 安装docker-compose
docker-compose是docker集群管理工具,可自定义一键启动多个docker container。
官网二进制发布:
https://github.com/docker/compose/releases
安装手册见网站 :
https://docs.docker.com/compose/install/
安装命令如下:
$ curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose -v
或者通过 pip 安装
$ pip install -U docker-compose
二. 搭建Fabric 1.0.0 演示环境( solo共识方式,带自定义channel)
杨宝华的项目主页
https://github.com/yeasy/blockchain_guide/blob/master/hyperledger/1.0.md
A.下载所需组件
1. 安装操作系统和docker (略)
2. 安装python pip(略)
3. 安装 docker-compose 最新发布版本
pip install docker-compose
4.获取docker的 image,并更新镜像别名。
注意:这里一定要用tag来更新别名,要和docker-compose.yml 中的匹配
2017年02月16日,杨宝华mail确定:
The latest tag is auto-building by triggered from code change.
While those number tag (e.g.,0.8) is stable and manually set.
所以, 我们使用:
最新的版本的pull命令如下:
以root用户运行以下命令
ARCH=x86_64
BASE_VERSION=1.0.0-preview
PROJECT_VERSION=1.0.0-preview
IMG_VERSION=0.8.4
docker pull yeasy/hyperledger-fabric-base:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-peer:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-orderer:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-ca:$IMG_VERSION \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag yeasy/hyperledger-fabric-peer:$IMG_VERSION hyperledger/fabric-peer \
&& docker tag yeasy/hyperledger-fabric-orderer:$IMG_VERSION hyperledger/fabric-orderer \
&& docker tag yeasy/hyperledger-fabric-ca:$IMG_VERSION hyperledger/fabric-ca \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baseimage \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-ccenv:$ARCH-$BASE_VERSION \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baSEOs:$ARCH-$BASE_VERSION
5.设置网络
$ docker network create fabric_noops
$ docker network create fabric_pbft
6.启动 Fabric 1.0
a. 下载 Compose 模板文件。
$ cd ~
$ git clone https://github.com/yeasy/docker-compose-files
b. 进入hyperledger 1.0 模板目录
$ cd /root/docker-compose-files/hyperledger/1.0
c. 查看包括若干模板文件,功能如下。
peers.yml: 包含 peer 节点的服务模板。
docker-compose.yml: 启动 1 个 最小化的环境,包括 1 个 peer 节点、1 个 Orderer 节点、1 个 CA 节点。
d. 修改成3个peer的方式。
peer1:
extends:
file: peer.yml
service: peer
container_name: fabric-peer1
hostname: peer1
environment:
- CORE_PEER_ID=peer1 - CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 links:
- ca - orderer ports:
- 8052:7051 depends_on:
- ca - orderer
peer2:
extends:
file: peer.yml
service: peer
container_name: fabric-peer2
hostname: peer2
environment:
- CORE_PEER_ID=peer2 - CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 links:
- ca - orderer ports:
- 8053:7051 depends_on:
- ca - orderer
e. 部署和启动 Fabric 1.0
$ docker-compose -f docker-compose.yml up -d
7. 查看容器信息
应该有5个启动的容器,分别是 1. fabric-peer0 2. fabric-peer1 3. fabric-peer2 4. fabric-orderer 5. fabric-ca
$ docker ps
# 或者
$ docker-compose ps
8. 建立一个channel 名字是myc1
进入任何一个peer容器内均可
docker exec -it fabric-peer2 bash
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1
# 确认myc1.block文件产生了。说明channel的创世纪块建立成功
ls *.block
9. 把相应的peer(0,1,2)节点加入myc1
在建立channel 的容器里面,进行下面操作。
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc1.block
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc1.block
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer2:7051 peer channel join -b myc1.block
10. 部署和实例化chaincode
- 有几个peer需要运行这个chaincode,那就需要在这几个peer上都peer chaincode install。
- 但是只需要在任意一个peer上peer chaincode instantiate 一次。
- 如果在其他peer上再做 instantiate ,就会出现错误。
- 修改CORE_PEER_ADDRESS参数值即可指定在哪个peer上 install 和 instantiate。
$ docker exec -it fabric-peer0 bash
# 部署一个chaincode
CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode install -C myc1 -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{}' -v 1.1.0
# 实例化一个chaincode
CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode instantiate -C myc1 -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a","100","b","200"]}' -v 1.1.0
注意:
* 在docker宿主机器上,使用docker ps 命令可以看到,在第一次指定一个peer(由CORE_PEER_ADDRESS指定),成功install 并且instantiate一个chaincode后,就会产生,并且up起来一个以这个peer和chaincode ,版本号为名字的容器。
* 接下来在其他peer上install这个相同的chaincode的时候,不会产生容器。(这个时候,由于已经有第一个peer进行了这个chaincode的instantiate,再在其他容器上instantiate 就会出错的,错误信息是chaincode已经存在)
* 当指定peer进行业务操作的时候,就会产生,并且up起来一个以这个指定的peer和chaincode ,版本号为名字的容器。
docker ps
dev-peer0-mycc-1.1.0
7. 查询chaincode
部署完成后,等待几秒,或者查看log。确定部署完成,然后进行查询
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode query -C myc1 -n mycc -c '{"Args":["query","a"]}'
#返回结果是:
Query Result: 100
2017-03-15 08:05:17.429 UTC [main] main -> INFO 002 Exiting.....
#或者
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode invoke -C myc1 -n mycc -c '{"Args":["invoke","10"]}' peer chaincode invoke -n mycc -c '{"Args":["query","a"]}'
返回结果是:
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" payload:"100" > payload:"\n \... [main] main -> INFO 002 Exiting.....
- 调用chaincode
模拟转账业务
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode invoke -C myc1 -n mycc -c '{"Args":["invoke","10"]}'
正确的返回内容:
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:...
[main] main -> INFO 002 Exiting.....
注意最终结果状态正常 response:<status:200 message:"OK" >
CORE_PEER_ADDRESS=peer0:7051 peer chaincode query -C myc1 -n mycc -c '{"Args":["query","a"]}'
返回的正确内容,b账号里面多了转账的金额。
- 查看日志
在docker server上执行如下命令:
$ cd ~/docker-compose-files/hyperledger/1.0
$ docker-compose logs -f
三. 搭建Fabric 0.6 演示环境(noops 模式)
A.下载组件
hyperledger Fabric使用的 docker-compose.yml
Docker Compose 配置文件 yaml 参数简单介绍
http://debugo.com/docker-compose/
使用HyperLedger github上的样例curl -o docker-compose.yml https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sdk/node/docker-compose.yml
下载membersrvc和peer 的Docker image
$ docker pull hyperledger/fabric-membersrvc:latest $ docker pull hyperledger/fabric-peer:latest #查看images 信息 $ docker images
B. build客户端镜像
1. 下载Fabric样例Dockerfile
$ cd ~
$ curl -o Dockerfile https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sdk/node/Dockerfile
2. build image
docker build -t hyperledger/fabric-starter-kit:latest .
3. 检查images是否正确构建
docker images
C. 运行Fabric开发环境
1. 启动Cluster
docker-compose -f docker-compose.yml up -d
2. 进入Docker
部署为开发模式,直接进入peer
docker exec -it peer bash
3. 登陆
官方Image默认打开权限,需要先登陆用户,使用内置用户登陆。
- CLI
peer network login jim
# 缺省密码 6avZQLwcUe9b
- REST API
也可以使用REST API方式:
POST http://127.0.0.1:7050/
registrar
{
"enrollId": "jim","enrollSecret": "6avZQLwcUe9b" }
Note: 为了使用REST,你需要在docker-compose.yml文件的peer部分中加入端口映射:
$ vim docker-compose.yml
#增加端口映射在peer部分
ports:
- "0.0.0.0:7050:7050"
#退出 vim
#建议删除原有的3个container
$ docker rm -f peer starter membersrvc
#然后重新生成容器
$ docker-compose -f docker-compose.yml up -d
# 查看进程
$ docker-compose ps
# 如果有错误 , 查看docker 日志
$ docker-compose logs
4. 部署Chaincode
- CLI
# 进入 peer容器
$docker exec -it peer bash
#部署一个命名为 mycc的chaincode
$CORE_PEER_ADDRESS=127.0.0.1:7051
$peer chaincode deploy -n mycc -c '{"Function": "init","Args": ["roamer","she","5000"]}' -u jim
注意: 在这里 只能用 mycc 作为 chiancode的名字。在0.6.1 preview版本中如果使用 hyperledger-demo-1 这类的名字,会抛出 sending init Failed(handler not found for chaincode roamer-test) 错误!
Note: 部署返回成功仅仅意味着提交的指令已被接收,不代表指令执行完成。如果要查看是否部署成功,需要新开一个终端,在docker 服务器上(不是当前容器),运行查看日志命令,确保没有错误信息。
$ docker logs -f peer
#或者
$ docker-compse logs -f peer
- REST API
POST http://192.168.2.10:7050/chaincode
request 参数
{
"jsonrpc": "2.0","method": "deploy","params": { "type": 1,"chaincodeID": { "name": "mycc" },"ctorMsg": { "function": "init","args": ["roamer","5000"] },"secureContext": "jim" },"id": 1 }
5. 查询
- CLI
peer chaincode query -u jim -n mycc -c '{"Function": "query","Args": ["roamer"]}'
返回结果应该是
Query Result: 100
06:41:08.619 [main] main -> INFO 004 Exiting.....
- REST API
http://192.168.2.10:7050/chaincode
request参数
{
"jsonrpc": "2.0","method": "query","ctorMsg": { "function": "query","args": ["roamer"] },"id": 5 }
返回结果是:
{
"jsonrpc": "2.0","result": { "status": "OK","message": "100" },"id": 5 }
6. 转账
- CLI
peer chaincode invoke -n mycc -u jim -c '{"Function": "invoke","Args": ["roamer","she","10"]}'
- REST API
POST http://192.168.2.10:7050/chaincode
{
"jsonrpc": "2.0","method": "invoke","ctorMsg": { "function": "invoke","5"] },"id": 3 }
7. 获取某个区块的信息
- REST API
GET
http://192.168.2.10:7050/chain/blocks/1
http://192.168.2.10:7050/chain/blocks/2
......