4. 杂七杂八
到这一步想必你已经对 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 实例化的过程中都做了哪些事情
- 下载 fabric-shim 和 fabric-contract-api 两个 nodejs 库
- 但是这两个库不是纯 JavaScript,因此还需要下载一些 c 代码,然后通过 node-pre-gyp 编译为可执行文件
- 完成以上两步之后,才算完成了实例化的第一阶段
- 将完成第一阶段的容器 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/。