總體介紹
以太坊內(nèi)部有大量協(xié)程,協(xié)程間的調(diào)度驅(qū)動(dòng)通過(guò)事件機(jī)制來(lái)完成;具體實(shí)現(xiàn)使用
golang的chan機(jī)制构舟。主要方案有以下兩種。
1.使用觀察者模式實(shí)現(xiàn)“事件”轉(zhuǎn)發(fā)
Feed 類為 observer
Subscribe()方法佩谷, 客戶端調(diào)用
開始訂閱‘事件’旁壮,把客戶端的 接收channel 添加到 Feed监嗜;同時(shí)返回feedSub對(duì)象feedSub.Unsubscribe()方法 谐檀,客戶端調(diào)用
客戶端通過(guò)調(diào)用此方法取消訂閱Send(value interface{})方法, Feed(observer) 擁有者調(diào)用
通過(guò)此方法向所有訂閱者發(fā)布‘事件’
使用go的chan機(jī)制實(shí)現(xiàn)通信
- 訂閱者把自己的 接收 chan 添加到 Feed(observer)
- Send發(fā)布消息時(shí)的輸入?yún)?shù)也是一個(gè) chan
具體使用示例
1)BlockChain類作為 Feed(observer) 擁有者
- 擁有下面幾個(gè) Feed成員
rmLogsFeed event.Feed
chainFeed event.Feed
chainSideFeed event.Feed
chainHeadFeed event.Feed
logsFeed event.Feed - 封裝了下面幾個(gè)訂閱函數(shù)
SubscribeRemovedLogsEvent
SubscribeChainEvent
SubscribeChainHeadEvent
... - 發(fā)布消息時(shí)調(diào)用 bc.xxxxFeed.Send(ev)
2) TestTransactionGapFilling 作為客戶端
- 下行代碼定義了事件接收 chan
events := make(chan TxPreEvent, testTxPoolConfig.AccountQueue+5) - 下行代碼訂閱了tx_pool的事件
sub := pool.txFeed.Subscribe(events) - 通過(guò)上面的events接收處理事件
2.全局雙工事件通道裁奇,根據(jù)事件類型訂閱和轉(zhuǎn)發(fā)
TypeMux 類為observer
- Subscribe()方法桐猬, 注冊(cè)者調(diào)用
參數(shù)為要接收的‘事件類型’, 返回TypeMuxSubscription對(duì)象 - Post()方法刽肠, 注冊(cè)者調(diào)用
發(fā)送消息溃肪,具體實(shí)現(xiàn)調(diào)用TypeMuxSubscription.deliver() - TypeMuxSubscription. Unsubscribe()方法, 注冊(cè)者調(diào)用
取消訂閱 - TypeMuxSubscription.deliver()方法 音五,無(wú)外部調(diào)用
注冊(cè)者發(fā)送消息的具體實(shí)現(xiàn)惫撰, - TypeMuxSubscription.Chan()方法, 注冊(cè)者調(diào)用
接收事件
以太坊具體使用
Ethereum中創(chuàng)建一次躺涝,其他地方多次使用 ,全局只有一個(gè)對(duì)象厨钻。
Subscribe()和Post()方法在代碼中有多次調(diào)用,執(zhí)行對(duì)象都來(lái)自Ethereum.eventMux指向的對(duì)象