溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用以太坊Whisper協(xié)議創(chuàng)建簡單的聊天CLI

發(fā)布時(shí)間:2022-01-15 14:26:17 來源:億速云 閱讀:237 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇“如何使用以太坊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今天的樣子。

NodeJS 8.10+
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
Go-ethereum 1.8.17+
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

啟動geth節(jié)點(diǎn)

要使用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、shhnetAPI對我們可用。

設(shè)置和瀏覽

現(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)用程序。

對聊天客戶端進(jìn)行編碼

文件src/index.js中充滿了我們需要處理的todo。以下各節(jié)詳細(xì)介紹了我們將如何以邏輯方式完成這些操作。在每個(gè)部分的末尾,可以執(zhí)行npm start以查看進(jìn)度。

TODO:Web3連接

為了通過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)閉。

TODO:生成密鑰對

我們需要生成一個(gè)密鑰對,用于對發(fā)送的消息進(jìn)行簽名。我們將使用相同的密鑰對來接收和解密私有消息。這與調(diào)用通過shh API公開的函數(shù)一樣簡單:

// Generate keypair
const keyPair = await web3.shh.newKeyPair();
TODO:生成對稱密鑰

Public消息是使用對稱密鑰和主題加密的消息。它們不會針對特定的任何人,而是由在特定頻道中收聽的任何人接收。在聊天應(yīng)用程序中,我們的頻道由一個(gè)共享對稱密鑰表示,該密鑰的password就是我們將要使用和收聽的頻道:

// Generate a symmetric key
const channelSymKey = await web3.shh.generateSymKeyFromPassword(DEFAULT_CHANNEL);
TODO:獲取公鑰

我們需要為自己生成公鑰,以便能夠?qū)⒆约簶?biāo)識為通過我們的通道發(fā)送和接收的作者消息。這是通過以下代碼完成的:

// Obtain public key
const pubKey = await web3.shh.getPublicKey(keyPair);
TODO:發(fā)送公共消息

一旦生成了對稱密鑰,就可以使用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)。

TODO:訂閱公共聊天消息

你可能已經(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è)問題。

TODO:發(fā)送私人消息

為了發(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)系人的公鑰。

TODO:訂閱私人消息

與從公共通道接收消息類似,我們需要創(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI