简单的资产Chaincode

应用程序是一个基本样本链代码,用于在分类账上创建资产

安装Go及Docker, Docker-compose, 并配置Go相应的环境变量

创建目录

为chaincode应用程序创建一个目录作为其子目录

$ mkdir -p $GOPATH/src/test
$ cd $GOPATH/src/test

新建文件

新建一个文件,用于编写Go代码

$ touch test.go
$ vim test.go

编写代码

必须实现 Chaincode接口的InitInvoke函数。因此,须在文件中添加go import语句以获取链代码的依赖。

导入chaincode shim包和 peer protobuf包。然后添加一个结构SimpleChaincdoe作为Chaincode函数的接收器

package mainimport ("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer"
)type SimpleChaincdoe struct {
}

初始化Chaincode

Init方法

  • 获取参数, 使用GetStringArgs 函数检索调用 的参数
  • 检查合法性, 检查参数数量是否为2个, 如果不是, 则返回错误信息
  • 利用两参数, 调用PutState方法向账本中写入状态, 如果有错误则返回(shim.Error()), 否则返回nil(shim.Success)
func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response {}

调用实现

Invoke方法

验证函数名称为setget,并调用那些链式代码应用程序函数,通过shim.Successshim.Error函数返回响应

  • 获取函数名与参数
  • 对获取到的参数名称进行判断, 如果为set, 则调用set方法, 反之调用get
  • set/get函数返回两个值(result, err)
  • 如果err不为空则返回错误
  • err为空则返回[]byte(result)
func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response {}

实现Chaincode应用

chaincode应用程序实现了两个可以通过Invoke函数调用的函数(set/get)

为了访问分类账的状态,利用 chaincode shim API 的ChaincodeStubInterface.PutState 和ChaincodeStubInterface.GetState函数

set函数, 返回两个值
  • 检查参数个数是否为2
  • 利用PutState方法将状态写入
  • 如果成功,则返回要写入的状态, 失败返回错误: fmt.Errorf(“…”)
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {}
get函数, 返回两个值
  • 接收参数并判断个数 是否为1个
  • 调用GetState方法返回并接收两个返回值(value, err)
  • 判断err及value是否为空 return “”, fmt.Errorf(“……”)
  • 返回值 return string(value), nil
func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {}

main方法

func main() {if err := shim.Start(new(SimpleChaincdoe)); err != nil {fmt.Printf("Error starting SimpleAsset chaincode: %s", err)}
}

构建Chaincode

编译chaincode

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

使用开发模式测试

正常情况下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 启动网络
启动网络
$ sudo docker-compose -f docker-compose-simple.yaml up -d

上面的命令以SingleSampleMSPSoloorderer配置文件启动网络,并以“dev模式”启动对等体。它还启动了两个额外的容器 : 一个用于chaincode环境,一个用于与chaincode交互的CLI。创建和加入通道的命令被嵌入到CLI容器中,因此可以立即跳转到链式代码调用

终端2 建立并启动链码

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

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

进入

$ sudo docker exec -it chaincode bash

命令提示符变为:

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

编译

进入test目录编译chaincode

root@858726aed16e:/opt/gopath/src/chaincode#  cd test
root@858726aed16e:/opt/gopath/src/chaincode/test#  go build
运行chaincode
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test
终端3 使用链码
$ sudo docker exec -it cli bash
安装及实例化

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

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

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

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

执行成功, 输出如下内容

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

查询a的值

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

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

