Back to topics

This article does not have an English body yet. Showing the Chinese version below.

区块链基础(下):比特币的共识与运行机制

上篇我们讲了密码学和数据结构这两块"建筑材料"。这一篇我们把它们组装起来,看看比特币这条链到底是怎么跑起来的。


一、数字货币的两个根本问题

任何数字货币系统,不管去不去中心化,都必须回答两个问题:

  1. 谁来发行货币? —— 谁有权"印钱"?
  2. 怎么防双花攻击? —— 同一笔钱不能被花两次

传统银行体系里,央行发行货币,银行数据库记录余额,双花问题由中心化账本解决——你转账后余额扣减,不可能再花一次。

在没有中心化账本的去中心化网络里,这两个问题怎么解决?比特币的答案是:用交易本身来追溯币的来源

1.1 比特币交易结构

每笔交易必须声明"我这笔钱是从之前的哪笔交易来的":

  • 输入(Input):引用之前某笔交易的某个输出,声明"我要花这笔旧钱"
  • 输出(Output):定义新的归属和花费条件,声明"这笔钱现在归谁、怎么花"

这引出了比特币最核心的账本模型——UTXO


二、UTXO:比特币的账本模型

UTXO = Unspent Transaction Output(未花费交易输出)。

比特币没有"账户余额"这个概念。你的"余额"实际上是所有属于你的 UTXO 的总和

工作原理:

  • 每一笔交易的输出会生成新的 UTXO,表示"有一笔钱可以被后续交易使用"
  • 每一笔交易的输入必须引用一个或多个已有的 UTXO,并彻底销毁它们
  • 交易的总输入 ≈ 总输出(差额作为交易费给矿工)

类比一下:UTXO 模型不是银行存折(随时加减余额),而是现金——你钱包里有几张钞票(UTXO),花一张就销毁一张,找零产生新钞票。你不能把一张100块的钞票"部分花掉",必须整张花掉然后收找零。

这种设计有几个精巧之处:

  • 防双花天然成立:每笔交易的输入必须引用尚未被花费的 UTXO,一旦被引用就标记为"已花费",不可能再花一次。节点收到冲突交易直接拒绝。
  • 溯源是副产品:通过 UTXO 链可以追溯每笔钱的完整历史,但 UTXO 本身的设计目标是高效验证防双花,而非主动记录来源。
  • 不归并:UTXO 不会自动合并。你有3个 UTXO(0.3 BTC + 0.5 BTC + 0.2 BTC),转账 0.8 BTC 时需要把3个都作为输入,然后生成两个输出——0.8 BTC 给对方,0.2 BTC 找零给自己。

2.1 交易费的意义

交易费 = 总输入 - 总输出。现在是矿工收益的重要补充,未来(当出块奖励趋近于零时)将是矿工的唯一收入来源,保障网络持续安全。


三、比特币脚本:谁说了算?

比特币交易不只是"A 转账给 B"这么简单。每笔交易输出里嵌了一段锁定脚本(ScriptPubKey),定义"满足什么条件才能花这笔钱"。

一个完整的交易验证过程:

  1. 锁定脚本(位于输出中):声明花费条件,比如"提供与公钥 X 匹配的签名"
  2. 解锁脚本(位于输入中):提供满足条件的数据——签名和公钥
  3. 验证时,将解锁脚本和锁定脚本拼接执行。如果执行成功且结果为 True,交易有效

这种设计让比特币支持多种花费条件,而不只是"支付到公钥"。


四、共识协议:谁有资格记账?

4.1 分布式共识的困境

在一个去中心化的 P2P 网络里,节点之间可能互相作恶,网络延迟没有上限。分布式系统理论告诉我们一些悲观结论:

  • FLP 不可能性:在异步网络(延迟无上限)中,只要有一个节点可能故障,就无法在有限时间内达成确定性共识
  • CAP 定理:一致性(Consistency)、可用性(Availability)、分区容错(Partition Tolerance)三者最多满足两个

比特币的解决思路很"野蛮":不去追求确定性共识,而是用最长链概率性共识

4.2 比特币共识:算力说话

规则很简单:

  • 谁先找到合法的 nonce(使得 H(block header) ≤ target),谁就获得本轮记账权
  • 记账者将自己的区块广播给全网
  • 其他节点验证区块合法性(检查 nonce、交易是否有效、prev_hash 是否指向当前最长链末端)
  • 如果合法,节点将这个区块接到自己本地的链上,然后开始竞争下一个区块

最长合法链原则:如果出现分叉(两个矿工几乎同时挖出区块),网络暂时保留两个分支。哪个分支先找到下一个区块,就更长,全网就会切过去,短的那条被丢弃(orphaned)。

这就是概率性共识——不是"所有人立刻同意",而是"随着区块不断增加,被回滚的概率指数级下降"。

4.3 六次确认

双花攻击的一种手法:攻击者在区块 N 里写入交易 A(给自己买东西),同时秘密挖一条不含交易 A 的分叉链。等商家看到交易 A 入块后发货,攻击者立即广播自己更长的分叉链,回滚掉交易 A。

