交易环境与密码学基础

比特币单位

Satoshis(聪,简称Sats)是比特币的最小计量单位。在比特币底层协议中,所有的金额计算和记录都是以Satoshis为单位进行的。这样做是为了避免在计算机处理金融数据时,使用浮点数(即小数)可能导致的精度错误和计算复杂性。

换算关系:1 BTC=100,000,000 Sats{1} \space BTC = 100,000,000 \space {Sats}(一亿聪)

未花费的交易输出

  • UTXO(Unspent Transaction Output,未花费的交易输出)是比特币网络中所有资金存在的形式。它们不是像银行账户一样的“余额”,而更像一张张不同面值的数字钞票或收据。
  • 每个UTXO都是上一次交易的 输出 ,并被一个锁定脚本保护,直到它被用作下一笔交易的 输入 ,成为已花费的交易输出(TXO)。
  • 一个比特币钱包的“余额”不是一个存储的数字,而是该钱包地址所能 解锁和控制的所有UTXO的总和

密钥对的生成

  • 私钥(Private Key,KpriK_{pri}):Alice首先随机选择一个256位的随机数作为私钥。这是Alice对比特币资金 独一无二的所有权证明

  • 公钥(Public Key,KpubK_{pub}):通过在特定的椭圆曲线(secp256k1)上对私钥KpriK_{pri}进行单向数学运算(即椭圆曲线点乘),生成对应的公钥KpubK_{pub}

    Kpub=Kpri×GK_{pub} = K_{pri} \times G(其中GG为椭圆曲线的基点)

  • 比特币地址(Address):公钥KpubK_{pub}经过两次单向哈希函数(SHA-256后接RIPEMD-160)运算,得到一个 公钥哈希(PKH) ,然后经过编码(如Base58Check编码),形成Alice的比特币地址。

锁定资金:交易输出的构建

  1. 交易结构概述

    一笔交易的核心在于:消费一个或多个旧的UTXO(作为输入),并创造一个或多个新的UTXO(作为输出)。

    Transaction T={Input1,Input2,}{OutputA,OutputB,}Transaction \space T = \{ Input_1, Input_2, \dots \} \rightarrow \{ Output_A, Output_B, \dots \}

  2. 资金的锁定

    当Alice收到一笔X SatoshisX \space Satoshis的比特币时,这笔钱被作为Output记录在区块链上。其核心是 锁定脚本

    • 锁定脚本(ScriptPubKey): 定义了花费这X SatsX \space Sats所必须满足的条件。

    • 最常见形式:P2PKH(Pay-to-Public-Key-Hash)

      ScriptPubKeyAlice=OP_DUP OP_HASH160 [PKHAlice] OP_EQUALVERIFY OP_CHECKSIG{ScriptPubKey}_{Alice} = {OP\_DUP} \space {OP\_HASH160} \space [{PKH}_{Alice}] \space {OP\_EQUALVERIFY} \space {OP\_CHECKSIG}

    • 该脚本将资金锁定在Alice的地址哈希(PKH)上。只有能提供与此PKH匹配的 公钥 和有效 数字签名 的人才能解锁。

花费资金:新交易的创建与签名

交易输入的构建

Alice想要给Bob支付Y SatoshisY \space Satoshis,她必须选择一个或多个她拥有的UTXO作为Input。每个Input必须提供 解锁脚本

ScriptSigAlice=[σ][Kpub of Alice]{ScriptSig}_{Alice} = [{\sigma}] [{K}_{pub \space of \space Alice}]

解锁脚本(ScriptSig)是Alice填入的解锁条件(钥匙)。其中σ\sigma是Alice用私钥生成的数字签名。

ECDSA签名

这是证明所有权的关键步骤。Alice使用她的私钥Kpri of AliceK_{pri \space of \space Alice}待广播的交易数据 进行签名。

  1. 消息摘要:Alice对Transaction TTransaction \space T中除ScriptSig外的全部数据进行哈希运算(SHA-256两次),生成一个交易摘要zz,即:z=Hash(T data)z = {Hash}(T \space {data})
  2. 生成签名:Alice执行 ECDSA签名算法 Sign(z,Kpri of Alice){Sign}(z, K_{pri \space of \space Alice}),得到数字签名σ=(r,s)\sigma = (r, s)(两个整数)。
  3. 核心安全保障:签名过程中使用了Alice的私钥和一个随机数kk。由于KpriK_{pri}只有Alice知道,因此只有Alice能生成有效的签名。

