《精通比特币第二版》中文版第八章比特币网络1/2
精力有限,后期修订以github为主,建议大家移步github链接阅读更新版本,感谢理解:
https://github.com/tianmingyun/MasterBitcoin2CN
特别预告:专栏早鸟价:99元,11月5日后升级为199元,11月14日零时前报名加入的朋友均赠送《精通比特币第二版》中文版纸质打印本一本。
本文5300字。
8.1 P2P网络架构
比特币采用了基于国际互联网(Internet)的P2P(peer-to-peer)网络架构。P2P是指位于同一网络中的每台计算机都 彼此对等,各个节点共同提供网络服务,不存在任何“特殊”节点。每个网络节点以“扁平(flat)”的拓扑结构相互连通。 在P2P网络中不存在任何服务端(server)、中央化的服务、以及层级结构。P2P网络的节点之间交互运作、协同处 理:每个节点在对外提供服务的同时也使用网络中其他节点所提供的服务。P2P网络也因此具有可靠性、去中心化,以 及开放性。早期的国际互联网就是P2P网络架构的一个典型用例:IP网络中的各个节点完全平等。当今的互联网架构具 有分层架构,但是IP协议仍然保留了扁平拓扑的结构。在比特币之外,规模最大也最成功的P2P技术应用是在文件分享 领域:Napster是该领域的先锋,BitTorrent是其架构的最新演变。
比特币所采用的P2P网络架构不仅仅是选择拓扑结构这样简单。比特币被设计为一种点对点的数字现金系统,它的网络 架构既是这种核心特性的反映,也是该特性的基石。去中心化控制是设计时的核心原则,它只能通过维持一种扁平化、 去中心化的P2P共识网络来实现。
“比特币网络”是按照比特币P2P协议运行的一系列节点的集合。除了比特币P2P协议之外,比特币网络中也包含其他协 议。例如Stratum协议就被应用于挖矿、以及轻量级或移动端比特币钱包之中。网关(gateway)路由服务器提供这些协 议,使用比特币P2P协议接入比特币网络,并把网络拓展到运行其他协议的各个节点。例如,Stratum服务器通过 Stratum协议将所有的Stratum挖矿节点连接至比特币主网络、并将Stratum协议桥接(bridge)至比特币P2P协议之 上。我们使用“扩展比特币网络(extended bitcoin network)”指代所有包含比特币P2P协议、矿池挖矿协议、Stratum 协议以及其他连接比特币系统组件相关协议的整体网络结构。
8.2 节点类型及分工
尽管比特币P2P网络中的各个节点相互对等,但是根据所提供的功能不同,各节点可能具有不同的分工。每个比特币节 点都是路由、区块链数据库、挖矿、钱包服务的功能集合。一个全节点(full node)包括如图8-1所示的四个功能:
图8-1一个包含四个完整功能的比特币网络节点:钱包、矿工、完整区块链、网络路由节点每个节点都参与全网络的路由功能,同时也可能包含其他功能。每个节点都参与验证并传播交易及区块信息,发现并维 持与对等节点的连接。在图8-1所示的全节点用例中,名为“网络路由节点”的橙色圆圈字母‘N’即表示该路由功能。
一些节点保有一份完整的、最新的区块链拷贝,这样的节点被称为“全节点”。全节点能够独立自主地校验所有交易,而 不需借由任何外部参照。另外还有一些节点只保留了区块链的一部分,它们通过一种名为“简易支付验证(SPV)”的方 式来完成交易验证。这样的节点被称为“SPV节点”,又叫“轻量级节点”。在如上图所示的全节点用例中,名为完整区块链 的蓝色圆圈字母“B”即表示了全节点区块链数据库功能。在图8-3中,SPV节点没有此蓝色圆圈,以示它们没有区块链的完整拷贝。
挖矿节点通过运行在特殊硬件设备上的工作量证明(proof-of-work)算法,以相互竞争的方式创建新的区块。一些挖矿 节点同时也是全节点,保有区块链的完整拷贝;还有一些参与矿池挖矿的节点是轻量级节点,它们必须依赖矿池服务器 维护的全节点进行工作。在全节点用例中,挖矿功能如图中名为“矿工”的黑色圆圈字母“M”所示。
用户钱包也可以作为全节点的一部分,这在桌面比特币客户端中比较常见。当前,越来越多的用户钱包都是SPV节点, 尤其是运行于诸如智能手机等资源受限设备上的比特币钱包应用;而这正变得越来越普遍。在图8-1中,名为“钱包”的绿 色圆圈字母“W”代表钱包功能。
在比特币P2P协议中,除了这些主要的节点类型之外,还有一些服务器及节点也在运行着其他协议,例如特殊矿池挖矿 协议、轻量级客户端访问协议等。
图8-2描述了扩展比特币网络中最为常见的节点类型。
图8-2描述了扩展比特币网络中最为常见的节点类型
8.3 扩展比特币网络
运行比特币P2P协议的比特币主网络由大约5000-8000个运行着不同版本比特币核心客户端(Bitcoin Core)的监听节 点、以及几百个运行着各类比特币P2P协议的应用(例如Bitcoin Classic, Bitcoin Unlimited, BitcoinJ, Libbitcoin, btcd, and bcoin等)的节点组成。比特币P2P网络中的一小部分节点也是挖矿节点,它们竞争挖矿、验证交易、并创建新的区块。许多连接到比特币网络的大型公司运行 着基于Bitcoin核心客户端的全节点客户端,它们具有区块链的完整拷贝及网络节点,但不具备挖矿及钱包功能。这些节点是网络中的边缘路由器(edge routers),通过它们可以搭建其他服务,例如交易所、钱包、区块浏览器、商家支付处理(merchant payment processing)等。
如前文所述,扩展比特币网络既包括了运行比特币P2P协议的网络,又包含运行特殊协议的网络节点。比特币P2P主网 络上连接着许多矿池服务器以及协议网关,它们把运行其他协议的节点连接起来。这些节点通常都是矿池挖矿节点(参 见挖矿章节)以及轻量级钱包客户端,它们通常不具备区块链的完整备份。
图8-3描述了扩展比特币网络,它包括了多种类型的节点、网关服务器、边缘路由器、钱包客户端以及它们相互连接所 需的各类协议。
8.4比特币中继网络
虽然比特币P2P网络服务于各种各样的节点类型的一般需求,但是对于比特币挖掘节点的专门需求,它显示出太高的网络延迟。
比特币矿业公司正在进行时间敏感的竞争,以解决工作证明问题,并扩大块状(参见[采矿])。在参加比赛时,比特币矿工必须最大限度地缩短获胜块的传播与下一轮比赛开始之间的时间。在采矿方面,网络延迟与利润率直接相关。
比特币中继网络是一种网络,尝试最小化矿工之间传输块的延迟。原始的比特币中继网络是由核心开发商Matt Corallo于2015年创建的,以便能够以非常低的延迟在矿工之间快速同步块。该网络由世界各地的亚马逊Web服务基础架构上托管的几个专门的节点组成,并且连接大多数矿工和采矿池。
原始的比特币中继网络在2016年被替换为Fast Internet Bitcoin Relay Engine or FIBRE,也由核心开发商Matt Corallo创建。 FIBER是一种基于UDP的中继网络,可以中继节点网络内的块。 FIBER实现了compact block,以进一步减少传输的数据量和网络延迟。
康奈尔大学研究的另一个中继网络(仍在提案阶段)是 Falcon。 Falcon使用“直通路由”而不是“存储转发”来减少延迟,通过传播块的部分,而不是等待直到接收到完整的块。
中继网络不是比特币的P2P网络的替代品。相反,它们是覆盖网络,在具有特殊需求的节点之间提供额外的连接像高速公路不是农村道路的替代品,而是交通繁忙的两点之间的快捷方式,您仍然需要小路连接高速公路。
8.5 网络发现
当新的网络节点启动后,为了能够参与协同运作,它必须发现网络中的其他比特币节点。新的网络节点必须发现至少一 个网络中存在的节点并建立连接。由于比特币网络的拓扑结构并不基于节点间的地理位置,因此各个节点之间的地理信 息完全无关。在新节点连接时,可以随机选择网络中存在的比特币节点与之相连。
节点通常采用TCP协议、使用8333端口(该端口号通常是比特币所使用的,除8333端口外也可以指定使用其他端口) 与已知的对等节点建立连接。在建立连接时,该节点会通过发送一条包含基本认证内容的version消息开始“握手”通信过 程(见图8-4)。这一过程包括如下内容:
▷ nVersion
定义了客户端所“说出”的比特币P2P协议所采用的版本(例如:70002)。
▷ nLocalServices
一组该节点支持的本地服务列表,当前仅支持NODE_NETWORK
▷ nTime
当前时间
▷ addrYou
当前节点可见的远程节点的IP地址
▷ addrMe
本地节点所发现的本机IP地址
▷ subver
指示当前节点运行的软件类型的子版本号(例如:”/Satoshi:0.9.2.1/”)
▷ BaseHeight
当前节点区块链的区块高度 (version网络消息的具体用例请参见GitHub )
版本消息始终是任何对等体发送给另一个对等体的第一条消息。 接收版本消息的本地对等体将检查远程对等体报告的nVersion,并确定远端对等体是否兼容。 如果远程对等体兼容,则本地对等体将确认版本消息,并通过发送一个verack建立连接。
新节点如何找到对等体? 第一种方法是使用多个“DNS种子”来查询DNS,这些DNS服务器提供比特币节点的IP地址列表。 其中一些DNS种子提供了稳定的比特币侦听节点的静态IP地址列表。 一些DNS种子是BIND(Berkeley Internet Name Daemon)的自定义实现,它从搜索器或长时间运行的比特币节点收集的比特币节点地址列表中返回一个随机子集。 Bitcoin Core客户端包含五种不同DNS种子的名称。 不同DNS种子的所有权和多样性的多样性为初始引导过程提供了高水平的可靠性。 在Bitcoin Core客户端中,使用DNS种子的选项由选项switch -dnsseed控制(默认设置为1,以使用DNS种子)。
或者,不知道网络的引导节点必须被给予至少一个比特币节点的IP地址,之后可以通过进一步介绍来建立连接。 命令行参数-seednode可用于连接到一个节点,仅用于将其用作种子。 在使用初始种子节点形成介绍后,客户端将断开连接并使用新发现的对等体。
当建立一个或多个连接后,新节点将一条包含自身IP地址的addr消息发送给其相邻节点。相邻节点再将此条addr消息依 次转发给它们各自的相邻节点,从而保证新节点信息被多个节点所接收、保证连接更稳定。另外,新接入的节点可以向 它的相邻节点发送getaddr消息,要求它们返回其已知对等节点的IP地址列表。通过这种方式,节点可以找到需连接到 的对等节点,并向网络发布它的消息以便其他节点查找。图8-5描述了这种地址发现协议。
图8-5地址广播及发现节点必须连接到若干不同的对等节点才能在比特币网络中建立通向比特币网络的种类各异的路径(path)。由于节点可 以随时加入和离开,通讯路径是不可靠的。因此,节点必须持续进行两项工作:在失去已有连接时发现新节点,并在其 他节点启动时为其提供帮助。节点启动时只需要一个连接,因为第一个节点可以将它引荐给它的对等节点,而这些节点 又会进一步提供引荐。一个节点,如果连接到大量的其他对等节点,这既没必要,也是对网络资源的浪费。在启动完成 后,节点会记住它最近成功连接的对等节点;因此,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。如 果先前的网络的对等节点对连接请求无应答,该节点可以使用种子节点进行重启动。
在运行比特币核心客户端的节点上,您可以使用 getpeerinfo 命令列出对等节点连接信息:
$ bitcoin-cli getpeerinfo
[
{
"addr" : "85.213.199.39:8333",
"services" : "00000001",
"lastsend" : 1405634126,
"lastrecv" : 1405634127,
"bytessent" : 23487651,
"bytesrecv" : 138679099,
"conntime" : 1405021768,
"pingtime" : 0.00000000,
"version" : 70002,
"subver" : "/Satoshi:0.9.2.1/",
"inbound" : false,
"startingheight" : 310131,
"banscore" : 0,
"syncnode" : true
},
{
"addr" : "58.23.244.20:8333",
"services" : "00000001",
"lastsend" : 1405634127,
"lastrecv" : 1405634124,
"bytessent" : 4460918,
"bytesrecv" : 8903575,
"conntime" : 1405559628,
"pingtime" : 0.00000000,
"version" : 70001,
"subver" : "/Satoshi:0.8.6/",
"inbound" : false,
"startingheight" : 311074,
"banscore" : 0,
"syncnode" : false
}
]
用户可以通过提供 -connect=<IP地址> 选项来指定一个或多个IP地址,从而达到覆盖自动节点管理功能并指定IP地址列表的目的。如果采用此选项,节点只连接到这些选定的节点IP地址,而不会自动发现并维护对等节点之间的连接。
如果已建立的连接没有数据通信,所在的节点会定期发送信息以维持连接。如果节点持续某个连接长达90分钟没有任何 通信,它会被认为已经从网络中断开,网络将开始查找一个新的对等节点。因此,比特币网络会随时根据变化的节点及 网络问题进行动态调整,不需经过中心化的控制即可进行规模增、减的有机调整。
8.5 全节点
全节点是指维持包含全部交易信息的完整区块链的节点。更加准确地说,这样的节点应当被称为完整区块链节点”。在比 特币发展的早期,所有节点都是全节点;当前的比特币核心客户端也是完整区块链节点。但在过去的两年中出现了许多 新型客户端,它们不需要维持完整的区块链,而是作为轻量级客户端运行。在下面的章节里我们会对这些轻量级客户端 进行详细介绍。
完整区块链节点保有完整的、最新的包含全部交易信息的比特币区块链拷贝,这样的节点可以独立地进行建立并校验区 块链,从第一区块(创世区块)一直建立到网络中最新的区块。完整区块链节点可以独立自主地校验任何交易信息,而 不需要借助任何其他节点或其他信息来源。完整区块节点通过比特币网络获取包含交易信息的新区块更新,在验证无误 后将此更新合并至本地的区块链拷贝之中。
运行完整区块链节点可以给您一种纯粹的比特币体验:不需借助或信任其他系统即可独立地对所有交易信息进行验证。 辨别您是否在运行全节点是十分容易的:只需要查看您的永久性存储设备(如硬盘)是否有超过20GB的空间被用来存 储完整区块链即可。如果您需要很大的磁盘空间、并且同步比特币网络耗时2至3天,那么您使用的正是全节点。这就是 摆脱中心化管理、获得完全的独立自由所要付出的代价。
尽管目前还有一些使用不同编程语言及软件架构的其他的完整区块链客户端存在,但是最常用的仍然是比特币核心客户 端,它也被称为“Satoshi客户端”。比特币网络中超过90%的节点运行着各个版本的比特币核心客户端。如前文所述,它 可以通过节点间发送的version消息或通过getpeerinfo命令所得到的子版本字符串“Satoshi”加以辨识,例如 /Satoshi: 0.8.6/。
本章未完,待续。
参考内容:
1、本文部分内容摘自《精通比特币》第一版中译本,特此说明并致谢。
我正在发起“和我一起研读《精通比特币第二版》”活动。
我声明,这不是讲课,是讨论,是研读学习,所以需要你的加入,更需要你的参与。
我把这种学习方式作为一次认知学习法[注]的实践。
我希望大家可以和我一起通过将认知学习法与《精通比特币第二版》的研读结合起来,尝试总结出一套可行的区块链知识技能快速入门的方法。
尝试,反思,总结,生成以及组合进行的实践、检验并逐步迭代升级,这是我们的经历也是我们的结果。
这个结果也将成为我们大家一起合作编写的一本书《认知学习比特币》的雏形(所有有价值的讨论都将成为这本书的素材)。
我更希望大家通过本次认知学习方法论的实践以及迭代升级,将这种经过实践的学习方法迁移到更多领域的学习中。
所以希望我们携手走入第二季,第三季......
欢迎扫描二维码加入。
欲知详情请扫描二维码