1. 趣币网首页
  2. 技术
  3. 技术应用

从零到壹学习超级账本理论加实战第十二讲简单的资产Chaincode

从零到壹学习超级账本理论加实战为一个系列,一共23讲,包括超级账本简介、搭建环境、启动网络、测试链码、区块链应用开发等。今天介绍第十二讲:简单的资产Chaincode。

从零到壹学习超级账本理论加实战第十二讲简单的资产Chaincode

黎跃春

孔壹学院、ChainDesk创始人兼CEO

从零到壹学习超级账本理论加实战为一个系列,一共23讲,包括超级账本简介、搭建环境、启动网络、测试链码、区块链应用开发等。今天我们将为大家介绍从零到壹学习超级账本理论加实战第十二讲:简单的资产Chaincode。话不多说,马上开启我们的超级账本理论加实战学习之旅。

孔壹学院
简单的资产Chaincode

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

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

###创建目录

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

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

###新建文件

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

$touchtest.go$vimtest.go

###编写代码

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

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

packagemainimport("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer")typeSimpleChaincdoestruct{}

####初始化Chaincode

Init方法

  • 获取参数, 使用GetStringArgs 函数检索调用 的参数

  • 检查合法性, 检查参数数量是否为2个, 如果不是, 则返回错误信息

  • 利用两参数, 调用PutState方法向账本中写入状态, 如果有错误则返回(shim.Error()), 否则返回nil(shim.Success)

func(t*SimpleChaincdoe)Init(stubshim.ChaincodeStubInterface)peer.Response{}

####调用实现

Invoke方法

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

  • 获取函数名与参数

  • 对获取到的参数名称进行判断, 如果为set, 则调用set方法, 反之调用get

  • set/get函数返回两个值(result, err)

  • 如果err不为空则返回错误

  • err为空则返回[]byte(result)

func(t*SimpleChaincdoe)Invoke(stubshim.ChaincodeStubInterface)peer.Response{}

####实现Chaincode应用

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

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

#####set函数, 返回两个值

  • 检查参数个数是否为2

  • 利用PutState方法将状态写入

  • 如果成功,则返回要写入的状态, 失败返回错误: fmt.Errorf("…")

funcset(stubshim.ChaincodeStubInterface,args[]string)(string,error){}

#####get函数, 返回两个值

  • 接收参数并判断个数 是否为1个

  • 调用GetState方法返回并接收两个返回值(value, err)

  • 判断err及value是否为空 return "", fmt.Errorf("……")

  • 返回值 return string(value), nil

funcget(stubshim.ChaincodeStubInterface,args[]string)(string,error){}

main方法

funcmain(){iferr:=shim.Start(new(SimpleChaincdoe));err!=nil{fmt.Printf("ErrorstartingSimpleAssetchaincode:%s",err)}}

###构建Chaincode

####编译chaincode

$goget-u--tagsnopkcs11github.com/hyperledger/fabric/core/chaincode/shim$gobuild--tagsnopkcs11

####使用开发模式测试

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

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

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

跳转至fabric-samples的chaincode-docker-devmode目录

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

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

$sudodockerimages

会看到如下输出

REPOSITORYTAGIMAGEIDCREATEDSIZEhyperledger/fabric-toolslatestb7bfddf508bcAboutanhourago1.46GBhyperledger/fabric-toolsx86_64-1.1.0b7bfddf508bcAboutanhourago1.46GBhyperledger/fabric-ordererlatestce0c810df36aAboutanhourago180MBhyperledger/fabric-ordererx86_64-1.1.0ce0c810df36aAboutanhourago180MBhyperledger/fabric-peerlatestb023f9be0771Aboutanhourago187MBhyperledger/fabric-peerx86_64-1.1.0b023f9be0771Aboutanhourago187MBhyperledger/fabric-javaenvlatest82098abb1a17Aboutanhourago1.52GBhyperledger/fabric-javaenvx86_64-1.1.082098abb1a17Aboutanhourago1.52GBhyperledger/fabric-ccenvlatestc8b4909d8d46Aboutanhourago1.39GBhyperledger/fabric-ccenvx86_64-1.1.0c8b4909d8d46Aboutanhourago1.39GB......

####使用三个终端

#####终端1 启动网络

######启动网络

$sudodocker-compose-fdocker-compose-simple.yamlup-d

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

#####终端2 建立并启动链码

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

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

进入

$sudodockerexec-itchaincodebash

命令提示符变为:

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

######编译

进入test目录编译chaincode

root@858726aed16e:/opt/gopath/src/chaincode#cdtestroot@858726aed16e:/opt/gopath/src/chaincode/test#gobuild

######运行chaincode

CORE_PEER_ADDRESS=peer:7052CORE_CHAINCODE_ID_NAME=test:0./test

#####终端3 使用链码

$sudodockerexec-itclibash

######安装及实例化

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

peerchaincodeinstall-pchaincodedev/chaincode/test-ntest-v0peerchaincodeinstantiate-ntest-v0-c'{"Args":["a","10"]}'-Cmyc

######调用

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

peerchaincodeinvoke-ntest-c'{"Args":["set","a","20"]}'-Cmyc

执行成功, 输出如下内容

............Chaincodeinvokesuccessful.result:status:200payload:"20"......

######查询

查询a的值

peerchaincodequery-ntest-c'{"Args":["query","a"]}'-Cmyc

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

©本文仅代表作者本人观点,与趣币网无关。趣币网对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。若以此作为投资依据,请自行承担全部责任。转载请注明出处:趣币网

发表评论

登录后才能评论

联系我们

13798586780

在线咨询:点击这里给我发消息

邮件:1074760229@qq.com

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

QR code