go-ethereum事件機制設計與實現(xiàn)

總體介紹

以太坊內(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指向的對象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容