在本教程中,我們將學習如何使用以太坊的whisper協議建立簡單的聊天cli。儘管本教程中的所有操作都在你的控制台中進行,但是你應該能夠重新使用我們在你自己的應用程式中提供的js,並對如何傳送和顯示不同型別的訊息有乙個很好的了解,以及使用whisper可以構建什麼。
我們專門為本教程建立了這個儲存庫。如果你想幫助社群,可以在不同的分支下新增額外的教程。不過,在轉殖儲存庫之前,讓我們確保正確設定了所有依賴項,尤其是nodejs和go-ethereum。我們將使用最新版本的geth、whisper和emochtjs來幫助你了解whisper今天的樣子。
nodejs 8.10+
node version
> 8.10+
如果需要更新節點,請 installnvm
並安裝/使用lts版本。下面為你提供了macos/linux命令:
curl -o- | bash
nvm install --lts
nvm use lts
go-ethereum 1.8.17+geth version
> 1.8.17+
如果你需要installgeth
,你可以使用下面的macos命令:
brew tap ethereum/ethereum
brew install ethereum
/* just to upgrade */
brew upgrade ethereum
如果你使用的是linux發行版:
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum
/* just to upgrade */
sudo apt-get update ethereum
要使用whisper,你需要乙個正在執行的geth節點。可以執行以下命令以使用所需的最小選項啟動節點:
geth --testnet --syncmode=light --ws --wsorigins=mychat --shh --wsapi=web3,shh,net
這裡,我們連線到ropsten,確保我們沒有驗證完整的塊(只有headers),確保websockets
使用特定的源(我們稍後將在js中使用),確保啟用了whisper,即shh
,並且web
、shh
和net
api對我們可用。
現在我們已經設定了所有的先決條件,我們需要轉殖這個repo並安裝依賴項。
git clone
cd whisper-tutorial
npm install
安裝完所有依賴項後,可以執行npm start
來檢視教程的內容。這非常簡單,只是乙個cli介面,它允許你使用預設主題和一些其他設定傳送悄悄訊息。下面我們將介紹如何傳送公共和私人訊息。為了更好地理解我們為什麼要執行以下步驟並更詳細地了解我們引入的每個概念,請在完成此操作時閱讀上面的擴充套件功能部分。
你可以隨時使用ctrl+c
關閉應用程式。
檔案src/index.js
中充滿了我們需要處理的todo
。以下各節詳細介紹了我們將如何以邏輯方式完成這些操作。在每個部分的末尾,可以執行npm start
以檢視進度。
todo:web3連線
為了通過whisper進行交流,我們需要乙個web3連線。確保geth
正在執行後,我們可以使用以下**連線到節點:
// web3 connection
const web3 = new web3();
try }));
await web3.eth.net.islistening();
} catch(err)
呼叫web3並告訴它將其provider
設定為正在執行的geth例項(使用上面的選項),將使cli能夠連線到我們的節點。它使用geth
命令的--wsorigins
標誌中指定的源**mychat
。如果無法連線,聊天視窗將關閉。
todo:生成金鑰對
我們需要生成乙個金鑰對,用於對傳送的訊息進行簽名。我們將使用相同的金鑰對來接收和解密私有訊息。這與呼叫通過shh
api公開的函式一樣簡單:
// generate keypair
const keypair = await web3.shh.newkeypair();
todo:生成對稱金鑰
public
訊息是使用對稱金鑰和主題加密的訊息。它們不會針對特定的任何人,而是由在特定頻道中收聽的任何人接收。在聊天應用程式中,我們的頻道由乙個共享對稱金鑰表示,該金鑰的password
就是我們將要使用和收聽的頻道:
// generate a symmetric key
const channelsymkey = await web3.shh.generatesymkeyfrompassword(default_channel);
todo:獲取公鑰
我們需要為自己生成公鑰,以便能夠將自己標識為通過我們的通道傳送和接收的作者訊息。這是通過以下**完成的:
// obtain public key
const pubkey = await web3.shh.getpublickey(keypair);
todo:傳送公共訊息
一旦生成了對稱金鑰,就可以使用web3.shh.post
傳送訊息。我們將用金鑰對
簽署我們的訊息,並將其傳送到特定的主題。
// send a public message
web3.shh.post();
todo:訂閱公共聊天訊息
你可能已經注意到你傳送的訊息沒有顯示在螢幕上。為了在whisper中看到訊息,我們需要訂閱subscribe
對稱金鑰接收的訊息。我們還可以使用相同的主題建立過濾器:
// subscribe to public chat messages
web3.shh.subscribe("messages", ).on('data', (data) => ).on('error', (err) => );
新增此**後,開啟聊天應用程式的兩個例項並編寫一條訊息。你將看到它如何在兩個視窗中顯示。唯一的問題是,任何收聽此頻道的人都可以看到你所寫的所有訊息,所以讓我們通過新增私有訊息來解決這個問題。
todo:傳送私人訊息
為了傳送私人訊息,我們有乙個類似於irc的命令:/msg 0xcontact_public_key message
。因此,如果你想傳送訊息,只需從chat cli複製聯絡人的公鑰,然後編寫訊息。
我們已經將聯絡人的公鑰分配給contactcode
變數,並將訊息的正文分配給messagecontent
。向特定的非對稱公鑰傳送訊息與向對稱金鑰傳送訊息類似。區別在於,你需要指定pubkey
屬性而不是symkeyid
。
// send private message
web3.shh.post();
在ubuntu中,你需要按shift
並拖動滑鼠以選擇聯絡人的公鑰。
todo:訂閱私人訊息
與從公共通道接收訊息類似,我們需要建立乙個訂閱來接收私有訊息,將其用作privatekeyid
我們的keypair
,以便訂閱接收傳送到公共金鑰的訊息。
// subscribe to private messages
web3.shh.subscribe("messages", ).on('data', (data) => ).on('error', (err) => );
新增此**後,繼續開啟聊天應用程式的三個例項,在乙個視窗中編寫一條公共訊息,在另乙個視窗中複製公共金鑰並向建立第一條訊息的帳戶傳送一條私有訊息。第乙個和第二個視窗將能夠看到訊息,但第三個視窗將只接收到公共訊息。
如你所見,使用whisper進行去中心化通訊非常容易,你可以利用該協議來傳遞加密安全的鏈外訊息。布魯姆這樣做了,正如project khoka in south africa等。
以太坊Whisper協議
在本教程中,我們將學習如何使用以太坊的whisper協議建立簡單的聊天cli。儘管本教程中的所有操作都在你的控制台中進行,但是你應該能夠重新使用我們在你自己的應用程式中提供的js,並對如何傳送和顯示不同型別的訊息有乙個很好的了解,以及使用whisper可以構建什麼。我們專門為本教程建立了這個儲存庫。...
以太坊原始碼分析 Whisper
whisper具有以下基本特性和概念 通訊加密 每一條whisper訊息在網路上都是加密傳輸的,可以選擇非對稱加密 橢圓曲線 和對稱加密 aes gsm 兩種加密演算法之一。envelope 信封 envelope是網路中傳輸的whisper訊息的基本單位,它包含已加密的原始訊息以及訊息相關的控制資...
以太坊 GHOST協議
在區塊鏈中為了提高交易速度,需要減少出塊時間從而加快出塊速度 區塊時間的減少會導致網路安全性下降,而且對大的礦池有利,對小的礦池或單個礦工不利。在以太坊中引入ghost協議,來解決這個問題。關於為什麼出塊時間縮短後,會出現安全性下降和對小礦池不利可以參考 以太坊原理簡介 中叔塊部分內容。另外,在以太...