您的位置:首页 > 编程语言

Fabric 智能合约具体代码模板分析

2017-07-19 21:26 375 查看
Fabric 智能合约具体代码模板分析

Fabric的智能合约称为链码(chaincode),分为系统链码和用户链码。系统链码用来实现系统层面的功能,用户链码实现用户的应用功能。链码被编译成一个独立的应用程序,运行于隔离的Docker容器中。 
和以太坊相比,Fabric链码和底层账本是分开的,升级链码时并不需要迁移账本数据到新链码当中,真正实现了逻辑与数据的分离,同时,链码采用Go、Java、Nodejs语言编写。
Fabric链码通过gprc与peer节点交互,
(1)当peer节点收到客户端请求的输入(propsal)后,会通过发送一个链码消息对象(带输入信息,调用者信息)给对应的链码。
(2)链码调用ChaincodeBase里面的invoke方法,通过发送获取数据(getState)和写入数据(putState)消息,向peer节点获取账本状态信息和发送预提交状态。
(3)链码发送最终输出结果给peer节点,节点对输入(propsal)和 输出(propsalreponse)进行背书签名,完成第一段签名提交。
(4)之后客户端收集所有peer节点的第一段提交信息,组装事务(transaction)并签名,发送事务到orderer节点排队,最终orderer产生区块,并发送到各个peer节点,把输入和输出落到账本上,完成第二段提交过程。



Fabric 智能合约链码开发的基础,一句话总结起来就是:一个基类,两个查询,一个写入。

▲一个基类

Java中ChaincodeBase是自定义链码的合约基类,里面的run(ChaincodeStub stub, String function, String[] args)方法是peer调用链码的入口函数,其中必须自定义一个init方法,用于合约初始化及升级初始化动作。代码如下图:



GO由于其动态接口的特性,不需要特别声明实现合约接口。但是必须实现两个接口方法:

▪ Init(stubshim.ChaincodeStubInterface) :init用于合约初始化及升级初始化动作;



▪ Invoke(stubshim.ChaincodeStubInterface):Invoke是peer调用链码的入口函数;代码如下图:



ChaincodeStub里面包含丰富的账本操作,常用的有getCallerCertificate(),getState(k), putState(k,v), invokeChaincode(…), rangeQueryState(k1,k2),getTxId()等。

▲两个查询

因为fabric默认的状态数据库是个k-v库,常用到的方法就以下两个查询。

1. getState(k)获取单独的key对应的value值。





2. rangeQueryState(k1,k2),获取k1开始,k2结束的所有k-v对象, 返回的是个Map<String,String>对象, 其中k1,k2按字典序排序。





▲一个写入

putState(k,v),  写入数据,此处要注意下,putState数据并不会马上落到账本上, 要等到第二段交易提交共识达成后,数据才会落地。代码如下图:





我师弟在我指导下写的,暂时这样,后续还要改改。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息