Fabric1.0.2默认自带的例子是不基于tls连接的,但是balance-transfer和e2e_cli的例子是基于tls,为了使连接更加安全和通用,研究支持基于tls的日志监听实现。
Fabric1.0.2源码里的example/events/Block-listener.go例子产生监听客户端的流程大致是:
Block-listener.go里调用createEventClient方法,该方法会调用consumer的NewEventsClient方法,NewEventsClient类初始化后会调用start方法,start方法里会调用newEventsClientConnectionWithAddress方法,这是实现tls连接的核心方法。
由下面的截图可以看到如果是tls连接,最后一个参数将调用comm.InitTLSForPeer方法。
comm.InitTLSForPeer方法的内容是什么呢?其实也不复杂。
在fabric1.0.2源码里connection.go文件里定义了该方法:
有上面的截图可知,这里最重要的内容是初始化了两个参数,一个是sn,一个是creds。
通过验证得到以下结论:
(1)sn需要和cryptogen工具的配置文件(cryptogen.yaml)里定义的域名是一致的,即形如peer0.org1.example.com
(2)config.GetPath("peer.tls.rootcert.file") 里对应的文件即docker-compose文件里定义的
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/crypto/peer/tls/ca.crt的文件
更改好这两个参数的内容变成通过传参数获得(原有方式通过获取配置文件的内容不方便更改,所以官方例子才需要禁用掉tls连接去测试事件监听例子),重新go build一个可执行文件,修改主机host,添加
Peer0容器ip地址 peer0.org1.example.com
在命令行运行:
./block-listener-tls -events-address=127.0.0.1:7053 -events-sn=peer0.org1.example.com -events-rootca=/usr/local/balance-transf-1.0.2/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -events-from-chaincode=mycc1 -events-mspdir=/usr/local/balance-transf-1.0.2/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp -events-mspid=Org1MSP
正常启动后监听到事件,并将结果打印在控制台。如果没改这些地方,启动原有的block-listen在tls连接的情况下是会直接报错退出的。
虽然是用org1的msp来连接,但是只要在同一条channel,无论是org1还是org2产生的区块都能监听到。
下面列出所有的事件类型。
Enum HeaderType {
MESSAGE = 0; // Used for messages which are signed but opaque
CONFIG = 1; // Used for messages which express the channel config
CONFIG_UPDATE = 2; // Used for transactions which update the channel config
ENDORSER_TRANSACTION = 3; // Used by the SDK to submit endorser based transactions
ORDERER_TRANSACTION = 4; // Used internally by the orderer for management
DELIVER_SEEK_INFO = 5; // Used as the type for Envelope messages submitted to instruct the Deliver API to seek
CHAINCODE_PACKAGE = 6; // Used for packaging chaincode artifacts for install
}
对这个例子的源代码和可执行文件感兴趣的同学,可以留下邮箱,我看到就会单独发送。