Fabric--简单的资产Chaincode相关推荐

  1. Fabric学习笔记(六) - chaincode开发模式

    启动网络 terminal1 cd /opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode-docker-devmodedock ...

  2. fabric 简单理解

    参考:fabric实战 执行过程: 1.客户端或sdk调用api把调用请求发送到所有的背书节点 2.背书节点模拟交易执行,看看有没有问题,没有问题就给调用的客户端或sdk返回读写集,并对其签名. 3. ...

  3. C#超简单实现资产折旧计算方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  4. Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发

    chaincode是由go语言写的,实现了定义的接口.其他语言例如JAVA也是支持的.通过application体积的transaction,chaincode可以初始化并管理Ledger状态. 一个 ...

  5. Hyperledger Fabric Chaincode 开发

    好了,进入正题.我今天分享的内容的题目是Fabric1.0 Chaincode介绍.除了介绍Chaincode程序编写.调试的基本方法之外,我还加入了一些有关Chaincode原理的内容,希望能够帮助 ...

  6. HyperLeger Fabric开发(十)——资产交易平台实战

    HyperLeger Fabric开发(十)--资产交易平台实战 一.资产交易平台需求分析 1.资产交易平台的功能 A.用户开户.销户功能 B.资产登记,即资产上链,资产绑定到用户 C.资产转让,即资 ...

  7. Fabric - chaincode开发模式

    Fabric学习笔记(六) - chaincode开发模式 启动网络 terminal1 cd /opt/gopath/src/github.com/hyperledger/fabric-sample ...

  8. Ubuntu 20.04 下Fabric V2.2.0 和 V1.1.0 运行及配置说明(均可运行)

    ubuntu 20.04 下Fabric V2.2.0 和 V1.1.0 运行及配置说明 ubuntu 20.04 下Fabric运行及配置说明 注:本文是对 <hyperledger/fabr ...

  9. 超级账本Fabric区块链用弹珠游戏Marbles 部署

    Marbles 演示 Marbles GitHub地址 关于 Marbles 这个应用程序的基础网络是 Hyperledger Fabric,后者是一个 Linux Foundation 项目.您可能 ...

最新文章

  1. 使用maven+eclipse搭建最简单的struts2的HelloWorld
  2. IOS之UITabBarController
  3. 破解微软xp黑屏方法
  4. arm-linux-gcc/ld/objcopy/objdump使用总结[zz]
  5. Android NDK之静态/动态注册Native方法
  6. gulp之gulp.watch报错
  7. Pandas Groupby ApplyAgg
  8. Exchange Server 2016 独立部署/共存部署 (六)—— 创建数据库副本
  9. 怎样让你的Linux使用起来更像Windows
  10. C#.Net工作笔记019---葡萄城控件FlexGrid自定义风格_比如给某列设置某个颜色_该颜色不受选择行的影响
  11. 处理数据集python脚本(处理自己制作的数据集)
  12. 安装openstack(pike版本)nova节点,yum安装报错分析
  13. OBS( Open Broadcaster Software )录制视频黑屏问题录制方法
  14. linux 下bt远程下载,在Linux服务器上配置Transmission来离线下载BT种子
  15. 关于快应用list、list-item踩的坑
  16. Cocos2d-x手机游戏开发视频教程
  17. UE5 预览版载具模板工程车不能移动的问题
  18. 空间点到空间直线的垂点计算
  19. python中3个单引号,Pyhton3中单引号、双引号、三个引号的用法和区别
  20. 为什么计算机关机慢,XP系统为什么电脑关机慢?

热门文章

  1. 成功解决成功解决return _iterencode(o, 0) ValueError: Circular reference detected
  2. AI开发者大会之AI学习与进阶实践:2020年7月3日《如何转型搞AI?》、《基于AI行业价值的AI学习与进阶路径》、《自动机器学习与前沿AI开源项目》、《使用TensorFlow实现经典模型》
  3. WeChat之小工具:基于C++程序代码设计的查看微信撤销、撤回消息(包括文本、图片、视频等)GUI小工具
  4. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)
  5. 关于你不知道的特征归一化/标准化
  6. 密码检验规则(字母数字和特殊字符组成的混合体)
  7. 未完全关闭数据库导致ORA-01012: not logged的解决
  8. 29-分数求模(逆元)
  9. numpy中的matrix与array的区别
  10. 提高SQL语句的性能