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