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