写在前面
在超级账本中的事件有区块、链码、交易的事件,对于这些事件的监听是至关重要的,因为我们需要获得其中的很多重要信息,所以我们要学习关于事件监听的SDK,
概述
按照官方文档中的Basic Flow
来看,监听事件的步骤如下:
- 准备通道事件的上下文
- 创建事件的客户端
- 为想要监听的事件注册
- 监听到事件的信息
- 取消注册
官方例程:
|
|
New(mockChannelProvider())
:以mock
形式创建一个客户端RegisterChaincodeEvent
:注册一个链码事件- 返回值
registration
:作为取消注册函数Unregister
的入参 - 返回值
notifier
:是我们接收到事件的具体信息,是一个通道类型
- 返回值
select{case : case :}
:读取通道类型的数据
监听区块事件
|
|
官方例程:
|
|
New(mockChannelProvider())
:以mock
形式创建一个链码的客户端WithBlockEvents()
:一个可选项
RegisterBlockEvent
:注册一个区块事件Unregister
:取消注册
监听链码事件
|
|
- 返回值
Registration
:作为取消注册函数Unregister
的入参 - 返回值
CCEvent
:通道类型,保存链码信息,CCEvent
结构体中有六个成员:TxID
:交易IDChaincode
:链码IDEventName
:事件名Payload
:自定义BlockNumber
:标识区块SourceURL
:产生该事件的peer
节点的域名
官方例程1:
|
|
- 与监听区块信息的例程区别是:
- 在以
mock
形式创建一个客户端时没有设置可选项WithBlockEvents()
- 在以
RegisterChaincodeEvent
:注册一个链码事件,有两个入参:examplecc
:链码名称event123
:事件名称
注:事件名称和
payload
的定义都在链码中编写,用到shim
包中的API:SetEvent,在编写一个链码函数的时候,只要在链码函数的最后加上调用SetEvents
方法,第一个入参写上事件名,第二个参数传入想要返回的payload
信息
官方例程2:
|
|
- 如果想要获取
payload
信息,就需要在创建客户端时添加可选项WithBlockEvents()
示例
链码事件的监听需要两边的配合:首先需要在链码编写的时候,在想要监听的函数的最后加上SetEvent
方法,然后再在SDK中使用链码监听事件的方法。这样我们才能够来监听一个链码事件
链码编写:
|
|
- 事件名称:
chaincode-event
payload
信息:自定义EventName
为set
,当读到链码事件时,我们就能知道所触发的链码函数是set
SDK:
|
|
channel.New()
:为通道创建客户端ChClient
,用于调用智能合约event.New()
:为事件创建客户端EvClient
,后面要加上event.WithBlockEvents()
选项,可以读到链码事件中payload
信息
主函数
|
|
示例代码:三次set
操作,最后一次get
操作