whisper
具有以下基本特性和概念
通訊加密
每一條whisper
訊息在網路上都是加密傳輸的,可以選擇非對稱加密(橢圓曲線)和對稱加密(aes gsm)兩種加密演算法之一。
envelope(信封)
envelope是網路中傳輸的whisper
訊息的基本單位,它包含已加密的原始訊息以及訊息相關的控制資訊:
當乙個節點從乙個peer收到乙個envelope時,不管它自己管不關心裡面的資料(topic是否符合設定的值), 它都會將這個envelope**給其他peer,這是whisper的固有機制。
topic(主題)
每個envelope上寫明了自己封裝訊息的topic,如果乙個節點不關心這個topic,那麼它就不需要去試著開啟(解密)這個envelope。通常乙個topic對應乙個訊息加密時使用的key(無論是對稱還是非對稱加密)。所以,如果乙個節點收到了乙個關心的topic的envelope時,它應該能開啟這個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....