深度探索区块链/超级账本初体验(2)
本内容基于Hyperledger Fabric1.0(《深度探索区块链》)
一。基础环境安装
Hyperledger fabric1.0依赖Docker执行“智能合约”,需要先安装Docker和Docker-Compose的运行环境。
(一)。Docker的安装和使用
1。Docker安装
Docker支持Linux,Mac,Windows等多平台,安装文档参考:https://docs.docker.com/engine/installation
Linux环境下docker安装(为了学习本课程,电脑安装visualbox虚拟机,同时安装ubuntu镜像)
//0.安装curl sudo apt install curl //1.Ubuntu,debian,centos等linux系统,可通过官方提供的脚本进行安装: curl -sSL https://get.docker.com | sh //2.将用户加入到docker组,非root用户USER可以执行docker命令(可能需要重新登录生效) sudo usermod -aG docker $USER //若是ubuntu/debian操作系统,修改Docker配置文件/etc/default/docker,增加Docker的socket绑订,运行在Docker中的进程才能通过映射的socket调用Docker的API执行镜像编译和创建容器等操作。 DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock " //3.重启docker服务,让配置生效 sudo service docker start
docker version //查看docker版本号
2。Docker国内镜像仓库
阿里云和DaoCloud :提供镜像加速的服务,需要登录注册才能使用。(可以使用github账号登录)
阿里云:登录容器Hub服务:https://cr.console.aliyun.com的控制台 (左侧加速器帮助页面会显示为你独立分配的加速地址)
DaoCloud:在https://www.daocloud.io进行注册登录 (点击加速器获取加速器相关配置)
修改Docker镜像仓库的办法:在DOCKER_OPTS里加入registry-mirror参数
如:
DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=http://069f616f.m.daocloud.io"
点击加速器,跳转:
//编辑docker文件,添加加速器 $ cd /etc/default $ vi docker
重启docker服务,即可以使用镜像加速。(Docker在mac/windows可以在图形界面添加镜像仓库)
3。Docker常用命令
【1】。docker images:查看主机上的镜像文件列表
【2】。docker pull:从镜像仓库中下载镜你文件(如:docker pull hyperledger/fabric-peer)
【3】。docker tag:给镜像文件打标签,x86_64-1.0.0标记为latest
(如:docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest)
【4】。docker run:从镜像中启动容器,
如:docker run -it --name cli ubuntu / bin/bash
其中:cli是容器名称,ubuntu是镜像名称,-it是以交互方式启动,/bin/bash是启动容器时执行的命令
【5】。docker logs:查看容器日志(如:docker logs -f cli)
【6】。docker ps:查看主机上的容器,其中:参数-a会显示已经停止的容器(docker ps -a)
【7】。docker port:查看容器映射的端口(如:docker port peer0.org1.example.com)
【8】。docker rm:删除容器,其中:cli为容器名称或者id (docker rm cli)
【9】。docker --help:查看帮助文档
以上,更多命令查看帮助文档:https://docs.docker.com/engine/reference/commandline/docker
(二)。Docker Compose的安装和使用
说明:
Docker Compose能够在一个主机上创建出相互隔离的网络。
通过命令行管理多个Docker容器,快速启动,停止和更新容器。
1。Docker Compose安装(linux环境)
//方式一:通过pip进行安装
sudo apt-get install python-pip
sudo pip install docker-compose 或 $ pip install docker-compose>=1.8.0
//方式二:直接下载文件 curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-'uname -s' - 'uname -m' -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose
推荐方式一。本人试用过,没有问题。方式二方式会出现docker compose文件乱码。
查看docker compose版本号:$ docker-compose -version
2。Docker Compose的配置文件
说明:Compose采用YAML文件定义Docker容器之间的依赖,设置环境变量和文件的持久化。
配置文件:/examples/e2e_cli/base/docker-compose-base.yaml
说明:
【1】。version:(version:'2')采用version 2的语法
【2】。services:定义服务列表
【3】。orderer.example.com:(根据服务名称自定义)自定义的服务名称,需要保持唯一。
【4】。container_name:容器名称(如:container_name:orderer.example.com)
【5】。image:容器使用的镜像文件(如:image:hyperledger/fabric-orderer)
【6】。environment:传递给容器的环境变量(-CORE_PEER_LOCALMSPID=Org1MSP)
【7】。working_dir:容器启动的工作目录(working_dir:/opt/gopath/src/github.com/hyperledger/fabric)
【8】。command:容器启动的命令(command:orderer)
【9】。volumes:宿主机和容器之间的目录映射(-/var/run/:/host/var/run/)
【10】。ports:宿主机和容器之间的端口映射(-7050:7050)
【11】。extends:服务扩展,基于common.yml文件(file:common.yml)
【12】。extends:服务扩展,基础服务是peer-base(service:peer-base)
3。Docker Compose的常用命令
【1】。docker-compose up :根据配置文件docker-compose-cli.yaml启动容器。
如:docker-compose -f docker-compose-cli.yaml up -d
其中 -f指定配置文件的名称 -d设置以后台方式运行
【2】。docker-compose down :停止配置文件docker-compose-cli.yaml的容器
如:docker-compose -f docker-compose-cli.yaml down
【3】。docker-compose pull:批量下载所需的镜像文件
如:docker-compose -f docker-compose-cli.yaml pull
更多命令查看帮助文档和在线文档:https://docs.docker.com/compose/reference
(三)。下载超级账本源代码
超级账本源代码都托管在https://gerrit.hyperledger.org/r/#/admin/projects下面。
并在https://github.com/hyperledger上提供只读代码。
Git命令下载
$ sudo apt install git //安装git
$ git version //查看git版本
$ git clone https://github.com/hyperledger/fabric.git //下载fabric源码
本实例:
$ cd /opt
$ sudo mkdir -p ./gopath/src/github.com/hyperledger
$ cd ~/gopath/src/github.com/hyperledger
$ git clone -b release-1.0 https://github.com/hyperledger/fabric.git
也可打包下载文件后解压:
https://github.com/hyperledger/fabric/archive/release.zip
(四)。超级账本部署调用
1。下载Docker镜像文件
说明:超级账本scripts目录下有多个下载镜像的脚本,我们可以修改权限后直接运行。
//进入fabric/scripts 目录 $ chmod +x bootstrap-1.0.0.sh //MacOS执行如下命令(不下载二进制文件) $ sed -i '' 's/curl/#curl/g' bootstrap-1.0.0.sh //其他操作系统执行如下命令(不下载二进制文件) $ sed -i 's/curl/#curl/g' bootstrap-1.0.0.sh //直接下载Docker镜像文件 $ ./bootstrap-1.0.0.sh
上述下载镜像文件有9个:
Repository代表的是镜像的仓库名称。每个仓库下面都有打了不同TAG的标签名称。代表不同的版本。
通常最少有2个标签,一个是latest,另一个的命名规则为“主机CPU类型-超级账本主版本号-snapshot-代码库版本号”
2。部署超级账本网络
说明:运行超级账本需要设置较多的初始化配置,我们先绕开初始化过程,用fabric-samples工程中已经生成的配置文件来体验部署安装的过程:
//下载目录位置:/opt/src/github.com/hyperledger/
git clone -b release-1.0 https://github.com/hyperledger/fabric-samples.git
//上述也可不指定版本,直接下载最新fabric,利用git版本切换到1.0
进入basic-network目录,利用docker-compose启动容器
$ cd fabric-samples/basic-network //利用docker-compose启动容器 $ sudo docker-compose -f docker-compose.yml up -d //查看已经启动的容器 $ docker ps
切换到管理员用户再创建通道和加入通道:
//创建管理员密码 su passwd root //输入密码 //切换到管理员root身份 su root
#切换环境到管理员用户的MSP,进入peer节点容器peer0.org1.example.com docker exec -it -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com bash #创建通道 peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx #加入通道 peer channel join -b mychannel.block #退出peer节点容器peer0.org1.example.com exit #退出peer节点容器peer0.org1.example.com,进入cli容器安装链码和实例化: #进入cli容器
docker exec -it cli /bin/bash #给peer节点peer0.org1.example.com安装链码 peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02 #实例化链码 peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v v0 -c '{"Args":["init","a","100","b","200"]}'
上述链码实例化后,可以查询初始值。同样是在cli容器里执行下面的操作:
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
调用链码,从a转移10到b
//a向b转10
peer chaincode invoke -C mychannel -n mycc -v v0 -c '{"Args":["invoke","a","b","10"]}'
//查询a值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
//查询b值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","b"]}'
3。节点的配置参数传递规则
说明:在docker-compose.yml文件中,有ORDERER_GENERAL_LEDGERTYPE=ram的设置,这是传递给节点的参数。
给节点传递参数的方法有多种方式:
【1】。环境变量
【2】。配置文件
【3】。动态环境变量
【4】。默认值
程序在启动时,会读取配置文件和环境变量的值,分别保存到不同变量缓存起来,
在程序获取某个变量值的时候,不同传递方法参数读取流程图如下所示:
从图中可以看到,如果配置了自动从环境变量获取参数的值,那么每次都实时地从环境变量中获取,否则依次读取程序启动时从环境变量、配置文件中读取后缓存到内存中的值,优先获取到的值作为返回值。如果都没有获取到,则返回空,交给程序进行处理,程序可能会以默认值运行,也可能会报错停止运行,这跟业务逻辑有关系。所以,只有在设置了自动从环境变量中获取参数的情况下,才能在运行时通过修改环境变量改变参数的值。
每个环境变量的名称都有一个前缀,每个模块都是单独设置的,比如ORDERER_GENERAL_LEDGERTYPE的前缀是ORDERER,通常每个模块的前缀是不一样的。比如这里的ORDERER代表的是排序服务节点,Peer节点的变量名称前缀是CORE。环境变量名称是以“_”作为分隔符的,代表一种层级,是和配置文件一一对应的,比如ORDERER_GENERAL_LEDGERTYPE对应orderer.yaml配置文件的General.LedgerType。环境变量和配置文件的变量名称都是不区分大小写的,内部会统一转换成小写的变量名称进行处理。
配置文件路径优先读取环境变量设置的路径,排序服务节点和Peer节点都是相同的环境变量。如果没有设置环境变量,则默认是应用程序所在的目录,然后环境变量GOPATH路径对应到模块代码工程下的目录,比如排序服务节点的目录是GOPATH/src/github.com/hyperledger/fabric/peer。
一般情况下,配置文件的名称设置成模块前缀的小写,比如排序服务节点的配置文件名称是orderer,Peer节点的配置文件名称是core。配置文件名称的后缀支持:json、toml、yaml、properties、props、prop,它们分别对应JSON文件、TOML文件、YAML文件和Properties文件,程序设置配置文件的时候如果不指定后缀,则按支持的后缀顺序在配置文件路径下进行搜索,找到第一个匹配的文件作为最终的配置文件。文件路径和文件后缀按照广度优先的搜索顺序,即在同一路径下匹配完所有文件后缀再进入下一个文件路径。假设Peer节点没有设置配置文件路径,$GOPATH的路径是/opt/gopath,则有两个目录下的文件如下所示:
vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree .
.
├── core.yaml
└── peer
vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree /opt/gopath/
src/github.com/hyperledger/fabric/peer
.
├── core.json
└── peer
搜索路径顺序是:
./core.json
./core.toml
./core.yaml
./core.properties
./core.props
./core.prop
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.toml
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.yaml
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.properties
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.props
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.prop
所以最终获取到的配置文件是:./core.yaml。
而不是/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json。
二。go及goland环境安装
linux环境下,安装Goland
//linux默认下载位置 /tmp/mozilla_shiyufeng0 cd /tmp/mozilla_shiyufeng0 ls //拷备goland的tar文件到 /usr/local下 cp -i goland-2018.2.tar.gz /usr/local/ //解压缩到/opt目录下 sudo tar -zxvf goland-2018.2.tar.gz -C /opt cd /opt/goland-2018.2/bin //启动goland ./goland.sh
goland激活码:http://idea.youbbs.org (可随时在网上查找)
导入fabric项目,效果如下所示:
上述basic-network和first-network可用于部署区块链网络示例。
########### Docker常用命令 ###########