深度学习
Fabric应用程序除了通过主动查询来获取当前已确认的状态,还可以通过订阅并监听事件(event)来获取交易执行信息,用于进行交易确认或者审计。
本节的例子将展示如何在链码中发送事件。详细代码可见examples/chaincode/go/eventsender/eventsender.go。
发送事件需要使用stub.SetEvent方法。方法格式为SetEvent(namestring,payload[]byte)error。其中,name表示事件名称,payload为事件内容。
通过该方法,可以设定当这个交易在Committer处被认证通过,写入到区块时所发送的事件。
示例链码的invoke分支方法被调用时,会将记录在账本中的递增序列和Invoke传入的参数串联起来作为事件内容,以evtsender为事件名称,调用stub.SetEvent方法。
关键代码如下所示:
func (t *EventSender) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response { b, err := stub.GetState("noevents") if err != nil { return shim.Error("Failed to get state") } noevts, _ := strconv.Atoi(string(b)) tosend := "Event " + string(b) for _, s := range args { tosend = tosend + "," + s } err = stub.PutState("noevents", []byte(strconv.Itoa(noevts+1))) if err != nil { return shim.Error(err.Error()) } err = stub.SetEvent("evtsender", []byte(tosend)) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) }
应用开发者可以使用SDK中封装的方法监听链码发出的事件,并据此作出处理逻辑。也可以简单用Fabric提供的block-listener工具监听并查看事件。
block-listener工具代码位于examples/events/block-listener,其中展示了如何利用事件客户端来从网络中获取事件信息。创建事件客户端的核心代码如下所示:
func createEventClient(eventAddress string, _ string) *adapter { var obcEHClient *consumer.EventsClient done := make(chan *pb.Event_Block) adapter := &adapter{notfy: done} obcEHClient, _ = consumer.NewEventsClient(eventAddress, 5, adapter) if err := obcEHClient.Start(); err != nil { fmt.Printf("could not start chat. err: %s\n", err) obcEHClient.Stop() return nil } return adapter }
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=891