温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用以太坊Whisper协议创建简单的聊天CLI

发布时间:2022-01-15 14:26:17 来源:亿速云 阅读:246 作者:iii 栏目:互联网科技

这篇“如何使用以太坊Whisper协议创建简单的聊天CLI”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用以太坊Whisper协议创建简单的聊天CLI”文章吧。

我们了解到,没有多少DAPP开发人员希望以状态的方式使用Whisper(作为一个庞大的多用户消息传递协议),而是将有关DAPP中与其交互的特定(通常是重要的)信息移动。本教程旨在为你提供所需的技能,以适应你的需要:你应该既知道足够容易插入到任何状态聊天,以及如何使用Whisper为你自己的工作到最后。许多其他团队已经开始这样做了,例如,你可以在Bloom blog上找到更多关于如何将基本概念扩展到有趣系统的信息。

我们专门为本教程创建了这个存储库。如果你想帮助社区,可以在不同的分支下添加额外的教程。不过,在克隆存储库之前,让我们确保正确设置了所有依赖项,尤其是nodejs和go-ethereum。我们将使用最新版本的Geth、Whisper和EmochtJS来帮助你了解Whisper今天的样子。

NodeJS 8.10+
node version
> 8.10+

如果需要更新节点,请 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发行版:

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum

/* Just to upgrade */
sudo apt-get update ethereum

启动geth节点

要使用Whisper,你需要一个正在运行的geth节点。可以执行以下命令以使用所需的最小选项启动节点:

geth --testnet --syncmode=light --ws --wsorigins=mychat --shh --wsapi=web3,shh,net

这里,我们连接到Ropsten,确保我们没有验证完整的块(只有headers),确保websockets使用特定的源(我们稍后将在JS中使用),确保启用了Whisper,即shh,并且webshhnetAPI对我们可用。

设置和浏览

现在我们已经设置了所有的先决条件,我们需要克隆这个repo并安装依赖项。

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以查看进度。

TODO:Web3连接

为了通过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。如果无法连接,聊天窗口将关闭。

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({
    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目标。

TODO:订阅公共聊天消息

你可能已经注意到你发送的消息没有显示在屏幕上。为了在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);
});

添加此代码后,打开聊天应用程序的两个实例并编写一条消息。你将看到它如何在两个窗口中显示。唯一的问题是,任何收听此频道的人都可以看到你所写的所有消息,所以让我们通过添加私有消息来解决这个问题。

TODO:发送私人消息

为了发送私人消息,我们有一个类似于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并拖动鼠标以选择联系人的公钥。

TODO:订阅私人消息

与从公共通道接收消息类似,我们需要创建一个订阅来接收私有消息,将其用作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协议创建简单的聊天CLI”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI