zoukankan      html  css  js  c++  java
  • 基于ubuntu16.04快速构建Hyperledger Fabric网络




    前言

    最近在参加一个比赛,使用到了区块链的开源软件hyperledger,由于之前从未接触过区块链,以及和区块链开发相关的内容,所有在网上查阅了大量的资料,并且通过学习yeasy(杨宝华)开源的入门书籍区块链技术指南以及进阶学习的《区块链原理、设计与应用》,对区块链的一些相关概念有了一定认识。这里记录的是我安装hyperledger fabric的所有步骤,同时也是一个快速搭建单机环境的参考教程。

    准备好机器环境

    本人的区块链网络部署在VMware搭建的ubuntu16.04的环境下(推荐使用该版本的系统),详细的系统版本为ubuntu-16.04.4-desktop-amd64.iso ,是从网易开源镜像站下载的。对于如何使用VMware安装虚拟机以及让虚拟机访问网络,网上有许多教程,这里就不重复讲了。
    当将系统安装完成后,需要更换源,使用desktop版的可以直接在设置里面选择最佳服务器,如下图所示
    mark
    若使用的是服务器版本,则可以使用如下命令换成高速的源

    • 先备份原来的源文件
    $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  
    
    • 打开sources.list文件,删除原来的内容
    $ sudo vim /etc/apt/sources.list
    
    • 任选下面一组源文件复制到source.list中

    网易源

    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse  
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse  
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse  
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse  
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse  
    deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse  
    deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse  
    deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse  
    deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse  
    deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse  
    

    阿里源

    # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted  
    deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties  
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted  
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted  
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties  
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe  
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties  
    deb http://archive.canonical.com/ubuntu xenial partner  
    deb-src http://archive.canonical.com/ubuntu xenial partner  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted  
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe  
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse  
    

    搜狐源

    deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse  
    deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse  
    deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse  
    deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse  
    deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse  
    deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse  
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse  
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse  
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse  
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse 
    

    复制进去后,使用:wq保存,然后使用如下命令更新一下

    $ sudo apt-get update
    

    执行完成后环境就基本上准备好了,如果使用的是服务器版本,觉得使用不方便的话,可以使用xshell之类的远程连接工具连接你的虚拟机。如果你的环境搭建再云服务器上,例如阿里云或者腾讯云,可以不用更新源,直接在自己的主机上使用远程连接工具连接上云主机,环境就算完成了(若在本地不能连接上云主机,或者虚拟机,检查一下ssh是否已经安装并启动,若没有,可以参加网上的教程,配置远程连接)。

    安装GO语言环境

    不推荐使用apt的方式安装GO,原因是这样安装的版本比较老,推荐安装最新版的GO,具体安装命令如下

    • 下载最新的GO安装包,具体的最新版本号可以从Golang官网上查看
    $ wegt https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz
    
    • 解压安装包到/usr/local目录下
    $ sudo tar -C usr/local -xzf go1.10.2.linux-amd64.tar.gz
    
    • 编辑当前用户的环境变量
    $ vim ~/.profile
    

    添加如下内容

    export PATH=$PATH:/usr/local/go/bin
    export GOROOT=/usr/local/go
    #这里配置的GOPATH目录为家目录的的go文件夹
    export GOPATH=$HOME/go
    export PATH=$PATH:$HOME/go/bin
    

    使用:wq保存后使用如下命令将保存立即刷新

    $ source ~/.profile
    
    • 建立GOPATH目录
      由于在环境变量中配置了GOPATH目录的位置,所以我们需要在家目录下创建该文件夹
    $ cd ~
    $ mkdir go
    
    • 查看go版本,测试环境配置是否成功
    $ go version
    go version go1.10 linux/amd64
    

    安装Docker

    这里使用的Docker官方文档来安装docker

    • 如果系统中有旧版本的Docker,需要先使用如下命令卸载
    $ sudo apt-get remove docker docker-engine docker.io
    
    • 更新apt包索引
    $ sudo apt-get update
    
    • 安装软件包以允许apt通过HTTPS使用远程库
    $ sudo apt-get install 
        apt-transport-https 
        ca-certificates 
        curl 
        software-properties-common
    

    若出现无法识别命令,可以先将该命令复制到一个文本文件中,将去掉,将所有语句放在同一行下,然后复制执行。

    • 添加Docker的官方GPG密钥
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
    • 通过搜索指纹的最后8个字符,确认您现在拥有指纹识别码9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
    $ sudo apt-key fingerprint 0EBFCD88
    
    pub   4096R/0EBFCD88 2017-02-22
          Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid                  Docker Release (CE deb) <docker@docker.com>
    sub   4096R/F273FCD8 2017-02-22
    
    • 使用以下命令设置稳定版本的远程库
    $ sudo add-apt-repository 
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu 
       $(lsb_release -cs) 
       stable"
    
    • 再次更新apt包索引
    $ sudo apt-get update
    
    • 使用apt安装docker-ce
    $ sudo apt-get install docker-ce
    
    • 查看docker版本,测试环境配置是否成功
    $ docker version
    Client:
     Version:      18.03.1-ce
     API version:  1.37
     Go version:   go1.9.5
     Git commit:   9ee9f40
     Built:        Thu Apr 26 07:17:20 2018
     OS/Arch:      linux/amd64
     Experimental: false
     Orchestrator: swarm
    
    Server:
     Engine:
      Version:      18.03.1-ce
      API version:  1.37 (minimum version 1.12)
      Go version:   go1.9.5
      Git commit:   9ee9f40
      Built:        Thu Apr 26 07:15:30 2018
      OS/Arch:      linux/amd64
      Experimental: false
    

    安装完成之后,需要将当前用户添加到docker用户组,然后为该用户添加sudo权限

    • 若没有创建docker用户组,可以使用如下命令创建一个GID999,组名为docker的用户组
    $ sudo groupadd –g 999 docker
    
    • 将当前用户(ubuntu)添加到docker用户组并分配sudo权限
    $ sudo usermod -aG docker ubuntu
    

    注销后重新登录,然后添加阿里云的Docker Hub镜像(注意,不同版本的添加方法不同,见阿里云容器 Hub

    $ sudo mkdir -p /etc/docker
    $ sudo tee /etc/docker/daemon.json <<-'EOF'
    {
        "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"]
    }
    EOF
    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    

    如果觉得阿里云镜像不好用,可以选择DaoClound的镜像,配置方式见DaoCloud官方文档

    安装Docker-Compose

    Docker-Compose是支持通过模板脚本批量创建的一个组件。在安装 Docker-Compose之前,需要安装python-pip

    • 安装python-pip
    $ sudo apt-get python-pip
    
    • 下载 Docker-Compose,这里使用的是国内的DaoClound加速器进行下载
    $ curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
    
    • Docker-Compose文件夹移动到/usr/local/bin目录下
    $ sudo mv ~/docker-compose /usr/local/bin/docker-compose 
    
    • Docker-Compose附上可执行权限
    $ chmod +x /usr/local/bin/docker-compose
    

    下载Fabric源码

    • 先在GOPATH下创建对应的目录
    $ mkdir -p ~/go/src/github.com/hyperledger
    
    • 切换到对应目录,使用Git命令将fabric的源码从github上克隆下来
    $ cd ~/go/src/github.com/hyperledger
    $ git clone https://github.com/hyperledger/fabric.git
    
    • 由于Fabric一直在更新,而我们并不需要使用最新的源码,所有将版本切换到v1.0.0
    $ cd ~/go/src/github.com/hyperledger/fabric
    $ git checkout v1.0.0
    

    下载Fabric Docker镜像

    由于刚才设置了Docker Hub镜像的地址,并且官方文件中也提供了批量下载的脚本,所有我们只需运行下面命令即可

    $ cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
    $ source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
    

    由于刚才设置的是国内的镜像站,在本地网速还不错的情况下下载数度还是很快的。当下载完成后,使用如下命令检查镜像列表

    $ docker images
    REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
    dev-peer0.org1.example.com-marbles-v4   latest              089d43e100c9        5 hours ago         173MB
    dev-peer0.org1.example.com-fabcar-1.0   latest              6047921ee993        7 hours ago         173MB
    hyperledger/fabric-tools                latest              0403fd1c72c7        10 months ago       1.32GB
    hyperledger/fabric-tools                x86_64-1.0.0        0403fd1c72c7        10 months ago       1.32GB
    hyperledger/fabric-couchdb              latest              2fbdbf3ab945        10 months ago       1.48GB
    hyperledger/fabric-couchdb              x86_64-1.0.0        2fbdbf3ab945        10 months ago       1.48GB
    hyperledger/fabric-kafka                latest              dbd3f94de4b5        10 months ago       1.3GB
    hyperledger/fabric-kafka                x86_64-1.0.0        dbd3f94de4b5        10 months ago       1.3GB
    hyperledger/fabric-zookeeper            latest              e545dbf1c6af        10 months ago       1.31GB
    hyperledger/fabric-zookeeper            x86_64-1.0.0        e545dbf1c6af        10 months ago       1.31GB
    hyperledger/fabric-orderer              latest              e317ca5638ba        10 months ago       179MB
    hyperledger/fabric-orderer              x86_64-1.0.0        e317ca5638ba        10 months ago       179MB
    hyperledger/fabric-peer                 latest              6830dcd7b9b5        10 months ago       182MB
    hyperledger/fabric-peer                 x86_64-1.0.0        6830dcd7b9b5        10 months ago       182MB
    hyperledger/fabric-javaenv              latest              8948126f0935        10 months ago       1.42GB
    hyperledger/fabric-javaenv              x86_64-1.0.0        8948126f0935        10 months ago       1.42GB
    hyperledger/fabric-ccenv                latest              7182c260a5ca        10 months ago       1.29GB
    hyperledger/fabric-ccenv                x86_64-1.0.0        7182c260a5ca        10 months ago       1.29GB
    hyperledger/fabric-ca                   latest              a15c59ecda5b        10 months ago       238MB
    hyperledger/fabric-ca                   x86_64-1.0.0        a15c59ecda5b        10 months ago       238MB
    hyperledger/fabric-baseos               x86_64-0.3.1        4b0cab202084        12 months ago       157MB
    

    出现以上结果说明镜像已经下载成功

    启动Fabric网络并运行e2e_cli项目

    • 进入e2e_cli目录,并执行启动命令
    $ cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
    $ ./network_setup.sh up
    

    这个过程做了如下操作

    1.编译生成Fabric公私钥,证书的程序,程序在目录:fabric/release/linux-amd64/bin

    2.基于configtx.yaml生成创世区块和通道相关信息,并保存到channel-artifacts文件夹中

    3.基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中

    4.基于docker-compose-cli.yaml启动1 Orderer + 4 Peer + 1 CLIFabric容器

    5.在CLI启动的时候,会运行srcipt/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能

    最后运行完成,我们会看到如下截图,说明网络启动成功了
    mark

    手动测试一下Fabric网络

    我们以安装好的Example02进行测试,在官方例子中,channel的名字是mychannel,链码的名字是mycc,我们首先重新打开一个命令行,然后进入CLI

    • 输入以下命令即可
    $ docker exec -it cli bash
    
    • 运行以下命令可以查询a账户的余额
    $ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
    

    查询结果如下图所示
    mark
    可以看到a账户的余额现在是90

    • 运行以下命令可以查询b账户的余额
    $ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
    

    查询结果如下图所示
    mark
    可以看到b账户的余额现在是210

    • 现在将b账户的余额转100给a账户,运行如下命令
    peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","b","a","100"]}'
    

    执行结果如下图所示
    mark
    可以看到执行成功了

    • 再次查询a账户的余额
    $ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
    

    查询结果如下图所示
    mark
    可以看到a账户的余额现在是190,比之前多了100

    • 再次查询b账户的余额
    $ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
    

    查询结果如下图所示
    mark
    可以看到b账户的余额现在是110,比之前少了100

    调用链码一切正常

    关闭区块链网络

    • 退出CLI容器
    root@4941e8bd4bd6:/opt/gopath/src/github.com/hyperledger/fabric/peer# exit
    
    • 关闭Fabric网络
    $ cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
    $ ./network_setup.sh down
    

    最后出现如下图说明关闭区块链网络成功
    mark

    总结

    至此,部署以及测试fabric的环境已经全部完成,下一篇博客我将记录如何在此基础上部署及运行IBM官方区块链例子marbles(弹珠资产)

    参考

  • 相关阅读:
    JavaWeb--基本概念
    启动Tomcat错误:The JRE_HOME environment variable is not defined correctly
    时间管理-1-总有一种情况你经历过
    时间管理
    非对称加密-支付宝 堆成加密
    TreeMap底层实现和原理-红黑树
    @Autowired报错原因分析和4种解决方案!
    布隆过滤器的设计原理
    springboot 日期参数前后台转换问题
    设计模式
  • 原文地址:https://www.cnblogs.com/dmego/p/9038937.html
Copyright © 2011-2022 走看看