泪目!经历336小时,失败了无数次之后,我终于把超级账本 Fabric 搭建好了!

Posted 小生凡一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泪目!经历336小时,失败了无数次之后,我终于把超级账本 Fabric 搭建好了!相关的知识,希望对你有一定的参考价值。

  • 🎉区块链系列
  • 🎉点赞 👍 收藏 ⭐留言 📝 支持博主!
  • 🎉欢迎订阅专栏《区块链100例》~🙉
  • 🎉欢迎您的光临~✨

写在前面

超级账本Fabric的搭建对于新手来说,可能会有点难,我自己搭了好久,慢慢排查问题才搭出来。
因为节点有很多个,思路不清楚的话很难搭建成功。

1. 生成可执行文件

  • 下载fabric源码

注意是选择发行版本1.0的。

把这个压缩包丢到虚拟机上面,注意路径一定要这个!!!然后解压出来后重命名成fabric


进入到fabric -> fabric -> examples - > e2e_cli中执行这个 network_setup.sh 文件

./network_setup.sh up

然后再release/linux-amd64/bin这里就能看到对应的可执行文件
**注意一点:**要提前安装好gcc环境

只要这里有这些就行了!主要是用到这些可执行的文件。然后cpgo/bin目录下


然后就行了!

2. 更改节点信息

打开刚刚下载好的文件

  • 更改节点信息,方便后续生成对应模块

我们打开examples -> e2e_cli -> docker-compose-cli.yaml修改成这个样子。让他这个路径修改生成到当前文件处。


再打开examples -> e2e_cli -> base - > peer-base.yaml 修改成hyperledger_default

然后我们再打开examples -> e2e_cli -> base - > docker-compose-base.yaml 把修改节点信息

一定要保证这些节点下的域名相互对应!


3. CLI的生成

然后我们把这些文件拉到 go -> src 中目录中即可。

  • 生成模板配置文件
cryptogen generate --config crypto-config.yaml

  • 生成创世块
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesis.block

有这个genesis.block 文件即可

  • 生成通道
configtxgen -profile TwoOrgsChannel -channelID fanonechannel -outputCreateChannelTx ./channel.tx


生成这个channel.tx即可。

  • 放置通道创世块文件

  • 启动CLI,启动这个CLI即可!
docker-compose -f docker-compose-cli.yaml up -d


检验是否成功

docker ps -a


全部都up起来就可以了,
如果有哪个节点没有up就一定要把他日志打印出来

docker logs id(节点id)

4. 实例化链码

  • 链码是一种用于部署代码到 Hyperledger Fabric 区块链网络中的通用容器。
  • 链码中定义一个或多个相关联的智能合约
  • 每个智能合约在链码中有一个唯一的标识名
  • 应用程序通过合约名称去访问链码容器内的指定的智能合约。
  • 进入容器中
docker exec -it cli bash

  • 客户端创建通道
peer channel create -o orderer.example.com:7050 -c fanonechannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem

参数说明

-o:orderer节点地址,域名/ip:端口号(7050)
-c:要创建的通道id,必须小写,需要和之前生成的通道时候的id一样
-f:configtxgen生成的通道文件,./channel-artifacts/channel.tx
-t:创建通道的超时时长,默认5s
--tls:通信是否使用tls加密,true或false,和之前的配置保持一致
--cafile:tls证书文件,必须是绝对路径,pem后缀的文件peer节点路径/crypto/ordererOrganization/.../msp/tlscacerts/tlsca.xx.pem

出现这个文件即可

  • 加入通道
peer channel join -b fanonechannel.block

  • 查看是否加入成功
peer channel list

  • 安装链码
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go

  • 实例化链码
peer chaincode instantiate -o orderer.example.com:7050 -C fanonechannel -c '{"Args":["init","a","50","b","100"]}' -n mycc -P "OR ('Org1MSP.member','Org2MSP.member')" -v 1.0 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem 

参数说明

-o :orderer节点的地址,域名:7050
-C :channelId
-c :json格式参数
-l :语言
-n :chaincode的名字,安装链码的时候的名字
-P :背书策略,交易规则,指定都哪些节点参与
-v :链码版本
--tls :是否使用tls加密,true或false
--cafile :order节点下的pem文件路径 order节点路径:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/orderer.com/msp/tlscacerts/tlsca.orderer.com-cert.pem

例子

