Fabric 智能合约具体代码模板分析
来源:互联网 发布:单片机电子秤电路图 编辑:程序博客网 时间:2024/05/16 16:16
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数据并不会马上落到账本上, 要等到第二段交易提交共识达成后,数据才会落地。代码如下图:
我师弟在我指导下写的,暂时这样,后续还要改改。
- Fabric 智能合约具体代码模板分析
- 基于fabric 0.6定制智能合约
- Fabric智能合约编译与测试环境搭建
- 智能合约
- 在 hyperledger fabric 环境对Validating Peers布署 chaincode (智能合约)
- 【智能合约】客户端和web端对智能合约的事件Event进行调用的代码示例
- 【转载】智能合约简介
- 智能合约编写实例
- 智能合约的安全问题
- truffle部署智能合约
- 智能投票合约
- 【智能合约】Solidity
- 智能合约不智能
- 何编写智能合约
- 编写智能合约
- KMP模板(具体代码)
- 巴克莱银行如何利用R3区块链技术构建智能合约模板?
- 以太网智能合约开发参考
- IMO2017day1.1
- ECMAScript
- 如何用div模仿textarea
- C++拷贝构造函数详解
- 比特币市场和传统市场的简单比较
- Fabric 智能合约具体代码模板分析
- 联系人
- 统计
- 旋转数组的二分查找
- uva 1635 Irrelevant Elements [组合数, 唯一分解定理]
- 计算字符串中单词个数
- 搜狐2016招聘笔试题扎金花(未完待续)
- Git的相关知识
- windows 无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,windows只能安装在GPT磁盘上