event包支持訪問Fabric網絡上的通道事件。事件客戶端能夠接收區塊事件,過濾區塊事件,鏈碼事件和交易狀態事件。
官方文檔:
https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/eventgit
event使用基本流程以下:
A、準備通道客戶端上下文
B、建立事件客戶端
C、註冊事件
D、處理事件(或超時)
E、註銷事件
使用示例:github
ec, err := New(mockChannelProvider("mychannel")) if err != nil { fmt.Println("failed to create client") } registration, notifier, err := ec.RegisterChaincodeEvent("examplecc", "event123") if err != nil { fmt.Println("failed to register chaincode event") } defer ec.Unregister(registration) select { case ccEvent := <-notifier: fmt.Printf("received chaincode event %v\n", ccEvent) case <-time.After(time.Second * 5): fmt.Println("timeout while waiting for chaincode event") } // Timeout is expected since there is no event producer // output: // timeout while waiting for chaincode event
type Client struct { eventService fab.EventService permitBlockEvents bool fromBlock uint64 seekType seek.Type } func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error)
返回事件客戶端實例。客戶端接收區塊事件,過濾區塊事件,鏈碼事件和交易狀態事件。
使用示例:正則表達式
ctx := mockChannelProvider("mychannel") ec, err := New(ctx, WithBlockEvents()) if err != nil { fmt.Println(err) } if ec != nil { fmt.Println("event client created") } else { fmt.Println("event client is nil") } // output: // event client created
func (c *Client) RegisterBlockEvent(filter ...fab.BlockFilter) (fab.Registration, <-chan *fab.BlockEvent, error)
註冊塊事件。若是調用者沒有註冊區塊事件的權限,則返回錯誤。再也不須要註冊時,必須調用取消註冊。
參數:
filter是一個可選的過濾器,可過濾掉不須要的事件。只能指定一個過濾器。
返回:註冊對象和用於接收事件的通道。調用Unregister時,通道將關閉。
使用示例:網絡
ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents()) if err != nil { fmt.Println("failed to create client") } registration, _, err := ec.RegisterBlockEvent() if err != nil { fmt.Println("failed to register block event") } defer ec.Unregister(registration) fmt.Println("block event registered successfully") // output: // block event registered successfully
func (c *Client) RegisterChaincodeEvent(ccID, eventFilter string) (fab.Registration, <-chan *fab.CCEvent, error)
註冊鏈代碼事件。再也不須要註冊時,必須調用Unregister。
參數:
ccID是用於接收事件的鏈碼ID
eventFilter是用於接收事件的鏈碼事件過濾器(正則表達式)
返回:註冊對象和用於接收事件的通道。 調用取消註冊時,通道將關閉。
使用示例:ide
ec, err := New(mockChannelProvider("mychannel")) if err != nil { fmt.Println("failed to create client") } registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123") if err != nil { fmt.Println("failed to register chaincode event") } defer ec.Unregister(registration) fmt.Println("chaincode event registered successfully") // output: // chaincode event registered successfully
使用示例:函數
// If you require payload for chaincode events you have to use WithBlockEvents() option ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents()) if err != nil { fmt.Println("failed to create client") } registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123") if err != nil { fmt.Println("failed to register chaincode event") } defer ec.Unregister(registration) fmt.Println("chaincode event registered successfully") // output: // chaincode event registered successfully
func (c *Client) RegisterFilteredBlockEvent() (fab.Registration, <-chan *fab.FilteredBlockEvent, error)
註冊過濾區塊事件。當再也不須要註冊時,必須調用Unregister。
返回:註冊對象和用於接收事件的通道。調用Unregister時,通道將關閉。
使用示例:ui
ec, err := New(mockChannelProvider("mychannel")) if err != nil { fmt.Println("failed to create client") } registration, _, err := ec.RegisterFilteredBlockEvent() if err != nil { fmt.Println("failed to register filtered block event") } defer ec.Unregister(registration) fmt.Println("filtered block event registered successfully") // output: // filtered block event registered successfully
func (c *Client) RegisterTxStatusEvent(txID string) (fab.Registration, <-chan *fab.TxStatusEvent, error)
註冊交易狀態事件。再也不須要註冊時,必須調用Unregister。
參數:
txID是用於接收事件的交易ID
返回:註冊對象和用於接收事件的通道。調用Unregister時,通道將關閉。
使用示例:code
ec, err := New(mockChannelProvider("mychannel")) if err != nil { fmt.Println("failed to create client") } registration, _, err := ec.RegisterTxStatusEvent("tx123") if err != nil { fmt.Println("failed to register tx status event") } defer ec.Unregister(registration) fmt.Println("tx status event registered successfully") // output: // tx status event registered successfully
func (c *Client) Unregister(reg fab.Registration)
刪除給定的註冊對象並關閉事件通道。
參數:
reg是從其中一個註冊函數返回的註冊句柄對象
type ClientOption func(*Client) error func WithBlockEvents() ClientOption
WithBlockEvents指示要接收的區塊事件。 注意,調用者必須具備此選項的足夠權限。func WithBlockNum(from uint64) ClientOption
WithBlockNum表示用於接收事件的區塊編號。只有deliverclient支持次選項。
func WithSeekType(seek seek.Type) ClientOption
WithSeekType表示所需的搜索類型,最新,最舊或來自給定區塊,只有deliverclient支持此項。接口
var ( sdk *fabsdk.FabricSDK channelName = "assetchannel" org = "org1" user = "Admin" ) ctx := sdk.ChannelContext(channelName, fabsdk.WithOrg(org), fabsdk.WithUser(user)) cli, err := event.New(ctx) if err != nil { panic(err) } // 區塊事件 reg, blkevent, err := cli.RegisterBlockEvent() if err != nil { panic(err) } defer cli.Unregister(reg) timeoutctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() for { select { case evt := <-blkevent: fmt.Printf("received a block", evt) case <-timeoutctx.Done(): fmt.Println("event timeout, exit!") return }