由于项目需要,将服务器上的Fabric1.4改为Fabric2.0
已经配置好go、docker、node等环境,详情见上一章 Fabric(一)部署Fabric 1.4
感谢博客:https://blog.csdn.net/hnclsl/article/details/105542864
官方文档参考 https://hyperledger-fabric.readthedocs.io/en/latest/install.html
Fabric2.x需要go1.13+,所以重新安装go为1.14
go version
https://www.jianshu.com/p/662a8411c696
由于github上下载速度实在感人,于是在拉取仓库到码云
https://gitee.com/jessyl/fabric
https://gitee.com/jessyl/fabric-samples
因为在之后的镜像拉取中,有很多镜像是国外源,所以速度很慢,故配置阿里云镜像加速器
参考博客:
(1)aliyun官方教程
(2)Docker 配置国内源加速镜像下载
(3)利用阿里云镜像加速器对docker镜像源加速
(1)进入/root/go/src/github.com/hyperledger
文件夹拉取fabric源码
git clone https://gitee.com/jessyl/fabric.git
拉取之后默认为2.2(最新版本),所以如果需要其他版本的小伙伴可以
git checkout fabric2.1
(2)进入fabric文件夹,拉取fabric-samples文件夹
git clone https://gitee.com/jessyl/fabric-samples.git
(1)进入fabric文件夹,会发现sampleconfig,其实就是fabric-samples的config文件夹
(2)将sampleconfig文件夹移动到fabric-samples中,并且重命名为config
cp -r sampleconfig /root/go/src/github.com/hyperledger/fabric/fabric-samples
cd fabric-samples
mv sampleconfig config
(1)回到fabric目录下,进行源码编译,请耐心等待很长一段时间
make all
(2)在fabric文件夹下会生成build文件夹,里面含有bin和images
在bin目录中有如下二进制文件:
(3)将bin目录复制到fabric-sample 文件夹中
cp -r build/bin /root/go/src/github.com/hyperledger/fabric/fabric-samples
(4)设置环境变量
将bin目录和config目录都添加到环境变量中
可以看看 https://blog.csdn.net/weixin_37825371/article/details/90752386
vim /etc/profile
source /etc/profile
根据官网fabric-samples描述,各个文件夹功能如下表
(1)进入test-work文件夹,启动测试网络
(2)启动成功
(3)查看docker
docker ps -a
(1)使用network.sh脚本在Org1和Org2之间创建频道,并将其对等方加入该频道。
运行以下命令以使用默认名称创建频道mychannel:
./network.sh createChannel
(1)命令
./network.sh deployCC
tips:
如果出现因为访问无法下载
解决方法:设置go代理
https://www.cnblogs.com/zhangmingcheng/p/12294156.html
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
(1)启动测试网络
./network.sh up
./network.sh createChannel
./network.sh deployCC
(2)在test-network目录进行操作,将这些二进制文件添加到CLI路径
export PATH=${PWD}/../bin:${PWD}:$PATH
设置FABRIC_CFG_PATH指向存储库中的core.yaml文件fabric-samples:
export FABRIC_CFG_PATH=$PWD/../config/
(3)设置环境变量,以允许您以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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
(4)获取已添加到通道分类帐中的汽车的列表
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
出现报错
链码fabcar没有在通道上被成功定义,说明要去fabcar启动
① 运行启动文件
./startFabric.sh
没有找到fabric-ca-client 二进制文件
② 去官网查询二进制文件,发现bin文件夹中缺失了client和sever文件
解决方法:
1)法一:
参考博客:https://blog.csdn.net/ltt1st/article/details/81456484
cd /root/go/src/github.com/hyperledger
git clone https://gitee.com/jessyl/fabric-ca.git
2)法二:
直接加入现有的二进制文件
链接:https://pan.baidu.com/s/1Yk3U_bXhYVBTHUVkzx8qCg
提取码:75b0
③ 进入fabcar文件夹,运行startFabric.sh文件
./startFabric.sh
docker rmi $(docker images | grep hyperledger)
}
④ 重新运行startFabric.sh,成功界面:
此时可以选择javascript,typescript,java,go语言
Next, use the FabCar applications to interact with the deployed FabCar contract.
The FabCar applications are available in multiple programming languages.
Follow the instructions for the programming language of your choice:
go run fabcar.go:
第一步会生成wallet钱包以及keystore,
第二步提交创建new car的事务
第三步查询并返回car信息
第四步提交更换车主的事务
第五步查询并返回car信息
cd go
go run fabcar.go
运行结果,出现fabcar列表!!!,但是最后一句显示订购者为空,提交事务失败:)
这一部分等我解决:)
查看docker
docker ps
让我再康康
(5)重新进入test-network,首先关闭网络(没有开也运行一下)
./network.sh down
./network.sh up
(7)创建通道
./network.sh createChannel
(8)开启链码
./network.sh deployCC
(9)重新再设置一下环境变量
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
在/etc/profile中再设置一下环境变量
# 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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
(10)运行以下命令以使用资产初始化分类帐:
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":[]}'
出现-> INFO 001 Chaincode invoke successful. result: status:200
则成功
(11)现在可以从CLI查询分类帐。运行以下命令以获取添加到频道分类帐的资产列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
查询结果:
(12)当网络成员希望转移或更改分类帐上的资产时,会调用链码。通过调用资产转移(基本)链码,使用以下命令更改分类帐上资产的所有者:
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"]}'
出现-> INFO 001 Chaincode invoke successful. result: status:200
则成功
(13)因为资产转移(基本)链码的背书策略要求事务由Org1和Org2签名,所以chaincode invoke命令需要同时针对peer0.org1.example.com和peer0.org2.example.com使用–peeradresses标志。由于为网络启用了TLS,因此该命令还需要使用–tlsRootCertFiles标志为每个对等方引用TLS证书。
调用链代码后,我们可以使用另一个查询来查看调用是如何更改区块链账本上的资产的。因为我们已经查询了Org1节点,所以我们可以借此机会查询在Org2节点上运行的链码。
将以下环境变量设置为Org2操作:
向/etc/profile末尾添加,最后记得source /etc/profile
# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
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_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
./network.sh down
该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker注册表中删除链码图像。
该命令还从以前的运行中删除通道工件和docker卷,允许运行./network.sh
./network.sh up -ca
发出命令后,可以看到脚本启动了三个CA,网络中的每个组织都有一个CA。
花时间检查由network.sh在部署CA之后编写脚本生成的日志是值得的。测试网络使用Fabric CA客户端向每个组织的CA注册节点和用户身份。然后,该脚本使用enroll命令为每个标识生成一个MSP文件夹。MSP文件夹包含每个标识的证书和私钥,并在运行CA的组织中建立标识的角色和成员资格。
可以使用以下命令检查Org1 admin用户的MSP文件夹:
tree organizations/peerOrganizations/org1.example.com/users/[email protected]/
可以在signcerts文件夹中找到admin用户的证书,在keystore文件夹中找到私钥。要了解有关MSP的更多信息,请参阅Membership Service Provider concept topic。
cryptogen和Fabric CA都为organizations文件夹中的每个组织生成加密材料。可以在organizations/fabric-ca目录中找到用于设置网络的命令registerEnroll.sh脚本。要了解有关如何使用Fabric CA部署结构网络的更多信息,请访问Fabric CA operations guide。通过dentity and membership concept topics,您可以了解有关Fabric如何使用PKI的更多信息。
tips
要先安装tree工具
yum -y install tree