目录
1、链码的打包与签名
编辑
对链码的签名
1、安装已经添加签名的链码
2、安装成功之后进行链码的实例化操作,同时指定其背书策略
测试
1、查询链码
2、调用链码
3、查询链码
链码的升级
1、安装链码
2、升级链码
3、测试
1、查询
2、调用
3、查询
链码升级之后,之前旧版本的链码还能使用吗?
1、链码的打包与签名
通过将链码相关数据(如链码的名称、版本、实例化策略等信息)进行封装,可以实现对其进行打包和签名的操作。
链码包 具体包含以下3部分:
- 链码本身,由ChaincodeDeploymentSpec(CDS)定义。CDS根据代码及一些其他属性(名称、版本等)来定义链码。
- 一个可选的实例化策略,该策略可被背书策略描述。
- 一组表示链码所有权的签名。
对于一个已经编写完成的链码,可以使用package命令进行打包操作:
peer chaincode package -n exacc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ -s -S -i "AND('Org1MSP.admin')" ccpack.out
下面是对该命令的各个参数的解释:
peer chaincode package
: 这是命令的名称,用于将链码打包。-n exacc
: 指定链码的名称为 "exacc","exacc" 是链码的标识符。-v 1.0
: 指定链码的版本为 "1.0","1.0" 是链码的版本号。-p github.com/chaincode/chaincode_example02/go/
: 指定链码的路径为 "github.com/chaincode/chaincode_example02/go/",这是链码的位置。-s
: 表示将链码打包为一个压缩文件。-S
: 表示将链码打包为一个签名压缩文件。-i "AND('Org1MSP.admin')"
: 指定对链码进行签名的标识。这里使用 "Org1MSP.admin",它表示使用组织 "Org1MSP" 的管理员身份进行签名。ccpack.out
: 指定输出的打包文件名为 "ccpack.out",这是打包后的链码文件。
对链码的签名
对一个打包文件进行签名操作(添加当前MSP签名到签名列表中),可以使用signpackage命令来实现:
peer chaincode signpackage ccpack.out signedccpack.out
指定生成的signedccpack.out文件包含一个用本地MSP对包进行的附加签名。添加了签名的链码包可以进行下一步的处理,如先将链码进行安装,然后对已安装的链码进行实例化成升级操作。
1、安装已经添加签名的链码
peer chaincode install signedccpack.out
2、安装成功之后进行链码的实例化操作,同时指定其背书策略
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n exacc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR('Org1MSP.peer','Org2MSP.peer')"
这个命令是 Hyperledger Fabric 中的一个命令,用于在通道上实例化链码。下面是对该命令的各个参数的解释:
peer chaincode instantiate
: 这是命令的名称,用于在通道上实例化链码。-o orderer.example.com:7050
: 指定排序服务节点的地址和端口号。在这里是 "orderer.example.com:7050"。--tls
: 表示使用 TLS 连接到排序服务节点。--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/
example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
: 指定 TLS 连接所需的根证书文件的路径。-C $CHANNEL_NAME
: 指定要在其上实例化链码的通道名称。这里使用了一个环境变量$CHANNEL_NAME
,用于指定通道名称。-n exacc
: 指定要实例化的链码的名称为 "exacc","exacc" 是链码的标识符。-v 1.0
: 指定要实例化的链码的版本为 "1.0","1.0" 是链码的版本号。-c '{"Args":["init","a","100","b","200"]}'
: 指定链码实例化时的初始化参数。这里使用了 JSON 格式的参数,以初始化链码中的两个账户 "a" 和 "b",分别赋予初始值 "100" 和 "200"。-P "OR('Org1MSP.peer','Org2MSP.peer')"
: 指定链码的背书策略。这里使用了一个策略表达式,表示只要 "Org1MSP" 或 "Org2MSP" 中的对等节点对该链码进行背书,即可通过背书策略验证。
测试
1、查询链码
peer chaincode query -C $CHANNEL_NAME -n exacc -c '{"Args":["query","a"]}'
2、调用链码
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n exacc -c '{"Args":["invoke","a","b","10"]}'
该命令是用于在Hyperledger Fabric区块链网络中调用一个名为"exacc"的智能合约。
解释每个参数的含义如下:
peer chaincode invoke
:这是用于在对等节点上调用链码的命令。-o orderer.example.com:7050
:指定要连接的排序服务的地址和端口。--tls
:启用使用TLS进行通信。--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
:指定用于TLS连接的根证书的路径。-C $CHANNEL_NAME
:指定要在其中执行链码的通道。-n exacc
:指定要调用的链码的名称为"exacc"。-c '{"Args":["invoke","a","b","10"]}'
:指定传递给链码的调用参数。在这种情况下,调用参数是一个JSON字符串,包含一个名为"invoke"的函数和三个参数:"a"、"b"和"10"。
3、查询链码
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
链码的升级
1、安装链码
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
2、升级链码
peer chaincode upgrade -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
该命令是用于在Hyperledger Fabric区块链网络中升级一个名为"mycc"的智能合约。
解释每个参数的含义如下:
peer chaincode upgrade
:这是用于在对等节点上升级链码的命令。-o orderer.example.com:7050
:指定要连接的排序服务的地址和端口。--tls
:启用使用TLS进行通信。--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
:指定用于TLS连接的根证书的路径。-C $CHANNEL_NAME
:指定要在其中执行链码的通道。-n mycc
:指定要升级的链码的名称为"mycc"。-v 2.0
:指定要升级到的链码的新版本号为2.0。-c '{"Args":["init","a","100","b","200"]}'
:指定传递给链码的初始化参数。在这种情况下,初始化参数是一个JSON字符串,包含一个名为"init"的函数和四个参数:"a"、"100"、"b"和"200"。-P "OR ('Org1MSP.peer','Org2MSP.peer')"
:指定链码的背书策略。在这种情况下,链码的背书策略是至少需要"Org1MSP.peer"和"Org2MSP.peer"两个对等节点进行背书。该命令的目的是在指定的通道上升级名为"mycc"的链码到版本2.0,并通过调用"init"函数并传递参数"a"、"100"、"b"和"200"来进行初始化。同时,链码的背书策略要求至少"Org1MSP.peer"和"Org2MSP.peer"两个对等节点进行背书。
3、测试
1、查询
peer chaincode query -C $CHANNEL_NAME -n exacc -c '{"Args":["query","a"]}'
2、调用
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n exacc -c '{"Args":["invoke","a","b","10"]}'
该命令是用于在Hyperledger Fabric区块链网络中升级一个名为"mycc"的智能合约。
解释每个参数的含义如下:
peer chaincode upgrade
:这是用于在对等节点上升级链码的命令。-o orderer.example.com:7050
:指定要连接的排序服务的地址和端口。--tls
:启用使用TLS进行通信。--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
:指定用于TLS连接的根证书的路径。-C $CHANNEL_NAME
:指定要在其中执行链码的通道。-n mycc
:指定要升级的链码的名称为"mycc"。-v 2.0
:指定要升级到的链码的新版本号为2.0。-c '{"Args":["init","a","100","b","200"]}'
:指定传递给链码的初始化参数。在这种情况下,初始化参数是一个JSON字符串,包含一个名为"init"的函数和四个参数:"a"、"100"、"b"和"200"。-P "OR ('Org1MSP.peer','Org2MSP.peer')"
:指定链码的背书策略。在这种情况下,链码的背书策略是至少需要"Org1MSP.peer"和"Org2MSP.peer"两个对等节点进行背书。该命令的目的是在指定的通道上升级名为"mycc"的链码到版本2.0,并通过调用"init"函数并传递参数"a"、"100"、"b"和"200"来进行初始化。同时,链码的背书策略要求至少"Org1MSP.peer"和"Org2MSP.peer"两个对等节点进行背书。
3、查询
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
注意: 在升级过程中,链码的Iit函数会被调用以执行数据初始化相关的操作,所以在实际的生产环境中需要多加小心,以避免在升级链码时重设状态信息。
链码升级之后,之前旧版本的链码还能使用吗?
升级是一个类似于实例化操作的过程,会将新版本的链码与通道绑定。其他与旧版本
绑定的通道则仍旧运行旧版本的链码。换句话说,一次升级只会影响一个提交它的通道。