区块链基础(下):比特币的共识与运行机制
上篇我们讲了密码学和数据结构这两块"建筑材料"。这一篇我们把它们组装起来,看看比特币这条链到底是怎么跑起来的。
一、数字货币的两个根本问题
任何数字货币系统,不管去不去中心化,都必须回答两个问题:
- 谁来发行货币? —— 谁有权"印钱"?
- 怎么防双花攻击? —— 同一笔钱不能被花两次
传统银行体系里,央行发行货币,银行数据库记录余额,双花问题由中心化账本解决——你转账后余额扣减,不可能再花一次。
在没有中心化账本的去中心化网络里,这两个问题怎么解决?比特币的答案是:用交易本身来追溯币的来源。
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),定义"满足什么条件才能花这笔钱"。
一个完整的交易验证过程:
- 锁定脚本(位于输出中):声明花费条件,比如"提供与公钥 X 匹配的签名"
- 解锁脚本(位于输入中):提供满足条件的数据——签名和公钥
- 验证时,将解锁脚本和锁定脚本拼接执行。如果执行成功且结果为 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 中已有交易冲突的交易会被直接拒绝
七、总结
把两篇串联起来,比特币的完整图景是这样的:
- 密码学提供身份体系(公私钥)和不可伪造性(签名 + 哈希)
- 哈希指针 + Merkle 树构建不可篡改的链式账本
- UTXO 模型实现无账户的去中心化记账
- PoW 共识用算力竞争解决"谁来记账"的问题
- 最长链 + 六次确认提供概率性不可逆保证
- P2P 网络 + Gossip 协议让交易和区块在去中心化网络中高效传播
区块链不是魔法,它是密码学、分布式系统、博弈论的精密组合。理解这些底层原理,你才能看清那些天花乱坠的"区块链项目"到底有没有实质内容。
本文整理自个人学习笔记,力求用通俗语言讲清核心概念。如有疏漏,欢迎指正。