一、fabric智能合约运行环境
Chaincode是一个程序,Chaincode运行在一个被背书peer进程独立出来的安全的Docker容器中,Fabric中支持多种语言实现链码,包括golang、javascript、java等。当前主要以Golang为主,性能和稳定性都较好
ChainCode:链码
Fabric-ccevn:Fabric提供的链码运行环境
Docker:Docker容器
Golang:go语言环境,链码使用go语言编写, 需要Golang提供SDK支持
Linux OS:底层操作系统
二、智能合约需要实现的接口
每一个chaincode需要实现Chaincode接口,其方法是用于响应接收到的transaction
Init方法:当chaincode接收到instantiate或者upgrade transaction时Init方法被调用,以便chaincode能够执行任何必要的初始化,包括application state的初始化
Invoke方法:当chaincode接收到invoke transaction时调用invoke方法,用于处理transaction proposal
Main方法:程序入口
链码程序以一个文件目录的形式安装,所以一个链码可以有多个文件组成,链码程序可以支持非常复杂的功能
三、fabric系统提供给智能合约的接口
前面提到chaincode是改变区块链账本的唯一途径,Fabric提供了接口,chaincode通过这个接口实现对账本的修改,实际就是对状态数据的增删改查,前面提到Fabric1.x数据存储包含有,账本、索引、历史记录、状态数据(世界观),在这里chaincode只对状态数据进行操作,其他的账本,索引和历史记录系统会自动更新,不需要外部操作
接口类型包含下列6种:
与链码调用参数解析相关
与交易消息解析相关
与状态数据操作相关
与链码调用相关
与事件处理相关
与辅助操作相关
3个主要对状态数据操作方法如下:
增改数据PutState(key string,value[]byte)error:
删除数据DelState(key string)error
查询数据GetState(key string)([]byte,error)
[root localhost test-network]#./network.sh deployCC-ccn basic-ccp../asset-transfer-basic/chaincode-go-ccl go
Using docker and docker-compose
deploying chaincode on channel'mychannel'
executing with the following
-CHANNEL_NAME:mychannel
-CC_NAME:basic
-CC_SRC_PATH:../asset-transfer-basic/chaincode-go
-CC_SRC_LANGUAGE:go
-CC_VERSION:1.0
-CC_SEQUENCE:1
-CC_END_POLICY:NA
-CC_COLL_CONFIG:NA
-CC_INIT_FCN:NA
-DELAY:3
-MAX_RETRY:5
-VERBOSE:false
Vendoring Go dependencies at../asset-transfer-basic/chaincode-go
/home/lj/fabric/scripts/fabric-samples/asset-transfer-basic/chaincode-go/home/lj/fabric/scripts/fabric-samples/test-network
go:github.com/golang/protobuf v1.3.2:Get"https://proxy.golang.org/github.com/golang/protobuf/ v/v1.3.2.mod":dial tcp 172.217.163.49:443:connect:connection refused
/home/lj/fabric/scripts/fabric-samples/test-network
Finished vendoring Go dependencies
+peer lifecycle chaincode package basic.tar.gz--path../asset-transfer-basic/chaincode-go--lang golang--label basic_1.0
+res=1
Error:failed to normalize chaincode path:'go list'failed with:go:github.com/golang/protobuf v1.3.2:Get"https://proxy.golang.org/github.com/golang/protobuf/ v/v1.3.2.mod":dial tcp 172.217.163.49:443:connect:connection refused:exit status 1
Chaincode packaging has failed
Deploying chaincode failed