当前位置:网站首页>Hyperledger Fabric2.0安装尝试

Hyperledger Fabric2.0安装尝试

2020-12-07 10:22:52 osc_8eb8cps3



前言

主要记录一下初次探索区块链技术的简要过程


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境部署步骤

1.安装基本工具

首先我们要明确我们运行的基础环境是Ubuntu18.04版本
代码如下(示例):

sudo apt install git  //安装git
sudo apt install curl	//安装curl

安装pip并更新
sudo apt install python-pip
pip install --upgrade pip

2.安装docker

代码如下(示例):

1.首先需要安装17.06.2-ce或更高版本,建议安装最新版本的docker。

2.安装docker之前未确保docker版本过低我们选择卸载以前的docker,重新安装docker

sudo apt-get remove docker docker-engine docker.io

3.卸载docker完成之后我开始安装docker,分别执行一下命令

sudo apt install docker.io
docker -v //查看版本
//重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker

3.安装docker-compose

sudo apt install docker-compose
docker-compose -v
sudo chmod +x /usr/share/doc/docker-compose

4.安装Go语言

首先安装一些必要的依赖:

sudo apt install libtool libltdl-dev

去该网站 https://studygolang.com/dl 下载Go语言的安装包,我下的是目前最新版本: go1.14.6.linux-amd64.tar.gz

将压缩包复制到/usr/local路径下,然后进行解压:

wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz

下载完 Golang 压缩包之后,使用 tar 命令将压缩包解压到指定的 /usr/local/ 路径下,命令如下

sudo tar -xzvf go1.14.6.linux-amd64.tar.gz -C /usr/local/

3.下面我们开始配置环境变量

sudo vim /etc/profile

在文件末尾加入如下代码

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

4.使用 source 命令,使刚刚添加的配置信息生效

source /etc/profile

5.使用 go version 命令验证是否安装成功
如果显示了版本号,就说明安装成功。我的版本号是这样的

go version
go version go1.14.6 linux/amd64

二、Hyperledger Fabric安装

1.拉取fabric源码

首先创建文件夹(默认在学员/home/stack/目录下,这里的stack改为你自己的用户名)

mkdir -p go/src/github.com/hyperledger/

进入刚刚创建的文件夹内

cd go/src/github.com/hyperledger/

从github上拉取fabric的源码:

git clone https://hub.fastgit.org/hyperledger/fabric.git

修改bootstrap.sh脚本

cd fabric/
cd scripts/
vim ~/go/src/github.com/hyperledger/fabric/scripts/bootstrap.sh

修改脚本
在这里插入图片描述


这里的samples我们后续再下载

运行bootstrap.sh脚本

sudo ./bootstrap.sh

注:这个地方可能仍然很慢:可以试试换docker的源
参考:换源参考(亲测有效)

拉取fabric-samples
进入目录

cd ~/go/src/github.com/hyperledger/fabric/scripts

然后开始拉取fabric-samples

git clone https://hub.fastgit.org/hyperledger/fabric-samples.git

下载二进制文件并解压

cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples
wget https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric/releases/download/v2.2.1/hyperledger-fabric-linux-amd64-2.2.1.tar.gz

然后在当前目录解压包

sudo tar -xzvf hyperledger-fabric-linux-amd64-2.2.1.tar.gz

但是这里并没有结束!!!!!解压后fabric-samples下有一个bin文件夹,里面其实少了两个有关fabric-ca的文件,这会导致后面运行找不到二进制文件的问题。所以,接下来我按照官网的方法进行如下操作:

cd   (此命令回到用户根目录)
mkdir test (创建一个临时的文件夹)
cd /test

执行官网给出的命令

curl -sSL https://bit.ly/2ysbOFE | bash -s

下载完毕后,test文件夹下也会有一个fabric-samples的文件夹,其下面也有一个bin文件夹,打开可以看到下面相比上文多了两个可执行文件fabric-ca-client ,fabric-ca-server(***正是我们所缺少的!***)
将这个bin文件夹整个复制到我们之前的fabric-samples下

cp -r /home/stack/test/fabric-samples/bin /home/stack/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/

(根据自己的目录情况而定,两个路径中间有一个空格)
回到我们之前的目录下

cd /home/stack/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network

2.启动Fabric网络,调用测试链码

启动 Fabric 网络

sudo ./network.sh up

建立通道

sudo ./network.sh createChannel

12在通道上启动链码
(这里建议再执行一遍
source /etc/profile 不然下一步可能出现错误)

sudo ./network.sh deployCC

