Whisper
是以太坊中一项非常有趣的技术,它是一个基于身份的通信系统,被设计用于Dapp之间少量数据通信。Whisper
协议运行在以太坊p2p协议框架之上,所有运行Whisper
协议的节点(以下简称节点)组成一个Whisper
网络。通过节点之间的消息转发,理论上,每个节点都可以收到所有Whisper
消息。
Whisper
具有以下基本特性和概念
每一条Whisper
消息在网络上都是加密传输的,可以选择非对称加密(椭圆曲线)和对称加密(AES GSM)两种加密算法之一。
Envelope是网络中传输的Whisper
消息的基本单位,它包含已加密的原始消息以及消息相关的控制信息:
当一个节点从一个Peer收到一个Envelope时,不管它自己管不关心里面的数据(Topic是否符合设置的值), 它都会将这个Envelope转发给其他Peer,这是Whisper的固有机制。
每个Envelope上写明了自己封装消息的Topic,如果一个节点不关心这个Topic,那么它就不需要去试着打开(解密)这个Envelope。通常一个Topic对应一个消息加密时使用的Key(无论是对称还是非对称加密)。所以,如果一个节点收到了一个关心的Topic的Envelope时,它应该能打开这个Envelope
Dapp 可以在节点上安装多个Filter,每个Filter包含一组条件,只有满足这些条件的Envelope才能被打开,准确的说,不是节点打开Envelope,而是节点上安装的Filter打开Envelope,每个Filter有一个缓冲区可以存储解密后的消息,如果一个Envelope满足多个Filter,那么这个消息会存储在多个Filter中。Filter可以设置以下条件:
Proof of Work用来防止节点恶意大量发送消息,采用的算法和PoW共识算法差不多。消息的创建者需要找到一个nonce使得消息的Hash值小于一个值。这个值与消息的大小和TTL有关,消息越大,TTL越大,则找到nonce越困难,计算工作量的公式为
P o W = 2 ∗ B e s t B i t s i z e ∗ T T L PoW = \dfrac{2*BestBit}{size * TTL} PoW=size∗TTL2∗BestBit
其中 B e s t B i t BestBit BestBit为Hash值中从左往右第一个为1的bit所在的位置(这个值越大,则需要尝试nonce的次数越多)
本部分主要涉及Whisper filter envelope ,它们的联系如下图:
####Whisper
Whisper表示一个协议实例,负责整个Whisper
功能的运行,其中比较重要的字段如下:
在以太坊源码分析—p2p节点发现与协议运行提到过,两个节点在底层连接建立后,会运行共同支持的协议的Run函数,对于Whisper协议来说,就是HandlerPeer函数。
HandlePeer最终运行在两个Go routine中,一个是Whisper.runMessageLoop(),它负责从底层读取消息,另一个是Peer.update(),它负责周期性的将envelope池中的未发送的envelope发送到对端并将过期的envelope删除。
####Envelope
Envelope表示一个Whisper消息,它有两个来源
其重要的字段有
####消息发送的典型过程
以下是本节点广播发送一小段数据payload,封装到Envelope,再加入到Envelope池的过程,其中wh
表示Whisper实例
####消息接收的典型过程
以下是典型的Whisper
消息接收过程,其中w
表示Whisper实例
Whisper
消息,并解码成Envelope,加入Envelope池,调用**postEvent()**向w.messageQueue写入这个事件w
通过Start启动后,从w.messageQueue接收事件,开始Filter匹配写了一个whipser的chat-room demo,托管在github上,感兴趣可以瞧瞧