主页 > 最新imtoken官网下载地址 > 深入了解区块链 No. 5:比特币网络

深入了解区块链 No. 5:比特币网络

最新imtoken官网下载地址 2023-03-13 05:08:54

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 所示:

0?wx_fmt=png

图 6-1 一个具备四个完整功能的比特币网络节点:钱包、矿工、全区块链、网络路由节点

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

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

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

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

比特币李笑比特币身价_一万是多少比特币_莱特币和比特币是通用货币吗

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

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

0?wx_fmt=png

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

6.3 扩展比特币网络

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

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

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

0?wx_fmt=png

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

6.4 网络发现

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

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

一万是多少比特币_莱特币和比特币是通用货币吗_比特币李笑比特币身价

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

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

0?wx_fmt=png

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

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

0?wx_fmt=png

图 6-5 地址广播和发现

节点必须连接到几个不同的对等点,以在比特币网络中建立到比特币网络的各种路径。由于节点可以随时加入和离开,因此通信路径不可靠。因此,一个节点必须不断地做两件事:当现有连接丢失时发现新节点,并在其他节点出现时帮助它们。当一个节点启动时只需要一个连接,因为第一个节点可以将它引荐给它的对等节点,这反过来又提供了进一步的推荐。一个节点如果连接到大量其他对等点,既是不必要的,也是对网络资源的浪费。启动后,节点会记住其最近成功连接的对等点;因此,它可以在重新启动时快速重新连接到以前的对等网络。如果前一个网络的对等节点没有响应连接请求,

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

6.5 个全节点

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

完整的区块链节点维护包含所有交易信息的比特币区块链的完整且最新的副本。这样的节点可以独立地构建和验证区块链,从第一个区块(创世区块)开始构建到网络中的最新区块。一个完整的区块链节点可以独立验证任何交易信息,而无需借助任何其他节点或其他信息来源。全区块节点通过比特币网络获取包含交易信息的新区块更新,并在验证后将该更新合并到区块链的本地副本中。

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

比特币李笑比特币身价_一万是多少比特币_莱特币和比特币是通用货币吗

尽管存在其他几个使用不同编程语言和软件架构的完整区块链客户端,但最常用的是比特币核心客户端,也称为“Satoshi 客户端”。比特币网络中超过 90% 的节点运行各种版本的比特币核心客户端。如前所述,可以通过节点间发送的版本消息来识别,也可以通过getpeerinfo命令得到的颠覆字符串“Satoshi”来识别,如/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 所示。

0?wx_fmt=png

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

6.7 简单支付验证 (SPV) 节点

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

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

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

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

比特币李笑比特币身价_莱特币和比特币是通用货币吗_一万是多少比特币

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

0?wx_fmt=png

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

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

0?wx_fmt=png

图 6-7 SPV 节点同步块头

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

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

6.8 个布隆过滤器

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

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

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

6.9 布隆过滤器和库存更新

比特币李笑比特币身价_莱特币和比特币是通用货币吗_一万是多少比特币

布隆过滤器用于过滤 SPV 节点从对等方接收到的交易。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 年,当时一个关键的数据库缺陷导致了比特币区块链中的多块分叉。

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

原文发表时间:2017年8月8日