应用程序是一个基本样本链代码,用于在分类账上创建资产
安装Go及Docker, Docker-compose, 并配置Go相应的环境变量
为chaincode应用程序创建一个目录作为其子目录
$ mkdir -p $GOPATH/src/test $ cd $GOPATH/src/test新建一个文件,用于编写Go代码
$ touch test.go $ vim test.go必须实现 Chaincode接口的Init和Invoke函数。因此,须在文件中添加go import语句以获取链代码的依赖。
导入chaincode shim包和 peer protobuf包。然后添加一个结构SimpleChaincdoe作为Chaincode函数的接收器
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) type SimpleChaincdoe struct { }Init方法
获取参数, 使用GetStringArgs 函数检索调用 的参数检查合法性, 检查参数数量是否为2个, 如果不是, 则返回错误信息利用两参数, 调用PutState方法向账本中写入状态, 如果有错误则返回(shim.Error()), 否则返回nil(shim.Success) func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response { }Invoke方法
验证函数名称为set或get,并调用那些链式代码应用程序函数,通过shim.Success或shim.Error函数返回响应
获取函数名与参数对获取到的参数名称进行判断, 如果为set, 则调用set方法, 反之调用getset/get函数返回两个值(result, err)如果err不为空则返回错误err为空则返回[]byte(result) func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response { }chaincode应用程序实现了两个可以通过Invoke函数调用的函数(set/get)
为了访问分类账的状态,利用 chaincode shim API 的ChaincodeStubInterface.PutState 和ChaincodeStubInterface.GetState函数
main方法
func main() { if err := shim.Start(new(SimpleChaincdoe)); err != nil { fmt.Printf("Error starting SimpleAsset chaincode: %s", err) } }正常情况下chaincode由对等体启动和维护。然而,在“开发模式”下,链码由用户构建并启动
如果没有安装Hyperledger Fabric Samples请先安装
如果没有下载Docker images请先下载
跳转至fabric-samples的chaincode-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 ......上面的命令以SingleSampleMSPSoloorderer配置文件启动网络,并以“dev模式”启动对等体。它还启动了两个额外的容器 : 一个用于chaincode环境,一个用于与chaincode交互的CLI。创建和加入通道的命令被嵌入到CLI容器中,因此可以立即跳转到链式代码调用
打开第二个终端, 进入到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进入CLI容器后执行如下命令安装及实例化chaincode
peer chaincode install -p chaincodedev/chaincode/test -n test -v 0 peer chaincode instantiate -n test -v 0 -c '{"Args":["init","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
