摘要:前言是以太坊中一項非常有趣的技術,它是一個基于身份的通信系統,被設計用于之間少量數據通信。協議運行在以太坊協議框架之上,所有運行協議的節點以下簡稱節點組成一個網絡。
[TOC]
前言Whisper是以太坊中一項非常有趣的技術,它是一個基于身份的通信系統,被設計用于Dapp之間少量數據通信。Whisper協議運行在以太坊p2p協議框架之上,所有運行Whisper協議的節點(以下簡稱節點)組成一個Whisper網絡。通過節點之間的消息轉發,理論上,每個節點都可以收到所有Whisper消息。
特性Whisper具有以下基本特性和概念
每一條Whisper消息在網絡上都是加密傳輸的,可以選擇非對稱加密(橢圓曲線)和對稱加密(AES GSM)兩種加密算法之一。
Envelope是網絡中傳輸的Whisper消息的基本單位,它包含已加密的原始消息以及消息相關的控制信息:
Expiry time:消息的超時時刻,過了這個時刻,本消息不會被節點處理或者轉發
TTL:消息的存活時間,一個消息在從被創建起,只能生存TTL的時間,過了這個時間之后,消息在網絡中超時
Topic:消息的主題
AESNonce:采用AES對稱密鑰加密算法時使用的Nonce值
EnvNonce:用于PoW計算
當一個節點從一個Peer收到一個Envelope時,不管它自己管不關心里面的數據(Topic是否符合設置的值), 它都會將這個Envelope轉發給其他Peer,這是Whisper的固有機制。
每個Envelope上寫明了自己封裝消息的Topic,如果一個節點不關心這個Topic,那么它就不需要去試著打開(解密)這個Envelope。通常一個Topic對應一個消息加密時使用的Key(無論是對稱還是非對稱加密)。所以,如果一個節點收到了一個關心的Topic的Envelope時,它應該能打開這個Envelope
Dapp 可以在節點上安裝多個Filter,每個Filter包含一組條件,只有滿足這些條件的Envelope才能被打開,準確的說,不是節點打開Envelope,而是節點上安裝的Filter打開Envelope,每個Filter有一個緩沖區可以存儲解密后的消息,如果一個Envelope滿足多個Filter,那么這個消息會存儲在多個Filter中。Filter可以設置以下條件:
Topics:關心的主題的集合
Sender address:創建這個消息的節點
Recipient address:指定接收節點的地址
PoW requirement:消息需要的工作量證明
AcceptP2P:節點是否接收P2P消息,這類消息有特殊的用途
Proof of Work用來防止節點惡意大量發送消息,采用的算法和PoW共識算法差不多。消息的創建者需要找到一個nonce使得消息的Hash值小于一個值。這個值與消息的大小和TTL有關,消息越大,TTL越大,則找到nonce越困難,計算工作量的公式為
其中$BestBit$為Hash值中從左往右第一個為1的bit所在的位置(這個值越大,則需要嘗試nonce的次數越多)
源碼分解本部分主要涉及Whisper filter envelope ,它們的聯系如下圖:
WhisperWhisper表示一個協議實例,負責整個Whisper功能的運行,其中比較重要的字段如下:
protocol - Whisper協議的特定值,最重要的是其中的Run字段,它表示該協議的運行入口
filter - 本節點安裝的所有Filter
privateKeys - 本節點存儲的非對稱密鑰對的集合,一個Whisper實例可以保存多個密鑰對
symKeys - 本屆點存儲的對稱密鑰的集合,一個Whisper實例可以保存多個對稱密鑰
envelopes - envelope池,保存所有待廣播發送的信封。信封池的存儲鍵值是envelope的Hash
expirations - 超時池,記錄envelope的的過期時間,超時池的存儲鍵值是unix時間,值是envelope的Hash
peers - 活躍的Peer節點的集合,數據來源是p2p底層
msgQueue - 普通Whisper消息的envelope處理通道
在以太坊源碼分析—p2p節點發現與協議運行提到過,兩個節點在底層連接建立后,會運行共同支持的協議的Run函數,對于Whisper協議來說,就是HandlerPeer函數。
HandlePeer最終運行在兩個Go routine中,一個是Whisper.runMessageLoop(),它負責從底層讀取消息,另一個是Peer.update(),它負責周期性的將envelope池中的未發送的envelope發送到對端并將過期的envelope刪除。
Envelope表示一個Whisper消息,它有兩個來源
出方向通過NewEnvelope()構造
入方向從Peer節點接收
其重要的字段有
Topic - Envelope中的數據的主題,節點的Filter可以過濾感興趣的主題進行解密
EnvNonce - 消息的創建者在PoW中找到的nonce
pow - 消息具有的pow值
消息發送的典型過程以下是本節點廣播發送一小段數據payload,封裝到Envelope,再加入到Envelope池的過程,其中wh表示Whisper實例
首先構造發送參數,包括原始數據payload,主題Topic等
利用發送參數構造SentMessage
根據發送參數將SentMessage封裝到新創建的Envelope,這一步包括簽名(sign)加密(encrypt)計算nonce(Seal)
將Envelope加入Envelope池
消息接收的典型過程以下是典型的Whisper消息接收過程,其中w表示Whisper實例
w.runMessageLoop()從底層收到Whisper消息,并解碼成Envelope,加入Envelope池,調用postEvent()向w.messageQueue寫入這個事件
另一方面,當w通過Start啟動后,從w.messageQueue接收事件,開始Filter匹配
用已安裝的每個Filter去匹配這個Envelope,如果匹配上,就將Envelope打開(解密),最終將其放入Filter的緩沖區中。
demo寫了一個whipser的chat-room demo,托管在github上,感興趣可以瞧瞧
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24379.html
摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊客戶端命令用法參數詳解原文已更新,請讀者前往原文閱讀在以太坊智能合約開發中最常用的工具必備開發工具,一個多用途的命令行工具。如果你還不知道是什么,請先閱讀入門篇以太坊是什么。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊客戶端Geth命令用法-參數詳解原文已更新,請讀者前往原文閱讀 Geth在以太坊智能合約開發中最常用的工具(必備開發工具),一...
摘要:以太坊論壇大名鼎鼎的以太坊論壇將不再維護,可能很快就會停用。以太坊基金會以太坊基金會是在瑞士注冊的非營利性機構,旨在管理以太幣銷售中籌措的基金,以更好地為以太坊和去中心化技術生態系統服務。 社區發起討論和問問題,請明智選擇論壇,并協助我們維護論壇環境整潔。 Reddit以太坊reddit分論壇是最全面的以太坊論壇,這里是大部分社區討論發生的地方和核心開發者最活躍的地方。如果你想對新聞、...
摘要:它同時會檢查確保沒有意外發送的以太幣。當任何以太幣被存入智能合約時,匿名函數會被執行,并會自動拒絕接收以太幣。 作者:Alex Van de Sande譯者:王建/蔡佳慧譯者介紹: 王建:萬云平臺區塊鏈技術專家,擁有多年應用系統架構經驗,目前在區塊鏈落地方面進行積極探索 蔡佳慧:萬云平臺實習生,區塊鏈技術愛好者,英國帝國理工學院數學專業在讀 這篇教程是由以太坊Mist瀏覽器的負責人...
摘要:它同時會檢查確保沒有意外發送的以太幣。當任何以太幣被存入智能合約時,匿名函數會被執行,并會自動拒絕接收以太幣。 作者:Alex Van de Sande譯者:王建/蔡佳慧譯者介紹: 王建:萬云平臺區塊鏈技術專家,擁有多年應用系統架構經驗,目前在區塊鏈落地方面進行積極探索 蔡佳慧:萬云平臺實習生,區塊鏈技術愛好者,英國帝國理工學院數學專業在讀 這篇教程是由以太坊Mist瀏覽器的負責人...
摘要:自年初以來,一直在推廣和分享以太坊及其生態系統方面的知識。你可以把想作是以太坊的。在任何外部數據源例如網絡和區塊鏈應用程序如以太坊方面的智能合約之間提供安全的認證通道。 從2018年3月8日到10日,來自世界各地的以太坊專業人士、研究人員、投資者和愛好者涌入了巴黎來參加以太坊社區會議(EthCC)。 EthCC是由一家法國的非盈利組織Asseth籌備組織的。Asseth自2016年初以...
閱讀 3029·2021-11-18 10:07
閱讀 3778·2021-11-17 17:00
閱讀 2108·2021-11-15 18:01
閱讀 936·2021-10-11 10:58
閱讀 3387·2021-09-10 10:50
閱讀 3453·2021-08-13 15:05
閱讀 1232·2019-08-30 15:53
閱讀 2657·2019-08-29 13:01