主页 > imtoken最新app下载 > 比特币网络

比特币网络

imtoken最新app下载 2023-03-06 05:52:39

P2P 网络架构

比特币采用基于互联网的P2P(点对点)网络架构。 P2P是指同一网络中的每台计算机都是对等的,每个节点共同提供网络服务,没有“特殊”节点。每个网络节点都以“平面”拓扑相互连接。 P2P 网络中没有服务器、集中式服务和层次结构。 P2P网络的节点相互交互、协同运作:每个节点对外提供服务的同时也使用网络中其他节点提供的服务。

因此,P2P 网络是可靠、分散和开放的。

早期的互联网是 P2P 网络架构的典型用例:IP 网络中的所有节点都是完全平等的。今天的互联网架构具有分层结构,但IP协议仍然保留了扁平拓扑的结构。在比特币之外,P2P 技术最大和最成功的应用是文件共享:Napster 是该领域的先驱,而 BitTorrent 是其架构的最新发展。

比特币采用的P2P网络架构并不是选择拓扑那么简单。比特币被设计为一个点对点的数字现金系统,其网络架构既是这一核心特性的体现,也是基石。去中心化控制是设计的核心原则,只有通过维护一个扁平化、去中心化的 P2P 共识网络才能实现。

“比特币网络”是在比特币 P2P 协议下运行的节点集合。除了比特币 P2P 协议之外,比特币网络中还包含其他协议。例如,Stratum 协议用于采矿、轻量级或移动比特币钱包。网关路由服务器提供这些协议,使用比特币 P2P 协议连接到比特币网络,并将网络扩展到运行其他协议的各个节点。例如,Stratum 服务器通过 Stratum 协议将所有 Stratum 挖矿节点连接到比特币主网,并将 Stratum 协议桥接到比特币 P2P 协议。我们使用术语“扩展比特币网络”来指代所有的整体网络结构,包括比特币 P2P 协议、矿池挖矿协议、Stratum 协议以及与连接比特币系统组件相关的其他协议。

6.2 节点类型及分工

虽然比特币P2P网络中的每个节点都是平等的,但每个节点可能会根据所提供的功能而具有不同的功能。分工。每个比特币节点都是路由、区块链数据库、挖矿和钱包服务的功能集合。一个全节点包括四个功能,如图6-1所示:

图 6-1 比特币网络节点:钱包、矿工、全区块链、网络路由节点

每个节点都参与整个网络的路由功能,还可能包含其他功能。每个节点都参与验证和传播交易和区块信息,发现和维护与对等节点的连接。在图 6-1 所示的全节点用例中,路由功能由名为“网络路由节点”的橙色圆圈表示。

一些节点维护完整的、最新的区块链副本,这样的节点被称为“完整节点”。全节点可以独立验证所有交易,无需任何外部参考。还有一些节点只保留部分区块链,它们通过称为简单支付验证(SPV)的方法验证交易。此类节点称为“SPV 节点”,也称为“轻量级节点”。在上面显示的全节点用例中,名为全区块链的蓝色圆圈代表全节点区块链数据库功能。在图 6-3 中,SPV 节点没有这个蓝色圆圈,表示它们没有完整的区块链副本。

采矿节点通过在特殊硬件设备上运行的工作量证明算法相互竞争以创建新块。一些挖矿节点也是全节点比特网,保留了区块链的完整副本;部分参与矿池挖矿的节点属于轻量级节点,必须依赖矿池服务器维护的全节点才能工作。在全节点用例中,挖矿功能由图中名为“miner”的黑色圆圈表示。

用户钱包也可以是完整节点的一部分,这在桌面比特币客户端中更为常见。目前,越来越多的用户钱包是SPV节点,尤其是在智能手机等资源受限设备上运行的比特币钱包应用;这变得越来越普遍。在图6-1中,名为“Wallet”的绿色圆圈代表钱包功能。

在比特币P2P协议中,除了这些主要的节点类型外,一些服务器和节点还运行着其他协议,比如特殊的矿池挖矿协议、轻量级客户端访问协议等。

比特网

图 6-2 描述了扩展比特币网络的最常见的节点类型。

图 6-2 扩展比特币网络的不同节点类型

6.3 扩容比特币网络

p>

运行比特币P2P协议的比特币主网由大约7000-10000个运行不同版本比特币核心客户端(Bitcoin Core)的监听节点和数百个运行各种比特币P2P协议的节点组成。如 BitcoinJ、Libbitcoin、btcd 等)。比特币 P2P 网络中的少数节点也是挖矿节点,竞争挖矿、验证交易和创建新区块。许多连接到比特币网络的大公司运行基于比特币核心客户端的全节点客户端,这些客户端拥有区块链和网络节点的完整副本,但没有挖矿和钱包功能。这些节点是网络中的边缘路由器,通过它可以构建其他服务,例如交易所、钱包、区块浏览器、商户支付处理等。

如上所述,扩展比特币网络既包括运行比特币 P2P 协议的网络,也包括运行特殊协议的网络节点。有许多矿池服务器和协议网关连接到比特币 P2P 主网络,它们连接运行其他协议的节点。这些节点通常是矿池节点(见第 8 章)和轻量级钱包客户端,通常没有区块链的完整备份。

图 6-3 描绘了扩展的比特币网络,其中包括各种类型的节点、网关服务器、边缘路由器、钱包客户端以及将它们相互连接所需的各种协议。

图 6-3 具有多种节点类型、网关和协议的扩展比特币网络

6.4 网络发现

当一个新的网络节点启动时,为了能够参与协作操作,它必须发现网络中的其他比特币节点。新的网络节点必须发现网络中至少一个现有节点并建立连接。由于比特币网络的拓扑结构不是基于节点的地理位置,因此节点之间的地理信息是完全不相关的。当有新节点连接时,可以随机选择网络中现有的比特币节点进行连接。

节点通常使用TCP协议,使用8333端口(比特币通常使用这个端口号,除8333端口外还可以指定其他端口)与已知对等节点建立连接。建立连接时,节点通过发送包含基本认证内容的版本消息开始“握手”通信过程(见图6-4))。这个过程包括以下内容:

比特网

网络verack中的peer节点通过响应verack消息确认并建立连接;有时,如果接收节点需要交换连接并连接回始发节点,也会返回对等节点的版本消息。

新节点如何发现网络中的对等节点?虽然比特币网络中没有特殊的节点,但客户端维护了一个长期稳定运行的节点列表。这样的节点被称为“种子节点(seed nodes)”。新节点不一定需要与种子节点建立连接,但连接种子节点的好处是种子节点可以快速发现网络中的其他节点。在比特币核心客户端中,种子节点的使用由“-dnsseed”控制。

图 6-4 对等点之间的初始“握手”通信

p>

当一个或多个连接建立后,新节点会向其相邻节点发送一条包含其自身 IP 地址的 addr 消息。然后相邻节点依次将该addr消息转发给各自的相邻节点,以保证新的节点信息被多个节点接收,保证连接更稳定。此外,新连接的节点可以向其相邻节点发送 getaddr 消息,要求它们返回其已知对等节点的 IP 地址列表。通过这种方式,一个节点可以找到一个对等点来连接并将其消息发布到网络上以供其他节点查找。图 6-5 描述了这个地址发现协议。

图 6-5 地址广播和发现

节点必须连接到几个不同的对等方,才能以多种方式建立对比特币网络的访问。通信路径不可靠,因为节点可以随时加入和离开。因此,一个节点必须不断地做两件事:在失去现有连接时发现新节点,并在启动帮助时为它们提供其他节点。当一个节点启动时只需要一个连接,因为第一个节点可以将它引用给它的对等节点,而对等节点又提供引用。一个节点,如果连接到大量其他对等点,既不必要又浪费网络资源。启动完成后,节点会记住它最近成功连接的对等点;因此,它可以在重新启动时快速重新连接到以前的对等网络。如果上一个网络的对等节点没有响应连接请求,该节点可以使用种子节点重启。

