[TOC]git
Whisper
是以太坊中一項很是有趣的技術,它是一個基於身份的通訊系統,被設計用於Dapp之間少許數據通訊。Whisper
協議運行在以太坊p2p協議框架之上,全部運行Whisper
協議的節點(如下簡稱節點)組成一個Whisper
網絡。經過節點之間的消息轉發,理論上,每一個節點均可以收到全部Whisper
消息。github
Whisper
具備如下基本特性和概念算法
每一條Whisper
消息在網絡上都是加密傳輸的,能夠選擇非對稱加密(橢圓曲線)和對稱加密(AES GSM)兩種加密算法之一。segmentfault
Envelope是網絡中傳輸的Whisper
消息的基本單位,它包含已加密的原始消息以及消息相關的控制信息:網絡
當一個節點從一個Peer收到一個Envelope時,無論它本身管不關內心面的數據(Topic是否符合設置的值), 它都會將這個Envelope轉發給其餘Peer,這是Whisper的固有機制。app
每一個Envelope上寫明瞭本身封裝消息的Topic,若是一個節點不關心這個Topic,那麼它就不須要去試着打開(解密)這個Envelope。一般一個Topic對應一個消息加密時使用的Key(不管是對稱仍是非對稱加密)。因此,若是一個節點收到了一個關心的Topic的Envelope時,它應該能打開這個Envelope框架
Dapp 能夠在節點上安裝多個Filter,每一個Filter包含一組條件,只有知足這些條件的Envelope才能被打開,準確的說,不是節點打開Envelope,而是節點上安裝的Filter打開Envelope,每一個Filter有一個緩衝區能夠存儲解密後的消息,若是一個Envelope知足多個Filter,那麼這個消息會存儲在多個Filter中。Filter能夠設置如下條件:函數
Proof of Work用來防止節點惡意大量發送消息,採用的算法和PoW共識算法差很少。消息的建立者須要找到一個nonce使得消息的Hash值小於一個值。這個值與消息的大小和TTL有關,消息越大,TTL越大,則找到nonce越困難,計算工做量的公式爲oop
其中$BestBit$爲Hash值中從左往右第一個爲1的bit所在的位置(這個值越大,則須要嘗試nonce的次數越多)源碼分析
本部分主要涉及Whisper filter envelope ,它們的聯繫以下圖:
Whisper表示一個協議實例,負責整個Whisper
功能的運行,其中比較重要的字段以下:
在以太坊源碼分析—p2p節點發現與協議運行提到過,兩個節點在底層鏈接創建後,會運行共同支持的協議的Run函數,對於Whisper協議來講,就是HandlerPeer函數。
HandlePeer最終運行在兩個Go routine中,一個是Whisper.runMessageLoop(),它負責從底層讀取消息,另外一個是Peer.update(),它負責週期性的將envelope池中的未發送的envelope發送到對端並將過時的envelope刪除。
Envelope表示一個Whisper消息,它有兩個來源
其重要的字段有
如下是本節點廣播發送一小段數據payload,封裝到Envelope,再加入到Envelope池的過程,其中wh
表示Whisper實例
如下是典型的Whisper
消息接收過程,其中w
表示Whisper實例
Whisper
消息,並解碼成Envelope,加入Envelope池,調用postEvent()向w.messageQueue寫入這個事件w
經過Start啓動後,從w.messageQueue接收事件,開始Filter匹配寫了一個whipser的chat-room demo,託管在github上,感興趣能夠瞧瞧