《精通比特币》学习:比特币网络“P2P网络架构”

1、P2P网络架构:

对于比特币,大家听得最多的就是去中心化,分布式吧。简单理解就是比特币网络是一个分布式的网络,网络中的节点是点对点通讯,没有中心节点,也即P2P网络。对于有着多年技术背景和互联网从业经验的我来说,P2P协议对我来说并不陌生,在区块链兴起之前,P2P已经早就出来很多年了,只是一直不温不火,知名度最高的应该早期的电驴和迅雷了吧,主要用在分布式的文件共享和下载,相信很多人都用电驴下载过日本电影吧。P2P还有一个很重要的特点,单个文件也是可以分布式存储的,比如一部电影可能分散存在多个人的电脑里面,下载的时候从多个电脑下载组合,原来电驴下载就有种子一说,种子越多下载速度反而越快。

比特币网络是按照比特币P2P协议运行的一系列节点的集合,也称为主网络。比特币网络除了P2P协议之外,还包含其他协议,例如Stratum,用于挖矿以及比特币钱包中。例如,Stratum服务器通过Stratum协议将所有Stratum挖矿节点连接至比特币主网络、并将Stratum协议桥接(bridge)至比特币P2P协议之上。我们使用“扩展比特币网络(extended bitcoin network)”指代所有包含比特币P2P协议、矿池挖矿协议、Stratum协议以及其他连接比特币系统组件相关协议的整体网络结构。

2、比特币网络节点:

在比特币网络中的每一个节点独立平等,但是每一个节点并不是完全一样,有不同的分工和作用。最完整的一个节点应该具有四大功能,如下图:

《精通比特币》学习:比特币网络“P2P网络架构”

一个包含四个完整功能的比特币网络节点:钱包、矿工、完整区块链、网络路由节点

但不是每一个节点都需要这么完备的功能,比如有些只挖矿,扩展比特币网络中最为常见的节点类型如下图:

《精通比特币》学习:比特币网络“P2P网络架构”

3、比特币主网络和扩展比特币网络

比特币主网络由大约7000-10000个运行着不同版本比特币核心客户端(Bitcoin Core)的监听节点、以及几百个运行着各类比特币P2P协议的应用(例如BitcoinJ、Libbitcoin、btcd等)的节点组成。主网络上的节点有一小部分也是挖矿节点,但更多的挖矿节点是主网络连接的矿池服务器通过矿池挖矿协议连接的挖矿节点。

简单理解:主网络节点通过运行P2P协议相互连接,主网络节点主要是核心客户端、全节点客户端和轻量钱包等节点,另外矿池服务器和Stratum服务器通过P2P协议桥接连入主网络,然后挖矿节点通过矿池挖矿协议接入矿池服务器,Stratum挖矿节点和轻量Stratum钱包节点通过Stratum协议接入Stratum服务器,从而构成了一个完整的比特币网络,也叫扩展比特币网络。

4、边缘路由器

主网络中有很多完整区块链节点,这些节点有完整的区块链和网络路由节点,但是没有钱包和挖矿功能,这些节点是网络中的边缘路由器。那这些节点既不能用来挖矿赚钱,也不能转账交易,那他们能做什么呢?这些节点可都是大公司运行的节点,通过他们可以搭建其他服务,比如交易所、钱包、区块浏览器、商家交易处理等,是不是看到交易所眼睛一亮?

《精通比特币》学习:比特币网络“P2P网络架构”

具有多种节点类型、网关及协议的扩展比特币网络

5、网络发现节点:

当一个新的节点启动后,他必须发现并连接网络中至少一个已经存在的节点。由于节点可以随时加入和离开,所以节点之间的通讯路径是不可靠的,所以节点必须持续的进行两项工作:一是在失去节点连接时发现新节点,二是在其他节点启动时为其提供帮助。

6、补全缺失区块:

一个完整区块链节点连接到对等节点后,首先就是要构建完整的区块链,新节点需要下载从创世区块开始的数十万区块的全部内容。新节点和对等节点会交换信息,其中包含他们本地区块链的顶端区块哈希值,如果某个对等节点发现它接收到的哈希值不是顶端区块,那么他就会判断出自身的本地区块链比其他对等节点的区块链更长。拥有更长区块链的对等节点可以识别出哪些区块是其他节点需要补充的,第一批可供分享的500个区块通过使用INV消息把这些区块哈希值传播出去,缺少这些区块的节点通过getdata消息来请求得到全区块信息。新节点收到对等节点的inv消息后,通过分摊工作量的方式向与之相连的节点请求区块,防止单一对等节点被批量请求压垮。

7、简易支付验证 (SPV)节点

不是所有的节点都有能力储存完整的区块链账簿,比如手机。对于这样的设备节点,就通过SPV的方式让他们不必储存完整区块链节点的情况下进行工作。SPV节点只下载区块头,不下载区块中的交易信息,由此产生的区块链大小只有完整区块链大小的1/1000。SPV节点验证交易时需要依赖完整区块链节点,完整区块链节点就像有完整城市地图的游客,SPV节点就像只知道当前道路名字的游客,尽管两个游戏都可以验证当前所在街道是否存在,但没有地图的游客不知道当前所在街道是不是唯一的,是不是就是想找的那条街道,所以他只能向足够多的陌生人问路,并且希望别人不要抢劫他。SPV节点使用的是一条getheaders消息,而不是getblocks消息来获得区块头。发出响应的对等节点将用一条headers消息发送多达2000个区块头。

8、SPV节点的隐私风险问题

由于SPV节点需要读取特定交易从而选择性地验证交易,这样就又产生了隐私风险。与全区块链节点收集每一个区块内的全部交易所不同的是,SPV节点对特定数据的请求可能无意中透露了钱包里的地址信息。例如,监控网络的第三方可以跟踪某个SPV节点上的钱包所请求的全部交易信息,并且利用这些交易信息把比特币地址和钱包的用户关联起来,从而损害了用户的隐私。比特币开发人员就添加了一个新功能:Bloom过滤器,用以解决SPV节点的隐私风险问题。Bloom过滤器通过一个采用概率而不是固定模式的过滤机制,允许SPV节点只接收交易信息的子集,同时不会精确泄露哪些是它们感兴趣的地址。


分享到:


相關文章: