比特币原理与实现:UTXO、挖矿与脚本

FreeGuideOnline 最新 2026-06-15

比特币是什么:一个去中心化的价值传输网络

比特币不只是一串数字,它是一套完整的价值传输协议。你可以把它理解为一个全球共享的账本,任何人都可以查看,但没有人能随意篡改。这个账本记录的不是“张三有5个比特币”,而是“某次交易产生了5个比特币,当前这5个比特币被某个条件锁定,只有满足条件的人才能解锁使用”。

理解比特币,需要抓住三个核心支柱:UTXO模型(账本的数据结构)、挖矿(账本如何达成共识并安全更新)和脚本(决定谁能动用资金的智能锁)。下面我们逐一深入。


UTXO:比特币的“硬币”模型

为什么不用余额账户?

在传统银行系统中,你的账户就是一个数字余额。比特币则完全不同,它没有账户概念,只有UTXO(Unspent Transaction Output,未花费的交易输出)。每个UTXO就像一张印有面额和锁定条件的支票,整条链就是这些支票的流转记录。

理解交易输出

一笔比特币交易由输入和输出构成。输出就是新产生的UTXO,里面包含两个关键字段:

  • 面值(value):以“聪”(satoshi)为单位的比特币数量,1 BTC = 100,000,000 聪。
  • 锁定脚本(scriptPubKey):一段代码,规定谁、在什么条件下可以花费这个输出。

例如,一个经典的支付到公钥哈希(P2PKH)输出的锁定脚本长这样:

OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

它意味着:要花费这笔钱,你必须提供对应私钥的签名和公钥,且公钥哈希与指定的哈希值一致。

花费一个UTXO

当你想转账时,你的钱包会挑选你掌控的若干UTXO作为交易输入,并为每个输入提供解锁脚本(scriptSig)(包含签名和公钥)。区块链节点会按顺序执行解锁脚本和锁定脚本拼接后的完整脚本,如果执行结果为真,则验证通过,意味着你有权花费这笔资金。

交易输出可以创建新的UTXO给接收者,以及一个找零UTXO返回给自己。未被花费的UTXO集合(UTXO set)就是当前比特币“流通总量”的直接体现,也是全节点维持的状态。


挖矿:如何不靠中心化达成共识

为什么需要挖矿?

如果任何人都可以随便打包交易出块,系统会立刻分裂。比特币通过工作量证明(Proof-of-Work, PoW) 机制,让参与者必须付出现实世界的计算成本来竞争记账权,从而确保网络的安全和一致。

挖矿的三个核心步骤

  1. 组装候选区块
    矿工从内存池(mempool)中收集大量待确认交易,按优先级或费率排序,添加一笔创币交易(coinbase交易)把自己的地址写成奖励接收者,然后构造区块头。

  2. 区块头与哈希难题
    区块头包含:版本号、上一个区块哈希、Merkle根(所有交易的指纹)、时间戳、难度目标(nBits)、以及一个随机数(nonce)。矿工不断修改nonce(或者额外修改coinbase的extranonce),对区块头进行双重SHA-256哈希运算,直到找到一个哈希值小于目标值。这个目标值难度极大,需要成万亿次尝试,但验证起来只需一次哈希。

  3. 传播与确认
    找到合法区块后,矿工立刻广播全网。其他节点验证所有交易和PoW是否正确,验证通过后将该区块接入自己本地的链上,并开始基于这个最新区块继续挖掘。平均每10分钟产生一个新区块,一旦一个交易被多个后续区块覆盖,它就获得了“区块确认”,几乎无法逆转。

难度调整与经济激励

比特币协议每2016个区块(约两周)自动调整一次挖矿难度,使得平均出块时间稳定在10分钟。全网算力越高,难度越大。矿工的收入来自两部分:区块奖励(目前是3.125 BTC,每21万个区块减半一次)和交易手续费。随着时间推移,手续费将逐渐成为主要激励,保障了比特币网络即便区块奖励归零后仍能维持安全。


解锁与锁定:比特币的智能脚本系统