如果已建立的连接没有数据通信,它所在的节点会定期发送信息来维持连接。如果节点在没有任何通信的情况下继续连接长达 90 分钟,将被视为与网络断开连接,网络将开始寻找新的对等点。因此,比特币网络会随时根据节点变化和网络问题进行动态调整,规模增减可以有机地调整,无需集中控制。

6.5 个全节点

全节点是指维护包含所有交易信息的完整区块链的节点。更准确地说,这样的节点应该被称为“全区块链节点”。在比特币的早期,所有节点都是全节点;当前的比特币核心客户端也是完整的区块链节点。但在过去的两年中,出现了许多不需要维护完整的区块链,而是作为轻量级客户端运行的新型客户端。我们将在接下来的章节中详细介绍这些轻量级客户端。

完整的区块链节点维护包含所有交易信息的比特币区块链的完整、最新副本。这样的节点可以独立地构建和验证区块链,从第一个区块(创世区块)已经建立到网络中的最新区块。完整的区块链节点可以独立验证任何交易信息,无需任何其他节点或其他信息源。完整的区块节点通过比特币网络获得一个带有交易信息的新区块更新,验证后合并到区块链的本地副本中。

比特网

运行一个完整的区块链节点可以给你一个纯粹的比特币体验:所有交易信息都可以独立验证,无需依赖或信任其他系统。很容易判断您是否正在运行一个完整节点:只需检查您的永久存储设备(例如硬盘驱动器)是否有超过 20GB 的空间,只需使用它来存储完整的区块链。如果您需要大量磁盘空间并且同步比特币网络需要 2 到 3 天,那么您使用的是完整节点。这是关于摆脱中心化管理,获得完全独立和自由的代价。

虽然还有其他完整的区块链客户端使用不同的编程语言和软件架构,但最常用的仍然是比特币核心客户端,也称为“中本聪客户端”。比特币网络中超过 90% 的节点运行各种版本的比特币核心客户端。如前所述,可以通过节点之间发送的版本消息或通过getpeerinfo命令颠覆字符串“Satoshi”来获得,例如/中本聪:0.8.6/.

6.6 交换“库存清单”

全节点连接对等节点后,首先要做的是构建完整的区块链。如果节点是一个全新的节点,那么它不包含任何区块链信息,它只知道一个块——一个静态嵌入在客户端软件中的创世块。新节点需要从区块 0(创世区块)开始下载数十万个区块的全部内容,以便与网络同步,并重建整个区块链。

同步区块链的过程从发送版本消息开始,因为消息中包含的 BestHeight 字段表示节点当前的区块链高度(块数)。一个节点可以从它的对等方那里获取版本信息,以了解每一方有多少个区块,以便它可以与它在自己的区块链上拥有的区块数进行比较。对等点交换包含其本地区块链顶部块哈希的 getblocks 消息。如果一个peer识别出它接收到的hash不属于top block,而是属于一个不是top block的旧块,那么它就可以推断出自己的本地区块链比其他peer节点有更长的区块链。

具有较长区块链的节点比其他节点拥有更多的块,并且可以识别哪些块被其他节点“补充”。它识别前 500 个可用于共享的块,并使用 inv(库存)消息传播这些块的哈希值。缺少这些块的节点可以通过自己发送的getdata消息请求完整的块信息,并利用inv消息中包含的hash值来确认是否是正确请求的块,从而读取这些缺失的块。块。

每当节点离线时,都会触发将本地区块链与对等节点进行比较并恢复丢失块的过程,无论它离线多长时间。如果一个节点仅离线几分钟,它可能只是丢失了几个块;当它离线长达一个月时,它可能会丢失数千个块。但无论哪种情况,它都会首先发送 getblocks 消息,接收 inv 响应,然后下载丢失的块列表和块广播协议,如图 6-6 所示。

图 6-6 节点通过从对等点读取块来同步区块链

6. 7 个简单支付验证 (SPV) 节点

