开发者社区> nkbai> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

whisper简介

简介: 以太坊系列之二十 以太坊中的基础应用whisper 以太坊系列之二十 以太坊中的基础应用whisper 1 whisper介绍 2 whisper rpc模块 3 whisper中的消息 4 消息的加密 5 过滤器 以太坊作为一个区块链生态系统,为区块链dapp应用提供了丰富的环境,whisper就是其中一个基础性设施.
+关注继续查看

以太坊系列之二十 以太坊中的基础应用whisper

1 whisper介绍

whisper是一个比较独立的模块,它的运行完全独立于geth也就是以太坊区块链.如果要感受whisper可以通过启动wnode来感受.wnode有丰富的参数,能够让大家加入whisper网络,来感受这个去中心化的聊天系统. 我前面写的[以太坊系列之十八: 百行go代码构建p2p聊天室](http://www.cnblogs.com/baizx/p/7505096.html)就是一个简版的wnode,只取了其中一小部分.

whisper实际上就是以太坊p2p网络上的一个应用, 注意我强调以太坊网络是因为它的p2p协议直接取自前面介绍的[以太坊系列之六: p2p模块--以太坊源码学习](http://www.cnblogs.com/baizx/p/6963636.html),那里提到P2p模块是支持自定义Protocol的,实际上以太坊区块的同步,tx的发布都是其中的一个协议而已.同样whisper也是其中的一个协议.
我们来看看这个协议的定义.
```go
// p2p whisper sub protocol handler
whisper.protocol = p2p.Protocol{
    Name:    ProtocolName, //shh
    Version: uint(ProtocolVersion), //5
    Length:  NumberOfMessageCodes, //64
    Run:     whisper.HandlePeer, //数据处理
}
```
在web3 api中暴露的shh模块主体就是在这里

2 whisper rpc模块

以太坊系列对外提供的api接口都是通过rpc调用来实现的. whisper同样也是,whisper对外提供的api主要是建立账户,发送消息,过滤消息等. 我们一般意义上的接收消息就是过滤消息,因为p2p网络中会收到大量各种消息,你只有定义了自己感兴趣的消息,也就是过滤消息才能得到想要的具体消息内容.

对外提供rpc api的接口一般都是如下形式:
```go
[]rpc.API{
    {
        Namespace: ProtocolName, //shh
        Version:   ProtocolVersionStr, //5.0
        Service:   NewPublicWhisperAPI(w),
        Public:    true,
    },
}

// NewPublicWhisperAPI create a new RPC whisper service.
func NewPublicWhisperAPI(w *Whisper) *PublicWhisperAPI {
    return &PublicWhisperAPI{whisper: w}
}
```
PublicWhisperAPI包含了所有可能被访问的api.

3 whisper中的消息

主要有三种消息,分别是messagesCode  ,p2pCode,p2pRequestCode
我们一般用的主要就是messagesCode类型,p2pCode用于点对点直接通信,p2pRequestCode为智能合约使用.
主要说一下messageCode类型如何处理.

对于收到的消息,首先检验发送时间是否正确(防止错误垃圾消息),然后计算工作量是否到位(这个就是bitmessage的核心思想),
第三步检验该消息是否已经收到过(hash值存在),如果存在就忽略,否则进入第四步.
第四步将消息放入本地消息队列 节点会定期对消息队列中的消息进行处理.
第五步 检测是否满足某个过滤条件,如果是,就将消息放入过滤队列(channel)中.

另外,节点还会启动一个携程定期把本地收到的合法消息广播出去.
以上基本就是一个p2p聊天系统的核心了.

4 消息的加密

消息有两种加密形式,一种是对称的aes加密,另一种是非对称的ecdsaj加密.上面对于消息的处理流程中除了第五步检测是否满足设定的过滤条件,其他步骤都不涉及对消息内容的处理,也就无需解密.

也就是说真正对消息内容的处理,是在过滤器中进行的.先看看消息的格式,里面包含什么内容. 分成两个部分,一个是信封,一个是信体,信封没有加密,信体加密.
```go
// Envelope represents a clear-text data packet to transmit through the Whisper
// network. Its contents may or may not be encrypted and signed.
type Envelope struct {
    Version  []byte
    Expiry   uint32
    TTL      uint32
    Topic    TopicType
    AESNonce []byte
    Data     []byte
    EnvNonce uint64

    pow  float64     // Message-specific PoW as described in the Whisper specification.
}
```
信封里主要是时间相关信息以及验证工作量所需信息. 需要特别指出的是,whisper可以按照特定的topic过滤消息,topic是明文且没有加密的四字节数据.

信体格式比较复杂,关键是里面有需要解密消息的对称密钥或者公钥.
```go
// ReceivedMessage represents a data packet to be received through the
// Whisper protocol.
type ReceivedMessage struct {
    Raw []byte

    Payload   []byte
    Padding   []byte
    Signature []byte

    PoW   float64          // Proof of work as described in the Whisper spec
    Sent  uint32           // Time when the message was posted into the network
    TTL   uint32           // Maximum time to live allowed for the message
    Src   *ecdsa.PublicKey // Message recipient (identity used to decode the message)
    Dst   *ecdsa.PublicKey // Message recipient (identity used to decode the message)
    Topic TopicType

    SymKeyHash      common.Hash // The Keccak256Hash of the key, associated with the Topic
    EnvelopeHash    common.Hash // Message envelope hash to act as a unique id
    EnvelopeVersion uint64
}
```
可以看到信体里也把信封的大部分内容都包含进去了.

5 过滤器

过滤器必须给出一个公钥或者aes密钥来解密消息, 也可以给出一个或多个可选的topic来进行过滤.
过滤器实际上是用户接入whisper消息系统的入口,也只有这种方式来接收消息.
另外过滤器还可以指定一个更高难度(相比默认难度)的工作量来过滤消息.
过滤器结构如下:

type Filter struct {
    Src        *ecdsa.PublicKey  // Sender of the message
    KeyAsym    *ecdsa.PrivateKey // Private Key of recipient
    KeySym     []byte            // Key associated with the Topic
    Topics     [][]byte          // Topics to filter messages with
    PoW        float64           // Proof of work as described in the Whisper spec
    AllowP2P   bool              // Indicates whether this filter is interested in direct peer-to-peer messages
    SymKeyHash common.Hash       // The Keccak256Hash of the symmetric key, needed for optimization

    msgChan chan *ReceivedMessage //matched message channel
    mutex   sync.RWMutex
}

主要包含指定的公钥,指定的对称密钥,topics,pow.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《C语言课程设计》一1.1 VC 6.0简介
本节书摘来自华章出版社《C语言课程设计》一书中的第1章,第1.1节,作者 刘博 董学文,更多章节内容可以访问云栖社区“华章计算机”公众号查看
773 0
WTK使用简介(一)——使用入门
J2ME Wireless Toolkit(WTK)是常用的J2ME SDK,使用WTK可以进行程序的编译、校验、运行。有关WTK的信息可查询如下网址http://java.sun.com/products/j2mewtoolkit。   目前最新版本是WTK2.1,该版本支持JTWI(无线产业Java技术规范)Roadmap 1、CLDC1.1和J2ME Web Services API。本
836 0
Github简介
先附上下载地址 http://windows.github.com/ git-scm.com是版本控制软件Git的官方网站。   Git和GitHub的区别 Git是一个分布式的版本控制系统,与SVN类似;最初由Linus Torvalds编写,用作Linux内核代码的管理。
702 0
asi 简介
http://www.dreamingwish.com/dream-2011/apples-third-party-development-libraries-asihttprequest.html
830 0
x3d
CodeMirror简介
Javascript由于其作为Web标准的独特地位,很多人甚至希望它能一统前后端开发。 Javascript的本质工作首先肯定的Web前端开发,本文主要想介绍的CodeMirror是一款Web Editor组件。
832 0
VTK简介
VTK(Visualization ToolKit)是一个开放源码、自由获取的软件系统,全世界的数以千计的研究人员和开发人员用它来进行3D计算机图形,图像处理,可视化。 VTK(Visualization ToolKit)是一个开放源码、自由获取的软件系统,全世界的数以千计的研究人员和开发人员用它来进行3D计算机图形,图像处理,可视化。
831 0
GPIO简介
本文所述IO(Input/Output PAD)主要是指集成在CMOS芯片中的连接模块,其负责芯片引脚的外部信号与芯片内部的数字/模拟模块的交互,它是一颗完整芯片设计中不可或缺的组成部分。 文章首先根据IO的使用类型,介绍了IO的分类;紧接着重点介绍了GPIO的输入/输出功能和模式...
0 0
Mybatis Plus 中的LambdaQueryWrapper简介
Mybatis Plus 中的LambdaQueryWrapper简介
0 0
+关注
nkbai
区块链技术爱好者,智能合约安全专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
简介Bytom架构
立即下载
Chap1.简介Bytom架构
立即下载
低代码开发师(初级)实战教程
立即下载