深度探索区块链/超级账本初体验(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环境安装

配置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常用命令 ###########

 

 

posted @ 2018-08-06 08:48  kaixinyufeng  阅读(1622)  评论(0编辑  收藏  举报