区块链和P2P网络

2018-03-14 黄毅

其实在互联网刚萌芽的时候,网络就是p2p状态的,每一台机器都有一个固定的地址,互相之间可以访问。

但是随着互联网发展,一方面ipv4设计上的不周全导致地址不够用,普通人的电脑慢慢的就不能简单地直接被人访问了。 另一方面互联网业务本身也走向了客户端-服务器模式,并且客户端越来越轻,客户端软件逐渐被web技术取代,相对应的服务器越来越重要。

但在这个发展过程中,还是出现过一个惊艳的技术潮流,就是以BT下载为代表的P2P文件分享。 普通互联网用户不通过服务器,也可以直接建立网络结构,完成文件分享和下载的任务。 但是由于版权等问题,这个技术没有成为主流。

区块链技术从某种意义上,可以看做是P2P技术的一次重生。这一次,它实现了数字货币的功能,顺便解决了做种的人(现在叫矿工了)的激励问题。 同时,因为有了经济上的激励,它同时还要从根本上解决作弊的问题。

我们介绍一下区块链技术最底层的部分:P2P网络协议。

P2P网络协议有很多种,传统BT下载类应用常用分布式哈希表(DHT)算法,具体的就是Kademlia算法。

区块链应用中,比特币使用的是gossip protocol, 以太坊和Cardano(ADA)使用的是Kademlia DHT。

gossip protocol是一种非结构化的p2p网络,基本上是随机连上一些节点就可以了,网络拓扑会呈现更随机的形状, 比特币的参数是每个节点最多主动连8个节点,最多接受117个外来连接。

Kademlia DHT是一种结构化的p2p网络,这也是根据文件分享应用的需求来的。 完美的网络结构当然是最好按照物理距离来,每个节点连接和它物理距离最近的节点。 但是使用物理距离比较困难,Kademlia算法使用节点id之间的异或操作来当作节点之间的距离。 因为异或操作拥有的一些性质使得它适合来做这件事情:

  • 交换律,路由表对称。
  • 三角关系:d(x, y) + d(y, z) >= d(x, z)

Kademlia网络中查找节点内容的通讯复杂度是对数级别,路由表缓存效率更高,网络扩展性更好。 但是目前阶段的区块链应用基本上只需要广播,而不需要查找特定节点,其实用不上Kademlia的一些特性; 反而不小心的话,Kademlia网络的结构化特征给Eclipse Attack带来了便利,所以比特币的选择也有他的道理。

Eclipse Attack

Eclipse Attack是指恶意节点通过某种手段“包围”了目标节点,使得目标节点所有连接的都是恶意节点,之后恶意节点可以过滤或伪造消息,进一步对目标节点发起各种攻击,比如:

  • 攻击共识算法

    双花,自私挖矿等。

  • 攻击闪电网络等二级网络

    当闪电网络的通道关闭后,不告诉商家节点通道已关闭,继续发送付费消息并得到服务。

  • 攻击智能合约

    恶意节点可以引导受害节点的智能合约存储错误的状态,智能合约的逻辑的是依赖这些状态的,经过智能合约的运算,这种错误会得到放大,产生不可预料的问题。

2015年就有研究人员研究过对比特币网络进行Eclipse Attack的研究(Eclipse Attacks on Bitcoin’s Peer-to-Peer Network), 比特币经过改进,现在已经不是一般的攻击者能够实现的了。

2018年初又有研究人员发表了针对以太坊网络的Eclipse Attack研究(Low-Resource Eclipse Attacks on Ethereum’s Peer-to-Peer Network),发现攻击成本非常低, 两台普通机器连上以太坊就能成功发起攻击,当然以太坊后续版本已经加上了反制措施。 我们可以了解一下大概的攻击方法:

  • 连接垄断

    以太坊设定的每个节点维持最多13个连接,并且外部发起的和自己发起的连接是平等的。 攻击者可以等待目标节点重启(或者给目标节点发送"重启包"强制重启),然后主动连上去,占满目标节点的可用连接。

    解决方案:要求节点至少要有一部分主动对外的连接。

  • 占有路由表

    因为以太坊节点ID就是一个ECDSA公钥,而公钥生成成本很低,并且同一台电脑上就可以运行大量节点。 攻击者可以根据目标节点ID生成大量和目标节点ID距离很近的节点,并主动ping目标节点。 当目标节点重启后,路由表清空,会迅速被恶意节点占领。 当目标节点主动发起连接,依然会大概率连上恶意节点。

    解决方案:

    • 因为这个攻击方式利用了Kademlia距离函数是公开并且对称的特点,如果我们把距离函数改成非对称的, 引入本地生成的随机数: dist(s1, SHA3(n, s2)) ,这样攻击节点就无法批量生成和目标节点距离短的节点ID了。 目前以太坊没有实现这个策略,因为它其实破坏了Kademlia网络的结构,会提高查找特定节点的通讯复杂度,虽然区块链应用场景下目前并不需要这种操作。
    • 目前以太坊的反制措施是限制路由表中来自同一个网段中节点数量,让这种攻击方式的成本提高一些。

blog comments powered by Disqus

转载请注明出处,收藏或分享这篇文章到: