在本教程中,咱們將學習如何使用以太坊的Whisper協議建立簡單的聊天CLI。儘管本教程中的全部操做都在你的控制檯中進行,可是你應該可以從新使用咱們在你本身的應用程序中提供的JS,並對如何發送和顯示不一樣類型的消息有一個很好的瞭解,以及使用Whisper能夠構建什麼。php
咱們瞭解到,沒有多少DAPP開發人員但願以狀態的方式使用Whisper(做爲一個龐大的多用戶消息傳遞協議),而是將有關DAPP中與其交互的特定(一般是重要的)信息移動。本教程旨在爲你提供所需的技能,以適應你的須要:你應該既知道足夠容易插入到任何狀態聊天,以及如何使用Whisper爲你本身的工做到最後。許多其餘團隊已經開始這樣作了,例如,你能夠在Bloom blog上找到更多關於如何將基本概念擴展到有趣系統的信息。html
咱們專門爲本教程建立了這個存儲庫。若是你想幫助社區,能夠在不一樣的分支下添加額外的教程。不過,在克隆存儲庫以前,讓咱們確保正確設置了全部依賴項,尤爲是nodejs和go-ethereum。咱們將使用最新版本的Geth、Whisper和EmochtJS來幫助你瞭解Whisper今天的樣子。前端
node version > 8.10+
若是須要更新節點,請 install nvm
並安裝/使用LTS版本。下面爲你提供了macos/linux命令:java
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash nvm install --lts nvm use lts
geth version > 1.8.17+
若是你須要install geth
,你可使用下面的MacOS命令:node
brew tap ethereum/ethereum brew install ethereum /* Just to upgrade */ brew upgrade ethereum
若是你使用的是Linux發行版:python
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get install ethereum /* Just to upgrade */ sudo apt-get update ethereum
要使用Whisper,你須要一個正在運行的geth節點。能夠執行如下命令以使用所需的最小選項啓動節點:linux
geth --testnet --syncmode=light --ws --wsorigins=mychat --shh --wsapi=web3,shh,net
這裏,咱們鏈接到Ropsten,確保咱們沒有驗證完整的塊(只有headers),確保websockets
使用特定的源(咱們稍後將在JS中使用),確保啓用了Whisper,即shh
,而且web
、shh
和net
API對咱們可用。android
如今咱們已經設置了全部的先決條件,咱們須要克隆這個repo並安裝依賴項。git
git clone https://github.com/status-im/whisper-tutorial.git cd whisper-tutorial npm install
安裝完全部依賴項後,能夠執行npm start
來查看教程的內容。這很是簡單,只是一個cli界面,它容許你使用默認主題和一些其餘設置發送悄悄消息。下面咱們將介紹如何發送公共和私人消息。爲了更好地理解咱們爲何要執行如下步驟並更詳細地瞭解咱們引入的每一個概念,請在完成此操做時閱讀上面的擴展功能部分。程序員
你能夠隨時使用ctrl+c
關閉應用程序。
文件src/index.js
中充滿了咱們須要處理的todo
。如下各節詳細介紹了咱們將如何以邏輯方式完成這些操做。在每一個部分的末尾,能夠執行npm start
以查看進度。
爲了經過Whisper進行交流,咱們須要一個Web3鏈接。確保geth
正在運行後,咱們可使用如下代碼鏈接到節點:
// Web3 connection const web3 = new Web3(); try { web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546", {headers: {Origin: "mychat"}})); await web3.eth.net.isListening(); } catch(err) { process.exit(); }
調用web3並告訴它將其provider
設置爲正在運行的geth實例(使用上面的選項),將使cli可以鏈接到咱們的節點。它使用geth
命令的--wsorigins
標誌中指定的源代碼mychat
。若是沒法鏈接,聊天窗口將關閉。
咱們須要生成一個密鑰對,用於對發送的消息進行簽名。咱們將使用相同的密鑰對來接收和解密私有消息。這與調用經過shh
API公開的函數同樣簡單:
// Generate keypair const keyPair = await web3.shh.newKeyPair();
Public
消息是使用對稱密鑰和主題加密的消息。它們不會針對特定的任何人,而是由在特定頻道中收聽的任何人接收。在聊天應用程序中,咱們的頻道由一個共享對稱密鑰表示,該密鑰的password
就是咱們將要使用和收聽的頻道:
// Generate a symmetric key const channelSymKey = await web3.shh.generateSymKeyFromPassword(DEFAULT_CHANNEL);
咱們須要爲本身生成公鑰,以便可以將本身標識爲經過咱們的通道發送和接收的做者消息。這是經過如下代碼完成的:
// Obtain public key const pubKey = await web3.shh.getPublicKey(keyPair);
一旦生成了對稱密鑰,就可使用web3.shh.post
發送消息。咱們將用密鑰對
簽署咱們的消息,並將其發送到特定的主題。
// Send a public message web3.shh.post({ symKeyID: channelSymKey, sig: keyPair, ttl: TTL, topic: channelTopic, payload: web3.utils.fromAscii(message), powTime: POW_TIME, powTarget: POW_TARGET });
topic
,是一個4字節的十六進制字符串,可用於篩選消息。TTL
,是以秒爲單位的生存時間。powtime
,是用於工做證實的最長時間(秒)。pow target
,是此消息所需的最小pow目標。你可能已經注意到你發送的消息沒有顯示在屏幕上。爲了在Whisper中看到消息,咱們須要訂閱subscribe
對稱密鑰接收的消息。咱們還可使用相同的主題建立過濾器:
// Subscribe to public chat messages web3.shh.subscribe("messages", { minPow: POW_TARGET, symKeyID: channelSymKey, topics: [channelTopic] }).on('data', (data) => { // Display message in the UI ui.addMessage(data.sig, web3.utils.toAscii(data.payload)); }).on('error', (err) => { ui.addError("Couldn't decode message: " + err.message); });
添加此代碼後,打開聊天應用程序的兩個實例並編寫一條消息。你將看到它如何在兩個窗口中顯示。惟一的問題是,任何收聽此頻道的人均可以看到你所寫的全部消息,因此讓咱們經過添加私有消息來解決這個問題。
爲了發送私人消息,咱們有一個相似於irc的命令:/msg 0xcontact_public_key message
。所以,若是你想發送消息,只需從chat cli複製聯繫人的公鑰,而後編寫消息。
咱們已經將聯繫人的公鑰分配給contactcode
變量,並將消息的正文分配給messagecontent
。向特定的非對稱公鑰發送消息與向對稱密鑰發送消息相似。區別在於,你須要指定pubkey
屬性而不是symkeyid
。
// Send private message web3.shh.post({ pubKey: contactCode, sig: keyPair, ttl: TTL, topic: channelTopic, payload: web3.utils.fromAscii(messageContent), powTime: POW_TIME, powTarget: POW_TARGET });
在Ubuntu中,你須要按
shift
並拖動鼠標以選擇聯繫人的公鑰。
與從公共通道接收消息相似,咱們須要建立一個訂閱來接收私有消息,將其用做privatekeyid
咱們的keypair
,以便訂閱接收發送到公共密鑰的消息。
// Subscribe to private messages web3.shh.subscribe("messages", { minPow: POW_TARGET, privateKeyID: keyPair, topics: [channelTopic] }).on('data', (data) => { ui.addMessage(data.sig, web3.utils.toAscii(data.payload), true); }).on('error', (err) => { ui.addError("Couldn't decode message: " + err.message); });
添加此代碼後,繼續打開聊天應用程序的三個實例,在一個窗口中編寫一條公共消息,在另外一個窗口中複製公共密鑰並向建立第一條消息的賬戶發送一條私有消息。第一個和第二個窗口將可以看到消息,但第三個窗口將只接收到公共消息。
如你所見,使用Whisper進行去中心化通訊很是容易,你能夠利用該協議來傳遞加密安全的鏈外消息。布魯姆這樣作了,正如Project Khoka in South Africa等。
可是,目前沒有足夠的在線節點能夠啓用低語(多是由於缺少運行此功能的激勵措施),所以,除非你像咱們在狀態下這樣引導某些節點,不然消息可能沒法傳遞。你能夠經過在啓用了--shh
選項的狀況下運行本身的節點來增長可用節點的數量。咱們將永遠比你少3。
======================================================================
分享一些比特幣、以太坊、EOS、Fabric等區塊鏈相關的交互式在線編程實戰教程:
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- c#比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在C#代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發學習課程。
- java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- ERC721以太坊通證明戰,課程以一個數字藝術品創做與分享DApp的實戰開發爲主線,深刻講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約代碼庫二次開發,實戰項目採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
- EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- 深刻淺出玩轉EOS錢包開發,本課程以手機EOS錢包的完整開發過程爲主線,深刻學習EOS區塊鏈應用開發,課程內容即涵蓋帳戶、計算資源、智能合約、動做與交易等EOS區塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發包訪問EOS區塊鏈,以及如何在React前端應用中集成對EOS區塊鏈的支持。課程內容深刻淺出,很是適合前端工程師深刻學習EOS區塊鏈應用開發。
- Hyperledger Fabric 區塊鏈開發詳解,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、nodejs鏈碼與應用開發的操做實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
- Hyperledger Fabric java 區塊鏈開發詳解,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、java鏈碼與應用開發的操做實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
- tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裏是以太坊Whisper協議