区块链应用开发

简介

数字货币曾是区块链技术的唯一应用场景

对智能合约的支持突破了场景限制, 丰富了区块链应用的适用范围, 可以支持多行业、大规模的商业应用

区块链应用

区块链应用: 一般由若干部署在区块链网络中的智能合约, 以及调用这些智能合约的应用程序组成

用户专注于与业务本身相关的应用程序

智能合约则封装了与区块链账本直接交互的相关过程, 被应用程序调用

智能合约开发

智能合约本质上是为了对上层业务逻辑进行支持且直接与账本结构打交道, 处于核心位置.

所以设计得当可以简化上层应用开发的过程

应用程序开发

应用程序通过调用智能合约提供的方法接口实现业务逻辑, 可以使用JavaScript、Python、Go、Java等主流语言进行开发

链码的原理

链码延伸自智能合约的概念, 支持使用主流高级编程语言实现

区块链网络中的成员商定业务逻辑后, 可将业务逻辑编程到链码中, 所有人遵守合约执行

链码会创建一些状态(state)并写入账本中。状态带有绑定到链码的命名空间,仅限于创建他的链码使用,不能被其他链码直接访问。不过,在合适的范围内,一个链码也可以调用另一个链码,间接访问其状态

链码在Fabric节点上的隔离沙盒(目前为Docker容器)中运行, 并通过gRPC协议与节点进行交互

  • 调用链码
  • 读写账本
  • 返回响应
  • ……

Fabric中支持多种语言实现链码,包括Golang、JavaScript、Java等

基本工作原理

  1. 首先用户通过客户端向Fabric的背书节点发出调用链码的交易提案
  2. 节点对交易提案进行包括ACL权限检查在内的各种检验, 通过后则创建模拟执行这一交易的环境
  3. 之后, 节点和链码容器之间通过gRPC消息来交互, 模拟执行交易并给出背书结论
  4. 当链码的代码逻辑需要读写账本时,通过shim层发送相应操作类型给节点, 节点本地操作账本后返回响应消息
  5. 客户端收到足够的背书节点的支持后, 便可以将这笔交易发送给排序节点进行排序, 并最终写入区块链

链码接口与结构

依赖包

链码实现需要引入如下依赖包

  • “github.com/hyperledger/fabric/core/chaincode/shim”

    1. shim包提供了链码与账本交互的中间层
    2. 链码通过shim.ChaincodeStub提供的方法来读取和修改账本状态
  • “github.com/hyperledger/fabric/protos/peer”

    • peer.Response: 响应信息

链码接口

每个链码都需要实现chaincode接口:

type Chaincode interface{Init(stub ChaincodeStubInterface) peer.ResponseInvoke(stub ChaincodeStubInterface) peer.Response
}

Init与Invoke方法

编写链码, 关键是实现Init与Invoke两个方法

Init方法在链码部署或升级时被调用, 完成初始化工作

对数据进行操作时, Invoke方法被调用, 因此响应调用或查询的业务逻辑都需要在此方法中实现

必要结构

一个链码的必要结构如下

package main//引入必要的包
import("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer"
)//声明一个结构体
type SimpleChaincode struct {}//为结构体添加Init方法
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{//在该方法中实现链码初始化或升级时的处理逻辑//编写时可灵活使用stub中的API
}//为结构体添加Invoke方法
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{//在该方法中实现链码运行中被调用或查询时的处理逻辑//编写时可灵活使用stub中的API
}//主函数,需要调用shim.Start( )方法
func main() {err := shim.Start(new(SimpleChaincode))if err != nil {fmt.Printf("Error starting Simple chaincode: %s", err)}
}

链码API

账本状态交互API

链码需要将数据记录在分布式账本中.需要记录的数据称为状态, 以K-V对的形式存储

账本状态交互API可以对账本状态进行操作

GetState(key string) ([]byte, error) 通过Key来返回数组的特定值

PutState(key string, value []byte) error 账本中写入特定的键和值

DelState(key string) error 从账本中移除指定的键和值

GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error) 根据指定的范围内的健值

GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error) 返回指定健的所有历史值

GetQueryResult(query string) (StateQueryIteratorInterface, error) 对(支持富查询功能的)状态数据库进行富查询

交易信息相关API

GetTxID() string 返回交易提案中指定的交易ID

GetTxTimestamp() (*timestamp.Timestamp, error) 返回交易创建的时间戳,这个时间戳是peer收到交易的当前时间

GetBinding() ([]byte, error) 返回交易的binding信息

GetSignedProposal() (*pb.SignedProposal, error) 返回与交易提案相关的所有数据

GetCreator() ([]byte, error) 返回该交易的提交者的身份信息

GetTransient() (map[string][]byte, error) 返回交易中不会被写至账本中的一些临时信息

参数API

GetArgs() [][]byte 返回调用链码时交易提案中指定的参数

GetArgsSlice() ([]byte, error) 返回调用链码时交易提案中指定的参数

GetFunctionAndParameters() (function string, params []string) 返回调用链码时交易提案中指定的被调用的函数名称及其参数

