本文参考网上安装 fabric 过程,包含遇到的问题及解决办法。
1、Fabric 介绍
Hyperledger Fabric 是一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台,专为在企业环境中使用而设计。智能合约,在 Fabric 中称之为“链码”,作为受信任的分布式应用程序,从区块链中获得信任,在节点中达成基本共识。它是区块链应用的业务逻辑。
Fabric 由以下模块化的组件组成:
- 可插拔的排序服务对交易顺序建立共识,然后向节点广播区块;
- 可插拔的成员服务提供者负责将网络中的实体与加密身份相关联;
- 可选的P2P gossip 服务通过排序服务将区块发送到其他节点;
- 智能合约(“链码”)隔离运行在容器环境(例如 Docker)中。它们可以用标准编程语言编写,但不能直接访问账本状态;
- 账本可以通过配置支持多种 DBMS;
- 可插拔的背书和验证策略,每个应用程序可以独立配置。
2、环境安装过程
本次安装环境使用 VMware Workstation 虚拟机安装 CentOS7,其中需要安装 Docker、Fabric、golang等,具体安装过程如下:
(1)安装前配置
更新yum:yum update
yum源配置:
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum makecache
其他软件下载:
yum install -y curl vim gcc gcc-c++ git
增加docker yum 源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(2)docker 安装
删除之前的docker配置:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
使用官方脚本自动安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
使用 docker --version 命令查看版本:
(3)docker-compose 安装
使用curl命令从网址中拉入文件到/usr/local/bin/docker-compose文件下:docker-compose地址
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
给docker-compose文件加上权限:
sudo chmod +x /usr/local/bin/docker-compose
检验docker-compose是否安装成功:
docker-compose version
(4)安装 go 环境
安装git:
yum install -y git
cd /opt
mkdir golang
cd golang
wget https://studygolang.com/dl/golang/go1.14.10.linux-amd64.tar.gz
tar -zxvf go1.14.10.linux-amd64.tar.gz
设置环境变量:
vim /etc/profile
追加内容:
export GOPATH=/opt/gopath
export GOROOT=/opt/golang/go
export PATH=$GOROOT/bin:$PATH
export FABRIC=$GOPATH/src/github.com/hyperledger/fabric
刷新查看版本:
source /etc/profile
go version
go env
(5)拉取 fabric 源码
获取源码:
mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
相关文件和镜像下载:(下载的fabric-samples会在scripts文件夹下)
cd fabric/scripts
./bootstrap.sh # 执行脚本下载文件和镜像
(6)测试网络
进入test-network:
cd fabric-samples/test-network
运行以下命令删除所有运行中任何容器:
./network.sh down
通过以下命令来启动网络:
./network.sh up
运行以下命令以列出计算机上运行的所有Docker容器。可以看到该network.sh脚本创建的三个节点:
docker ps -a
5.创建频道。使用network.sh
脚本创建频道,运行以下命令以使用默认名称创建频道mychannel
./network.sh createChannel
成功后可以看到以下结果:
启动链码:
./network.sh deployCC
遇到错误1:
替换执行命令:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
遇到错误2:
执行命令设置 GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
再次执行生成链码命令,可以看到以下结果:
启用测试网络后,可以使用peerCLI与网络进行交互。peerCLI允许您从CLI调用已部署的智能合约,更新通道或安装和部署新的智能合约。
在test-network中执行以下命令:
二进制文件添加到您的CLI路径:
export PATH=${PWD}/../bin:$PATH
设置FABRIC_CFG_PATH为指向存储库中的core.yaml
文件fabric-samples
:
export FABRIC_CFG_PATH=$PWD/../config/
设置环境变量,允许以peer Org1的形式操作CLI:
# 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
用于安装和启动资产转移(基本)链码,调用(Go)链码的功能以在分类帐上放置资产的初始列表:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --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 -c '{"function":"InitLedger","Args":[]}'
初始化成功可以看到以下内容:
从CLI查询分类帐。运行以下命令以获取已添加到渠道分类帐的资产列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
查询得到以下内容:
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}]
当要转移或更改分类帐上的资产时,将调用链码。使用以下命令通过调用资产转移(基本)链码来更改分类帐上资产的所有者:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --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 -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
命令执行成功可以看到以下结果:
2021-09-19 20:37:48.166 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
关闭测试网络:
./network.sh down
该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker注册表中移除链码映像。该命令还会从以前的运行中删除通道工件和docker卷,从而在遇到任何问题时允许您再次运行。