链码的概念与使用

概念:

Chaincode: 链上代码, 简称链码, 一般是指用户编写的应用代码

链码被部署在Fabric网络节点上,

​ Peer 节点

​ – 背书节点

​ – commit节点

​ – Leader节点

​ – 锚节点

运行在隔离沙盒(当前为Docker容器)中,

并通过gRPC协议与相应的Peer节点进行交互, 以操作分布式账本中的数据

protobuf

分类

链码一般分为:

  • 用户链码
  • 系统链码

用户链码

由应用开发人员使用Go(Java/JS)语言编写基于区块链分布式账本的状态及处理逻辑

运行在链码容器中, 通过Fabric提供的接口与账本平台进行交互

系统链码

负责Fabric节点自身的处理逻辑, 包括系统配置、背书、校验等工作

系统链码仅支持Go语言, 在Peer节点启动时会自动完成注册和部署

系统链码共有五种类型:

配置系统链码(CSCC)

CSCC: Configuration System Chaincode

负责账本和链的配置管理

背书管理系统链码(ESCC)

ESCC: Endorsement System Chaincode

负责背书(签名)过程, 并可以支持对背书策略进行管理

对传入的链码提案的模拟运行结果进行签名, 之后创建响应消息返回给客户端

生命周期系统链码(LSCC)

LSCC: Lifecycle System Chaincode

负责对用户链码的生命周期进行管理

链码生命周期包括安装、部署、升级、权限管理、获取信息等环节.

查询系统链码(QSCC)

QSCC: Query System Chaincode

负责提供账本和链的信息查询功能

验证系统链码(VSCC)

VSCC: Verification System Chaincode

交易提交前根据背书策略进行检查

验证过程:

  1. 首先解析出交易结构, 并对交易结构格式进行校验
  2. 检查交易的读集合中元素版本跟本地账本中版本一致
  3. 检查带有合法的背书信息(主要是检查签名信息)
  4. 通过则返回正确, 否则返回错误消息

链码生命周期

管理Chaincode的生命周期四个命令:

安装, 实例化, 升级, 打包, 签名

packageinstallinstantiateupgrade

未来还会支持stopstart命令, 来禁用和重新启用链代码

链代码成功安装和实例化后,链代码处于活动状态(正在运行),可通过invoke命令调用处理事务

链代码可以在安装后随时升级

安装链码

install命令将链码的源码和环境等内容封装为一个链码安装打包文件(Chaincode Install Package, CIP), 并传输到背书节点.

背书节点解析后一般会保存在$CORE_PEER_FILESYSTEMPATH/chaincodes目录下

安装链码只需要与Peer交互

进入到sacc目录

$ cd ~/hyfa/fabric-samples/chaincode/sacc/

构建Chaincode

$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim$ go build --tags nopkcs11

命令解释

go get: 根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装

-u: 利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包

go build: 加上可编译的go源文件可以得到一个可执行文件

如果在执行 go build --tags nopkcsll 命令时出现如下错误

$GOPATH/src/github.com/hyperledger/fabric/vendor/github.com/miekg/pkcs11/pkcs11.go:26:18: fatal error: ltdl.h: No such file or directory
compilation terminated.解决方式: 安装 libltdl-dev
$ sudo apt install libltdl-dev

使用开发模式测试

正常情况下chaincode由对等体启动和维护。然而,在“开发模式”下,链码由用户构建并启动

如果没有安装Hyperledger Fabric Samples请先安装

如果没有下载Docker images请先下载

跳转至fabric-sampleschaincode-docker-devmode目录

$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

使用docker images查看Docker镜像信息(显示本地Docker Registry)

$ sudo docker images

会看到如下输出

