Fabric1.0.2基于tls连接实现日志监听

   

     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方法。

Fabric1.0.2基于tls连接实现日志监听_第1张图片

 Fabric1.0.2基于tls连接实现日志监听_第2张图片

    comm.InitTLSForPeer方法的内容是什么呢?其实也不复杂。

  在fabric1.0.2源码里connection.go文件里定义了该方法:

 Fabric1.0.2基于tls连接实现日志监听_第3张图片

有上面的截图可知,这里最重要的内容是初始化了两个参数,一个是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
}


对这个例子的源代码和可执行文件感兴趣的同学,可以留下邮箱,我看到就会单独发送。

 

 

 

 

 

你可能感兴趣的:(区块链,hyperledger)