区块链总览 (Blockchain)¶
当前区块链大小 (Current Blockchain Size):
856.92 GB
956,479 blocks
注意:这是我本地节点的区块链大小。 您的区块链大小会有所不同,取决于您的节点经历了多少次链重组 (chain reorganizations),以及您在磁盘上存储了多少个陈腐区块 (stale blocks)。
区块链是一个由交易 (transactions)组成的文件。它是比特币节点维护的最重要的文件。
它被称为“区块链 (blockchain)”,因为新交易被包含在区块 (blocks)中添加到文件中,并且这些区块相互叠加,形成了一个区块的链条。因此称为区块链。
但归根结底,区块链是比特币交易的永久存储 (permanent storage for bitcoin transactions)。
实时比特币区块链 (Live Bitcoin Blockchain):¶
顶端 (Tip): 956,479 (距离 0 个区块) ⇈
接下来 0 个区块 ↑
之前 10 个区块 (Previous 10 blocks) ↓
总大小 (Total Size): 856.92 GB
下载 (Download)¶
您如何获得区块链的副本?
获得区块链副本的最简单方法是运行一个比特币节点。
当您运行比特币程序(例如 Bitcoin Core)时,您的节点将自动从网络上的其他节点下载区块,直到您的计算机上拥有最新版本的区块链副本。
当节点彼此连接 (connect)时,它们会在初始握手 (handshake)期间互相告知它们链的高度(它们拥有的区块数量)。如果另一个节点的区块比您多,您的节点将向其他节点请求这些区块,直到您拥有区块链的完整副本。
因此,节点会不断地相互通信,以便在网络上的每台计算机之间复制区块链。
并不存在单一或最终版本的“区块链”。每个节点都保留它们自己的本地区块链副本,在任何给定时间,不同的计算机上的副本可能会有所不同。
当您第一次运行比特币时,下载完整的区块链可能需要一段时间。这被称为初始区块下载 (Initial Block Download) (IBD)。
挖矿 (Mining)¶
如何将新区块添加到区块链?
包含交易的新区块必须被挖 (mined)到区块链上。
简而言之,挖矿的过程包括将交易从内存池 (memory pool)收集到一个候选区块 (candidate block)中,然后使用处理能力生成一个低于特定目标 (target)值的区块哈希 (block hash)。这意味着网络上的任何节点都可以挖掘新区块,但您需要耗费能量才能做到。
| 字段 (Field) | 值 (Value) |
|---|---|
| 区块头 (Block Header) | 0 bytes |
| 区块哈希 (自然字节序) (Block Hash (Natural Byte Order)) | 在原始区块头内部使用0 bytes |
| 区块哈希 (反转字节序) (Block Hash (Reverse Byte Order)) | 在区块浏览器上搜索区块时在外部使用0 bytes |
| 字段 (Field) | 值 (Value) |
|---|---|
| 当前目标 (Current Target) | 0x0 bytes |
| 时间(秒) 实际 (Time (seconds) Actual) |
0d |
| 时间(秒) 预期 (Time (seconds) Expected) |
0d 目标调整周期为 2016 个区块。平均每 600 秒(10 分钟)挖出一个区块,因此预期时间为 2016 * 600 = 1209600 秒。 |
| 比率 (Ratio) | 实际时间除以预期时间。我们将当前目标乘以这个比率以获得新目标。 |
| 新目标 (全精度) (New Target (Full Precision)) | 0x |
| 新目标 (New Target) | 0x0 bytes注意:这个目标值被略微截断以存储在区块头的 bits 字段中,这是实际挖矿时使用的目标值。 |
当一个节点(或“矿工”)成功挖出一个新区块时,他们会将其分享给网络上的其他节点。当其他节点接收到这个新区块时,他们会将其添加到自己的区块链中,然后矿工们将开始尝试在这个新区块之上挖出一个新区块。
因此,矿工们不断努力利用新的交易区块来延长区块链。
- 由于挖出一个区块所需的处理能力以及定期调整的目标,平均每 10 分钟就会有一个新区块添加到区块链中。
- 节点不必尝试挖掘新区块。相反,它只需保留区块链的副本并在收到新区块时将其转发给其他节点即可。
这里有一段关于比特币挖矿工作原理的视频 (video on how mining works in Bitcoin)。
链重组 (Chain Reorganizations)¶
两个区块可以同时被挖出吗?
在区块链的构建过程中,两个区块同时被挖出是完全正常的。
如果两个区块同时被挖出,它将导致链上的暂时“分叉”。
在这种情况下,节点会将他们接收到的第一个区块视为其区块链的一部分,但也会保留接收到的第二个区块以防万一。然而,后到达的第二个区块(以及其中的交易)不会被视为其活跃区块链的一部分。
因此,网络上的节点将暂时对这两个区块中哪一个属于链的顶端存在分歧。
当下一个区块被挖出时,这种分歧将得到解决。下一个区块将建立在其中一个区块之上,从而创建一个新的最长区块链 (longest chain),通常来说,节点始终会采用已知的最长区块链作为其活跃的区块链。
因此,拥有较短链的节点将执行链重组 (chain reorganization),从其旧的活跃链中移出区块,转而支持构成新的较长链的区块。
当新区块被挖出时,分叉就会被解决,因为这将创造一条新的最长链。
因此,尽管整个网络对于在任何给定时间哪个(或哪些)区块属于区块链顶端可能存在分歧,但新区块的挖掘和最长链的采用意味着节点最终将始终保持同步。
像这样的临时分叉很少见。 这大约每个月发生一次,通常只影响区块链上的顶端区块。
最长链 (Longest Chain)¶
区块链中的区块可以被替换吗?
由于区块链的构建方式,链顶端的区块是有可能被替换的。
节点始终采用最长链 (longest chain)作为区块链的“真实”版本。因此,您始终可以尝试构建一个更长的新区块链来替换现有的区块链,网络上的每个节点都会采用它。
这使您可以从区块链中“撤销 (undo)”或反转一笔比特币交易。
如果您构建了一条新的最长区块链,其他节点会将其用作他们的区块链。
然而,问题在于所有的矿工都被激励始终在已知最长链的基础上进行构建。这意味着网络上矿工的合并处理能力将集中在构建一条单一的链上,这条链的构建速度将比您自己构建的任何链都快。
矿工们自然而然地努力去延长当前的最长链。
换句话说,网络致力于构建区块链的合并处理能力,有助于保护已经挖出并添加到区块链上的区块(以及交易)。
因此,执行蓄意的链重组(以“撤销”现有区块中的一笔交易)的唯一方法是拥有比所有其他矿工总和更多的处理能力,这样您就可以超越网络的挖掘速度,构建一条更长的链供大家采用。这被称为“51% 攻击 (51% Attack)”。
目前还没有人成功对比特币区块链进行过 51% 攻击。
位置 (Location)¶
区块链存储在哪里?
如果您运行的是 Bitcoin Core 节点,可以在您计算机的以下位置找到区块链文件:
- Linux:
~/.bitcoin/blocks/ - Mac:
~/Library/Application Support/Bitcoin/blocks/ - Windows:
C:\Users\[username]\AppData\Roaming\Bitcoin\blocks\(v27.2 及更低版本)C:\Users\[username]\AppData\Local\Bitcoin\blocks\(v28.0 及以后版本)
区块链被拆分成名为 blk00000.dat、blk00001.dat、blk00002.dat 等等多个文件。这是因为处理多个小文件比处理一个巨大的文件要容易得多。详情请见 blk.dat。
总结 (Summary)¶
点击图片观看一段精美、缓慢的动画,展示随着时间推移区块链是如何构建的,其中还空间包括了一次链重组。
区块链是比特币交易 (transactions)的永久存储。新交易被包含在区块 (blocks)中添加到文件中,并且这些区块相互叠加以形成一条链。
新区块通过挖矿 (mining)添加到区块链中,这需要使用计算机的处理能力。这意味着挖掘一个区块需要消耗能量,但任何节点都可以努力尝试将下一个区块添加到链上。
当新区块被挖出时,它将被中继到网络 (network)中,节点将验证并将其添加到它们的链中。这使得区块链成为了一个不断增长的交易账本,分布在网络上的多台计算机中。
节点始终采用最长的区块链 (longest chain)作为区块链的活跃版本,这解决了有关哪些区块属于链顶端的分歧。这也保护了已经在区块链中的区块,因为构建一条能够替换较低层区块的链需要耗费大量能量。
挖矿和采用最长链的机制允许多台计算机在同一个网络上就相同的区块和交易集达成一致,同时也使得任何人都难以对区块链中的历史区块(进而影响交易)进行更改。
因此,区块链是一个安全、分布式、并且定期更新的交易文件。








