主页 > imtoken苹果版下载官网 > 精通比特币的BTC网络
精通比特币的BTC网络
比特币网络
比特币采用基于互联网的P2P(点对点)网络架构。 P2P是指同一个网络中的每一台计算机都是平等的,各个节点共同提供网络服务,没有“特殊”的节点。 每个网络节点以“扁平”拓扑相互通信。
P2P 网络中没有服务器、中心化服务和等级结构。 P2P网络的节点之间相互交互、相互协作:每个节点在对外提供服务的同时,也使用网络中其他节点提供的服务。 因此,P2P 网络是可靠的、去中心化的和开放的。
早期的互联网是 P2P 网络架构的典型用例:IP 网络中的每个节点都是完全平等的。 今天的互联网架构已经是分层架构,但IP协议仍然保留着扁平的拓扑结构。 在比特币之外,P2P 技术最大和最成功的应用是在文件共享领域:Napster 是该领域的先驱,而 BitTorrent 是其架构的最新演变。
节点类型和角色
虽然比特币 P2P 网络中的每个节点都是平等的,但每个节点可能根据所提供的功能而扮演不同的角色。 每个比特币节点都是路由、区块链数据库、挖矿和钱包服务的集合。一个全节点包括如图8-1所示的四个功能:钱包、矿工、完整的区块链数据库和网络路由
每个节点都参与整个网络的路由功能,还可能包括其他功能。 每个节点都参与验证和传播交易和区块信息,发现和维护与对等节点的连接。
比特币传播网络
虽然比特币 P2P 网络可以满足各种节点类型的一般需求,但对于比特币挖矿节点的特殊需求而言,它表现出过高的网络延迟。
比特币传播网络是一个试图最小化矿工之间传输区块延迟的网络。 最初的比特币传播网络由核心开发人员 Matt Corallo 于 2015 年创建,旨在以极低的延迟在矿工之间实现区块的快速同步。 该网络由托管在全球亚马逊网络服务基础设施上的几个专用节点组成,并连接大多数矿工和矿池。
最初的比特币传播网络在 2016 年被同样由核心开发人员 Matt Corallo 创建的快速互联网比特币中继引擎或 FIBER 取代。 FIBER 是一种基于 UDP 的中继网络,可以在节点网络中中继块。 FIBER 实现了一个紧凑的块,以进一步减少传输的数据量和网络延迟。
康奈尔大学研究的另一个中继网络(尚处于提案阶段)是Falcon。 Falcon 使用“直通路由”而不是“存储转发”来通过传播块的部分而不是等待接收到完整的块来减少延迟。
Spread Network 不能替代比特币的 P2P 网络。 相反,它们是覆盖网络,在有特殊需求的节点之间提供额外的连接,例如高速公路不是乡村道路的替代品,而是交通繁忙的两点之间的捷径,您仍然需要小路连接到高速公路。
网络发现
当一个新的网络节点启动时,为了能够参与协同操作,它必须发现网络中的其他比特币节点。 一个新的网络节点必须发现网络中至少一个现有节点并建立连接。 由于比特币网络的拓扑结构不是基于节点的地理位置,因此节点之间的地理信息是完全不相关的。 当新节点连接时,它可以随机选择网络中存在的比特币节点连接到它。
节点通常使用TCP协议,使用8333端口(比特币通常使用此端口号,除8333端口外还可以指定其他端口)与已知对等节点建立连接。 建立连接时,节点通过发送包含基本认证内容的版本消息开始“握手”
保持联系
节点必须不断地做两项工作:当它们失去现有连接时发现新节点,并在其他节点出现时帮助它们。 一个节点启动只需要一个连接,因为第一个节点可以将它引用给它的对等节点,而这些节点又提供进一步的引用。 如果一个节点连接到大量其他对等节点,这既没有必要也不浪费网络资源。
启动完成后,节点会记住它最近成功连接的对等点; 因此,在重新启动时,它可以快速重新建立与先前对等网络的连接。 如果前一个网络的对等节点没有响应连接请求,该节点可以使用种子节点重新启动。
用户可以覆盖自动节点管理功能并通过提供 -connect= 选项指定一个或多个 IP 地址来指定 IP 地址列表。 如果采用此选项,节点只会连接到这些选定的节点 IP 地址,而不是自动发现和维护对等节点之间的连接。
如果已建立的连接没有数据通信,则其所在的节点将周期性地发送信息以维持连接。 如果一个节点在没有任何通信的情况下持续连接 90 分钟,则认为它已与网络断开连接,并且网络开始寻找新的对等点。 因此,比特币网络会根据不断变化的节点和网络问题随时进行动态调整,无需中心化控制即可实现规模上的有机调整。
全节点
全节点是指维护包含所有交易信息的完整区块链的节点。 更准确地说,这样的节点应该称为全区块链节点”。
完整的区块链节点维护着包含所有交易信息的比特币区块链的完整且最新的副本。 这样的节点可以独立地建立和验证区块链,从网络中的第一个区块(创世区块)到构建到最新的区块。 完整的区块链节点可以独立验证任何交易信息,而无需诉诸任何其他节点或其他信息来源。 全区块节点通过比特币网络获取包含交易信息的新区块更新,并在验证后将此更新合并到区块链的本地副本中。
运行完整的区块链节点可为您提供纯粹的比特币体验:所有交易信息均经过独立验证,无需诉诸或信任其他系统。 很容易判断您是否正在运行一个完整的节点:只需检查您的持久性存储设备(例如硬盘)是否有超过 20GB 被用于存储完整的区块链。 如果您需要大量磁盘空间并且同步比特币网络需要 2-3 天,那么您正在使用全节点。 这是摆脱中心化管理,获得完全独立自由所付出的代价。
交换“库存清单”并同步本地分类账
全节点连接到对等节点后,首先要做的是构建完整的区块链。 如果节点是一个全新的节点,那么它不包含任何区块链信息,它只知道静态嵌入在客户端软件中的创世块。 新节点需要下载从区块 0(创世区块)开始的数十万个区块的所有内容,以便与网络同步并重建整个区块链。
同步区块链的过程从发送版本消息开始,因为消息中包含的 BestHeight 字段表示节点当前的区块链高度(块数)。 一个节点可以从它的对等方那里得到版本信息,知道每一方有多少块,这样它就可以与自己的区块链拥有的块数进行比较。 对等点交换包含其本地区块链的顶部块哈希(指纹)的 getblocks 消息。 如果一个 peer 识别出它收到的 hash 不属于顶块,而是属于一个不属于顶块的旧块,那么它可以推断出它自己的本地区块链比其他 peer 有更长的区块链。
具有较长区块链的对等节点比其他节点拥有更多的块,并且可以识别其他节点需要“补充”哪些块。 它识别可用于共享的前 500 个块,并使用 inv(清单)消息传播这些块的哈希值。 缺少这些块的节点可以通过自己发送的getdata消息请求完整的块信息,并使用inv消息中包含的哈希值来确认是否是正确请求的块,从而读取这些丢失的块。 块。
该节点跟踪其每个对等连接上的“传输中”(已请求但尚未收到)块的数量,并检查该数量是否不超过上限(MAX_BLOCKS_IN_TRANSIT_PER_PEER)。 这样,如果一个节点需要更新大量区块,它不会发送新区块请求,直到前一个请求完成,允许对等节点控制更新速率,以免使网络不堪重负。
简化支付验证 (SPV) 节点
并非所有节点都能够存储完整的区块链。 许多比特币客户端被设计为在空间和功率受限的设备上运行,对于此类设备,简化支付验证 (SPV) 方法允许它们在无需存储完整区块链的情况下工作。 这种类型的客户端称为 SPV 客户端或轻量级客户端。
SPV 节点只需要下载区块头,而不需要下载每个区块包含的交易信息。 没有交易信息的最终区块链只有完整区块链大小的 1/1000。 SPV 节点无法构建所有可供消费的 UTXO 的完整图片,因为它们不知道网络上所有交易的完整信息。 SPV 节点使用略有不同的方法来验证交易,依靠对等节点“按需”提供区块链相关部分的部分视图。
Easy Payment Verification 通过参考交易在区块链中的深度而不是高度来验证交易。 具有完整区块链的节点构建了一条验证链,该验证链由数千个区块和交易组成,沿着区块链一直按时间倒序一直回到创世区块。 SPV 节点将验证所有区块(但不是所有交易)的链,并将区块链与相关交易链接起来。
例如,如果一个全节点想要在第 300,000 个区块中检查一笔交易,它将从该区块开始的所有 300,000 个区块都链接回创世块,并构建一个完整的 UTXO 数据库,通过确认交易是否有效来验证交易的有效性。 UTXO 尚未支付。 SPV 节点无法验证 UTXO 是否尚未支付。 相反,SPV 节点将使用 merkle 路径(参见“Merkle 树”部分)在交易信息和它所在的块之间建立链接。 然后SPV节点等待序号为300001到300006的6个区块堆叠在交易所在区块的顶部,通过建立交易深度为300006到300001区块来验证交易的有效性。 事实上,根据代理网关协议,如果网络中的每个其他节点都接受区块 300,000 并投入足够的工作在该区块之上再生成六个区块,则可以证明该交易不是双花。
如果一笔交易实际上并不存在,SPV 节点不会误认为该交易存在于一个区块中。 SPV 节点将通过请求 merkle 路径证明和验证区块链中的工作量证明来验证交易的存在。 然而btc网络,交易的存在可能对 SPV 节点“隐藏”。 SPV节点无疑可以验证某笔交易的存在,但无法验证某笔交易的不存在(比如同一笔UTXO的双重支付),因为SPV节点没有所有交易的记录。
此漏洞可被拒绝服务攻击或针对 SPV 节点的双花攻击所利用。 为了抵御这些攻击,SPV 节点需要随机连接到多个节点,以增加连接到至少一个可靠节点的概率。 这种对随机连接的需求意味着 SPV 节点也容易受到网络分区攻击或女巫攻击。 在后一种情况下,SPV 节点连接到假节点或假网络,与真实节点或真实比特币网络没有连接。
在大多数实际情况下,连接良好的 SPV 节点足够安全,在资源需求、实用性和安全性之间保持适当的平衡。 当然,如果要确保万无一失的安全性,最靠谱的方法就是运行一个完整的区块链节点。
总结
完整的区块链节点通过检查其下方数千个区块的整个链条来验证交易,以确保未支付此 UTXO。 另一方面,SPV 节点通过检查其上方的区块将其推到下方的深度来验证交易。
隐私风险
由于 SPV 节点需要读取特定交易以选择性地验证交易,这会产生隐私风险。 与收集每个区块中的所有交易的完整区块链节点不同,SPV 节点对特定数据的请求可能会无意中泄露钱包中的地址信息。 例如,监控网络的第三方可以跟踪 SPV 节点上钱包请求的所有交易信息,并使用这些交易信息将比特币地址与钱包用户相关联,从而损害用户的隐私。
在引入 SPV 节点/轻量级节点后不久,比特币开发者添加了一个新特性:布隆过滤器,以解决 SPV 节点的隐私风险。 布隆过滤器允许 SPV 节点通过使用概率而不是固定模式的过滤机制仅接收交易信息的一个子集,而不会确切地透露它们感兴趣的地址。
布隆过滤器
Bloom filter 是一种基于概率的过滤方法,它允许用户描述特定的关键字组合,而不必精确地表达它们。 它允许用户有效地搜索关键字,同时保护他们的隐私。 在SPV节点中,该方法用于向对端节点发送交易信息查询请求,交易地址不会暴露。
布隆过滤器允许 SPV 节点指定交易的搜索模式,可以根据准确性或隐私考虑进行调整。 一个非常具体的布隆过滤器会产生更准确的结果,但也会显示用户钱包中使用过的地址; 反之,如果过滤器只包含简单的关键字,则会搜索到更多对应的交易,在包含几笔无关交易的同时具有更高的隐私性。
布隆过滤器的工作原理
布隆过滤器的实现由一个可变长度(N)的二进制数组(N位二进制数组成一个位域)和一个可变数量(M)的一组哈希函数组成。 这些哈希函数的输出值总是在1到N之间,对应二进制数组。 并且这个函数是一个确定性函数,这意味着任何使用同一个布隆过滤器的节点都可以通过这个函数对特定的输入得到相同的结果。 Bloom 过滤器的准确性和隐私性能通过改变哈希函数的长度 (N) 和数量 (M) 来调整。
SPV 节点和隐私
实施 SPV 的节点比全节点具有更弱的隐私性。 全节点接收所有交易,因此不会透露有关地址是否在其钱包中使用的信息。 SPV 节点会收到一份与其钱包地址相关的过滤列表。 结果,它减少了所有者的隐私。
布隆过滤器是减少隐私损失的一种方法。 没有它们btc网络,SPV 节点将不得不明确列出它感兴趣的地址,从而造成严重的隐私侵犯。但是,即使使用过滤器,对手也可以监视 SPV 客户端或 P2P 网络中直接连接到它的节点的流量可以随时随地收集到足够的信息,知道SPV客户端钱包中的地址
加密和经过身份验证的连接
大多数比特币新用户都认为比特币节点的网络通信是加密的。 事实上,比特币最初的实现显然是完整的。 虽然这不是全节点的主要隐私问题,但 SPV 节点是一个大问题。
作为增加比特币 P2P 网络隐私和安全的一种方式,有两种通过 BIP-150/151 提供通信加密的解决方案:
Tor传输
Tor,代表洋葱路由网络,是一个软件项目和网络,它通过提供匿名性、不可追踪性和隐私的随机网络路径提供数据加密和封装。
Bitcoin Core 提供多种配置选项,允许您运行通过 Tor 网络传输流量的比特币节点。 此外,Bitcoin Core还可以提供Tor隐藏服务,让其他Tor节点通过Tor直接连接到你的节点。
从比特币核心版本 0.12 开始,如果节点能够连接到本地 Tor 服务,它们将自动提供隐藏的 Tor 服务。 如果您安装了 Tor 并且比特币核心进程以具有足够权限访问 Tor 身份验证 cookie 的用户身份运行,这应该会自动运行。
使用调试标志开启Bitcoin Core对Tor服务的调试,如下:
$ bitcoind --daemon --debug=tor
您应该在日志中看到“tor: ADD_ONION success”,表明 Bitcoin Core 已将隐藏服务添加到 Tor 网络。
P2P 对等认证和加密
两个比特币改进程序 BIP-150 和 BIP-151 在比特币 P2P 网络中增加了对 P2P 身份验证和加密的支持。 这两个 BIP 定义了可由兼容的比特币节点提供的可选服务。
BIP-151 支持对支持 BIP-151 的两个节点之间的所有通信进行协商加密。
BIP-150 提供可选的点对点身份验证,允许节点使用 ECDSA 和私钥验证彼此的身份。
BIP-150要求在认证之前,两个节点按照BIP-151建立加密通信。
截至 2017 年 1 月,BIP-150 和 BIP-151 尚未在比特币核心中实施。 然而,这两项提议都已由至少一个名为 bcoin 的替代比特币客户端实施。 BIP-150 和 BIP-151 允许用户运行连接到可信全节点的 SPV 客户端,使用加密和身份验证来保护 SPV 客户端的隐私。
此外,身份验证可用于创建受信任的比特币节点网络并防止中间人攻击。 最后,P2P 加密(如果广泛部署)将加强比特币对流量分析和隐私侵犯监视的抵抗力,尤其是在互联网使用受到严格控制和监控的极权主义国家。
交易池交易池和孤儿交易池
几乎比特币网络中的每个节点都维护着一个未确认交易的临时列表,称为内存池或交易池。 节点使用这个池来跟踪网络已知但尚未包含在区块链中的交易。 例如,保管用户钱包的节点会使用这个交易池来记录网络已经收到但尚未确认的属于用户钱包的预付款信息。
当交易被接收和验证时,它们被添加到交易池中并通知相邻节点,从而传播到网络中。
一些节点实现还维护一个单独的孤立交易池。 如果一笔交易的输入与未知交易有关,比如父交易缺失,则孤儿交易会暂时存放在孤儿交易池中,直到父交易的信息到达。
当一个交易被添加到交易池中时,会同时检查孤儿交易池,看是否有孤儿交易引用了这个交易的输出(子交易)。 验证任何匹配的孤立交易。 如果有效,它们将从孤立交易池中移除并添加到交易池中,从而完成以其父交易开始的链。
对于新加入交易池的交易,它不再是孤儿交易。 递归地重复上述过程寻找更多的后代,直到找到所有后代。 通过这个过程,父交易的到来将整个链中的孤立交易与它们的父交易重新结合起来,触发了整个独立交易链的级联重构。
交易池和孤立交易池(如果已实现)都存储在本地内存中,而不是存储在硬盘等持久性存储设备上。 更准确地说,它们是动态填充来自网络的传入消息。当节点启动时,两个池都是空闲的; 随着网络中不断收到新的交易,两个池逐渐被填满
UTXO池
一些比特币客户端实现还维护一个 UTXO 数据库,也称为 UTXO 池,它是区块链中所有未支付交易输出的集合。
“UTXO 池”听起来类似于交易池,但它代表不同的数据集。 UTXO 池不同于交易池和孤儿交易池,它在初始化时并不是空的,而是包含数百万个未花费的交易输出条目,其中一些甚至可以追溯到 2009 年。UTXO 池可能被放置在在本地内存中,或作为持久存储中的索引数据库表。
区别
交易池和孤立交易池代表单个节点的局部视角。 根据节点启动或重新启动的时间,不同节点上的两个池的内容可能会有很大差异。 相反,UTXO 池代表了网络的显着共识,因此不同节点之间 UTXO 池的内容相差不大。 此外,交易池和孤儿交易池只包含未确认的交易,而 UTXO 池只包含已确认的交易。