whisper简介

简介: 以太坊系列之二十 以太坊中的基础应用whisper以太坊系列之二十 以太坊中的基础应用whisper1 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.

目录
相关文章
markdown字体大小颜色样式详解
markdown字体大小颜色样式详解
641 1
|
5月前
|
开发框架 人工智能 Java
破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
本文详细介绍了阿里云应用服务器如何助力传统J2EE应用实现智能化升级。文章分为三部分:第一部分阐述了传统J2EE应用在智能化转型中的痛点,如协议鸿沟、资源冲突和观测失明;第二部分展示了阿里云应用服务器的解决方案,包括兼容传统EJB容器与微服务架构、支持大模型即插即用及全景可观测性;第三部分则通过具体步骤说明如何基于EDAS开启J2EE应用的智能化进程,确保十年代码无需重写,轻松实现智能化跃迁。
445 41
|
2月前
|
存储 新零售 监控
一文揭开神秘的RFID技术面纱
RFID(射频识别)技术是物联网的重要组成部分,通过无线电信号自动识别目标并读写数据。广泛应用于门禁卡、公交卡、无人超市、物流仓储、智慧医疗等领域。本文详解其原理、组成、分类、特点及应用,带你全面了解这项高效、智能的识别技术。
|
11月前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
293 5
|
人工智能 语音技术 Windows
语音识别教程:Whisper
本文是一份详细的Whisper语音识别模型使用教程,包括了FFmpeg的安装、Whisper模型的安装与使用,以及如何实现实时录制音频并转录的步骤和代码示例,旨在帮助用户基于Whisper和GPT创建AI字幕。
|
弹性计算 Cloud Native 数据可视化
建站选择云虚拟主机、轻量应用服务器、云服务器、云·速成美站、云·原生建站有何区别?
在阿里云的各种云产品中,云虚拟主机、轻量应用服务器、云服务器、云·原生建站、云·速成美站等产品都可用来建站使用,每种产品都有自己的优势和适用场景,例如我们是自己写的代码,可以选择云虚拟主机或者云服务器和轻量应用服务器来搭建网站,如果是自己不会写代码,想快速完成建站,一般选择云·速成美站就可以。本文为大家比较下这几个阿里云的产品在建站时各自的优势和适合的用户,以供参考。
建站选择云虚拟主机、轻量应用服务器、云服务器、云·速成美站、云·原生建站有何区别?
|
12月前
|
安全 数据库连接 Linux
深入探索研究FileRun
【10月更文挑战第9天】
469 1
|
存储 设计模式 ARouter
组件化框架 ARouter 完全解析(一)
组件化框架 ARouter 完全解析(一)
559 2
|
12月前
|
人工智能 语音技术 决策智能
魔搭社区每周速递(9.28-10.12)
503个模型、189个数据集、82个创新应用、9篇应用文章
|
人工智能 运维 自然语言处理
阿里云百炼
阿里云百炼支持多语言模型,适用于不同问答场景。初始内置问答基础上,用户可上传文档定制应用,针对每个项目“投喂”特定知识,优化答案检索,降低运维成本。模型管理允许关联不同知识库和设置敏感词以保护隐私。计费依据模型类型,大语言模型按Input和Output Token数,语音识别按时长计费。输入和输出分别计费,考虑资源消耗差异。