pkg/client/event event包
一. pkg/client/event 通过event包可以访问Fabric网络上的通道事件。 事件客户端接收诸如块,过滤块,链代码和事务状态事件之类的事件。
- 基本流程
1)准备频道客户端上下文
2)创建事件客户端
3)注册事件
4)处理事件(或超时)
5)取消注册1 ec, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 registration, notifier, err := ec.RegisterChaincodeEvent("examplecc", "event123") 7 if err != nil { 8 fmt.Println("failed to register chaincode event") 9 } 10 defer ec.Unregister(registration) 11 12 select { 13 case ccEvent := <-notifier: 14 fmt.Printf("received chaincode event %v\n", ccEvent) 15 case <-time.After(time.Second * 5): 16 fmt.Println("timeout while waiting for chaincode event") 17 } 18 19 // Timeout is expected since there is no event producer
输出:timeout while waiting for chaincode event
- 类型Client
-
type Client struct { // contains filtered or unexported fields }: 客户端可以访问Fabric网络上的通道事件。
-
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error): New返回Client实例。 客户端接收诸如块,过滤块,链代码和事务状态事件之类的事件。
- 例:
1 ctx := mockChannelProvider("mychannel") 2 3 ec, err := New(ctx, WithBlockEvents()) 4 if err != nil { 5 fmt.Println(err) 6 } 7 8 if ec != nil { 9 fmt.Println("event client created") 10 } else { 11 fmt.Println("event client is nil") 12 }
输出:event client created
- 例:
-
func (c *Client) RegisterBlockEvent(filter ...fab.BlockFilter) (fab.Registration, <-chan *fab.BlockEvent, error): RegisterBlockEvent注册块事件。 如果调用者没有注册块事件的权限,则返回错误。 不再需要注册时,必须调用取消注册。
- 参数
filter是一个可选的过滤器,可过滤掉不需要的事件。 (注意:只能指定一个过滤器。)
返回:
注册和用于接收事件的频道。 调用取消注册时,通道将关闭。 - 例:
1 ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents()) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 registration, _, err := ec.RegisterBlockEvent() 7 if err != nil { 8 fmt.Println("failed to register block event") 9 } 10 defer ec.Unregister(registration) 11 12 fmt.Println("block event registered successfully")
输出:block event registered successfully
- 参数
-
func (c *Client) RegisterChaincodeEvent(ccID, eventFilter string) (fab.Registration, <-chan *fab.CCEvent, error): RegisterChaincodeEvent注册链代码事件。 不再需要注册时,必须调用取消注册。
- 参数:
ccID是要为其接收事件的链代码ID
eventFilter是要为其接收事件的chaincode事件过滤器(正则表达式)返回:
注册和用于接收事件的频道。 调用取消注册时,通道将关闭。 - 例:
1 ec, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123") 7 if err != nil { 8 fmt.Println("failed to register chaincode event") 9 } 10 defer ec.Unregister(registration) 11 12 fmt.Println("chaincode event registered successfully")
输出:chaincode event registered successfully
1 // If you require payload for chaincode events you have to use WithBlockEvents() option 2 ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents()) 3 if err != nil { 4 fmt.Println("failed to create client") 5 } 6 7 registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123") 8 if err != nil { 9 fmt.Println("failed to register chaincode event") 10 } 11 defer ec.Unregister(registration) 12 13 fmt.Println("chaincode event registered successfully")
输出:chaincode event registered successfully
- 参数:
-
func (c *Client) RegisterFilteredBlockEvent() (fab.Registration, <-chan *fab.FilteredBlockEvent, error): egisterFilteredBlockEvent注册过滤的块事件。当不再需要注册时,必须调用取消注册。
- 参数:
返回:
注册和用于接收事件的频道。 调用取消注册时,通道将关闭。 - 例:
1 ec, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 registration, _, err := ec.RegisterFilteredBlockEvent() 7 if err != nil { 8 fmt.Println("failed to register filtered block event") 9 } 10 defer ec.Unregister(registration) 11 12 fmt.Println("filtered block event registered successfully")
输出:filtered block event registered successfully
- 参数:
-
func (c *Client) RegisterTxStatusEvent(txID string) (fab.Registration, <-chan *fab.TxStatusEvent, error): RegisterTxStatusEvent注册事务状态事件。 不再需要注册时,必须调用取消注册。
- 参数:
txID是要为其接收事件的事务ID
返回:
注册和用于接收事件的频道。 调用取消注册时,通道将关闭。 - 例:
1 ec, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 registration, _, err := ec.RegisterTxStatusEvent("tx123") 7 if err != nil { 8 fmt.Println("failed to register tx status event") 9 } 10 defer ec.Unregister(registration) 11 12 fmt.Println("tx status event registered successfully")
输出:tx status event registered successfully
- 参数:
-
func (c *Client) Unregister(reg fab.Registration): 取消注册将删除给定的注册并关闭事件通道。
- 参数:
reg是从其中一个注册函数返回的注册句柄
- 参数:
-
- 类型ClientOption
-
func WithBlockEvents() ClientOption: WithBlockEvents指示要接收块事件。 请注意,调用者必须具有此选项的足够权限。
-
func WithBlockNum(from uint64) ClientOption: WithBlockNum表示要从中接收事件的块编号。 只有deliverclient支持这一点
-
func WithSeekType(seek seek.Type) ClientOption: WithSeekType表示所需的搜索类型 - 最新,最旧或来自给定块只有deliverclient支持此项