4. 杂七杂八

2020-03-08  本文已影响0人  eftales

到这一步想必你已经对 fabric 有大致了解了,但是仍存在一点疑惑。这里记录一些零碎的小知识,或许可以解答你的疑惑。

fabric 一定要用到 docker 吗?

在默认情况下,智能合约的运行需要一个独立的环境,因此你每实例化一个 chaincode(即运行 peer chaincode instantiate ),peer程序都会创建一个docker镜像(fabric-ccenv)用于运行该 chaincode,因此fabric是避不开docker的。

但是似乎可以设置 fabric 的模式,设置为非 dev 模式就不依赖 docker 了。(似乎)

我把fabcar例子跑通过了,但是没有见到 fabric-ccenv 这个镜像啊

fabric-ccenv 只在 chaincode 实例化的过程中被创建,实例化完成之后就会被 commit 为一个新镜像,也就是 dev 开头的镜像。用 docker images 也可以看到这个镜像,用docker ps 可以看到这个容器。

chaincode 实例化的过程中都做了哪些事情

  1. 下载 fabric-shim 和 fabric-contract-api 两个 nodejs 库
  2. 但是这两个库不是纯 JavaScript,因此还需要下载一些 c 代码,然后通过 node-pre-gyp 编译为可执行文件
  3. 完成以上两步之后,才算完成了实例化的第一阶段
  4. 将完成第一阶段的容器 commit 为一个新的镜像(镜像的名字以dev开头),之后run这个镜像。

chaincode 实例化到哪里了?

逻辑上说是 channel。链码在 channel 上实例化,但是 channel 并不是一个物理存在的东西,因此实例化对应到实现上就是创建若干个dev开头的容器。dev开头容器的数量和背书节点相同。
例如背书节点有两个,这两个背书节点应该形成两个dev容器,但是这两个容器并不是在同时生成的。peer chaincode instantiate 的时候会生成第一个dev容器,之后用 peer chaincode invoke 调用智能合约会生成剩余的dev容器。

一定需要虚拟专用网络嘛

十分推荐,由于实例化不仅仅需要nodejs库,还会下载其他文件,所以即使更换了npm源也没有用。
如果没有虚拟专用网的话,实例化就是一个抽签过程,大概率失败,小概率成功。

chaincode 实例化失败怎么办?

如果有虚拟专用网

直接把实例化的命令再执行一遍,一般就ok了

没有虚拟专用网

烧香拜佛,然后再执行一遍

更多有关报错的可以参见文章常见错误

一个 channel 是否可以实例化多个 chaincode ?

可以,实例化的方法见文章。

同一个 channel 的 chaincode 是否可以实现数据共享?

默认情况下不行,不同的 contract 有不同的 context。但是有 chaincode 间交互的api,可以参考 https://hyperledger.github.io/fabric-chaincode-node/

上一篇下一篇

猜你喜欢

热点阅读