然后是Endorser、Orderer、Committer,它们是将原来0.6中VP的功能进行拆分后产生的三个角色 。
Endorser结点会模拟执行chaincode,这样就相当于把计算任务从consensus结点独立出来,进而减轻了consensus结点的负担,也就可以增加系统吞吐量 。同时,比较重要是fabric1.0可以支持endorsement policy,即一个transaction的提交需要哪些endorser进行背书才可通过 。这样整个系统的访问控制就更加灵活 。
Orderer结点的工作就是consensus 。Chaincode在endorser结点处执行之后,会被发送给orderer进行排序或者说consensus,保证transaction的顺序是一致的 。然后,orderer结点会把transaction发送给相应的channel中的所有committer结点 。
Committer结点会将接收到的transaction写进block 。
Page 5
这是fabric1.0对chaincode开发情况的支持 。
在开发语言上,支持go和Java两种语言来编写chaincode程序 。我下面是以go语言为例来介绍chaincode的编写的 。
关于SDK,如果使用vagrant方式搭建自己的fabric开发环境的话,在你的这条路径下,$GOPATH/src/github.com/hyperledger/fabric/core/chaincode/shim,就是chaincode开发的SDK 。
Page 6
接下来是第二部分,如何编写Chaincode 。
前面提到编写chaincode就是实现一个接口,这里就是那个接口的定义 。
可以看到这个接口定义了两个方法,分别具有不同的作用 。
首先,Init方法会在Instantiate chaincode时被调用 。因此,一般在其中完成一些初始化工作,并且仅被执行一次 。
Invoke方法会在Invoke或Query chaincode时被调用 。其中的代码可以查询或更新底层的数据,并且可被多次调用 。
Page 7
这一页是使用go语言编写chaincode时的一个最基本的框架 。
可以看到,最主要的是编写自己的chaincode类,实现刚刚看到的两个方法 。然后在main函数中通过API shim.start()来向特定peer结点注册该chaincode 。
那么如何使用相关的API呢?两种方式,一种是通过参数stub shim.ChaincodeStubInterface,fabric在该接口中定义了丰富的API;此外,fabric也定义了一些全局的函数可被使用,比如这里的start()函数就是其中之一 。
Page 8
那么,先看ChaincodeStub提供了哪些API 。我将这些API分成了五大类 。
第一大类与state操作相关 。通过这些API可以根据key来查询/添加/更新相应的state 。这些API提供了单key的读写操作、key字典序范围读取操作、composite key读取操作、底层数据库语法的查询操作等 。
第二大类与与参数相关 。fabric1.0修改了chaincode接口的定义,需要开发者自己调用API获取传入的参数 。注意,传入的参数第一个是函数名称,之后才是相应的函数输入参数 。
Page 9
第三大类与Transaction有关,并且这一类都是读操作,读取transaction中各种信息,比如transaction id、timestamp等 。
第四类是与chaincode间相互调用有关的一个API 。Fabric允许在一个chaincode中根据chaincode name和channel name去调用另一个chaincode 。可以看到并没有deploy的API,也就是说,fabric不允许在一个chaincode中去部署新的chaincode 。
最后一类也只有一个API,SetEvent 。Fabric允许开发者定义自己的event,然后这个event会在transaction写进block时触发,因此开发者就可以自己写相应的event handler程序做一些相关的工作 。
推荐阅读
- 一 hyperledger fabric 结构分析是什么?hyperledger fabric的架构设计指的什么?
- 超级账本Fabric 1.0是什么? 多节点集群的部署步骤是什么?
- hyperledger 国内外区块链联盟汇总有什么?超级账本是什么?
- fabric是什么意思