转载请注明出处:www.huamo.online
字节杭州 求贤若渴:
go-ethereum/whisper
先从whipserv6看起。
Whisper定义
Whisper代表了在以太坊网络中的一个隐秘(dark)通信接口,使用的是以太坊自有的P2P通信层。所谓dark,意思是没有可靠的方法可以来追踪数据包(见于Specs)
1 | // whisper/whisperv6/whisper.go |
Whisper节点的配置Config
由于新建一个Whisper实例,需要接收Config参数,所以先来看看Config的定义,见于config.go文件中。
1 | // whisper/whisperv6/config.go |
这里面提到了一个MinimumAcceptedPOW,是关于工作量证明的,我在Proof of Work找到了这个设计的初衷。
之所以用到
POW,主要是为了防止垃圾消息,也同样是为了缓解网络的压力。计算POW的成本可以理解为“你想让网络将你的消息存储一段时间(即TTL时间段),因此需要分配资源,那么你就需要为此支付价格”。所需的POW应该与消息大小和TTL成正比。
代码中还提供了一个默认配置样例DefaultConfig。
1 | // whisper/whisperv6/config.go |
新建一个Whisper客户端
搞明白了Config,开始新建一个Whisper客户端,whisper.go中的New()方法会新建一个Whisper客户端,该客户端可以在以太坊P2P网络中进行通信。
1 | // whisper/whisperv6/whisper.go |
总体来说,New()主要是创建了一个空的whisper{}结构体,并尽力初始化,比较重要的地方,就是初始化whisper.protocol子协议字段,这里面涉及到很多魔数。
关于版本号6,wiki上有这么一段话:
Tor系统有一个协议,可以在两个节点之间建立连接,但它们互相并不知道对方在哪里,这是用于隐藏服务的Rendezvous协议。隐藏的服务(相当于TCP/IP中一个监听端口的服务)会选择随机数量的”介绍人”节点(我想,这个随机数量一般都是6)。为了做到这一点,它会和每一个介绍人都建立标准的3跳链(3-hop chain),当一个用户想和一个隐藏服务建立连接时,它们就会传播一个请求去连接与特定公钥相关的隐藏服务。
关于消息代号数量128,p2p.Protocol结构体中的Lenght字段表示某一子协议中消息代号的总数量,而在whisper/whisperv6/doc.go的常量表中可以看到根据EIP-627提案,whisper协议的消息代号共有128种,故为128
HandlePeer:发现新节点后做什么
在新建whisper客户端时,whisper.protocol结构体用HandlerPeer()填充了Run字段,当和一个节点协商该协议时,会在一个新的goroutine上调用Run代表的方法。在whisper这里,当whisper子协议连接被协商的时候,下面的P2P层会调用HandlePeer。
1 | // whisper/whisperv6/whisper.go |
这里主要是在发现一个新的节点时,whisper协议所做的操作,大部分操作都是和Peer有关。下面就来看看whisper的Peer。
whisper中的Peer
在peer.go中有关于Peer的定义,Peer代表了在whisper协议中的一个节点连接。
1 | // whisper/whisperv6/peer.go |
新建一个远程节点的本地代理Peer
1 | // whisper/whisperv6/peer.go |
和远程节点握手:handshake()
handshake()向远程节点发送协议初始化状态信息,同时也会验证远程节点的状态。状态消息有以下几点要素:
- 消息代号为
statusCode,即0 - 消息的
payload是一个列表:[whisper协议版本号(即6), 本地节点需要的最小POW值, 本地节点感兴趣的消息过滤器] - 只有版本号是强制验证的,后续
2个参数都是可选的,即本地节点要求的最小POW和本地节点感兴趣的消息过滤器
1 | // whisper/whisperv6/peer.go |
开始通信:start()
start()初始化
参考资料
https://github.com/ethereum/go-ethereum/wiki/Whisper-Overview#proof-of-work
https://github.com/ethereum/wiki/wiki/Whisper#considerations-for-defeating-traffic-analysis
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-627.md
转载请注明出处:www.huamo.online