应用程序是一个基本样本链代码,用于在分类账上创建资产
安装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方法
func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response {
}
Invoke方法
验证函数名称为set
或get
,并调用那些链式代码应用程序函数,通过shim.Success
或shim.Error
函数返回响应
func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
}
chaincode应用程序实现了两个可以通过Invoke
函数调用的函数(set/get)
为了访问分类账的状态,利用 chaincode shim API 的ChaincodeStubInterface.PutState 和ChaincodeStubInterface.GetState函数
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
}
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)
}
}
$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim
$ go build --tags nopkcs11
正常情况下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
......
$ sudo docker-compose -f docker-compose-simple.yaml up -d
上面的命令以SingleSampleMSPSolo
orderer配置文件启动网络,并以“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
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test
$ 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":["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