BTC网络

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协议以及其他连接⽐特币系统组件相 关协议的整体⽹络结构。

节点类型及分工

​ 尽管⽐特币P2P⽹络中的各个节点相互对等,但是根据所提供的功能不同,各节点可能具有不同的分⼯。每个⽐特币节点都 是路由、区块链数据库、挖矿、钱包服务的功能集合。⼀个全节点(full node)包括如图所⽰的四个功能:

block-min

​ 每个节点都参与全⽹络的路由功能,同时也可能包含其他功能。每个节点都参与验证并传播交易及区块信息,发现并维持与 对等节点的连接。上图所⽰的全节点⽤例中,名为“⽹络路由节点”的橙⾊圆圈即表⽰该路由功能。

​ ⼀些节点保有⼀份完整的、最新的区块链拷⻉,这样的节点被称为“全节点”。全节点能够独⽴⾃主地校验所有交易,⽽不需 借由任何外部参照。另外还有⼀些节点只保留了区块链的⼀部分,它们通过⼀种名为“简易⽀付验证(SPV)”的⽅式来完成 交易验证。这样的节点被称为“SPV节点”,⼜叫“轻量级节点”。在如上图所⽰的全节点⽤例中,名为完整区块链的蓝⾊圆圈即 表⽰了全节点区块链数据库功能。在图6-3中,SPV节点没有此蓝⾊圆圈,以⽰它们没有区块链的完整拷⻉。

​ 挖矿节点通过运⾏在特殊硬件设备上的⼯作量证明(proof-of-work)算法,以相互竞争的⽅式创建新的区块。⼀些挖矿节点 同时也是全节点,保有区块链的完整拷⻉;还有⼀些参与矿池挖矿的节点是轻量级节点,它们必须依赖矿池服务器维护的全 节点进⾏⼯作。在全节点⽤例中,挖矿功能如图中名为“矿⼯”的⿊⾊圆圈所⽰。

​ ⽤⼾钱包也可以作为全节点的⼀部分,这在桌⾯⽐特币客⼾端中⽐较常⻅。当前,越来越多的⽤⼾钱包都是SPV节点,尤其 是运⾏于诸如智能⼿机等资源受限设备上的⽐特币钱包应⽤;⽽这正变得越来越普遍。在图中,名为“钱包”的绿⾊圆圈代 表钱包功能。

​ 在⽐特币P2P协议中,除了这些主要的节点类型之外,还有⼀些服务器及节点也在运⾏着其他协议,例如特殊矿池挖矿协 议、轻量级客⼾端访问协议等。

​ 下图描述了扩展⽐特币⽹络中最为常⻅的节点类型。

block-min

扩展⽐特币⽹络

​ 运⾏⽐特币P2P协议的⽐特币主⽹络由⼤约7000-10000个运⾏着不同版本⽐特币核⼼客⼾端(Bitcoin Core)的监听节点、 以及⼏百个运⾏着各类⽐特币P2P协议的应⽤(例如BitcoinJ、Libbitcoin、btcd等)的节点组成。⽐特币P2P⽹络中的⼀⼩ 部分节点也是挖矿节点,它们竞争挖矿、验证交易、并创建新的区块。许多连接到⽐特币⽹络的⼤型公司运⾏着基于Bitcoin 核⼼客⼾端的全节点客⼾端,它们具有区块链的完整拷⻉及⽹络节点,但不具备挖矿及钱包功能。这些节点是⽹络中的边缘 路由器(edge routers),通过它们可以搭建其他服务,例如交易所、钱包、区块浏览器、商家⽀付处理(merchant payment processing)等。

​ 扩展⽐特币⽹络既包括了运⾏⽐特币P2P协议的⽹络,⼜包含运⾏特殊协议的⽹络节点。⽐特币P2P主⽹络上 连接着许多矿池服务器以及协议⽹关,它们把运⾏其他协议的节点连接起来。这些节点通常都是矿池挖矿节点(参⻅第8章) 以及轻量级钱包客⼾端,它们通常不具备区块链的完整备份。

​ 下图描述了扩展⽐特币⽹络,它包括了多种类型的节点、⽹关服务器、边缘路由器、钱包客⼾端以及它们相互连接所需的各 类协议。

block-min

⽹络发现

​ 当新的⽹络节点启动后,为了能够参与协同运作,它必须发现⽹络中的其他⽐特币节点。新的⽹络节点必须发现⾄少⼀个⽹ 络中存在的节点并建⽴连接。由于⽐特币⽹络的拓扑结构并不基于节点间的地理位置,因此各个节点之间的地理信息完全⽆ 关。在新节点连接时,可以随机选择⽹络中存在的⽐特币节点与之相连。 节点通常采⽤TCP协议、使⽤8333端⼝(该端⼝号通常是⽐特币所使⽤的,除8333端⼝外也可以指定使⽤其他端⼝)与已 知的对等节点建⽴连接。在建⽴连接时,该节点会通过发送⼀条包含基本认证内容的version消息开始“握⼿”通信过程。这⼀过程包括如下内容:

  • PROTOCOL_VERSION

    常量,定义了客⼾端所“说出”的⽐特币P2P协议所采⽤的版本(例如:70002)。

  • nLocalServices

    一组该节点⽀持的本地服务列表,当前仅⽀持NODE_NETWORK

  • nTime

    当前时间

  • addrYou

    当前节点可⻅的远程节点的IP地址

  • addrMe

    本地节点所发现的本机IP地址

  • subver

    指⽰当前节点运⾏的软件类型的⼦版本号(例如:”/Satoshi:0.9.2.1/”)

  • BaseHeight

    当前节点区块链的区块高度

​ 网络络中的对等节点通过对verack消息的响应进⾏确认并建⽴连接;有时候,如果接收节点需要互换连接并连回起始节点,也 会传回该对等节点的version消息。 ​ ​ 新节点是如何发现⽹络中的对等节点的呢?虽然⽐特币⽹络中没有特殊节点,但是客⼾端会维持⼀个列表,那⾥列出了那些 ⻓期稳定运⾏的节点。这样的节点被称为“种⼦节点(seed nodes)”。新节点并不⼀定需要与种⼦节点建⽴连接,但连接到 种⼦节点的好处是可以通过种⼦节点来快速发现⽹络中的其他节点。在⽐特币核⼼客⼾端中,是否使⽤种⼦节点是通过“- dnsseed”控制的。默认情况下,该选项设为1,即意味着使⽤种⼦节点。另⼀种⽅式是,起始时将⾄少⼀个⽐特币节点的IP 地址提供给正在启动的节点(该节点不包含任何⽐特币⽹络的组成信息)。在这之后,启动节点可以通过后续指令建⽴新的 连接。⽤⼾可以使⽤命令⾏参数“-seednode”把启动节点“引荐”并连接到⼀个节点,并将该节点⽤作DNS种⼦。在初始种⼦节 点被⽤于形成“引荐”信息之后,客⼾端会断开与它的连接、并与新发现的对等节点进⾏通信。

​ 对等节点之间的初始“握⼿”通信如下:

block-min

​ 当建⽴⼀个或多个连接后,新节点将⼀条包含⾃⾝IP地址的addr消息发送给其相邻节点。相邻节点再将此条addr消息依次转 发给它们各⾃的相邻节点,从⽽保证新节点信息被多个节点所接收、保证连接更稳定。另外,新接⼊的节点可以向它的相邻 节点发送getaddr消息,要求它们返回其已知对等节点的IP地址列表。通过这种⽅式,节点可以找到需连接到的对等节点,并 向⽹络发布它的消息以便其他节点查找。下图描述了这种地址发现协议。

block-min

