一、fabric 智能合约运行环境

Chaincode是一个程序, Chaincode运行在一个被背书peer进程独立出来的安全的Docker容器中,Fabric中支持多种语言实现链码,包括golang、javascript、java等。当前主要以Golang为主,性能和稳定性都较好

ChainCode:链码

Fabric-ccevn:Fabric提供的链码运行环境

Docker:Docker容器

Golang:go语言环境,链码使用go语言编写,需要Golang提供SDK支持

Linux OS:底层操作系统


二、智能合约需要实现的接口

每一个chaincode需要实现Chaincode接口,其方法是用于响应接收到的transaction
Init方法:当chaincode接收到instantiate或者upgrade transaction时Init方法被调用,以便chaincode能够执行任何必要的初始化,包括application state的初始化

Invoke方法:当chaincode接收到invoke transaction时调用invoke方法,用于处理transaction proposal

Main方法:程序入口

链码程序以一个文件目录的形式安装,所以一个链码可以有多个文件组成,链码程序可以支持非常复杂的功能

那么如何编写链码程序呢?我们继续往下看:

ChainCode的Go代码需要定义一个struct

然后在该struct上定义Init和Invoke两个函数

然后还要定义一个main函数,作为ChainCode的启动入口

三、fabric 系统提供给智能合约的接口

前面提到chaincode是改变区块链账本的唯一途径, Fabric提供了接口, chaincode通过这个接口实现对账本的修改,实际就是对状态数据的增删改查,前面提到Fabric1.x数据存储包含有,账本、索引、历史记录、状态数据(世界观),在这里chaincode只对状态数据进行操作,其他的账本,索引和历史记录系统会自动更新,不需要外部操作
接口类型包含下列6种:

与链码调用参数解析相关
与交易消息解析相关
与状态数据操作相关
与链码调用相关
与事件处理相关
与辅助操作相关

3个主要对状态数据操作方法如下:
增改数据PutState(key string, value []byte) error:

删除数据DelState(key string) error

查询数据GetState(key string) ([]byte, error)

还有一些复杂的查询接口

四、系统提供给智能合约的接口

增改数据PutState(key string, value []byte) error:
根据Key删除State DB的数据。如果根据Key找不到对应的数据,删除内容失败
查询数据GetState(key string) ([]byte, error):

因为我们是Key Value数据库,所以根据Key来对数据库进行查询,是一件很常见,很高效的操作。返回的数据是byte数组,我们需要转换为string,然后再Json反序列化,可以得到我们想要的对象。

不能在一个ChainCode函数中PutState后又马上GetState,这个时候GetState是没有最新值的,因为在这时Transaction并没有完成,还没有提交到StateDB里面

事件设置SetEvent(name string, payload []byte) err
当ChainCode提交完毕,会通过Event的方式通知Client。而通知的内容可以通过SetEvent设置,事件设置完毕后,需要在客户端也做相应的修改

其他接口:
Key区间查询GetStateByRange(startKey, endKey string)** (StateQueryIteratorInterface, error)
富查询GetQueryResult(query string) (StateQueryIteratorInterface, error)
历史数据查询GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)
部分复合键查询GetStateByPartialCompositeKey(objectType string, keys []string) (StateQueryIteratorInterface, error)
调用另外的链上代码 InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response
获得签名的提案GetSignedProposal() (*pb.SignedProposal, error)
获得Transient对象 GetTransient() (map[string][]byte, error)
获得交易时间戳GetTxTimestamp() (*timestamp.Timestamp, error)
获得Binding对象 GetBinding() ([]byte, error)

五、智能合约开发注意事项

1.考虑一致性问题,目前链码开发过程中需要注意下列事项:
链码中不能使用不确定性的变量作为计算的输入,比如不能采用随机数或者获取系统当前时间等。链码会在不同的节点上多次运行,但运行的时间并不严格一致,环境的查询导致不同节点上执行的结构不一致,最终无法达成共识。

2.编码查询外部接口数据导致数据不一致,比如多个节点多次调用外部查询接口,会导致多个节点查询不一致,最终无法达成区块链网络的一致性。例如有些特殊情况是可以的,例如查询一个人的生日,身份证等永久不会变化的信息等。