GetStringArgs() []string 返回调用链码时指定的参数

-c ‘{“Args”:[“fn”, “param1”, “param2”, “paramN”]}’

示例(HelloWorld)

Init方法

  • 获取参数并判断参数长度是否为2

    • 参数: Key, Value
  • 调用PutState方法将状态写入账本中
  • 如果有错误, 则返回
  • 打印输出提示信息
  • 返回成功

Invoke方法

  • 获取参数并判断长度是否为1
  • 利用第1个参数获取对应状态GetState(key)
  • 如果有错误则返回
  • 如果返回值为空则返回错误
  • 返回成功状态

Fabric--区块链应用开发相关推荐

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

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

  2. Hyperledger Fabric区块链工具configtxgen配置configtx.yaml

    configtx.yaml是Hyperledger Fabric区块链网络运维工具configtxgen用于生成通道创世块或通道交易的配置文件,configtx.yaml的内容直接决定了所生成的创世区 ...

  3. Fabric区块链开发详解

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

  4. hyperledger fabric v2.4环境搭建及区块链项目开发

    基础环境配置,不再详细描述:学习交流可联系博主. 安装go 安装docker 安装docker-compose 清空历史docker images docker system prune --all ...

  5. c++区块链实例_确定技术任务了解区块链限制 开发区块链你该做哪些准备工作?...

    来源:区块链大本营 在开发自己的区块链之前,你要做哪些事情? 首先,要和团队讨论开发的原因,以及开发预算.必须要注意区块链架构及启动细节,当你低估了工作量和复杂性的时候,会很容易忽略这些细节. 为了避 ...

  6. EOS区块链技术开发(〇)起源

    EOS区块链技术开发(〇)起源 1 Why 1.1 EOS区块链 1.2 CSDN 2 How 3 What 参考资料 1 Why 1.1 EOS区块链 为什么选择EOS呢?自然是因为性能.ETH的性 ...

  7. 区块链应用开发入门(转)

    区块链技术如今是非常火热,不仅让金融家和创投家趋之若鹜,如今已经在多个领域遍地播种.作为拥有锐利触角的创业家们,是否也想将区块链集成到你们现有的应用中去,而作为IT技术工程师的你,是否也是跃跃欲试,想 ...

  8. 如何进行区块链的开发?

    2019独角兽企业重金招聘Python工程师标准>>> 区块链技术如今是非常火热,不仅让金融家和创投家趋之若鹜,如今已经在多个领域遍地播种.作为拥有锐利触角的创业家们,是否也想将区块 ...

  9. Fabric区块链网络

    翻译自fabric官方文档: https://hyperledger-fabric.readthedocs.io/en/release-1.3/network/network.html Fabric区 ...

  10. Fabric区块链官方浏览器【中文版】

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 blockchain-explorer是Hyperledger官方提供的区块链浏览器,目前支持Fabric 1.4.x区块链,中文版 ...

最新文章

  1. adb 切换默认桌面_公告 | 武林外传手游官方服务器全面开放桌面版体验
  2. 查询某一支接口,指定时间段的数据 按分钟排序
  3. mysql时间相关函数和操作
  4. dos命令集--江南技术联盟
  5. JAVA语言isPrime关键词_Java Guava IntMath isPrime()用法及代码示例
  6. 超强OCR文字识别软件首选ABBYY FineReader
  7. Android cpu降频工具,安卓手机CPU调频/调压工具_手机CPU管理 V16.6.9 安卓版
  8. Jenkins的windows10 从节点经常性掉线问题解决
  9. 解析 Java 类和对象的初始化过程
  10. maven 3.8.1 安装及配置文件setting.xml
  11. ISP——DPC(Defective Pixel Correction)
  12. 你的计划为什么执行不下去?怎么破?
  13. 网络工程基础——AAA认证
  14. Windows驱动开发二:Windbg源码调试
  15. Nginx(8)_return和rewrite
  16. 联想Y7000在配置ubuntu16.04过程中所遇到的一些问题.例如WIFI禁用,外接屏显示错误,NVIDIA驱动安装等
  17. wordpress需要FTP用户名密码的问题
  18. 正交基 matlab,matlab基础学习(五)之映射和正交基
  19. Altium Designer(AD)问题记录
  20. vue上传zip文件到服务器,vue.js zip文件上传

热门文章

  1. 数据机房建设常用材料有哪些?
  2. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名
  3. 用python做毕业设计小程序_用Python写一个模拟qq聊天小程序的代码实例
  4. android的文件操作,Android文件操作概要1.ppt
  5. Dataset之babyboom.dat:babyboom.dat数据集的简介、安装、使用方法之详细攻略
  6. DL之DNN优化技术:DNN中参数初始化【Lecun参数初始化、He参数初始化和Xavier参数初始化】的简介、使用方法详细攻略
  7. 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float
  8. ML之RF:基于Matlab利用RF算法实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性
  9. 2018 亚太数学建模大赛B题解题思路
  10. Python访问MySQL