​ 节点必须连接到若⼲不同的对等节点才能在⽐特币⽹络中建⽴通向⽐特币⽹络的种类各异的路径(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地址,⽽不会⾃动发现并维护对等节点之间的连接。

​ 如果已建⽴的连接没有数据通信,所在的节点会定期发送信息以维持连接。如果节点持续某个连接⻓达90分钟没有任何通 信,它会被认为已经从⽹络中断开,⽹络将开始查找⼀个新的对等节点。因此,⽐特币⽹络会随时根据变化的节点及⽹络问 题进⾏动态调整,不需经过中⼼化的控制即可进⾏规模增、减的有机调整。

全节点

​ 全节点是指维持包含全部交易信息的完整区块链的节点。更加准确地说,这样的节点应当被称为完整区块链节点。在⽐特币 发展的早期,所有节点都是全节点;当前的⽐特币核⼼客⼾端也是完整区块链节点。但在过去的两年中出现了许多新型客⼾ 端,它们不需要维持完整的区块链,⽽是作为轻量级客⼾端运⾏ 完整区块链节点保有完整的、最新的包含全部交易信息的⽐特币区块链拷⻉,这样的节点可以独⽴地进⾏建⽴并校验区块 链,从第⼀区块(创世区块)⼀直建⽴到⽹络中最新的区块。完整区块链节点可以独⽴⾃主地校验任何交易信息,⽽不需要 借助任何其他节点或其他信息来源。完整区块节点通过⽐特币⽹络获取包含交易信息的新区块更新,在验证⽆误后将此更新合并⾄本地的区块链拷⻉之中。

​ 运⾏完整区块链节点可以给您⼀种纯粹的⽐特币体验:不需借助或信任其他系统即可独⽴地对所有交易信息进⾏验证。辨别 您是否在运⾏全节点是⼗分容易的:只需要查看您的永久性存储设备(如硬盘)是否有超过20GB的空间被⽤来存储完整区块链即可。如果您需要很⼤的磁盘空间、并且同步⽐特币⽹络耗时2⾄3天,那么您使⽤的正是全节点。这就是摆脱中⼼化管 理、获得完全的独⽴⾃由所要付出的代价。

​ 尽管⽬前还有⼀些使⽤不同编程语⾔及软件架构的其他的完整区块链客⼾端存在,但是最常⽤的仍然是⽐特币核⼼客⼾端, 它也被称为“Satoshi客⼾端”。⽐特币⽹络中超过90%的节点运⾏着各个版本的⽐特币核⼼客⼾端。如前⽂所述,它可以通过 节点间发送的version消息或通过getpeerinfo命令所得到的⼦版本字符串“Satoshi”加以辨识,例如 /Satoshi: 0.8.6/。

交换”库存清单”

​ ⼀个全节点连接到对等节点之后,第⼀件要做的事情就是构建完整的区块链。如果该节点是⼀个全新节点,那么它就不包含 任何区块链信息,它只知道⼀个区块——静态植⼊在客⼾端软件中的创世区块。新节点需要下载从0号区块(创世区块)开始 的数⼗万区块的全部内容,才能跟⽹络同步、并重建全区块链。

​ 同步区块链的过程从发送version消息开始,这是因为该消息中含有的BestHeight字段标⽰了⼀个节点当前的区块链⾼度(区 块数量)。节点可以从它的对等节点中得到版本消息,了解双⽅各⾃有多少区块,从⽽可以与其⾃⾝区块链所拥有的区块数 量进⾏⽐较。对等节点们会交换⼀个getblocks消息,其中包含他们本地区块链的顶端区块哈希值。如果某个对等节点识别出 它接收到的哈希值并不属于顶端区块,⽽是属于⼀个⾮顶端区块的旧区块,那么它就能推断出:其⾃⾝的本地区块链⽐其他对等节点的区块链更⻓。

​ 拥有更⻓区块链的对等节点⽐其他节点有更多的区块,可以识别出哪些区块们是其他节点需要“补充”的。它会识别出第⼀批 可供分享的500个区块,通过使⽤inv(inventory)消息把这些区块的哈希值传播出去。缺少这些区块的节点便可以通过各⾃ 发送的getdata消息来请求得到全区块信息,⽤包含在inv消息中的哈希值来确认是否为正确的被请求的区块,从⽽读取这些 缺失的区块。

​ 在下例中,我们假设某节点只含有创世区块。它收到了来⾃对等节点的inv消息,其中包含了区块链中后500个区块的哈希 值。于是它开始向所有与之相连的对等节点请求区块,并通过分摊⼯作量的⽅式防⽌单⼀对等节点被批量请求所压垮。该节 点会追踪记录其每个对等节点连接上“正在传输”(指那些它已经发出了请求但还没有接收到)的区块数量,并且检查该数量 有没有超过上限( MAX_BLOCKS_IN_TRANSIT_PER_PEER )。⽤这种办法,如果⼀个节点需要更新⼤量区块,它会在上⼀请求完成后 才发送对新区块的请求,从⽽允许对等节点控制更新速度,不⾄于压垮⽹络。每⼀个区块在被接收后就会被添加⾄区块链中,随着本地区块链的逐步建⽴,越来越多的区块被请求和接收,整个过程将⼀直持续到该节点与全⽹ 络完成同步为⽌。

​ 每当⼀个节点离线,不管离线时间有多⻓,这个与对等节点⽐较本地区块链并恢复缺失区块的过程就会被触发。如果⼀个节 点只离线⼏分钟,可能只会缺失⼏个区块;当它离线⻓达⼀个⽉,可能会缺失上千个区块。但⽆论哪种情况,它都会从发 送 getblocks 消息开始,收到⼀个inv响应,

block-min

简易⽀付验证 (SPV)节点

​ 并⾮所有的节点都有能⼒储存完整的区块链。许多⽐特币客⼾端被设计成运⾏在空间和功率受限的设备上,如智能电话、平板电脑、嵌⼊式系统等。对于这样的设备,通过简化的⽀付验证(SPV)的⽅式可以使它们在不必存储完整区块链的情况下 进⾏⼯作。这种类型的客端被称为SPV客⼾端或轻量级客⼾端。随着⽐特币的使⽤热潮,SPV节点逐渐变成⽐特币节点(尤 其是⽐特币钱包)所采⽤的最常⻅的形式。

​ SPV节点只需下载区块头,⽽不⽤下载包含在每个区块中的交易信息。由此产⽣的不含交易信息的区块链,⼤⼩只有完整区 块链的1/1000。SPV节点不能构建所有可⽤于消费的UTXO的全貌,这是由于它们并不知道⽹络上所有交易的完整信 息。SPV节点验证交易时所使⽤的⽅法略有不同,这个⽅法需依赖对等节点“按需”提供区块链相关部分的局部视图。

​ 打个⽐⽅来说,每个全节点就像是⼀个在陌⽣城市⾥的游客,他带着⼀张包含每条街道、每个地址的详细地图。相⽐之 下,SPV节点就像是这名陌⽣城市⾥的游客只知道⼀条主⼲道的名字,通过随机询问该城市的陌⽣⼈来获取分段道路指⽰。 虽然两种游客都可以通过实地考察来验证⼀条街是否存在,但没有地图的游客不知道每个⼩巷中有哪些街道,也不知道附近 还有什么其他街道。没有地图的游客在“教堂街23号”的前⾯,并不知道这个城市⾥是否还有其他若⼲条“教堂街23号”,也不 知道⾯前的这个是否是要找的那个。对他来说,最好的⽅式就是向⾜够多的⼈问路,并且希望其中⼀部分⼈不是要试图抢劫他。

​ 简易⽀付验证是通过参考交易在区块链中的深度,⽽不是⾼度,来验证它们。⼀个拥有完整区块链的节点会构造⼀条验证 链,这条链是由沿着区块链按时间倒序⼀直追溯到创世区块的数千区块及交易组成。⽽⼀个SPV节点会验证所有区块的链(但不是所有的交易),并且把区块链和有关交易链接起来。

​ 例如,⼀个全节点要检查第300,000号区块中的某个交易,它会把从该区块开始⼀直回溯到创世区块的300,000个区块全部都 链接起来,并建⽴⼀个完整的UTXO数据库,通过确认该UTXO是否还未被⽀付来证实交易的有效性。SPV节点则不能验证 UTXO是否还未被⽀付。相反地,SPV节点会在该交易信息和它所在区块之间⽤merkle路径,建⽴⼀条链接。然后SPV节点⼀直等待,直到序号从300,001到300,006的六个区块堆叠在该交易所在的区块之上,并通过确⽴交易的深 度是在第300,006区块~第300,001区块之下来验证交易的有效性。事实上,如果⽹络中的其他节点都接受了第300,000区 块,并通过⾜够的⼯作在该块之上⼜⽣成了六个区块,根据代理⽹关协议,就可以证明该交易不是双重⽀付。

​ 如果⼀个交易实际上不存在,SPV节点不会误认为该交易存在于某区块中。SPV节点会通过请求merkle路径证明以及验证区 块链中的⼯作量证明,来证实交易的存在性。可是,⼀个交易的存在是可能对SPV节点“隐藏”的。SPV节点毫⽆疑问可以证 实某个交易的存在性,但它不能验证某个交易(譬如同⼀个UTXO的双重⽀付)不存在,这是因为SPV节点没有⼀份关于所 有交易的记录。这个漏洞会被针对SPV节点的拒绝服务攻击或双重⽀付型攻击所利⽤。为了防御这些攻击,SPV节点需要随 机连接到多个节点,以增加与⾄少⼀个可靠节点相连接的概率。这种随机连接的需求意味着SPV节点也容易受到⽹络分区攻 击或Sybil攻击。在后者情况中,SPV节点被连接到虚假节点或虚假⽹络中,没有通向可靠节点或真正的⽐特币⽹络的连接。

​ 在绝⼤多数的实际情况中,具有良好连接的SPV节点是⾜够安全的,它在资源需求、实⽤性和安全性之间维持恰当的平衡。 当然,如果要保证万⽆⼀失的安全性,最可靠的⽅法还是运⾏完整区块链的节点。

​ SPV节点使⽤的是⼀条getheaders消息,⽽不是getblocks消息来获得区块头。发出响应的对等节点将⽤⼀条headers消息发 送多达2000个区块头。这⼀过程和全节点获取所有区块的过程没什么区别。SPV节点还在与对等节点的连接上设置了过滤 器,⽤以过滤从对等节点发来的未来区块和交易数据流。任何⽬标交易都是通过⼀条getdata的请求来读取的。对等节点⽣成 ⼀条包含交易信息的tx消息作为响应

block-min

​ 由于SPV节点需要读取特定交易从⽽选择性地验证交易,这样就⼜产⽣了隐私⻛险。与全区块链节点收集每⼀个区块内的全 部交易所不同的是,SPV节点对特定数据的请求可能⽆意中透露了钱包⾥的地址信息。例如,监控⽹络的第三⽅可以跟踪某 个SPV节点上的钱包所请求的全部交易信息,并且利⽤这些交易信息把⽐特币地址和钱包的⽤⼾关联起来,从⽽损害了⽤⼾ 的隐私。

交易池

​ ⽐特币⽹络中⼏乎每个节点都会维护⼀份未确认交易的临时列表,被称为内存池或交易池。节点们利⽤这个池来追踪记录那 些被⽹络所知晓、但还未被区块链所包含的交易。例如,保存⽤⼾钱包的节点会利⽤这个交易池来记录那些⽹络已经接收但 还未被确认的、属于该⽤⼾钱包的预⽀付信息。

​ 随着交易被接收和验证,它们被添加到交易池并通知到相邻节点处,从⽽传播到⽹络中。

​ 有些节点的实现还维护⼀个单独的孤⽴交易池。如果⼀个交易的输⼊与某未知的交易有关,如与缺失的⽗交易相关,该孤⽴交易就会被暂时储存在孤⽴交易池中直到⽗交易的信息到达。

​ 当⼀个交易被添加到交易池中,会同时检查孤⽴交易池,看是否有某个孤⽴交易引⽤了此交易的输出(⼦交易)。任何匹配 的孤⽴交易会被进⾏验证。如果验证有效,它们会从孤⽴交易池中删除,并添加到交易池中,使以其⽗交易开始的链变得完 整。对新加⼊交易池的交易来说,它不再是孤⽴交易。前述过程重复递归寻找进⼀步的后代,直⾄所有的后代都被找到。通过这⼀过程,⼀个⽗交易的到达把整条链中的孤⽴交易和它们的⽗级交易重新结合在⼀起,从⽽触发了整条独⽴交易链进⾏级联重构。

​ 交易池和孤⽴交易池(如有实施)都是存储在本地内存中,并不是存储在永久性存储设备(如硬盘)⾥。更准确的说,它们 是随⽹络传⼊的消息动态填充的。节点启动时,两个池都是空闲的;随着⽹络中新交易不断被接收,两个池逐渐被填充。

​ 有些⽐特币客⼾端的实现还维护⼀个UTXO数据库,也称UTXO池,是区块链中所有未⽀付交易输出的集合。“UTXO池”的名 字听上去与交易池相似,但它代表了不同的数据集。UTXO池不同于交易池和孤⽴交易池的地⽅在于,它在初始化时不为 空,⽽是包含了数以百万计的未⽀付交易输出条⽬,有些条⽬的历史甚⾄可以追溯⾄2009年。UTXO池可能会被安置在本地 内存,或者作为⼀个包含索引的数据库表安置在永久性存储设备中。

​ 交易池和孤⽴交易池代表的是单个节点的本地视⻆。取决于节点的启动时间或重启时间,不同节点的两池内容可能有很⼤差 别。相反地,UTXO池代表的是⽹络的突显共识,因此,不同节点间UTXO池的内容差别不⼤。此外,交易池和孤⽴交易池只 包含未确认交易,⽽UTXO池之只包含已确认交易。