在Ubuntu18.04中配置Hyperledger Fabric 1.0

1.安装VMWare虚拟机

本次选用的是VMware 14.1.5。使用虚拟机的目的是提供一个干净的开发测试环境,而不与日常使用的操作系统相混淆,避免各种未知的错误。

不过,使用虚拟机对载体计算机的性能要求会高一些。本次使用的载体计算机配置如下:

虚拟机的配置如下

2.安装Ubuntu

在虚拟机上安装Ubuntu,本次实验使用的是Ubuntu18.04,其他版本的ubuntu可能会有略微不同的设置。为了保证实验能顺利进行,建议选用相同的配置。

3.更换下载源

在安装完Ubuntu后,需要保证apt source是国内的(这个过程不要使用阿里的源,我试过,出了问题),不然如果是国外的话会很慢很慢的。具体做法是

    3.1.复制源文件备份,以防万一

我们要修改的文件是sources.list,它在目录/etc/apt/下,sources.list是包管理工具apt所用的记录软件包仓库位置的配置文件,同样类型的还有位于 同目录下sources.list.d文件下的各种.list后缀的各文件。命令如下:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

    3.2.编辑源列表文件

命令如下:

sudo vim /etc/apt/sources.list

如果报错:sudo:vim:command not found    说明没装vim编辑器,使用命令:sudo apt-get install vim 安装即可

打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是http://cn.xxxxx之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入:

:%s/us./cn./g

就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。 

    3.3.更新软件列表

运行如下命令:

sudo apt-get update

 

4. Go的安装

Ubuntu的apt-get虽然提供了Go的安装,但是版本比较旧,最好的方法还是参考官方网站 https://golang.org/dl/ ,下载最新版的Go。具体涉及到的命令包括:

wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz
【注意:不要使用apt方式安装go,apt的go版本太低了!】

接下来编辑当前用户的环境变量:

vi ~/.profile

添加以下内容:

export PATH=$PATH:/usr/local/go/bin 
export GOROOT=/usr/local/go 
export GOPATH=$HOME/go 
export PATH=$PATH:$HOME/go/bin

编辑保存并退出vi后,记得把这些环境载入:

source ~/.profile

我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹

cd ~
mkdir go

5. Docker安装

因为国内docker全面被墙,完全无法安装或是下载镜像。所以我们有了国内的镜像源。不过这次有点不同,这次叫做加速器:
https://dashboard.daocloud.io/nodes/new

注意:18.04不要使用阿里的docker源

 

curl -sSL https://get.daocloud.io/docker | sh

如果提示:Command 'curl' not found, but can be installed with:sudo apt install curl,可以运行:sudo apt install curl,安装curl

下面的输出说明docker安装成功了

# Executing docker install script, commit: 4957679
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sudo -E sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic edge" > /etc/apt/sources.list.d/docker.list
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sudo -E sh -c docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:49:01 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker wesley

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

接下来需要修改当前用户(我使用的用户叫wesley)权限:

sudo usermod -aG docker wesley

安装完一定要重启系统。

6. Docker-Compose的安装

Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本:

sudo apt-get install python-pip