并非所有节点都能够存储完整的区块链。许多比特币客户端设计为在空间和功率受限的设备上运行,例如智能手机、平板电脑、嵌入式系统等。对于此类设备,简化支付验证 (SPV) 允许它们在无需存储完整区块链的情况下工作。这种类型的客户端称为 SPV 客户端或轻量级客户端。随着比特币使用的火爆,SPV节点逐渐成为比特币节点最常见的形式,尤其是比特币钱包。

SPV 节点只需要下载区块头,而不需要下载每个区块中包含的交易信息。由此产生的没有交易信息的区块链只有完整区块链大小的 1/1000。 SPV 节点无法构建所有可供消费的 UTXO 的完整图景,因为它们没有关于网络上所有交易的完整信息。 SPV 节点使用稍微不同的方法来验证交易,依靠对等方“按需”提供区块链相关部分的部分视图。

例如,每个完整节点就像一个陌生城市的游客,拥有每条街道、每个地址的详细地图。相比之下,SPV 节点就像一个陌生城市的游客,只知道一条主干道的名称,通过随机询问城市中的陌生人获得分段的道路方向。虽然这两种类型的游客都可以通过实地考察来验证街道的存在,但没有地图的游客不知道每条小巷中有哪些街道或附近还有哪些街道。没有地图的游客在“教堂街23号”前,不知道城里是否还有其他几条“教堂街23号”,也不知道眼前的那条是不是他们要找的那条。对他来说最好的办法是向足够多的人问路,希望他们中的一些人不会想抢劫他。

比特网

Easy Payment Verification 通过参考交易在区块链中的深度而非高度来验证交易。一个拥有完整区块链的节点构建了一条由数千个区块和交易组成的验证链,这些区块和交易沿区块链按时间倒序追溯至创世区块。而SPV节点会验证所有区块链(但不是所有交易),并链接区块链和相关交易。

在绝大多数实际情况下,具有良好连接性的 SPV 节点足够安全,可以在资源需求、实用性和安全性之间保持适当的平衡。当然,如果你想要万无一失的安全性,最可靠的方法是在完整的区块链上运行一个节点。

一个完整的区块链节点通过检查整个链中它下面的数千个块来确保这个UTXO没有被支付,从而验证交易。另一方面,SPV 节点通过检查它们上方的块将其推到下方的深度来验证交易。

SPV 节点使用 getheaders 消息而不是 getblocks 消息来获取块头。响应的对等方将在单个标头消息中发送多达 2000 个块标头。这个过程与全节点获取所有块的过程没有区别。 SPV 节点还在其与对等点的连接上设置过滤器,以过滤对等点发送的未来块和交易数据流。通过 getdata 请求读取任何目标事务。对等节点生成包含交易信息的 tx 消息作为响应。区块头的同步过程如图6-7所示。

图6-7 SPV节点同步区块头

由于 SPV 节点需要读取特定交易来选择性地验证交易,这会产生另一个隐私风险。与收集每个区块内所有交易的全区块链节点不同,SPV 节点对特定数据的请求可能会无意中泄露钱包中的地址信息。例如比特网,监控网络的第三方可以在 SPV 节点上跟踪钱包请求的所有交易信息,并使用这些交易信息将比特币地址与钱包的用户相关联,从而损害用户的隐私。

在引入 SPV 节点/轻量级节点后不久,比特币开发人员添加了一项新功能:布隆过滤器以解决 SPV 节点的隐私风险。布隆过滤器允许 SPV 节点通过概率而非固定模式过滤机制仅接收交易信息的子集,而不会准确揭示它们感兴趣的地址。

6.8 布隆过滤器

布隆过滤器是一种基于概率的过滤方法,它允许用户描述特定的关键字组合,而不必精确。它允许用户在保护隐私的同时有效地搜索关键字。在SPV节点中,该方法用于向对等节点发送交易信息查询请求,而交易地址不暴露。

使用我们之前的示例,没有地图的游客需要询问前往特定地点的路线。如果他问陌生人“教堂街 23 号在哪里”,他会不经意间透露他的目的地。布隆过滤器问,附近有没有“唐”字的街道?这个问题包含的关键字比以前略少。游客可以选择包含多少信息,例如“以'tang street'结尾的街道”或“以'teaching'开头的街道”。如果他问的越少,得到的可能地址就越多,隐私也得到保护,但是这些地址中有很多不相关的结果;如果他问得很具体,他会在得到更准确的结果的同时暴露他的隐私。