peer chaincode instantiate 
-o orderer.orderer.com:7050 
-C fanonechannel
-c '{"Args":["init","a","50","b","100"]}'
-n example02
-P "OR ('Peer1Orgs.member','Peer2Orgs.member')"
-v 1.0
--tls true
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem 

成功的话,会在docker中生成镜像

  • 验证实例化成功
peer chaincode query -C fanonechannel -n mycc -c '{"Args":["query","a"]}'

查询即可

出现这个刚刚初始化的a的值就是50,就可以了。

5.注意点

也不难吧,但我搞了半个月。。

5.1 镜像问题

如果用官方的镜像脚本是不行的!会拉取不完全,你以为完成了,但是是不完全的。

要一个一个拉取,注意拉取顺序,不能跳过的。

docker pull hyperledger/fabric-tools:x86_64-1.0.0
docker pull hyperledger/fabric-orderer:x86_64-1.0.0
docker pull hyperledger/fabric-peer:x86_64-1.0.0
docker pull hyperledger/fabric-couchdb:x86_64-1.0.0
docker pull hyperledger/fabric-kafka:x86_64-1.0.0
docker pull hyperledger/fabric-ca:x86_64-1.0.0
docker pull hyperledger/fabric-ccenv:x86_64-1.0.0
docker pull hyperledger/fabric-baseimage:x86_64-0.4.7
docker pull hyperledger/fabric-javaenv:x86_64-1.0.0
docker pull hyperledger/fabric-zookeeper:x86_64-1.0.0

如果你觉得很慢的话,就换一下国内的docker镜像源

在虚拟机上创建这个文件/etc/docker/daemon.json

然后输入

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

也可以用其他的

# Docker中国区官方镜像
https://registry.docker-cn.com
# 网易
http://hub-mirror.c.163.com
# ustc 
https://docker.mirrors.ustc.edu.cn
# 中国科技大学
https://docker.mirrors.ustc.edu.cn
# 阿里云容器服务
https://cr.console.aliyun.com/

然后重新启动docker服务就好了

systemctl restart docker.service

拉取完全部的镜像之后,把这个标签改成latest

docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools 
docker tag hyperledger/fabric-orderer:x86_64-1.0.0 hyperledger/fabric-orderer 
docker tag hyperledger/fabric-peer:x86_64-1.0.0 hyperledger/fabric-peer 
docker tag hyperledger/fabric-couchdb:x86_64-1.0.0 hyperledger/fabric-couchdb 
docker tag hyperledger/fabric-kafka:x86_64-1.0.0 hyperledger/fabric-kafka 
docker tag hyperledger/fabric-ca:x86_64-1.0.0 hyperledger/fabric-ca 
docker tag hyperledger/fabric-ccenv:x86_64-1.0.0 hyperledger/fabric-ccenv 
docker tag hyperledger/fabric-baseimage:x86_64-0.4.7 hyperledger/fabric-baseimage 
docker tag hyperledger/fabric-javaenv:x86_64-1.0.0 hyperledger/fabric-javaenv
docker tag hyperledger/fabric-zookeeper:x86_64-1.0.0 hyperledger/fabric-zookeeper

验证是否拉取成功

docker images

出现这些镜像即可

注意一点:如果镜像更新的话,之前的配置都要重新进行配置。所以镜像一定要配置好

5.2 节点问题

一定要注意这些节点要对应他所对应的节点名称!!!不要peer1下面有peer0之类的!

5.3 example02 源码解读

  • Init函数
	初始化两个账户,并把账户金额写道账本中,除了`init`参数,还需要四个参数,两个账户和对应的金额

Invoke函数`:

    invoke: '{"Args":["invoke","a","b","1"]}'
    delete:'{"Args":["delete","a"]}'
    query:-c '{"Args":["query","a"]}'

以上是关于泪目!经历336小时,失败了无数次之后,我终于把超级账本 Fabric 搭建好了!的主要内容,如果未能解决你的问题,请参考以下文章

数据库建表我改了无数次语句,终于达到DBA的要求了

泪目!找份工作太不容易,挂了78家公司,终于收获百度offer

win10下机器学习TensorFlow搭建

泪目!蚂蚁金服三轮面试,四个小时灵魂拷问,艰难上岸

[C++]一个面试官问了无数次的问题--什么是“多态”

泪目!女朋友跳槽太不容易了,挂了8家公司,终于收获京东offer