Fabric 多 Channel 的创建

F

多链技术与channel

多链架构是现在区块链中较火的一个概念,实际上就是一整个区块链网络中有多条区块链并行计算,并可能运行着不同的智能合约。这样的架构不仅能够极大地扩展区块链的功能;并且大大降低了单条链上的计算和存储压力,在效率上的提升也是显而易见的;此外,多链架构上默认不同链之间的数据不可在普通节点流通,不仅可以极大地提升用户的隐私性,还防止了单链的崩溃造成整个网络的崩溃。

channel 是 fabric 网络中的一个功能,基本原理跟多链架构相同,一个 channel 即可以看做一条链。因此本文用 channel 来模拟多链架构,并记录设置多 channel 时遇到的一些坑。

版本不兼容

  • 网上的一些博客和教程,虽然看起来说的特对,但是实际一操作根本不是那么回事儿。我用的环境是fabric v1.4, 网上的绝大部分是1.0和1.1的教程,我甚至还特意改回去过,但是按照他们的步骤来依旧无法执行成功,我甚至一度怀疑我的智力有问题(╯‵□′)╯︵┻━┻,到最后我才知道,内些教程全是错的……

证书的生成

  • 生成证书需要一个 configtxgen 工具,但是fabric并不自带这个(太坑了),国内网络下载经常下着下着就说资源过期,然后半个小时前功尽弃,科学上网才能解决下载问题。不过我倒是真想知道这个服务器是哪个国家的,无论墙内墙外一视同仁,速度都没有超过20kb/s,五十多兆的东西要下一个多小时。最后靠着电脑上摆满贡品,终于把这祖宗下下来了。

创建通道

  • 使用 configtxgen 生成一些文件之后即可开始配置并启动网络。
  • 启动网络会创建6个docker,其中4个peer节点,一个cli来管理控制peer,以及一个orderer节点负责排序。下图是7个docker,因为安装了chaincode,每个chaincode会单独生成一个docker。
  • 进入cli docker之后可以控制整个区块链网络,按照教程说的,执行
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
  • 即可生成一个新channel,但是怎么执行也不成功,报错也十分诡异
Error: got unexpected status: BAD_REQUEST -- error authorizing update: error validating ReadSet: readset expected key [Group]  /Channel/Application at version 0, but got version 1
  • 后来查了n久资料才知道,这是因为和这个channel是黑户,需要先在docker外面用 configtxgen 生成通道配置信息,这样区块链网络才能认可这个channel。
  • 之后的事情又十分诡异,仍然是创建不了,瞎搞了半天才发现这版本的fabric会自动创建一个mychannel的channel,名字重了……
  • 后来就一马平川了,整个创建通道的步骤可以理解为先在宿主机申请,再进入cli创建。

加入通道

  • 首先控制每个docker,fabric提供了一个cli来控制peer节点,只需修改一些环境变量( CORE_PEER_LOCALMSPID CORE_PEER_ADDRESS CORE_PEER_TLS_ROOTCERT_FILE CORE_PEER_MSPCONFIGPATH )即可用peer命令执行对应的peer节点的shell命令。
  • 但是这里也卡了半天,所有的教程都是说要把 CORE_PEER_ADDRESS定义为peer0.org2.example.com:9051,但是一直显示无法连接,之后我查看了一下docker配置,才发现9051是宿主机端口的位置,而fabric会给每个docker分配一个内部的ip,当他们用内部ip互相通信的时候,使用对应的宿主机映射端口当然不可能连接成功。(这里不得不吐槽一下,不知道为什么教程都会犯这么低级的错误)把他们都改成内部端口即可实现通信,peer节点是7051,orderer是7050。

安装chaincode

  • 这一步倒没出什么幺蛾子,就是设置链码的时候需要把路径设置为$GOPATH/src/的相对路径,这一点注意一下就好。
  • 每个channel需要安装各自的链码(当然也可以安装一样的),查了一些资料说链码可以跨链调用,也就是说支持channel与channel之间的交互,具体是如何调用还得等待下一步测试。

执行

  • 在mychannel上运行fabric测试链码mycc,channel2上没有运行链码
peer名称orgchannel能调用的链码
peer0.org1org1mychannelmycc
peer0.org2org2mychannelmycc
peer1.org1org1channel2
peer1.org2org2channel2
  • 在peer0.org1上初试化链码并提交一条交易,同channel的peer1.org2可以查询到相关交易,但是在另一个channel的peer0.org1, peer1.org2均查询不到相关交易,并报错无此链码。
Error: endorsement failure during query. response: status:500 message:"make sure the chaincode mycc has been successfully instantiated and try again: chaincode mycc not found

References:

Imagin 丨 京ICP备18018700号-1


Your sidebar area is currently empty. Hurry up and add some widgets.