转载请注明出处: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