比特币交易机制:UTXO模型与ECDSA算法
交易环境与密码学基础
比特币单位
Satoshis(聪,简称Sats)是比特币的最小计量单位。在比特币底层协议中,所有的金额计算和记录都是以Satoshis为单位进行的。这样做是为了避免在计算机处理金融数据时,使用浮点数(即小数)可能导致的精度错误和计算复杂性。
换算关系:(一亿聪)
未花费的交易输出
- UTXO(Unspent Transaction Output,未花费的交易输出)是比特币网络中所有资金存在的形式。它们不是像银行账户一样的“余额”,而更像一张张不同面值的数字钞票或收据。
- 每个UTXO都是上一次交易的 输出 ,并被一个锁定脚本保护,直到它被用作下一笔交易的 输入 ,成为已花费的交易输出(TXO)。
- 一个比特币钱包的“余额”不是一个存储的数字,而是该钱包地址所能 解锁和控制的所有UTXO的总和 。
密钥对的生成
-
私钥(Private Key,):Alice首先随机选择一个256位的随机数作为私钥。这是Alice对比特币资金 独一无二的所有权证明 。
-
公钥(Public Key,):通过在特定的椭圆曲线(secp256k1)上对私钥进行单向数学运算(即椭圆曲线点乘),生成对应的公钥。
(其中为椭圆曲线的基点)
-
比特币地址(Address):公钥经过两次单向哈希函数(SHA-256后接RIPEMD-160)运算,得到一个 公钥哈希(PKH) ,然后经过编码(如Base58Check编码),形成Alice的比特币地址。
锁定资金:交易输出的构建
-
交易结构概述
一笔交易的核心在于:消费一个或多个旧的UTXO(作为输入),并创造一个或多个新的UTXO(作为输出)。
-
资金的锁定
当Alice收到一笔的比特币时,这笔钱被作为Output记录在区块链上。其核心是 锁定脚本 :
-
锁定脚本(ScriptPubKey): 定义了花费这所必须满足的条件。
-
最常见形式:P2PKH(Pay-to-Public-Key-Hash)
-
该脚本将资金锁定在Alice的地址哈希(PKH)上。只有能提供与此PKH匹配的 公钥 和有效 数字签名 的人才能解锁。
-
花费资金:新交易的创建与签名
交易输入的构建
Alice想要给Bob支付,她必须选择一个或多个她拥有的UTXO作为Input。每个Input必须提供 解锁脚本 :
解锁脚本(ScriptSig)是Alice填入的解锁条件(钥匙)。其中是Alice用私钥生成的数字签名。
ECDSA签名
这是证明所有权的关键步骤。Alice使用她的私钥对 待广播的交易数据 进行签名。
- 消息摘要:Alice对中除ScriptSig外的全部数据进行哈希运算(SHA-256两次),生成一个交易摘要,即:。
- 生成签名:Alice执行 ECDSA签名算法 ,得到数字签名(两个整数)。
- 核心安全保障:签名过程中使用了Alice的私钥和一个随机数。由于只有Alice知道,因此只有Alice能生成有效的签名。
矿工验证:脚本的执行与验证
脚本堆栈的构建
矿工将Alice提供的 解锁脚本(ScriptSig)和上一个交易中为该UTXO设置的 锁定脚本(ScriptPubKey)组合,并在一个基于栈(Stack-based)的虚拟机中执行。
脚本执行流程
以P2PKH为例,栈的执行过程大致如下:
-
执行ScriptSig: 将Alice的和压入栈。栈(由底到顶):
-
执行ScriptPubKey的指令:
- :复制栈顶元素(公钥),栈:
- :对新复制的公钥进行RIPEMD-160哈希运算,得到 。 栈:
- :将Alice锁定时的原始公钥哈希压入栈。 栈:
- :比较与,如果相等则弹出。如果它们不相等,则脚本立即失败,交易无效。(验证Alice提供的公钥确实对应着这个UTXO被锁定的地址)。
- :执行 ECDSA验证算法 ,使用Alice提供的公钥和数字签名 来验证交易摘要,即:。如果验证通过,则在栈顶压入
TRUE
。
-
最终判定
- 如果脚本最终成功执行,且栈顶结果为
TRUE
,则该输入解锁成功,交易有效。 - 矿工确认所有输入都有效、且未被双重花费后,即可将交易打包到区块中。
总结
比特币交易的核心是一套基于密码学和脚本语言的 “花钱-锁钱” 机制。
-
资产模型的核心:UTXO
- 比特币摒弃了传统的账户余额模型,采用 UTXO(未花费的交易输出)模型。
- 本质:资金以一个个独立的、像“数字收据”一样的UTXO形式存在。
- 交易行为:一笔交易的发生,即是消耗(解锁)一个或多个旧的UTXO(作为输入),同时创造(锁定)一个或多个新的UTXO(作为输出)。
-
安全保障的核心:ECDSA签名与脚本
比特币所有权和交易有效性由 非对称密码学 保障,核心是 ECDSA(椭圆曲线数字签名算法) 。
- 锁定机制:交易输出(新的UTXO)被一个锁定脚本保护,该脚本通常包含接收方地址的哈希值。
- 解锁机制:花费资金时,发送方必须提供数字签名和公钥作为解锁脚本。该签名由其私钥对整个交易数据进行ECDSA运算产生。
- 矿工验证:矿工将ScriptSig和ScriptPubKey结合,运行脚本虚拟机。脚本成功执行(即ECDSA验证通过)是交易被视为有效的 唯一标准 。
-
双重支付的解决
- 如何解决:通过UTXO模型和最长链原则。
- UTXO的作用:UTXO确保了每个“数字钞票”只能被花费一次。一旦一个UTXO被用作输入,它就永远失效了。
- 矿工的作用:矿工在验证时,会检查Alice用作输入的UTXO是否已经被包含在区块链的任何一个区块中(即是否已被花费)。如果Alice尝试将同一个UTXO用于两笔交易(双重支付),矿工只会接受其中一个被优先广播和确认的交易。