泪目!经历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环境
只要这里有这些就行了!主要是用到这些可执行的文件。然后cp
到go/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 搭建好了!的主要内容,如果未能解决你的问题,请参考以下文章