3.避免调用外部数据接口导致重复计算,比如多个节点多次调动外部写数据的接口,可能会导致区块链外部重复计算,这种情况多个链码的执行结果可能是一致的,不会导致共识失败,但会影响外部的一致性,这是一个逻辑错误。

##总的原则是所有节点执行的链码最终结果要保持一致,否则就不能达成系统一致性

fabric 智能合约开发详解相关推荐

  1. Fabric区块链开发详解

    Hyperledger是一个旨在推动区块链跨行业应用的开源项目,由Linux基金会在2015年12月主导发起该项目,成员包括金融.银行.物联网.供应链.制造和科技等多个行业的领头羊,托管了众多面向企业 ...

  2. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

  3. PeckShield:DeFi平台Opyn智能合约漏洞详解——攻击者空手套白狼!

    北京时间2020年08月05日,DeFi 期权平台 Opyn 的看跌期权(Opyn ETH Put)智能合约遭到黑客攻击,损失约37万美元. Opyn 是一个通用期权协议,于今年2月份转型为保险平台, ...

  4. Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    前言 在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方 ...

  5. 以太坊智能合约ABI详解

    在以太坊生态系统中, ABI 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式.本文让我们了解一下智能合约的 ABI 是什么. ABI是什么 在计算机科学中,ABI(应用程序二进制接 ...

  6. 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约

    文章目录 安装IBM Blockchain Platform extension for VS Code 创建一个智能合约项目 理解智能合约 打包智能合约 Local Fabric Ops 安装智能合 ...

  7. python区块链开发_Fabric区块链Python开发详解

    Hyperledger Fabric是最流行的联盟区块链平台.Fabric区块链Python开发详解课程 涵盖Fabric区块链的核心概念.Fabric网络搭建.Node链码开发.Python应用开发 ...

  8. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  9. 智能合约开发环境搭建及 Hello World 合约

    智能合约开发环境搭建及 Hello World 合约 如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是 Hel ...

最新文章

  1. 互联网中网站建设如何体现出企业品牌的企业网络推广能力?
  2. 简单的图像去噪的实现和验证码识别
  3. Substring Removal
  4. python和C语言分别实现插入排序
  5. 重学java基础第十一课:基本的dos命令
  6. OpenCV中的函数子
  7. 用Python绘制一套“会跳舞”的动态图形给你看看
  8. 如何编辑PDF文件,教你几招轻松搞定
  9. 闪退没由报错_使命召唤:(cod16)出现的闪退问题以及解决办法
  10. 十大“史上最佳”自动化测试工具
  11. 《Android UI基础教程》——1.4节工具
  12. Java 基于UDP 实现单播、组播、广播 Socket 编程
  13. 群晖nas存储系统原理_群晖NAS 创建存储池和存储空间图文教程
  14. VS2017优质插件总结
  15. 启动器Android标准,【转】各款安卓启动器评测(之我见)
  16. Servlet 身份验证体系结构
  17. pragma once用法总结
  18. linux a卡双显卡切换显卡,amd显卡驱动 双显卡切换
  19. 佛山科学技术学院计算机科学与技术李欣华,第七届国务院学位委员会中文学科评议组2019年度 扩大会议在佛山科学技术学院召开...
  20. C语言中惰性,利用C-H键活化接力(CHAR)实现惰性C-H的功能化

热门文章

  1. 预处理命令 宏定义 #define #undef
  2. 代理ip中的通道数是什么意思?
  3. 呼拉拉一片陈一舟和王兴PK声
  4. mysql utf8mb4与emoji表情【转】
  5. 计算机演示文稿的使用步骤,将编辑好的演示文稿在其他计算机放映用什么功能...
  6. 安装kibana后的坑
  7. 【JavaEE基础与高级 第1章】— 基础知识1初识JavaEE
  8. wps公式如何加序号_WPS表格怎么只打印部分内容?_金山WPS_办公软件_软件教程
  9. 让工作变简单的10种方法
  10. url、src、herf的区别