REPOSITORY                     TAG                  IMAGE ID            CREATED             SIZE
hyperledger/fabric-tools       latest             b7bfddf508bc        About an hour ago   1.46GB
hyperledger/fabric-tools       x86_64-1.1.0       b7bfddf508bc        About an hour ago   1.46GB
hyperledger/fabric-orderer     latest             ce0c810df36a        About an hour ago   180MB
hyperledger/fabric-orderer     x86_64-1.1.0       ce0c810df36a        About an hour ago   180MB
hyperledger/fabric-peer        latest             b023f9be0771        About an hour ago   187MB
hyperledger/fabric-peer        x86_64-1.1.0       b023f9be0771        About an hour ago   187MB
hyperledger/fabric-javaenv     latest             82098abb1a17        About an hour ago   1.52GB
hyperledger/fabric-javaenv     x86_64-1.1.0       82098abb1a17        About an hour ago   1.52GB
hyperledger/fabric-ccenv       latest             c8b4909d8d46        About an hour ago   1.39GB
hyperledger/fabric-ccenv       x86_64-1.1.0       c8b4909d8d46        About an hour ago   1.39GB
......

使用三个终端

终端1 启动网络

$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

该目录下有 myc.tx 文件

启动网络

$ sudo docker-compose -f docker-compose-simple.yaml up -d

终端2 建立并启动链码

打开第二个终端, 进入到chaincode-docker-devmode 目录

$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

进入CLI

chaincode容器的作用是为发简化的方式建立并启动链码

$ sudo docker exec -it chaincode bash

命令提示符变为:

root@858726aed16e:/opt/gopath/src/chaincode#

编译

进入sacc目录编译chaincode

root@858726aed16e:/opt/gopath/src/chaincode#  cd sacc
root@858726aed16e:/opt/gopath/src/chaincode/sacc#  go build

运行chaincode

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc

mycc: 链码名称

0: 链码初始版本号

终端3 使用链码

安装及实例化

$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
$ sudo docker exec -it cli bash

进入CLI容器后执行如下命令安装及实例化chaincode

容器中已经有 myc.blockmyc.tx 两个文件, 可以直接使用

peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc 

调用

进行调用,将a的值更改为20

peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc

执行成功, 输出如下内容

......
...... Chaincode invoke successful. result: status:200 payload:"20"
......

查询

查询a的值

peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc

执行成功, 输出: Query Result: 20

打包链码及签名

通过将链码相关数据进行封装, 可以实现对其进行打包和签名操作

打包

peer chaincode package -n mycc -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out

-s: 创建角色支持的CC部署规范包, 而不是原始的CC部署规范

-S: 如果创建CC部署规范方案角色支持,也与本地MSP签名

-i: 指定实例化策略

打包后的文件, 可以直接用于install操作, 如:

peer chaincode install ccpack.out

签名

对一个打包文件进行签名操作(添加当前MSP签名到签名列表中)

peer chaincode signpackage ccpack.out signedccpack.out

升级链码

退出终端3, 停止终端2的服务

终端2中重新运行chaincode

$ sudo docker exec -it chaincode bashcd sacc
go build
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:1 ./sacc

注意版本为 1.0, 旧版本为 0

终端3

打开终端3, 进入CLI容器

$ sudo docker exec -it cli bash

安装及升级

peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 1peer chaincode upgrade -n mycc -v 1 -c '{"Args":["a", "100"]}' -C myc 

注意版本号必须一致

在对某链码代码升级前, 推荐先将所有该链码的容器停止, 并从Peer上备份并移除旧链码部署文件. 之后先在个别Peer节点上部署新链码, 对原有数据进行测试, 成功后再在其它节点上进行升级操作

查询

查询a的值

peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc

执行成功, 输出: Query Result:100