13进行环境变量设置(必须在test-network目录下)

sudo vim /etc/profile 

添加如下信息:

export PATH=${
   
      PWD}/../bin:${
   
      PWD}:$PATH
export FABRIC_CFG_PATH=${
   
      PWD}/../config/

继续添加如下环境变量

# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

完成后
source /etc/profile(必须在test-network目录下)

运行

peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'

(但是这里应该会报错)

因为没有将fabcar加入通道!

所以,退回到上一级目录

cd ..

进入fabcar目录

cd /fabcar

运行startFabric.sh可执行文件

./startFabric.sh

16若是运行成功,则回到test-network目录

cd ..
cd /test-network

这时再次运行

peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'

得到汽车列表
结束!

三、在fabric-sample网络环境下部署自己的链码

建议进入超级管理账号(命令:su - ,然后输入密码就可以进入。具体功能还有怎么操作可以百度,这个好理解)。然后后续操作中不要再加sudo!!
这里主要看个人选择吧,实际的开发案例中都是使用用户账号,而非root权限账号,但是如果使用root权限来进行操作的话会比较容易成功,所以以下以root权限账户为例:
首先是docker的换源(根据个人网络环境参考)

cd /etc/docker
cat daemon.json
{
   
      
	"registry-mirrors": [
	"https://docker.mirrors.ustc.edu.cn",
	"https://kfwkfulq.mirror.aliyuncs.com",
	"https://2lqq34jg.mirror.aliyuncs.com",
	"https://pee6w651.mirror.aliyuncs.com",
	"https://registry.docker-cn.com",
	"http://hub-mirror.c.163.com"
]
}

systemctl daemon-reload
systemctl restart docker

然后可以将自己的链码替换掉fabcar里面的内容,也可以自己再新建一个文件夹编写自己的链码文件
这里我直接替换掉了fabcar的内容
进入fabric-samples/test-network目录

cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network

以下内容参考自大佬的博客内容
https://blog.csdn.net/mutou___/article/details/110039475#comments_13973567

3.1 恢复到已知的初始状态

使用以下命令结束所有活动或陈旧的Docker容器并删除以前生成的部件

sudo ./network.sh down

3.2 启动测试网络

sudo ./network.sh up createChannel

该createChannel命令创建一个以mychannel两个通道成员Org1和Org2命名的通道。该命令还将属于每个组织的peer节点加入通道。如果成功创建了网络和通道,则可以在日志中看到以下消息:

Channel successfully joined====

3.3、设置Logspout(可选)

此步骤不是必需的,但是对于故障排除链码非常有用。
Fabric示例monitordocker.sh中的commercial-paper示例已包含用于安装和配置Logspout的脚本。

打开一个新的终端
进入fabric-samples/test-network目录

cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network

将monitordocker.sh脚本从commercial-paper示例复制到fabric-samples/test-network工作目录中

sudo cp ../commercial-paper/organization/digibank/configuration/cli/monitordocker.sh .

启动Logspout

sudo ./monitordocker.sh net_test

成功后可以看到类似于以下内容的输出:

Starting monitoring on all containers on the network net_test
Unable to find image 'gliderlabs/logspout:latest' locally
latest: Pulling from gliderlabs/logspout
188c0c94c7c5: Already exists 
f76076d59b2f: Pull complete 
d09edbff691c: Pull complete 
Digest: sha256:2b70c1989a00a2775311e66aec8be6e2479deb0e0c0c0be603de1863f49027e8
Status: Downloaded newer image for gliderlabs/logspout:latest
1c6c61c50c02e45282d565c8177d81358945a1ab59065a822491ee88fcac1ad6

3.4、打包智能合约

注意:以下为由Go语言编写的智能合约打包步骤,JavaScript打包见第八节。

打开一个新的终端
安装chaincode依赖项
依赖项go.mod在fabric-samples/chaincode/fabcar/go目录中的文件中列出,该go.mod文件将Fabric合约API导入到智能合约包中。

cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/chaincode/fabcar/go
sudo GO111MODULE=on go mod vendor

返回到test-network所在目录,以便可以将链码与其他网络部件打包在一起。

cd ../../../test-network

将bin目录中二进制文件添加到CLI路径
所需格式的链码包可以使用peer CLI创建,使用以下命令将这些二进制文件添加到你的CLI路径。

export PATH=${
   
      PWD}/../bin:$PATH

设置FABRIC_CFG_PATH为指向fabric-samples中的core.yaml文件

export FABRIC_CFG_PATH=$PWD/../config/