六次确认是对抗这种攻击的经验法则:等待6个新区块覆盖在包含你交易的区块之上。攻击者要回滚你的交易,需要重新挖出6个以上的区块并超过当前主链——这在算力上需要全网 50% 以上的算力,成本极高。

4.4 出块奖励:唯一的铸币方式

矿工为什么要拼命挖矿?因为有出块奖励(Block Reward)。这是比特币唯一的货币发行方式——没有央行印钱,全靠矿工挖矿"铸造"出来。

出块奖励的设计:

  • 初始奖励:50 BTC / 区块
  • 减半周期:每 210,000 个区块(约 4 年)
  • 数学本质:210,000 × 50 × (1 + 1/2 + 1/4 + 1/8 + ...) = 210,000 × 50 × 2 = 2,100 万

这是一个收敛的几何级数,比特币总量趋近于 2100 万。稀缺性是人为设计出来的,不是天然属性。


五、PoW 挖矿:寻找那个 nonce

5.1 挖矿的数学本质

H(nonce || prev_hash || merkle_root || timestamp || target || version) ≤ target

矿工不断尝试不同的 nonce,做一次 SHA-256 哈希,看结果是否小于等于 target。target 越小(即要求哈希值以更多个 0 开头),难度越大。

比特币网络每 2016 个区块(约两周)自动调整一次 target,使得平均出块时间保持在 10 分钟

5.2 挖矿的概率论

每次 nonce 尝试是一个伯努利试验(Bernoulli Trial)——只有"成功"和"失败"两种结果。

连续多次尝试是一个伯努利过程(Bernoulli Process),具有无记忆性(Memoryless)——你挖了 9 分钟没出块,第 10 分钟出块的概率和刚挖第 1 分钟一样。过去的工作不会让你"更接近"成功。

这就是 Progress Free 性质:挖矿没有"进度条",每次尝试都是独立的。这对公平性很重要——大矿工和小矿工在每次尝试上的成功概率是平等的(与历史工作量无关)。

从连续时间角度看,出块事件是泊松过程(Poisson Process),相邻区块的时间间隔服从指数分布(Exponential Distribution)。假设你拥有全网 1% 的算力,平均每 100 个区块中就有 1 个是你挖出的,也就是大约每 1000 分钟出一个。

Bitcoin is secured by mining. 挖矿表面上"浪费电力",但这是保障去中心化网络安全性的代价。没有 PoW 提供的经济屏障,攻击网络的成本几乎为零。


六、网络层:交易如何传播?

6.1 分层架构

比特币网络可以粗略分为两层:

  • 应用层(Bitcoin Blockchain):处理交易验证、区块共识、UTXO 管理、防双花
  • 网络层(P2P Overlay Network):负责节点间数据传输,基于 TCP/IP 的自定义 P2P 协议

6.2 Gossip 协议

交易和区块在 P2P 网络中通过 Gossip 协议(流行病协议) 传播:

每个节点随机选择若干邻居节点交换信息,通过多轮传播使全网节点最终同步。

类似于"人传人"的流行病传播模型——一个人告诉三个人,三个人再各自告诉三个人,信息指数级扩散。

6.3 节点角色

比特币 P2P 网络中所有节点都是平等的,没有超级节点(master node)。但节点功能上有所区分:

  • Seed Node(种子节点):新节点的"引路人"。新节点刚启动时"一个邻居都没有",需要向种子节点索取初始节点列表。获取初始邻居后,邻居会动态推荐更多节点,新节点最终融入全网。设计原则是simple, robust, not efficient——简单、鲁棒、不求高效。
  • 全节点:存储完整区块链,独立验证所有交易
  • 轻节点:只存区块头,依赖全节点提供 Merkle Proof

6.4 Mempool:交易的"候车室"

当一笔交易被广播到网络,它不会立刻进入区块。节点首先验证交易是否有效(签名正确、UTXO 未被花费等),有效则放入Mempool(内存池)。

Mempool 的三个作用:

  • 暂存区:交易在此排队等待矿工打包
  • 中继站:节点将 Mempool 中的交易继续广播给邻居
  • 手续费市场:矿工优先选择手续费高的交易打包,形成动态竞价机制
  • 双花过滤:与 Mempool 中已有交易冲突的交易会被直接拒绝

七、总结

把两篇串联起来,比特币的完整图景是这样的:

  1. 密码学提供身份体系(公私钥)和不可伪造性(签名 + 哈希)
  2. 哈希指针 + Merkle 树构建不可篡改的链式账本
  3. UTXO 模型实现无账户的去中心化记账
  4. PoW 共识用算力竞争解决"谁来记账"的问题
  5. 最长链 + 六次确认提供概率性不可逆保证
  6. P2P 网络 + Gossip 协议让交易和区块在去中心化网络中高效传播

区块链不是魔法,它是密码学、分布式系统、博弈论的精密组合。理解这些底层原理,你才能看清那些天花乱坠的"区块链项目"到底有没有实质内容。


本文整理自个人学习笔记,力求用通俗语言讲清核心概念。如有疏漏,欢迎指正。