布隆过滤器允许 SPV 节点为交易指定搜索模式,可以根据准确性或隐私考虑进行调整。一个非常具体的布隆过滤器会产生更准确的结果,但也会显示用户钱包中使用的地址;相反,如果过滤器只包含简单的关键字,则会搜索出更多的对应交易,包括一些不相关的交易,同时具有更高的隐私性。

比特网

6.9 布隆过滤器和库存更新

布隆过滤器用于过滤 SPV 节点从对等节点接收到的交易。 SPV 将创建一个与节点钱包中的地址匹配的过滤器。然后,SPV 节点将向包含要在连接中使用的过滤器的对等节点发送 filterload 消息。过滤器建立后,对等节点会将输出值代入过滤器进行验证。那些匹配的交易被发送回 SPV 节点。

对等节点响应来自 SPV 节点的 getdata 消息,将发出一个块,该块仅包含与过滤器匹配的块,以及匹配交易的默克尔树。对等方还为匹配的交易发送 tx 消息。

这个节点可以发送filteradd消息给它的Bloom过滤器添加关键字,也可以发送filterclear消息来清除整个过滤器。因为关键字不能直接从过滤器中删除,如果某个关键字不再需要,节点必须通过清除和添加替换原来的

6.10个交易池

比特币网络中几乎每个节点都维护着一个未确认交易的临时列表,称为内存池或交易池。节点使用此池来跟踪网络已知但尚未包含在区块链中的交易。例如,持有用户钱包的节点使用此交易池来跟踪网络已接收但尚未包含在区块链中的交易。属于用户钱包的未经确认的预付款。

当交易被接收和验证时,它们被添加到交易池中并通知相邻节点,从而传播到网络中。

一些节点实现还维护一个单独的孤立事务池。如果一笔交易的输入与未知交易相关,比如缺少父交易,则该孤立交易将暂时存储在孤立交易池中的信息直到父交易到达。

当一个事务被添加到事务池中时,孤儿事务池也会被检查,看一个孤儿事务是否引用了这个事务的输出(子事务)。任何匹配的孤儿交易都会被验证。如果验证有效,则将它们从孤儿交易池中移除并添加到交易池中,从而使以其父交易开始的链完整。

事务池和孤立事务池(如果实施)存储在本地内存中,而不是永久存储设备(如硬盘驱动器)中。更准确地说,它们是通过网络动态填充传入消息的。当一个节点启动时,两个池都是空闲的;随着网络中接收到新交易,两个池逐渐被填满。

一些比特币客户端实现还维护一个 UTXO 数据库,也称为 UTXO 池,它是区块链中所有未支付交易输出的集合。 “UTXO 池”这个名称听起来类似于交易池,但它代表的是不同的数据集。与交易池和孤儿交易池不同,UTXO 池在初始化时不是空的,而是包含数百万个未支付的交易输出条目,其中一些可以追溯到 2009 年。UTXO 池可以放置在本地内存中,也可以放置在持久存储中作为包含索引的数据库表。

事务池和孤立事务池代表单个节点的本地视角。这两个池的内容可能因节点而异,具体取决于节点何时启动或重新启动。相反,UTXO 池代表了网络的显着共识,因此不同节点之间的 UTXO 池的内容差别不大。另外,交易池和孤儿交易池只包含未确认的交易,而UTXO池只包含确认的交易。

6.11 条警告消息

警告消息不经常使用,但在大多数节点上都可用。警告消息是比特币的“紧急广播系统”,比特币核心开发人员可以使用该功能向所有比特币节点发送紧急短信。此功能旨在让核心开发团队将比特币网络的严重问题通知所有比特币用户,例如需要用户操作的严重错误。到目前为止,警告系统只被使用过几次,最严重的一次是在 2013 年,当时一个严重的数据库缺陷导致了比特币区块链中的多块分叉。

警告消息通过警报消息传播。