创建链码包
使用peer lifecycle chaincode package命令创建链码包。

sudo peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1

命令解释:此命令将在当前目录中创建一个名为basic.tar.gz的软件包。–lang标签用于指定链码语言,–path标签提供智能合约代码的位置,该路径必须是标准路径或相对于当前工作目录的路径,–label标签用于指定一个链码标签,该标签将在安装链码后对其进行标识。建议您的标签包含链码名称和版本。

现在,我们已经创建了链码包,我们可以在测试网络的对等节点上安装链码。

3.5、安装链码包

打包Fabcar智能合约后,我们可以在peer节点上安装链码。需要在将认可交易的每个peer节点上安装链码。因为我们将设置背书策略以要求来自Org1和Org2的背书,所以我们需要在两个组织的peer节点上安装链码:peer0.org1.example.com和peer0.org2.example.com。

Org1 peer节点安装链码
先在Org1 peer节点上安装链码。

设置以下环境变量,以Org1管理员的身份操作peer CLI。

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

使用 peer lifecycle chaincode install 命令在peer节点上安装链码。

sudo peer lifecycle chaincode install fabcar.tar.gz

如果命令成功,则peer节点将生成并返回包标识符。下一步,此包ID将用于通过链码。你应该看到类似于以下内容的输出:

2020-11-24 20:59:00.766 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506\022\010fabcar_1" > 
2020-11-24 20:59:00.775 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506

Org2 peer节点安装链码
设置以下环境变量,以Org2管理员的身份操作peer CLI。

export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
   
      PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_ROOTCERT_FILE=${
   
      PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
   
      PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

使用 peer lifecycle chaincode install 命令在peer节点上安装链码。

sudo peer lifecycle chaincode install fabcar.tar.gz

注意:安装链码时,链码由peer节点构建。如果智能合约代码有问题,install命令将从链码中返回所有构建错误。

3.6、通过链码定义

安装链码包后,需要通过组织的链码定义。该定义包括链码管理的重要参数,例如名称,版本和链码认可策略。

如果组织已在其peer节点上安装了链码,则他们需要在其组织通过的链码定义中包括包ID。包ID用于将peer节点上安装的链码与通过的链码定义相关联,并允许组织使用链码来认可交易。

查询包ID
可以使用peer lifecycle chaincode queryinstalled命令来查询peer节点,从而找到链码的包ID。

sudo peer lifecycle chaincode queryinstalled

包ID是链码标签和链码二进制文件的哈希值的组合。每个peer节点将生成相同的包ID。你应该看到类似于以下内容的输出:

Installed chaincodes on peer:
Package ID: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: fabcar_1

通过链码时,我们将使用包ID,因此,将包ID保存为环境变量。将返回的包ID粘贴到下面的命令中。
注意:包ID对于所有用户而言都不相同,因此需要使用上一步中从命令窗口返回的包ID来完成此步骤。而不是直接复制命令!!!

export CC_PACKAGE_ID=fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506

Org2通过链码定义
因为已经设置了环境变量为peer CLI作为Orig2管理员进行操作,所以我们可以以Org2组织级别将Fabcar的链码定义通过。使用 peer lifecycle chaincode approveformyorg命令通过链码定义:

sudo peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${
   
      PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

Org1通过链码定义
设置以下环境变量以Org1管理员身份运行:

export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=${
   
      PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051

Org1通过链码定义:

sudo peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${
   
      PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.7、将链码定义提交给通道

使用peer lifecycle chaincode checkcommitreadiness命令来检查通道成员是否已批准相同的链码定义:

sudo peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${
   
      PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
1

该命令将生成一个JSON映射,该映射显示通道成员是否批准了checkcommitreadiness命令中指定的参数:

{
   
      
	"approvals": {
   
      
		"Org1MSP": true,
		"Org2MSP": true
	}
}

由于作为通道成员的两个组织都同意了相同的参数,因此链码定义已准备好提交给通道。你可以使用peer lifecycle chaincode commit命令将链码定义提交到通道。commit命令还需要由组织管理员提交。

sudo peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${
   
      PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles ${
   
      PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${
   
      PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

可以使用peer lifecycle chaincode querycommitted命令来确认链码定义已提交给通道。

sudo peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar --cafile ${
   
      PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

如果将链码成功提交给通道,该querycommitted命令将返回链码定义的顺序和版本:

Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]

到此内容基本结束,可以开始调用你自己的链码了。


版权声明
本文为[osc_8eb8cps3]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4266314/blog/4777621