记录Hyperledger Fabric的安装部署以及链码运行过程
文章目录
前言
主要记录一下初次探索区块链技术的简要过程
提示:以下是本篇文章正文内容,下面案例可供参考
一、环境部署步骤
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
修改脚本
为
运行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]
到此内容基本结束,可以开始调用你自己的链码了。