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.EventsClientdone := 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
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();