矿工验证:脚本的执行与验证

脚本堆栈的构建

矿工将Alice提供的 解锁脚本(ScriptSig)和上一个交易中为该UTXO设置的 锁定脚本(ScriptPubKey)组合,并在一个基于栈(Stack-based)的虚拟机中执行。

脚本执行流程

以P2PKH为例,栈的执行过程大致如下:

  1. 执行ScriptSig: 将Alice的σ\sigmaKpubK_{pub}压入栈。栈(由底到顶):[σ],[Kpub][\sigma], [K_{pub}]

  2. 执行ScriptPubKey的指令:

    • OP_DUP{OP\_DUP}:复制栈顶元素(公钥),栈:[σ],[Kpub],[Kpub][\sigma], [K_{pub}], [K_{pub}]
    • OP_HASH160{OP\_HASH160}:对新复制的公钥[Kpub][K_{pub}]进行RIPEMD-160哈希运算,得到 PKH{PKH}'。 栈:[σ],[Kpub],[PKH][\sigma], [K_{pub}], [{PKH}']
    • [PKHAlice][{PKH}_{Alice}]:将Alice锁定时的原始公钥哈希PKH{PKH}压入栈。 栈:[σ],[Kpub],[PKH],[PKH][\sigma], [K_{pub}], [{PKH}'], [{PKH}]
    • OP_EQUALVERIFY{OP\_EQUALVERIFY}:比较PKH{PKH}'PKH{PKH},如果相等则弹出。如果它们不相等,则脚本立即失败,交易无效。(验证Alice提供的公钥KpubK_{pub}确实对应着这个UTXO被锁定的地址)。
    • OP_CHECKSIG{OP\_CHECKSIG}:执行 ECDSA验证算法 ,使用Alice提供的公钥KpubK_{pub}和数字签名 σ\sigma来验证交易摘要zz,即:Verify(z,σ,Kpub){Verify}(z, \sigma, K_{pub})。如果验证通过,则在栈顶压入TRUE
  3. 最终判定

  • 如果脚本最终成功执行,且栈顶结果为TRUE,则该输入解锁成功,交易有效。
  • 矿工确认所有输入都有效、且未被双重花费后,即可将交易打包到区块中。

总结

比特币交易的核心是一套基于密码学和脚本语言的 “花钱-锁钱” 机制。

  1. 资产模型的核心:UTXO

    • 比特币摒弃了传统的账户余额模型,采用 UTXO(未花费的交易输出)模型
    • 本质:资金以一个个独立的、像“数字收据”一样的UTXO形式存在。
    • 交易行为:一笔交易的发生,即是消耗(解锁)一个或多个旧的UTXO(作为输入),同时创造(锁定)一个或多个新的UTXO(作为输出)。
  2. 安全保障的核心:ECDSA签名与脚本

    比特币所有权和交易有效性由 非对称密码学 保障,核心是 ECDSA(椭圆曲线数字签名算法)

    • 锁定机制:交易输出(新的UTXO)被一个锁定脚本保护,该脚本通常包含接收方地址的哈希值。
    • 解锁机制:花费资金时,发送方必须提供数字签名和公钥作为解锁脚本。该签名由其私钥对整个交易数据进行ECDSA运算产生。
    • 矿工验证:矿工将ScriptSig和ScriptPubKey结合,运行脚本虚拟机。脚本成功执行(即ECDSA验证通过)是交易被视为有效的 唯一标准
  3. 双重支付的解决

    • 如何解决:通过UTXO模型和最长链原则。
    • UTXO的作用:UTXO确保了每个“数字钞票”只能被花费一次。一旦一个UTXO被用作输入,它就永远失效了。
    • 矿工的作用:矿工在验证时,会检查Alice用作输入的UTXO是否已经被包含在区块链的任何一个区块中(即是否已被花费)。如果Alice尝试将同一个UTXO用于两笔交易(双重支付),矿工只会接受其中一个被优先广播和确认的交易。