比特币脚本是一门语言

比特币使用的是一门基于堆栈的、非图灵完备的脚本语言,叫做Script。它故意不支持循环,以防止死循环攻击。脚本由一系列操作码组成,操作数据可以是常量或临时堆栈数据。当接收一笔转账时,你就在输出的锁定脚本中定义了资金的使用条件。

两类脚本的组合执行

验证一笔交易时,系统将当前交易的输入解锁脚本(scriptSig)与被引用的UTXO的锁定脚本(scriptPubKey)拼接起来,按顺序执行:

<scriptSig> <scriptPubKey>

脚本在栈上操作,执行后如果栈顶元素为真(非零),则花费成功。

常见脚本类型示例

  1. P2PKH(支付到公钥哈希)

    • 锁定脚本:OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
    • 解锁脚本:<Signature> <PublicKey>
      执行过程:先入栈签名和公钥,复制公钥并哈希,与给定的哈希值对比,若一致则最后用公钥验证签名。这是最经典的地址格式(1开头)。
  2. P2SH(支付到脚本哈希)

    • 锁定脚本:OP_HASH160 <RedeemScriptHash> OP_EQUAL
    • 解锁脚本:<Signatures> <RedeemScript>
      执行时哈希赎回脚本并验证是否与给定哈希匹配,匹配后还会将赎回脚本作为指令执行。P2SH使复杂条件(如多重签名)的编写更灵活,费用更低,地址以3开头(或部分以bc1开头)。
  3. P2WPKH(隔离见证)
    将签名等见证数据从脚本中分离,解决了交易延展性问题,并减少交易体积。地址通常以bc1q开头。

  4. 多重签名
    脚本设定m-of-n条件,如2 <PubKey1> <PubKey2> <PubKey3> 3 OP_CHECKMULTISIG,要求提供至少两个对应私钥的签名才能花费。在企业共管金库、闪电网络等场景中大量使用。

非图灵完备的设计哲学

比特币脚本不能实现任意循环或复杂逻辑,牺牲了一部分表达能力,但换来了极高的安全可预测性。更复杂的智能合约则放到第二层网络(如闪电网络、RGB协议)去实现。


将一切串联:一笔交易的旅程

假设Alice要支付0.05 BTC给Bob。

  1. 选择输入:Alice的钱包扫描UTXO集,找到她可控的一个面额为0.1 BTC的UTXO(来自之前收到的交易)。
  2. 构建交易
    • 输入:引用那个0.1 BTC的UTXO,并提供解锁脚本(签名+公钥)。
    • 输出1:0.05 BTC,锁定脚本指向Bob的地址(公钥哈希)。
    • 输出2:0.0499 BTC(找零),锁定脚本指向Alice自己的找零地址。差额0.0001 BTC作为矿工费。
  3. 签名:对交易进行哈希,用Alice的私钥生成该输入的签名。签名确认交易的完整性和授权。
  4. 广播:交易被发到邻近节点,逐步扩散到全网的矿工内存池。
  5. 挖矿打包:矿工将该交易和其他交易一起打包进候选区块,不断尝试nonce求解。
  6. 确认:幸运矿工找到有效区块并广播,网络节点验证后接受该区块。Bob的钱包看到1个确认,基本认为款项到账。随着更多区块叠加,交易确定性指数级增长。

深入学习路线

  • 阅读比特币白皮书《Bitcoin: A Peer-to-Peer Electronic Cash System》,奠定理论基础。
  • 使用Bitcoin Core客户端与bitcoin-cli命令行工具,亲手创建交易、解码脚本。
  • 在测试网络(testnet)上尝试创建P2SH多重签名地址、构造时间锁交易。
  • 学习《Programming Bitcoin》或《Mastering Bitcoin》第二版,理解更底层的椭圆曲线签名和序列化格式。

掌握UTXO、挖矿与脚本,就掌握了比特币这座大厦的筋与骨。无论你是开发者、产品经理还是投资者,这些核心机制都将为你提供最坚实的理解框架。