Fabric--链码的概念与使用相关推荐

  1. fabric 启动peer_编写 Fabric 链码的一般准则

    我相信智能合约(链码)是 Hyperledger Fabric 区块链网络的核心.正确开发链码可以真正发挥一个安全区块链的优势,反之则会带来灾难性的后果.在这篇文章里我不打算探讨 Hyperledge ...

  2. HyperLedger Fabric链码开发及测试

    HyperLedger Fabric链码开发及测试 1.链码开发 先设计一个简单的应用场景,假设有这样的业务需求: 可以添加学校,信息包括学校名称.学校ID: 添加该学校的学生,信息包括姓名,用户ID ...

  3. Fabric 链码Chaincode 的安装、初始化、调用、升级

    Fabric 链码Chaincode 的安装.初始化.调用.升级 Fabric chaincode 上一篇文章,我们启动了一个Fabric网络,这篇文章来看看在Fabric网络进行应用的开发. 上一篇 ...

  4. HyperLeger Fabric开发(七)——HyperLeger Fabric链码开发

    HyperLeger Fabric开发(七)--HyperLeger Fabric链码开发 一.链码开发模式 1.链码开发模式简介 Fabric的链码开发调试比较繁琐.在不使用链码开发模式的情况下,链 ...

  5. Fabric链码常用API文档

    Fabric链码API文档 一.Fabric-shim.ChaincodeInterface ChaincodeInterface 在链码当中我们必须实现ChaincodeInterface接口中定义 ...

  6. Fabric链码实战(二)公民身份信息

    title: Fabric链码实战(二)公民身份信息 tags: Hyperledger, fabric ,区块链,chaincode 功能简述 使用链码可以添加和查询公民信息 功能实现 1.导入包 ...

  7. Fabric链码开发——富查询

    Fabric链码开发--富查询 常见的链码使用PutState和GetState就可以进行简单的增加和查找了,再不济就加入DelState.因为fabric底层都是KV数据库,所以这三个接口就可以进行 ...

  8. HyperLedger Fabric - 超级账本(4)链码的概念与使用

    概念: Chaincode: 链上代码, 简称链码, 一般是指用户编写的应用代码 链码被部署在Fabric网络节点上, ​ Peer 节点 ​ – 背书节点 ​ – commit节点 ​ – Lead ...

  9. Hyperledger Fabric 链码(0) 说明

    1. 概念 基于区块链的应用,一般都由部署在区块链上的智能合约以及调用这些智能合约的业务程序组成,智能合约又称为链码(Chaincode),是一段运行在容器中的程序. Chaincode 是客户端程序 ...

  10. Fabric 架构和概念

    0x00 本文基于fabric 1.0.4版本,如果相关概念有所改动,请以官方文档为准 基本架构 fabric构建的区块链网络是一个分布式系统,包含了一些逻辑节点,这些逻辑节点各司其职,完整的执行着交 ...

最新文章

  1. 5行Python提取海量新闻网站内容
  2. python语言的实验心得体会范文_实验报告个人心得体会范文
  3. python :案例:银行卡
  4. 互联网1分钟 |1128
  5. 【CLion】如何编译运行单个文件 (C/C++ Single File Execution插件的使用)
  6. Spring boot的Maven配置依赖
  7. 修改oracle重做日志文件大小
  8. 需要清除memcach缓存方能解决的几个报错
  9. 高精度地图的学习笔记
  10. 静态方法多次调用内存_JVM内存结构图(1.8之后发生了什么)
  11. error_reporting() 错误级别详解
  12. (转)Singleton 单例模式(懒汉方式和饿汉方式)
  13. 外星人17r4原版系统_外星人Alienware 17R4 测评/升级
  14. [bzoj3998]弦论
  15. 新媒体运营编辑有出路吗
  16. 明确生产计划,做好生产进度跟踪
  17. Java中的大端和小端
  18. 四皇后、八皇后……的求解
  19. 隐马尔可夫模型(背景介绍)
  20. error C2065: “IDD_DIALOG”: 未声明的标识符

热门文章

  1. 成功解决SyntaxError: import * only allowed at module level
  2. Py之av:av库的简介、安装、使用方法之详细攻略
  3. 成功解决AttributeError: module 'tensorflow' has no attribute 'scalar_summary'
  4. ML之SVM(三种):基于三种SVM(linearSVR、polySVR、RBFSVR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
  5. 成功解决pillow模块内生成的非UTF-8格式(比如label中有汉字时)
  6. Excel:解决Excel表格每一行所有字段在一个单元格的情况
  7. Linux系统管理01
  8. [Intellij] 软件设置和常用快捷键
  9. 正向代理服务器和反向代理服务器的区别
  10. 几个网页制作的小技巧