比特币交易是比特币系统中最重要的组成部分,它是价值转移的载体,记录了参与者之间的资产流动。本章将深入解析交易的数据结构、创建与验证过程,以及如何将交易永久记录在区块链中。
交易的本质与重要性
交易是对比特币系统参与者之间价值转移进行编码的数据结构。每一笔交易都是比特币区块链上的公开记录,构成了全球复式簿记账本的一部分。比特币网络中的所有其他机制都是为了确保交易能够被创建、传播、验证并最终添加到这个分布式账本中。
交易的实际结构
当我们使用区块链浏览器查看交易时,通常会看到简化的信息展示,如发送方和接收方的比特币地址。然而,这些高层次结构实际上并不直接存在于比特币系统中。
通过Bitcoin Core的命令行界面可以检索到交易的"原始"数据,这些数据包含多个字段和十六进制字符串,而不是我们熟悉的地址和余额概念。
交易输入与输出详解
交易输出(UTXO)
交易输出是比特币交易的基本构建块,代表了不可分割的比特币货币单位,被整个网络识别为有效。每个比特币全节点都会跟踪所有可用和可花费的输出,这些被称为未花费的交易输出(UTXO)。
UTXO集合的大小随着新UTXO的创建而增长,随着UTXO被消费而缩小。每笔交易都表示UTXO集合的状态变化。
交易输出的关键特性:
- 价值以整聪(satoshi)为单位(1比特币=1亿聪)
- 一旦创建就不可分割
- 只能被交易全部花费,如需找零必须创建新的输出
交易输入
交易输入通过引用标识要使用的UTXO,并通过解锁脚本提供所有权证明。每个输入包含三个主要部分:
- 指向UTXO的指针(交易哈希和输出索引)
- 解锁脚本(通常包含数字签名和公钥)
- 序列号(用于高级功能)
交易费用机制
大多数交易都包含交易费用,用于激励比特币矿工并确保网络安全。费用不是强制性的,但足够高的费用可以鼓励矿工优先处理交易。
费用计算方式
交易费用基于交易数据的大小(以字节为单位)计算,而不是基于交易的价值。费用计算公式为:
费用 = 所有输入值的总和 - 所有输出值的总和动态费用估算
由于比特币网络容量限制,固定费用已不再可行。现代钱包和应用通常使用动态费用估算算法,根据网络拥堵情况和市场竞争情况计算适当的费用率(每字节多少聪)。
费用估算服务通常会提供高、中、低三个优先级选项,对应不同的确认时间和费用水平。
交易脚本与脚本语言
比特币使用一种基于堆栈的脚本语言称为Script,这是一种类似Forth的逆波兰表示法执行语言。脚本语言用于编写锁定脚本(定义花费条件)和解锁脚本(提供花费证明)。
脚本执行原理
脚本语言通过从左到右处理每个项目来执行。数字被推入堆栈,操作符从堆栈中弹出一个或多个参数执行操作,并将结果推回堆栈。
验证节点会分别执行解锁脚本和锁定脚本。只有解锁脚本满足锁定脚本条件时,输入才被视为有效。
支付到公钥哈希(P2PKH)
最常见的交易类型使用P2PKH脚本,其锁定脚本形式为:
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG对应的解锁脚本包含签名和公钥:
<签名> <公钥>当这两个脚本组合执行时,会验证签名是否与公钥哈希匹配,从而证明花费者拥有相应的私钥。
数字签名(ECDSA)技术
比特币使用椭圆曲线数字签名算法(ECDSA)来创建和验证数字签名。数字签名在比特币中有三个主要用途:
- 证明资金所有者授权支出
- 提供不可否认的授权证明
- 保证交易在签名后未被修改
签名创建与验证
签名创建使用私钥对交易哈希进行加密运算,产生R和S两个值。签名验证则使用公钥、签名和交易哈希来验证签名的有效性,而无需暴露私钥。
SIGHASH类型
SIGHASH标志决定了交易的哪些部分被包含在签名哈希中,主要有三种类型:
- SIGHASH_ALL:签名所有输入和输出
- SIGHASH_NONE:签名所有输入,不签名任何输出
- SIGHASH_SINGLE:签名所有输入,但只签名与输入索引相同的输出
这些标志可以与SIGHASH_ANYONECANPAY组合使用,实现更复杂的签名方案。
常见问题
比特币地址和余额是如何产生的?
比特币地址是从交易脚本中的公钥哈希通过Base58Check编码生成的。余额则是钱包应用通过扫描区块链,汇总所有属于用户的可花费UTXO计算得出的,并不直接存在于比特币系统中。
为什么交易输入必须引用之前的UTXO?
比特币采用UTXO模型,每笔新交易都必须消费之前交易的输出。这种设计确保了比特币的来源可追溯,并且可以验证每个UTXO的合法性。
交易费用是如何确定的?
交易费用由市场供需决定。当网络拥堵时,用户需要支付更高的费用以获得优先处理。费用计算基于交易大小而不是交易价值,这使得小额支付和大额支付的成本差异主要取决于交易的复杂程度。
什么是脚本执行的无状态特性?
比特币脚本执行是无状态的,执行前没有状态,执行后也不保存状态。所有执行所需信息都包含在脚本自身中,这确保了在任何系统上执行结果都一致,提高了系统的可预测性和安全性。
为什么数字签名中的随机性如此重要?
如果在不同交易中使用相同的随机值k生成签名,攻击者可以计算出私钥。因此必须使用确定性随机算法(RFC 6979)为每笔交易生成不同的k值,确保私钥安全。
区块链浏览器如何显示交易信息?
区块链浏览器通过解析交易数据,提取公钥哈希并将其编码为比特币地址格式。余额信息则是通过索引和汇总所有相关UTXO计算得出的,需要实时更新和维护UTXO集合。
通过本章的学习,我们对比特币交易的核心机制有了深入理解。从UTXO模型到脚本执行,从数字签名到交易费用,每个环节都体现了比特币系统的精巧设计。这些基础概念为我们进一步探索更复杂的比特币功能和应用打下了坚实基础。