一 搭建开发环境
1.1安装Git
sudo apt-get install git
1.2 安装curl
sudo apt-get install curl
1.3 安装docker
# 安装并检查版本sudo apt-get -y install docker-composedocker --versiondocker-compose --version# 提示,以后只要碰到docker有关的错误,先执行2.3.1步骤#1.重启dockersudo systemctl start docker#设置系统启动时docker启动,可选sudo systemctl enable docker#2.将用户添加到docker组,确保在用户命令下可以执行sudo gpasswd -a $USER docker#3.更新用户组newgrp docker # docker信息docker info# 测试docker,若报错详见文末附加问题1docker run hello-world
1.4 安装go
新建目录、下载、解压
mkdir ~/downloadcd ~/download# 下载wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz# 解压sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
配置环境
mkdir $HOME/go#用vi打开~./bashrc,配置环境变量vi ~/.bashrc# 在最下方插入export GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin#使配置的环境变量生效source ~/.bashrc#检查是否配置正确go version# 配置goproxy环境变量加速国内下载go env -wGOPROXY=https://goproxy.io
1.5 安装JQ
sudo apt-get install jq
二 安装实例、二进制和docker镜像
2.1 新建目录,克隆fabric-samples
仓库
mkdir -p $GOPATH/src/github.com/hyperledgercd $GOPATH/src/github.com/hyperledger# 获取fabric-samples源码git clone https://github.com/hyperledger/fabric-samples.git
选择适当的版本标签,进入目录,切换分支
cd fabric-samples# 可自行选择版本git checkout release-2.2#查看版本git branch
2.2 下载docker镜像
将指定版本的 Hyperledger Fabric 平台特定二进制文件和配置文件安装到 fabric-samples 下的/bin
和/config
目录中,下载指定版本的 Hyperledger Fabric docker 镜像
2.2.1 配置镜像源
sudo vi /etc/docker/daemon.json#把以下代码加进去{"registry-mirrors":["https://registry.docker-cn.com"]}
#如果你想要最新的生产发布版本,忽略所有的版本标识符。# curl -sSL https://bit.ly/2ysbOFE | bash -s# curl -sSL https://bit.ly/2ysbOFE | bash -s -- # 若报错详见文末附加问题2curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18# 若不行试试下面这个curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s2.2.0 1.4.7 0.4.18
注:以上curl主要是为了获得一个bootstrap.sh
的脚本文件并执行,可能会出现拒绝连接或者访问,以及网络故障等问题
可以去去fabric中下载bootstrap.sh源码即可。
- 需要先下载zip
https://github.com/hyperledger/fabric.git
(master分支) - 再将文件
fabric/scripts/bootstrap.sh
移动到目录$HOME/go/src/github.com/
下,也就是虚拟机fabric-samples目录 - 在fabric-samples目录下执行下面的指令
cat bootstrap.sh |bash -s
结果:
2.2.2 将go版本匹
查看安装的go版本
go version
cd chaincode-gosudo vi go.mod# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配
2.2.3环境变量设置
vi ~/.bashrc# 添加下面的变量export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin# 使之生效source ~/.bashrc# 检验成功否fabric-ca-client version
三 使用fabric测试网络
到了这里说明环境已经部署完毕,接下来要使用测试网络,需要注意的是最好在一个完整的时间段操作。
首先开启debug模式
#开启debug模式export FABRIC_LOGGING_SPEC=debug
3.1 启动测试网络
进入fabric-samples
下的test-network,
执行以下命令以执行脚本network.sh
./network.sh up
执行完毕后看到,我们创建了排序组织orderer、联盟成员org1的peer0节点和联盟成员org2的peer0节点以及相应的镜像image
3.2测试网络的组成部分
执行
docker ps -a
Fabric网络成员的所有组织称为联盟,此测试网络有两个联盟成员org1、2,一个维护网络排序服务的组织orderer,每个组织各运营一个对等节点,peer0.org1.example.com和peer0.org2.example.com。peer节点是fabric网络的基本组件,最常见的peer节点就是背书节点,对等节点存储区块链账本进行交易之前的验证。
3.3 创建一个channel
使用./network.sh createChannel
在org1和org2之间创建通道并加入他们的对等节点,如下有几种方法:
- 创建Channel,系统默认命名为
mychannel
- channel名称限制
- 仅包含小写ASCII字母数字,点“。”和破折号“-”
- 少于250个字符
- 以字母开头
# 1.不输入自定义名称通道,默认为mychannel./network.sh createChannel# 2.输入自定义名称,可以创建多个不同名称通道./network.sh createChannel -c channel1./network.sh createChannel -c channel2# 3.也可以建立网络创建通道一起./network.sh up createChannel
我这里默认通道名
执行完成显示:
3.3在通道启动一个链码
在fabric 中,链码就是指的智能合约。
在创建通道后,开始部署链码与通道账本交互,链码包含区块链账本上资产的业务逻辑,用的go语言编写。由成员运行的应用程序网络可以在账本上调用智能合约创建,更改和转让资产。
为确保交易有效,使用智能合约创建的交易需要多个组织签名才能提交到账本,也就是背书,而智能合约也定义了背书策略,比如需要成员2/3同意便通过,一半成员同意通过等等。
创建完通道,现在开始启动链码
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
链码启动成功
3.4与网络互动,配置peer指令
均在test-network
文件夹下执行
3.4.1 把fabric-samples的bin文件下的二进制文件添加到CLI路径:
export PATH=${PWD}/../bin:$PATH
3.4.2 将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
3.4.3设置环境变量,允许用户作为org1操作peer的CLI:
# Environment variables for Org1export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org1MSP"#CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspexport CORE_PEER_ADDRESS=localhost:7051
该CORE_PEER_TLS_ROOTCERT_FILE
和CORE_PEER_MSPCONFIGPATH
环境变量指向的ORG1加密材料organizations
文件夹。
3.4.4 初始化账本
接下来可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产,运行如下命令,用一些资产来初始化账本。
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":[]}'
3.4.5用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"]}'
更改结果:[{"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":"Christopher","Size":15}]
发现ID为asset6的拥有者已经变成了Christopher。
3.4.6我们可以通过org2的peer来查询,在这之前我们先设置一下org2的环境变量
# Environment variables for Org2export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org2MSP"export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspexport CORE_PEER_ADDRESS=localhost:9051
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
查询运行在 mychannel 上的asset-transfer-basic
链码peer0.org2.example.com
结果和org1一样asset6转给了名叫Christopher的人.
3.4.7至此测试完毕,我们关闭网络./network.sh down
./network.sh down
3.5使用认证机构建立网络
Hyperledger Fabric使用公钥基础设施(PKI)来验证所有网络参与者的行为。 每个节点,网络管理员和用户提交的交易需要具有公共证书和私钥以验证其身份。 这些身份必须具有有效的信任根源,该证书是由作为网络中的成员组织颁发的。
在测试网络中,network.sh在创建节点之前就使用cryptogen工具创建了这些加密材料。
在text-network目录下执行
./network.sh up -ca
结果:
可以看到脚本启动了三个CA,分别是orderer、org1和org2。
下面还可以查看一下org1的MSP文件夹,其中包含了每个身份的证书和私钥:
tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/# tree命令并不是默认安装的,如果没有该命令,按照提示先安装
organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
└── msp
├── cacerts //根CA服务器证书
│└── localhost-7054-ca-org1.pem
├── config.yaml
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── keystore //节点的私钥
│└── 1018d5470ce399ed212639a454a80d1ea96592b01bed4c0560e11b65c34ed1b6_sk
├── signcerts
│└── cert.pem //账户证书文件
└── user5 directories, 6 files
关闭网络:
#关闭网络./network.sh down