然后是安装docker-compose,我们从官方网站(https://github.com/docker/compose/releases)下载也可以从国内的进行DaoClound下载,为了速度快接下来从DaoClound安装Docker-compose,运行脚本:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
sudo mv ~/docker-compose /usr/local/bin/docker-compose 
chmod +x /usr/local/bin/docker-compose

7. Fabric源码下载

我们可以使用Git命令下载源码,首先需要建立对应的目录,然后进入该目录,Git下载源码:

mkdir -p ~/go/src/github.com/hyperledger 
cd ~/go/src/github.com/hyperledger 
git clone https://github.com/hyperledger/fabric.git

如果出现:Command 'git' not found, but can be installed with:sudo apt install git,运行sudo apt install git安装git。

由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可:

cd ~/go/src/github.com/hyperledger/fabric
git checkout v1.0.0

8. 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

这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。

下载完毕后的输出如下:

===> List out hyperledger docker images
hyperledger/fabric-tools       latest              0403fd1c72c7        17 months ago       1.32GB
hyperledger/fabric-tools       x86_64-1.0.0        0403fd1c72c7        17 months ago       1.32GB
hyperledger/fabric-couchdb     latest              2fbdbf3ab945        17 months ago       1.48GB
hyperledger/fabric-couchdb     x86_64-1.0.0        2fbdbf3ab945        17 months ago       1.48GB
hyperledger/fabric-kafka       latest              dbd3f94de4b5        17 months ago       1.3GB
hyperledger/fabric-kafka       x86_64-1.0.0        dbd3f94de4b5        17 months ago       1.3GB
hyperledger/fabric-zookeeper   latest              e545dbf1c6af        17 months ago       1.31GB
hyperledger/fabric-zookeeper   x86_64-1.0.0        e545dbf1c6af        17 months ago       1.31GB
hyperledger/fabric-orderer     latest              e317ca5638ba        17 months ago       179MB
hyperledger/fabric-orderer     x86_64-1.0.0        e317ca5638ba        17 months ago       179MB
hyperledger/fabric-peer        latest              6830dcd7b9b5        17 months ago       182MB
hyperledger/fabric-peer        x86_64-1.0.0        6830dcd7b9b5        17 months ago       182MB
hyperledger/fabric-javaenv     latest              8948126f0935        17 months ago       1.42GB
hyperledger/fabric-javaenv     x86_64-1.0.0        8948126f0935        17 months ago       1.42GB
hyperledger/fabric-ccenv       latest              7182c260a5ca        17 months ago       1.29GB
hyperledger/fabric-ccenv       x86_64-1.0.0        7182c260a5ca        17 months ago       1.29GB
hyperledger/fabric-ca          latest              a15c59ecda5b        17 months ago       238MB
hyperledger/fabric-ca          x86_64-1.0.0        a15c59ecda5b        17 months ago       238MB

我们运行以下命令检查下载的镜像列表:

docker images

7.启动Fabric网络并完成ChainCode的测试

仍然留在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。我们要启动Fabric网络,并自动运行Example02 ChainCode的测试,执行一个命令:

./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启动1Orderer+4Peer+1CLI的Fabric容器。

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

最后运行完毕,我们可以看到这样的界面:

===================== Query on PEER3 on channel 'mychannel' is successful ===================== 

===================== All GOOD, End-2-End execution completed ===================== 


 _____   _   _   ____            _____   ____    _____ 
| ____| | \ | | |  _ \          | ____| |___ \  | ____|
|  _|   |  \| | | | | |  _____  |  _|     __) | |  _|  
| |___  | |\  | | |_| | |_____| | |___   / __/  | |___ 
|_____| |_| \_| |____/          |_____| |_____| |_____|

如果您看到这个界面,这说明整个Fabric网络已经通了。

8.手动测试一下Fabric网络

fabric提供了SDK和CLI两种交互方式,这里我们使用的是CLI。
这里我们使用官方提供的小例子进行测试,在官方例子中,channel名字是mychannel,链码(智能合约)的名字是mycc。
首先要登录到CLI这个容器中,才能执行Fabric的CLI命令:

docker exec -it cli bash

这时用户名变为root@caa22f87a5bf,当前目录变为/opt/go/src/github.com/hyperledger/fabric/peer#,接着可执行peer命令,体验区块链的命令行使用方式。

8.1.查看a账户的余额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

此时我们可以看到控制台输出有:

Query Result: 90
2019-01-01 07:45:39.167 UTC [main] main -> INFO 007 Exiting.....

这里90就是a账户的余额
8.2.调用链码,转账

这里我们让b账户向a账户转账20:

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","a","b","20"]}'

运行结果为:

2019-01-01 07:49:56.965 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2019-01-01 07:49:56.965 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2019-01-01 07:49:56.978 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2019-01-01 07:49:56.978 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2019-01-01 07:49:56.978 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08A4B7ACE10510...696E766F6B650A01610A01620A023230 
2019-01-01 07:49:56.979 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: F49520C6BE059FA2DEFA269FA6155B8ACB6B3F057DDD94C8B485CC5B93DAF175 
2019-01-01 07:49:56.993 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0A95070A6708031A0C08A4B7ACE10510...FB539F9550274EAB7C7E9DA28651DF3F 
2019-01-01 07:49:56.994 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: 29C34053A6AAF7A894A7C35864E7850043E778B4E93BD3CF2943F4C29DA409D6 
2019-01-01 07:49:56.999 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK" > payload:"\n eQO*\024\200R\020a\3553T\034F\351dM\206`2r-\265p\362\277l\202\317\2343V\022Y\nE\022\024\n\004lscc\022\014\n\n\n\004mycc\022\002\010\003\022-\n\004mycc\022%\n\007\n\001a\022\002\010\004\n\007\n\001b\022\002\010\004\032\007\n\001a\032\00270\032\010\n\001b\032\003230\032\003\010\310\001\"\013\022\004mycc\032\0031.0" endorsement:<endorser:"\n\007Org1MSP\022\200\006-----BEGIN -----\nMIICGTCCAb+gAwIBAgIQbwrMxZPxvW84hZDBxjiXlTAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\nb3JnMS5leGFtcGxlLmNvbTAeFw0xOTAxMDEwNzI4NDRaFw0yODEyMjkwNzI4NDRa\nMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcxLmV4YW1wbGUuY29tMFkw\nEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU1pRilRoJ4ooacPUEfRXjslJeSK48QRN\nWeJCAYA1f017Z96xcvLE+nP25it1/Mye82UYhREhN5aqc8lh/PYxjqNNMEswDgYD\nVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAg2NnH3gkLQNHO\nFjl9i96svwTwKUtFzRXw11RUSgZq3CkwCgYIKoZIzj0EAwIDSAAwRQIhAKlS36IH\nHvMMW28G/m9tSHwZUg6D4fM+8fLgd48gHnZEAiBOuHhi5ii75bMOUF+1DAi04wcY\nfM1KC2VF1lXR5iFxjw==\n-----END -----\n" signature:"0E\002!\000\300CN&\225\030f\0258\274K\303\330\222\2607\273kR\320\363\371\353\016\006\307\272\3203_{.\002 :Pq\221o\273\331\205\256\257\017\371\271\302\240\251\373S\237\225P'N\253|~\235\242\206Q\337?" > 
2019-01-01 07:49:57.002 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200 
2019-01-01 07:49:57.002 UTC [main] main -> INFO 00b Exiting.....

现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况:

再次运行

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

结果为

Query Result: 70
2019-01-01 07:55:58.353 UTC [main] main -> INFO 007 Exiting.....

果然,一切正常。最后我们要关闭Fabric网络,首先需要运行

exit

命令退出cli容器。

关闭Fabric的命令与启动类似,命令为:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli

./network_setup.sh down

现在我们整个Fabric的环境已经测试完毕,一切正常,接下来我们就是去做自己的区块链的开发。

以上大部分是【博客园深蓝居】的博客内容,是基于Ubuntu16.04系统的。另有一部分配置是在ubuntu18上经过多次失败后的经验总结,如果需要在Ubuntu18.04上配置Fabric,建议按照我的步骤。

 

9.常见错误及解决方法

9.1. 如果发现运行 ./network_setup.sh up命令 后提示在…fabric/release/linux-amd64/bin文件夹下找不到指定文件

解决办法:
可以在~/go/src/github.com/hyperledger/fabric/scripts文件下找到 bootstrap.1.0.0.sh文件,手动运行它 ./bootstrap.1.0.0.sh, 此时可以在当前文件夹生成一个bin文件夹,bin里面的文件就是我们需要的,将它拷贝到前面的…fabric/release/linux-amd64/bin文件夹下

2. 如果出现:Error on outputBlock: Error writing genesis block: open ./channel-artifacts/genesis.block: is a directory不能生成创世块的错误。

解决办法:
可以在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/channel-artifacts目录下,将genesis.block这个目录删除,rm -rf genesis.block/

3. 如果出现:.ERROR: for orderer.example.com Cannot start service orderer.example.com: b’OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58:

解决办法:
执行./network_setup.sh down 清除网络后再启动即可

 

参考文献

1、使用DaoCloud安装Docker和镜像(https://www.jianshu.com/p/bc35ea82b61d

2、快速搭建一个Fabric 1.0的环境https://www.cnblogs.com/studyzy/p/7437157.html

3、联盟链初识以及Fabric环境搭建流程(https://blog.csdn.net/xilibi2003/article/details/84568354)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值