简介
我们在上一篇文章中介绍了如何对通道上的链码进行实例化,从这一篇文章开始我们与区块链账本进行交互。这是自定义 fabric 生产环境系列最后一篇文章,希望能对你的 fabric 学习之路有所帮助。
与链码交互
查询(query)
让我们查询 a 的值,以确保链码被正确实例化并且向状态数据库写入了数据。查询的语法是这样的:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
因为调用初始化方法时,我们赋给键 a 的值为 100,因此查询结果应该也是 100
调用(invoke)
现在我们从 a 账户向 b 账户转账 10,这个交易将会产生一个新的区块并更新状态数据库,调用的语法是这样的:
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mychannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
命令很长,不要害怕,我们分解来看。
-o 表示使用的排序服务(共识服务)
--tls 使用TLS加密通信
--cafile 这是排序节点的根证书的本地路径,允许我们去验证TLS握手
-C 通道名称
-n 链码名称
--peerAddresses 组织 1 锚节点的地址(域名+端口号)
--tlsRootCertFiles TLS根证书路径
-c 链码操作,调用链码函数为 invoke,实现 a 向 b 转账 10
- 执行结果
此时再查询键a的值和键b的值,看是否发生变化:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
可以看到,a、b 初始余额分别为 100 和 200,a 向 b 成功转了 10 个单元代币,a 剩余 90,b 余额增加到 210,转账调用成功。
恭喜你,从 0 纯手动搭建了一个完整的 fabric 生产环境,下面就是根据自己的需求修改配置文件,构造更加复杂的网络了,但是基本原理都已经介绍了,这大概就是 fabric 生产环境搭建的流程了,后面还会涉及动态增添组织、节点。
一些补充
- 链码必须安装在节点上才能与区块链账本交互;
- 一个链码容器在链码实例化之前不会在节点里启动(所以安装了链码后记得实例化);
- 所有通道中的节点都持有以块的形式顺序存储的不可变账本的精确备份以及用来保存当前状态的快照状态数据库;
- 一个链码在通道上只需要被实例化一次,即使在新的节点上安装了该链码,如果已经被其他节点实例化,那么该链码默认直接可用(因为它已经实例化过了)。
实例化是把链码添加到通道上,并为目标节点启动容器。
假设我们在 peer0.org1.example.com 安装并实例化了链码,然后在 peer1.org1.example.com 安装了链码,那么此时已经启动了两个链码容器。此时如果我们以安装了链码的节点 peer1.org2.example.com 发送对 “a” 值的查询时,将默认启动第三个链码容器(名为 dev-peer1.org2.example.com-mycc-1.0)。
此时网络中共启动了三个这样的容器,如下图所示:
另外,如果你想查看链码日志,可以使用以下命令:
docker logs dev-peer0.org1.example.com-mycc-1.0
docker logs dev-peer0.org2.example.com-mycc-1.0
docker logs dev-peer1.org2.example.com-mycc-1.0
链码日志中记录了所有的状态变更,在出现 bug 时,查询链码日志是排查错误的一个好办法。
over