本文章所有操作基于的操作系统版本是:ubuntu16.04 64位
本文章基于的Fabric网络环境是《Fabric实战(2)运行一个简单的fabric网络(容器外)》
Fabric中智能合约也叫chaincode,开发语言可以是Go、Java、Node.js等语言,其中GO语言使用最为广泛和稳定
Usage:
peer chaincode [command]
可用的自命令:
install #将指定的链码打包并安装到指定的peer节点上
instantiate #对已经执行过install命令的chaincode进行实例化
invoke #调用chaincode
package #对链码进行打包
query #调用chaincode进行查询
signpackage #对已经打包好的chaincode进行签名
upgrade #对银镜存在的chaincode进行更新
几个所有子命令公用的参数:
--cafile string #PEM格式证书的位置
-o, --orderer string #orderer服务器的访问地址
--tls #使用orderer的TLS证书的位置
--transient #JSON参数的编码映射
install 命令负责安装chaincode,这个过程命令会自动编译chaincode的源代码,如果有语法错误,会报错。install命令的参数如下所示:
-c, --ctor #JSON格式的构造参数 ,默认值是"{}"
-l, --l #编写chaincode的语言,默认值是"golang"
-n, --name #chaincode的名字
-p, --path #chaincode源代码的路径
-v, --version #当前操作的chaincode的版本
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#要访问的peer的地址和端口号
export set CORE_PEER_ADDRESS=peer0.org1.simple-network.com:7051
#执行peer chaincode install命令
peer chaincode install -n r_test_cc6 -v 1.1 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
install命令成功执行后,在被访问的peer模块的数据目录中会生成一个带-n参数和-v参数组成文件,在《运行一个简单的fabric网络》中文件的路径如下:
~/fabric-ws/simple-demo/peer0-org1/production/chaincodes
在这个路径下会发现一个名为r_test_cc6.1.1的文件,这个文件就是chaincode打包后的文件。
instantiate会对已经执行过install命令的chaincode进行实例化,instantiate命令执行完成后会启动chaincode运行的docker镜像,同时instantiate命令还会对chaincode进行初始化,调用chaincode的Init函数。
instantiate命令的参数选项如下:
-C,--channelID #指定将chaincode实例化到哪个通道
-c,--ctor #JSON格式的构造参数,默认值是"{}"
-E,--escc #应用与当前chaincode的系统背书链码的名字
-l,--lang #编写chaincode的编程语言,默认值是"golang"
-n,--name #chaincode的名字,需要实例哪一个chaincode
-P,--policy #当前chaincode的背书策略
-v,--version #当前操作的chaincode版本
-V,--vscc #当前chaincode调用的验证系统的系统链码的名字
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#要访问的peer的地址和端口号
export set CORE_PEER_ADDRESS=peer0.org1.simple-network.com:7051
#执行peer chaincode instantiate命令
peer chaincode instantiate -o orderer.simple-network.com:7050 -C testchannel -n r_test_cc6 -v 1.0 -c '{"Args":["init", "a", "100", "b", "200"]}' -P "OR ('Org1MSP.member', 'Org2MSP.member')"
instantiate命令执行成功后,可以通过docker ps命令查看已经启动的chaincode容器
上面的命令中使用了一个参数-P,参数的值是"OR (‘Org1MSP.member’, ‘Org2MSP.member’)",这个值就是指明这个实例化的链码采用何种背书策略。也就是说以后发交易对这个链码近性操作必须符合这个背书策略。
在Fabric中有一个非常重要的概念叫Endorsement,中文明证叫背书。背书的过程就是一笔交易被确认的过程。背书策略被用来指示对相关参与方如何对交易进行确认。当一个节点接收到一个交易请求时,会调用VSCC(系统链码,处理背书验证相关的操作)与交易的chaincode共同来验证交易的合法性。在VSCC和交易的chaincode共同对交易的确认中,通常会做以下校验。
1. 交易中所有背书签名是否有效
2. 参与背书的数量是否满足要求
3. 所有背书参与方是否满足要求
背书策略是指定第二和第三点的一种方式。比如"OR (‘Org1MSP.member’, ‘Org2MSP.member’)"。这个参数说明对当前实例化的chaincode发起的交易,需要组织编号为Org1MSP 或 组织编号为Org2MSP组织中任何一个用户共同参与交易的确认并签名同意,这样的交易就能够生效,被记录到区块链中。
除了上面用到的OR关键字,换可以用AND,比如:
"OR ('Org1MSP.member', 'Org2MSP.member')"
这样就表示对当前实例化的chaincode发起的交易,需要组织编号为Org1MSP 和 组织编号为Org2MSP组织中任何一个用户共同参与交易的确认并签名同意,这样的交易就能够生效。
通过上面的描述,基本上可以了解背书策略的编写规则,下面通过几个实例进一步了解背书策略的编写规则。
示例一
AND('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')
按照示例一进行背书的交易,必须经过组织Org1MSP、Org2MSP、Org3MSP中的用户共同验证的交易才能生效。
示例二
OR('Org1MSP.member', 'Org2MSP.member')
按照示例二进行背书的交易,只需经过组织Org1MSP或组织Org2MSP中的用户共同验证的交易就能生效。
示例三
OR('Org1MSP.member', AND('Org1MSP.member', 'Org2MSP.member'))
按照示例三进行背书的交易,有两种办法让交易生效:
另外需要注意的是,背书规则只针对那些对chaincode有写入操作的交易,对于查询类的交易不需要背书。另外一点是fabric的背书是发生在客户端,需要进行相关代码的编写才能完成背书。
invoke命令的调用chaincode。invoke命令的选项如下:
-C,--channelID 调用哪个通道中的链码,默认值是"testchainid"
-c,--ctor JSON格式的构造参数,默认值是"{}"
-n,--name 要调用chaincode的名字
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#要访问的peer的地址和端口号
export set CORE_PEER_ADDRESS=peer0.org1.simple-network.com:7051
#执行peer chaincode instantiate命令
peer chaincode invoke -o orderer.simple-network.com:7050 -C testchannel -n r_test_cc6 -v 1.0 -c '{"Args":["invoke", "a", "b", "1"]}'
package是用来将chaincode打包。 package命令的参数如下:
-c,--ctor #JSON格式的构造参数,默认值是"{}"
-i,--instantiate-policy chaincode的权限
-l,--lang #编写chaincode的编程语言。默认值是"golang"
-n,--name #chaincode的名字
-p, --path #待打包chaincode的源码路径
-S,--sign #对打包的文件用本地的MSP(core.yaml配置文件中localMspId指定的值)进行签名。
-v,--version #当前操作的chaincode版本
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#执行peer chaincode package命令
peer chaincode package -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -n r_test_cc6 -v 1.1 -S -i "OR {'Org1MSP.member','Org2MSP.member'}" r_test_cc6_1.1.out
query命令用来执行chaincode代码中的query方法,选项如下:
-C,--channelID #调用哪个通道中的链码,默认值是"testchainid"
-c,--ctor #JSON格式的构造参数,默认值是"{}"
-x,--hex #是否对输出的内容进行16进制编码处理
-n,--name #要调用chaincode的名字
-r,--raw #是否输出二进制内容
-t,--tid #制定当前查询的编号
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]-network.com/msp
#要访问的peer的地址和端口号
export set CORE_PEER_ADDRESS=peer0.org1.simple-network.com:7051
#执行peer chaincode query命令
peer chaincode query -o orderer.simple-network.com:7050 -C testchannel -n r_test_cc6 -v 1.0 -c '{"Args":["query", "a"]}'
用来对已经打好包的chaincode进行签名
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#执行peer chaincode signpackage命令
peer chaincode signpackage r_test_cc6_1.1.out sign_r_test_cc6_1.1.out
用来更新已经存在的chaincode。updategrade命令参数如下:
-C,--channelID #调用哪个通道中的链码,默认值是"testchainid"
-c,--ctor #JSON格式的构造参数,默认值是"{}"
-E,--escc #应用与当前chaincode的系统背书链码的名字
-l,--lang #编写chaincode的编程语言,默认值是"golang"
-n,--name #chaincode的名字,需要实例哪一个chaincode
-p,--path #chaincode的源码路径
-P,--policy #当前chaincode的背书策略
-v,--version #要更新的chaincode版本
-V,-vscc #当前chaincode调用的验证系统chiancode的名字
调用示例:
#运行命令的peer所在的MSPID
export set CORE_PEER_LOCALMSPID=Org1MSP
#运行命令的peer的MSP,使用组织内的管理员权限访问网络
export set CORE_PEER_MSPCONFIGPATH=/home/zym/fabric-ws/simple-demo/crypto-config/peerOrganizations/org1.simple-network.com/users/[email protected]/msp
#要访问的peer的地址和端口号
export set CORE_PEER_ADDRESS=peer0.org1.simple-network.com:7051
#执行peer chaincode upgrade 命令
peer chaincode upgrade -o orderer.simple-network.com:7050 -C testchannel -n r_test_cc6 -v 1.3 -c '{"Args":["init", "a", "10000", "b", "200"]}' -P "OR ('Org1MSP.member', 'Org2MSP.member')"