您好,登錄后才能下訂單哦!
這篇“如何使用以太坊Whisper協(xié)議創(chuàng)建簡單的聊天CLI”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“如何使用以太坊Whisper協(xié)議創(chuàng)建簡單的聊天CLI”文章吧。
我們了解到,沒有多少DAPP開發(fā)人員希望以狀態(tài)的方式使用Whisper(作為一個(gè)龐大的多用戶消息傳遞協(xié)議),而是將有關(guān)DAPP中與其交互的特定(通常是重要的)信息移動。本教程旨在為你提供所需的技能,以適應(yīng)你的需要:你應(yīng)該既知道足夠容易插入到任何狀態(tài)聊天,以及如何使用Whisper為你自己的工作到最后。許多其他團(tuán)隊(duì)已經(jīng)開始這樣做了,例如,你可以在Bloom blog上找到更多關(guān)于如何將基本概念擴(kuò)展到有趣系統(tǒng)的信息。
我們專門為本教程創(chuàng)建了這個(gè)存儲庫。如果你想幫助社區(qū),可以在不同的分支下添加額外的教程。不過,在克隆存儲庫之前,讓我們確保正確設(shè)置了所有依賴項(xiàng),尤其是nodejs和go-ethereum。我們將使用最新版本的Geth、Whisper和EmochtJS來幫助你了解Whisper今天的樣子。
node version > 8.10+
如果需要更新節(jié)點(diǎn),請 install nvm
并安裝/使用LTS版本。下面為你提供了macos/linux命令:
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命令:
brew tap ethereum/ethereum brew install ethereum /* Just to upgrade */ brew upgrade ethereum
如果你使用的是Linux發(fā)行版:
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get install ethereum /* Just to upgrade */ sudo apt-get update ethereum
要使用Whisper,你需要一個(gè)正在運(yùn)行的geth節(jié)點(diǎn)??梢詧?zhí)行以下命令以使用所需的最小選項(xiàng)啟動節(jié)點(diǎn):
geth --testnet --syncmode=light --ws --wsorigins=mychat --shh --wsapi=web3,shh,net
這里,我們連接到Ropsten,確保我們沒有驗(yàn)證完整的塊(只有headers),確保websockets
使用特定的源(我們稍后將在JS中使用),確保啟用了Whisper,即shh
,并且web
、shh
和net
API對我們可用。
現(xiàn)在我們已經(jīng)設(shè)置了所有的先決條件,我們需要克隆這個(gè)repo并安裝依賴項(xiàng)。
git clone https://github.com/status-im/whisper-tutorial.git cd whisper-tutorial npm install
安裝完所有依賴項(xiàng)后,可以執(zhí)行npm start
來查看教程的內(nèi)容。這非常簡單,只是一個(gè)cli界面,它允許你使用默認(rèn)主題和一些其他設(shè)置發(fā)送悄悄消息。下面我們將介紹如何發(fā)送公共和私人消息。為了更好地理解我們?yōu)槭裁匆獔?zhí)行以下步驟并更詳細(xì)地了解我們引入的每個(gè)概念,請?jiān)谕瓿纱瞬僮鲿r(shí)閱讀上面的擴(kuò)展功能部分。
你可以隨時(shí)使用ctrl+c
關(guān)閉應(yīng)用程序。
文件src/index.js
中充滿了我們需要處理的todo
。以下各節(jié)詳細(xì)介紹了我們將如何以邏輯方式完成這些操作。在每個(gè)部分的末尾,可以執(zhí)行npm start
以查看進(jìn)度。
為了通過Whisper進(jìn)行交流,我們需要一個(gè)Web3連接。確保geth
正在運(yùn)行后,我們可以使用以下代碼連接到節(jié)點(diǎn):
// 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(); }
調(diào)用web3并告訴它將其provider
設(shè)置為正在運(yùn)行的geth實(shí)例(使用上面的選項(xiàng)),將使cli能夠連接到我們的節(jié)點(diǎn)。它使用geth
命令的--wsorigins
標(biāo)志中指定的源代碼mychat
。如果無法連接,聊天窗口將關(guān)閉。
我們需要生成一個(gè)密鑰對,用于對發(fā)送的消息進(jìn)行簽名。我們將使用相同的密鑰對來接收和解密私有消息。這與調(diào)用通過shh
API公開的函數(shù)一樣簡單:
// Generate keypair const keyPair = await web3.shh.newKeyPair();
Public
消息是使用對稱密鑰和主題加密的消息。它們不會針對特定的任何人,而是由在特定頻道中收聽的任何人接收。在聊天應(yīng)用程序中,我們的頻道由一個(gè)共享對稱密鑰表示,該密鑰的password
就是我們將要使用和收聽的頻道:
// Generate a symmetric key const channelSymKey = await web3.shh.generateSymKeyFromPassword(DEFAULT_CHANNEL);
我們需要為自己生成公鑰,以便能夠?qū)⒆约簶?biāo)識為通過我們的通道發(fā)送和接收的作者消息。這是通過以下代碼完成的:
// Obtain public key const pubKey = await web3.shh.getPublicKey(keyPair);
一旦生成了對稱密鑰,就可以使用web3.shh.post
發(fā)送消息。我們將用密鑰對
簽署我們的消息,并將其發(fā)送到特定的主題。
// 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
,是一個(gè)4字節(jié)的十六進(jìn)制字符串,可用于篩選消息。
TTL
,是以秒為單位的生存時(shí)間。
powtime
,是用于工作證明的最長時(shí)間(秒)。
pow target
,是此消息所需的最小pow目標(biāo)。
你可能已經(jīng)注意到你發(fā)送的消息沒有顯示在屏幕上。為了在Whisper中看到消息,我們需要訂閱subscribe
對稱密鑰接收的消息。我們還可以使用相同的主題創(chuàng)建過濾器:
// 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); });
添加此代碼后,打開聊天應(yīng)用程序的兩個(gè)實(shí)例并編寫一條消息。你將看到它如何在兩個(gè)窗口中顯示。唯一的問題是,任何收聽此頻道的人都可以看到你所寫的所有消息,所以讓我們通過添加私有消息來解決這個(gè)問題。
為了發(fā)送私人消息,我們有一個(gè)類似于irc的命令:/msg 0xcontact_public_key message
。因此,如果你想發(fā)送消息,只需從chat cli復(fù)制聯(lián)系人的公鑰,然后編寫消息。
我們已經(jīng)將聯(lián)系人的公鑰分配給contactcode
變量,并將消息的正文分配給messagecontent
。向特定的非對稱公鑰發(fā)送消息與向?qū)ΨQ密鑰發(fā)送消息類似。區(qū)別在于,你需要指定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
并拖動鼠標(biāo)以選擇聯(lián)系人的公鑰。
與從公共通道接收消息類似,我們需要創(chuàng)建一個(gè)訂閱來接收私有消息,將其用作privatekeyid
我們的keypair
,以便訂閱接收發(fā)送到公共密鑰的消息。
// 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); });
添加此代碼后,繼續(xù)打開聊天應(yīng)用程序的三個(gè)實(shí)例,在一個(gè)窗口中編寫一條公共消息,在另一個(gè)窗口中復(fù)制公共密鑰并向創(chuàng)建第一條消息的帳戶發(fā)送一條私有消息。第一個(gè)和第二個(gè)窗口將能夠看到消息,但第三個(gè)窗口將只接收到公共消息。
以上就是關(guān)于“如何使用以太坊Whisper協(xié)議創(chuàng)建簡單的聊天CLI”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。