Page 10
此外就是一些全局的或辅助的API 。
比如刚才看到的Start函数,它向指定的peer结点注册chaincode 。
辅助类StateRangeQueryIterator与前面state范围查询的API有关 。
关于API的详细说明可以打开这个链接看到 。但是上面基于的是最新的fabric实现,所以跟刚才讲的会有很多不同 。具体以你使用fabric版本为准 。
Page 11
第三部分讲的是如何调试chaincode 。
在介绍具体调试步骤之前,我想先介绍一下chaincode运行的基本原理,我觉得这有助于chaincode的开发 。
首先,fabric peer结点有两种运行模式 。一种是一般模式,在这种模式下chaincode运行在Docker容器中 。这也是fabric在production环境下的运行模式 。这就相当于给chaincode的运行提供了一个相对隔离的环境,这样整个系统也就更加的健壮 。但是在这种模式下,调试过程就变得非常复杂 。因为一旦调试过程中发现bug,重新install,然后重新部署 。而在这个过程中,install和Docker image的build过程都比较耗时 。
所以,针对这个问题,fabric又提供了开发模式 。在这种模式下chaincode直接运行在本地,这样chaincode的调试过程就与普通程序的调试过程完全一样,因此开发调试过程就更加容易 。
要说明的是,我目前看的fabric1.0的代码对于开发模式的支持还不完备,部署的时候回失败 。
Page 12
但是因为开发模式的原理比较容易理解,这里我还是以开发模式为例介绍一下chaincode的运行原理 。一般模式下,只需将chaincode的运行放在Docker容器中进行理解 。
首先,这个图描述的是开发模式下chaincode注册时的执行过程 。
首先,chaincode会向指定的peer结点发送相关信息,比如chaincode name 。然后,peer结点会做一些检查,主要是看该chaincode name是否已存在 。如果不存在,则注册成功,为其创建相应的handler,然后返回相关信息 。此后,chaincode就与peer结点建立起了联系,并且二者始终处于互相监听状态 。
Page 13
这个图描述的是开发模式下chaincode Instantiate/invoke/query时的运行过程 。
首先,通过CLI或App向指定endorser结点发送Instantiate/invoke/query请求 。
endorser接收到请求之后,如果相关chaincode存在,就会将请求发送到chaincode端,并执行相应函数 。由于执行过程中,可能涉及到多次的state的读写,而每一次的读写都会涉及到底层db的操作,所以这个过程会涉及到多次与endorser结点的通信 。
最后,chaincode执行完毕之后,会发送消息给endorser结点 。如果执行成功,endorser结点就会封装执行结果并对其endorse,并把结果返回给CLI/APP端,然后进行ordering 。这个图里没有给出ordering和committing的过程 。
Page 14
这里给出一般模式下Chaincode的开发调试过程 。以fabric chaincode_example02为例,完全本地,并且使用fabric默认配置 。我的环境是使用vagrant方式搭建的 。
首先,启动orderer结点,运行在solo模式下 。
然后,本地启动一个peer结点,指定peer的名称 。
然后,install chaincode程序,指定chaincode的名称以及version,它们将用于命名build出来的docker image 。默认配置下,需要你的chaincode程序位于GOPATH/src路径下,并且这个命令会将GOPATH/src下的几乎所有文件都打包发送到指定的peer结点 。
推荐阅读
- 一 hyperledger fabric 结构分析是什么?hyperledger fabric的架构设计指的什么?
- 超级账本Fabric 1.0是什么? 多节点集群的部署步骤是什么?
- hyperledger 国内外区块链联盟汇总有什么?超级账本是什么?
- fabric是什么意思