以太坊原始碼分析 Whisper

2021-09-13 04:09:46 字數 2500 閱讀 8162

whisper具有以下基本特性和概念

通訊加密

每一條whisper訊息在網路上都是加密傳輸的,可以選擇非對稱加密(橢圓曲線)和對稱加密(aes gsm)兩種加密演算法之一。

envelope(信封)

envelope是網路中傳輸的whisper訊息的基本單位,它包含已加密的原始訊息以及訊息相關的控制資訊:

當乙個節點從乙個peer收到乙個envelope時,不管它自己管不關心裡面的資料(topic是否符合設定的值), 它都會將這個envelope**給其他peer,這是whisper的固有機制。

topic(主題)

每個envelope上寫明了自己封裝訊息的topic,如果乙個節點不關心這個topic,那麼它就不需要去試著開啟(解密)這個envelope。通常乙個topic對應乙個訊息加密時使用的key(無論是對稱還是非對稱加密)。所以,如果乙個節點收到了乙個關心的topicenvelope時,它應該能開啟這個envelope

filter(過濾器)

proof of work(工作量證明)

proof of work用來防止節點惡意大量傳送訊息,採用的演算法和pow共識演算法差不多。訊息的建立者需要找到乙個nonce使得訊息的hash值小於乙個值。這個值與訊息的大小和ttl有關,訊息越大,ttl越大,則找到nonce越困難,計算工作量的公式為

其中$bestbit$為hash值中從左往右第乙個為1的bit所在的位置(這個值越大,則需要嘗試nonce的次數越多)

本部分主要涉及whisper filter envelope ,它們的聯絡如下圖:

whisper

whisper表示乙個協議例項,負責整個whisper功能的執行,其中比較重要的字段如下:

在以太坊原始碼分析—p2p節點發現與協議執行提到過,兩個節點在底層連線建立後,會執行共同支援的協議的run函式,對於whisper協議來說,就是handlerpeer函式。

handlepeer最終執行在兩個go routine中,乙個是whisper.runmessageloop(),它負責從底層讀取訊息,另乙個是peer.update(),它負責週期性的將envelope池中的未傳送的envelope傳送到對端並將過期的envelope刪除。

envelope

envelope表示乙個whisper訊息,它有兩個**

出方向通過newenvelope()構造

入方向從peer節點接收

其重要的字段有

訊息傳送的典型過程

以下是本節點廣播傳送一小段資料payload,封裝到envelope,再加入到envelope池的過程,其中wh表示whisper例項

首先構造傳送引數,包括原始資料payload,主題topic等

利用傳送引數構造sentmessage根據傳送引數將sentmessage封裝到新建立的envelope,這一步包括簽名(sign)加密(encrypt)計算nonce(seal)

envelope加入envelope池

訊息接收的典型過程

以下是典型的whisper訊息接收過程,其中w表示whisper例項

寫了乙個whipser的chat-room demo,託管在github上,感興趣可以瞧瞧

以太坊Whisper協議

在本教程中,我們將學習如何使用以太坊的whisper協議建立簡單的聊天cli。儘管本教程中的所有操作都在你的控制台中進行,但是你應該能夠重新使用我們在你自己的應用程式中提供的js,並對如何傳送和顯示不同型別的訊息有乙個很好的了解,以及使用whisper可以構建什麼。我們專門為本教程建立了這個儲存庫。...

以太坊Whisper協議

在本教程中,我們將學習如何使用以太坊的whisper協議建立簡單的聊天cli。儘管本教程中的所有操作都在你的控制台中進行,但是你應該能夠重新使用我們在你自己的應用程式中提供的js,並對如何傳送和顯示不同型別的訊息有乙個很好的了解,以及使用whisper可以構建什麼。我們專門為本教程建立了這個儲存庫。...

以太坊挖礦返回null原始碼分析

在以太坊版本1.7.3中,無論是dev環境或是公鏈環境在console中執行miner.start 始終返回null,而不是期待的true。這是為什麼呢?這篇文章就帶大家從原始碼中找找原因。在這個過程中我們會了解到更多底層的知識。首先看一下呼叫挖礦的程式,在console中我們執行的是 miner....