Fabric实战(9)链码(chaincode)开发-chaincode相关命令

本文章所有操作基于的操作系统版本是:ubuntu16.04 64位
本文章基于的Fabric网络环境是《Fabric实战(2)运行一个简单的fabric网络(容器外)》

1 chaincode基本概念

Fabric中智能合约也叫chaincode,开发语言可以是Go、Java、Node.js等语言,其中GO语言使用最为广泛和稳定

2 chaincode相关的管理命令

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参数的编码映射

2.1 install

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打包后的文件。

2.2 instantiate

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容器

2.2.1背书策略

上面的命令中使用了一个参数-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'))

按照示例三进行背书的交易,有两种办法让交易生效:

  • 组织Org1MSP的某个用户对交易进行验证。
  • 组织Org2MSP和Org3MSP中成员共同对交易进行验证。

另外需要注意的是,背书规则只针对那些对chaincode有写入操作的交易,对于查询类的交易不需要背书。另外一点是fabric的背书是发生在客户端,需要进行相关代码的编写才能完成背书。

2.3 invoke

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"]}'

2.4 package

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

2.5 query

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"]}'

2.6 signpackage

用来对已经打好包的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

2.7 upgrade

用来更新已经存在的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')"

你可能感兴趣的:(Fabric)