摘要:前言是以太坊中一项非常有趣的技术,它是一个基于身份的通信系统,被设计用于之间少量数据通信。协议运行在以太坊协议框架之上,所有运行协议的节点以下简称节点组成一个网络。
[TOC]
前言Whisper是以太坊中一项非常有趣的技术,它是一个基于身份的通信系统,被设计用于Dapp之间少量数据通信。Whisper协议运行在以太坊p2p协议框架之上,所有运行Whisper协议的节点(以下简称节点)组成一个Whisper网络。通过节点之间的消息转发,理论上,每个节点都可以收到所有Whisper消息。
特性Whisper具有以下基本特性和概念
每一条Whisper消息在网络上都是加密传输的,可以选择非对称加密(椭圆曲线)和对称加密(AES GSM)两种加密算法之一。
Envelope是网络中传输的Whisper消息的基本单位,它包含已加密的原始消息以及消息相关的控制信息:
Expiry time:消息的超时时刻,过了这个时刻,本消息不会被节点处理或者转发
TTL:消息的存活时间,一个消息在从被创建起,只能生存TTL的时间,过了这个时间之后,消息在网络中超时
Topic:消息的主题
AESNonce:采用AES对称密钥加密算法时使用的Nonce值
EnvNonce:用于PoW计算
当一个节点从一个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可以设置以下条件:
Topics:关心的主题的集合
Sender address:创建这个消息的节点
Recipient address:指定接收节点的地址
PoW requirement:消息需要的工作量证明
AcceptP2P:节点是否接收P2P消息,这类消息有特殊的用途
Proof of Work用来防止节点恶意大量发送消息,采用的算法和PoW共识算法差不多。消息的创建者需要找到一个nonce使得消息的Hash值小于一个值。这个值与消息的大小和TTL有关,消息越大,TTL越大,则找到nonce越困难,计算工作量的公式为
其中$BestBit$为Hash值中从左往右第一个为1的bit所在的位置(这个值越大,则需要尝试nonce的次数越多)
源码分解本部分主要涉及Whisper filter envelope ,它们的联系如下图:
WhisperWhisper表示一个协议实例,负责整个Whisper功能的运行,其中比较重要的字段如下:
protocol - Whisper协议的特定值,最重要的是其中的Run字段,它表示该协议的运行入口
filter - 本节点安装的所有Filter
privateKeys - 本节点存储的非对称密钥对的集合,一个Whisper实例可以保存多个密钥对
symKeys - 本届点存储的对称密钥的集合,一个Whisper实例可以保存多个对称密钥
envelopes - envelope池,保存所有待广播发送的信封。信封池的存储键值是envelope的Hash
expirations - 超时池,记录envelope的的过期时间,超时池的存储键值是unix时间,值是envelope的Hash
peers - 活跃的Peer节点的集合,数据来源是p2p底层
msgQueue - 普通Whisper消息的envelope处理通道
在以太坊源码分析—p2p节点发现与协议运行提到过,两个节点在底层连接建立后,会运行共同支持的协议的Run函数,对于Whisper协议来说,就是HandlerPeer函数。
HandlePeer最终运行在两个Go routine中,一个是Whisper.runMessageLoop(),它负责从底层读取消息,另一个是Peer.update(),它负责周期性的将envelope池中的未发送的envelope发送到对端并将过期的envelope删除。
Envelope表示一个Whisper消息,它有两个来源
出方向通过NewEnvelope()构造
入方向从Peer节点接收
其重要的字段有
Topic - Envelope中的数据的主题,节点的Filter可以过滤感兴趣的主题进行解密
EnvNonce - 消息的创建者在PoW中找到的nonce
pow - 消息具有的pow值
消息发送的典型过程以下是本节点广播发送一小段数据payload,封装到Envelope,再加入到Envelope池的过程,其中wh表示Whisper实例
首先构造发送参数,包括原始数据payload,主题Topic等
利用发送参数构造SentMessage
根据发送参数将SentMessage封装到新创建的Envelope,这一步包括签名(sign)加密(encrypt)计算nonce(Seal)
将Envelope加入Envelope池
消息接收的典型过程以下是典型的Whisper消息接收过程,其中w表示Whisper实例
w.runMessageLoop()从底层收到Whisper消息,并解码成Envelope,加入Envelope池,调用postEvent()向w.messageQueue写入这个事件
另一方面,当w通过Start启动后,从w.messageQueue接收事件,开始Filter匹配
用已安装的每个Filter去匹配这个Envelope,如果匹配上,就将Envelope打开(解密),最终将其放入Filter的缓冲区中。
demo写了一个whipser的chat-room demo,托管在github上,感兴趣可以瞧瞧
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24379.html
摘要:本文首发于深入浅出区块链社区原文链接以太坊客户端命令用法参数详解原文已更新,请读者前往原文阅读在以太坊智能合约开发中最常用的工具必备开发工具,一个多用途的命令行工具。如果你还不知道是什么,请先阅读入门篇以太坊是什么。 本文首发于深入浅出区块链社区原文链接:以太坊客户端Geth命令用法-参数详解原文已更新,请读者前往原文阅读 Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一...
摘要:以太坊论坛大名鼎鼎的以太坊论坛将不再维护,可能很快就会停用。以太坊基金会以太坊基金会是在瑞士注册的非营利性机构,旨在管理以太币销售中筹措的基金,以更好地为以太坊和去中心化技术生态系统服务。 社区发起讨论和问问题,请明智选择论坛,并协助我们维护论坛环境整洁。 Reddit以太坊reddit分论坛是最全面的以太坊论坛,这里是大部分社区讨论发生的地方和核心开发者最活跃的地方。如果你想对新闻、...
摘要:它同时会检查确保没有意外发送的以太币。当任何以太币被存入智能合约时,匿名函数会被执行,并会自动拒绝接收以太币。 作者:Alex Van de Sande译者:王建/蔡佳慧译者介绍: 王建:万云平台区块链技术专家,拥有多年应用系统架构经验,目前在区块链落地方面进行积极探索 蔡佳慧:万云平台实习生,区块链技术爱好者,英国帝国理工学院数学专业在读 这篇教程是由以太坊Mist浏览器的负责人...
摘要:它同时会检查确保没有意外发送的以太币。当任何以太币被存入智能合约时,匿名函数会被执行,并会自动拒绝接收以太币。 作者:Alex Van de Sande译者:王建/蔡佳慧译者介绍: 王建:万云平台区块链技术专家,拥有多年应用系统架构经验,目前在区块链落地方面进行积极探索 蔡佳慧:万云平台实习生,区块链技术爱好者,英国帝国理工学院数学专业在读 这篇教程是由以太坊Mist浏览器的负责人...
摘要:自年初以来,一直在推广和分享以太坊及其生态系统方面的知识。你可以把想作是以太坊的。在任何外部数据源例如网络和区块链应用程序如以太坊方面的智能合约之间提供安全的认证通道。 从2018年3月8日到10日,来自世界各地的以太坊专业人士、研究人员、投资者和爱好者涌入了巴黎来参加以太坊社区会议(EthCC)。 EthCC是由一家法国的非盈利组织Asseth筹备组织的。Asseth自2016年初以...
阅读 3022·2021-11-18 10:07
阅读 3765·2021-11-17 17:00
阅读 2103·2021-11-15 18:01
阅读 926·2021-10-11 10:58
阅读 3373·2021-09-10 10:50
阅读 3442·2021-08-13 15:05
阅读 1229·2019-08-30 15:53
阅读 2640·2019-08-29 13:01