比特币拍了拍你,牛市前先要掌握好这几个知识点
写在前面:
比特币距其第三次“产量减半”完成已过去了两个月的时间,而这段适应期,为defi、filecoin等热点的爆发提供了机会,但加密货币市场真正的主角,从来都是比特币,随着传统金融市场的投机潮进入尾声,比特币有望重回大众的视线,那关于比特币,有哪些知识是需要我们去掌握的呢?这是一份对初学者友好的比特币“图谱”,它可以帮助你理解各种各样的节点、软件以及比特币网络的参与者。在这篇文章中,作者Gloria Zhao将介绍比特币的四大节点类型,并描述它们之间形成的P2P连接,旨在帮助大家更好地理解比特币的概念。
比特币网络通常被描述为点对点(P2P)、分布式或去中心化的,也经常会有人把它错误地绘制成下面这个样子:
实际上,它可能更像是下面这个样子: 那什么是节点,它是做什么的?节点是一个服务器还是一个客户端… 或者两者兼而有之?鉴于比特币软件有很多种,什么才算是一个节点?比特币的所有参与者(用户、矿工、节点、钱包),它们是如何相互作用的?本文绘制了一张比特币网络图,阐明了这些定义并进行了简化。我们将根据服务器/客户端功能对不同类型的节点进行分类,并描述它们之间形成的P2P连接。本文没有提供整个网络的统计数据,而是主要关注于列举网络中的各种可能性。
简短的答案
首先,那些标有比特币标志(฿)的圆点是P2P网络中的节点,而边则是这些节点之间的P2P连接。实际上,比特币网络当中有很多不同类型的节点,这可以根据它们为其他对等方和客户端提供服务的能力进行分类,节点可以在任何给定的时间点充当服务器、客户端或两者兼而有之。
节点 = P2P网络上实施比特币P2P协议的参与者,只要节点遵循比特币的协议,它无需运行任何特定的软件。
P2P连接=使用比特币P2P协议通信的两个节点之间直接建立的网络连接。我们经常使用“peer”来指代与某个节点有P2P连接的其他节点,也翻译成对等节点。
节点的类型
从广义上讲,节点根据其维护的状态及可提供的服务分为四类。
1、全节点(又称全验证节点)= 能够验证交易和区块的节点。全节点不会每次都在区块数据库中进行搜索,而是保留某种状态,即设置一个UTXO(未使用的交易输出或“币”)。
因此,只要比特币节点维护一些区块元数据和最新的UTXO集,它们就不必为验证而需要完整的区块链副本。修剪节点实现了这种精确的行为:它们下载并处理区块以构建必要的数据库进行验证,然后丢弃旧区块以节省磁盘空间。因为它们拥有所有的信息并且可以验证所有新的区块和交易,因此它们也是全节点。
2、存档节点 = 具有区块链整个历史副本的节点。这些节点能够验证传入的交易和区块,以及从历史上的任何点查询区块和交易数据,包括那些不再与验证相关的数据(因此命名为“存档”)。存档节点的存在是至关重要的,因为新节点需要跟上整个历史记录,才能成为全节点。它们只能通过从存档节点一次一个区块地下载历史记录来实现这一点。
3、挖矿节点 = 生成新区块的节点。这包括维持一个未确认交易的存储池(Mempool),验证新交易,以及解决工作量证明哈希难题(即查找nonce)来构造区块。挖矿节点通常使用额外的硬件(例如Asic矿机)来协助它们解决哈希难题,或者说参与到矿池当中。从技术上讲,还有一些非全节点会加入矿池,连接到管理该矿池的全节点,并帮助解决PoW难题,而无需进行任何验证(因此有些挖矿节点实际并不是全节点)。
4、轻客户端 = 这种节点不保留完整验证所需的完整状态,而是信任其他全节点来执行此操作。 轻客户端可能会保留有限数量的数据,以验证其自身的交易,但不能完全验证所有区块。在Bitcoin Core中,“轻客户端”通常与简化支付验证(SPV)节点同义,但不要把它和修剪节点混淆。在某些情况下,轻客户端并不能称作节点,因为它们不执行全节点通常执行的大多数操作。
节点的其他概念
节点可能还具有影响其参与网络的其他特征,但彼此之间或以上四个类别中的任何一个都不互斥。由于去中心化的性质,以及对比特币生态系统中可访问性的关注,因此,只要节点实施P2P协议并遵守共识规则,节点运营者就可以自行决定实施细节和采用特征。
初始区块下载(IBD):这是一种临时状态,在该状态下,节点尚未达到当前区块的高度,并需要下载旧区块。而全节点在没有下载相关区块时无法告知你相关的交易。而getblockchaininfo
RPC会返回节点是否在IBD中。
仅区块(Blocks Only)模式:一种非临时模式,在此模式下,全节点仅验证区块及其中的交易,它不验证任何未确认的交易(除了它自己的交易之外),不保留mempool,并要求其对等节点不要向其中继交易。
Bitcoin Core:这一开源软件最初是由中本聪编写,目前由众多贡献者在负责维护,你可以从bitcoincore.org上找到相关的软件。我们要知道的是,Bitcoin Core并不是比特币P2P网络中唯一存在的软件,一些节点运行实现特定行为的自定义补丁,而某些节点可能会使用旧版本(没有纳入新规则)的Bitcoin Core。重要的是要认识到哪些新功能需要全面的网络合作,不要指望节点正确或诚实地运行,并且要考虑到节点运营者在升级软件时会犹豫不决,或者采用新软件的进程会很缓慢。
恶意行为:故意伤害网络的任何类型行为(不包括漏洞、网络复杂性或其他无意的行为)。比特币假设了一个高度敌对的环境,包括可能遭到拒绝服务攻击,旨在进行双花的女巫攻击/日蚀攻击,试图对地址去匿名化的间谍节点攻击等。
节点作为服务器
我们已经看到,每个单独的节点都依赖于它的对等节点来发送它需要的信息。此外,节点通常通过非P2P接口(如RPC、HTTP/REST和GUI)为许多用户和客户端软件提供服务。
可将节点用作服务器的非节点客户端的一些示例:
- 运行节点的用户发送和接收比特币;
- 管理密钥、创建交易,并可能保留与这些密钥相关联的一些UTXO状态的钱包,但没有区块链的副本,而是依靠节点来获取最新信息;
- 面向用户的软件服务和应用程序,例如区块浏览器、交易所以及商家,它们查询全节点以获取信息并将其显示在网页或应用程序上;
- 开发人员在regtest模式下创建节点来测试功能或接口本身;
- 面向开发人员的软件,如SDK、API和其他接口。例如,Bitcoin Core CLI (bitcoin-cli)使用RPC接口来实现命令行接口;
现在,我们将节点理解为服务器和客户端,下面是单个节点的视图:
节点的简化视图
P2P连接类型
比特币中的P2P连接都说“相同的语言”,因为它们都使用P2P协议进行通信,但其对话内容却多种多样。Bitcoin Core的实现试图通过促进对等节点发现和仔细管理连接来平衡稳定性(倾向于静态连接)和可访问性(鼓励接受来自新节点的连接)。Bitcoin Core基于连接的发起方式,来区分三种主要类型的连接。
1、出站(Outbound)= 节点通过对等发现发起的自动连接。节点发现首先要获取已建立节点的IP地址列表,然后是一个连续的动态过程,即公布自己的地址并尝试连接到你知道的地址。根据你的节点需要什么(例如在IBD中),它可以优先考虑能够提供特定服务的连接(例如服务于过去的区块和交易)。
2、入站(Inbound) = 对等方发起的自动连接(到你的对等节点)。为了安全起见,入站流量在默认情况下是禁用的,你需要配置一些网络和防火墙设置才能启用它。
3、手动(Manual)= (例如通过CLI或RPC)手动而自动建立的连接。你可能会创建一个手动连接,比如你需要连接到一个你信任之人操作的节点,或者你正在测试软件,并且需要控制这些连接。
P2P连接的其他概念
1、出站连接的多样性
出站连接可根据接收到的信息和连接的持续时间,细分为更多的类别。全中继(Full-Relay)出站连接希望传达所有信息,包括区块、交易以及地址(用于查找对等方,类似于IP地址,并且不会与交易中使用的钱包地址混淆)。仅区块中继(Block-Only-Relay)出站连接仅期望接收区块,不要将其和仅区块(blocks-only)模式混淆。对于全节点,建立与1-2个对等节点的仅区块中继连接,以及对其他所有人建立全中继连接是完全正常的。
One-Shot 和 Feelers是用于节点发现的临时出站连接。One-Shot连接用于请求可用于查找新对等方的地址列表。Feelers连接用于验证地址是否与实际节点相对应。
2、个体差异
如我们所见,每个节点可能提供不同的服务,并从其对等节点查找特定的信息。每个连接都是从version握手开始,其中节点发送有关其自身的信息(例如最佳区块高度)并协商要谈论的内容(例如仅对区块感兴趣)。连接也可能会通过后续消息(例如费用过滤器消息)发生变化,以表明它们仅对以最低费用率中继的交易感兴趣。3、劝阻,断开和禁止
Bitcoin Core节点会跟踪对等方的行为,以表明它们可能是恶意的或运行了故障软件。作为对此类行为的响应,节点可能会选择阻止(标记其错误行为,可能会断开连接以支持新的对等方节点)、断开连接或禁止对等方节点。4、权限和白名单
节点还可以保持一份每个对等方拥有的权限列表,例如允许它请求的特定服务,或对通常会受到处罚的不当行为的容忍度。通常会为自定义的个人轻客户端,和由彼此信任的人操作的节点手动添加允许的不当行为。相关的节点也可以将特定的IP地址列入白名单。5、不对称的重要性
请注意,每个单独的连接是双向的,但它们是不对称的:发起对等方可能会将连接理解为[全中继]出站、仅区块中继、feeler或one-shot连接,但接收对等方只看到具有某些既定规则的入站连接。这通过含糊不清的方式,隐藏了有关节点行为是揭示其内部机制还是仅反映了连接性质的信息。例如,如果一个节点知道它的对等方处于blocksonly模式(即拒绝所有传入的交易消息),那么很明显,从该对等方发送的所有交易都对应于其自己的钱包地址。相反,接收节点只看到关闭了交易中继的入站连接。
这可能意味着blocksonly模式,仅区块中继连接或连接的特性。单个节点更详细的视图如下所示(请注意,箭头的方向仅指示发起哪个节点,而不是说通信是非双向的):
稍完整一些的节点视图
“完整”图谱
每个节点对整个网络所了解的信息是有限的,节点实际上只看到了自己的对等节点,而对等节点可能会谎称自己是什么类型的节点。在日蚀攻击事件中,所有对等节点甚至可能都来自于同一个人。这对于隐私和安全性来说是一个优势,因为它同样适用于对手方。信息有限会使定向攻击更加困难,通过创建大量临时连接,可以收集有关网络中有多少个节点的大概信息,但这些信息远非全面。
例如,网络上不会立即显示节点是否参与了矿池。通过大致了解哪些节点是矿池的一部分,并观察它们“挖掘”了多少区块,一些网站就能够生成计算能力比例的分析。但是,它们可能会产生误导,因为节点组甚至多个矿池完全可能是由一个实体操作。
综上所述,我们可以想象出这张简化的网络图谱:
简化的比特币网络图谱
该图表示了各种可能性,而没有展示网络规模(非常大)或拓扑结构(动态且未知的)。 请注意,可能性包括:- 具有通过非P2P接口连接的各种客户端的Bitcoin Core全节点。例如从bitcoincore.org下载该软件,并使用命令行或GUI来发送和接收币的用户。
- 轻量级客户端尽其所能连接到各种全节点,以便为自己的客户提供服务。
- 一个服务于一个或多个轻客户端的全节点,也许是一个比特币狂热者,他使用一些云服务提供商在其个人设备上运行一个全节点,并使用一个更轻量级的应用程序。
- 通过P2P网络和某些专用网络连接到一组自定义轻客户端(例如,个人矿池参与者)的自定义全节点(例如矿池管理者)。
结论
希望这篇文章有助于澄清人们所说的“节点”和“P2P网络”的含义,并将网络中所有参与者如何相互作用的要点联系起来。我希望它也为Bitcoin Core如何实现点对点连接以保护隐私,以及如何使得新节点能够参与进来,提供一些见解,谢谢阅读!
非常感谢John Newbery和Amiti Uttarwar,他们帮助我理解和记录了这些信息。