北京大学肖臻老师《区块链技术与应用》公开课第 9 讲的主题是**"比特币的脚本"**。本课深入探讨了比特币交易的底层结构、输入输出的关联以及脚本执行的逻辑。
以下是根据视频内容及你提供的图片进行的详细总结:
一、 比特币交易的宏观结构
比特币的交易并非简单的" A 转账给 B ",而是一个包含多个字段的复杂 JSON 对象。
- 基础元数据 :包括交易 ID (
txid)、版本号、大小 (size) 和锁定时间 (locktime)。 - 确认数 (
confirmations):表示该交易所在区块之后已经产生了多少个区块,确认数越多,交易越不可篡改。 - 输入 (
vin) 与输出 (vout):这是交易的核心,每一笔交易都是将之前的输出作为现在的输入,并产生新的输出。
二、 交易的输入与输出细节
比特币通过脚本系统实现了资金的转移和锁定。
1. 交易输入 (vin)
- 引用来源 :每个输入必须指明资金来源,即前一笔交易的 ID (
txid) 和对应的输出索引 (vout)。 - 解锁脚本 (
scriptSig):包含发送者的数字签名和公钥,用于证明对这笔资金的所有权。
2. 交易输出 (vout)
- 金额 (
value):该输出对应的比特币数量。 - 锁定脚本 (
scriptPubKey):定义了花费这笔钱的条件,通常要求提供能与特定公钥哈希匹配的签名。 - 地址 (
addresses):虽然代码中显示为地址,但本质上是公钥哈希的 Base58 编码。
三、 脚本执行逻辑:P2PKH
比特币最常见的交易类型是 P2PKH (Pay-to-Pubkey-Hash)。其验证过程是将当前交易的 scriptSig 和前一笔交易的 scriptPubKey 拼接在一起执行。
执行步骤如下(基于栈的操作):
- PUSHDATA(Sig):将签名压入栈。
- PUSHDATA(PubKey):将公钥压入栈。
- DUP:复制栈顶的公钥。
- HASH160:将栈顶公钥进行哈希处理。
- PUSHDATA(PubKeyHash):将预期的公钥哈希(来自锁定脚本)压入栈。
- EQUALVERIFY:比较两个哈希值是否一致。如果不一致,脚本执行失败。
- CHECKSIG :利用栈中的公钥验证签名的有效性。如果验证通过,返回 TRUE,交易合法。
四、 全节点在脚本系统中的角色
全节点是脚本执行的实际操作者:
- 验证合法性:全节点通过执行上述脚本,验证网络上每一笔交易的输入是否真实引用了有效的 UTXO,以及签名是否正确。
- 维护 UTXO 集合 :为了提高验证效率,全节点在内存中维护 UTXO 集合,这样在收到新交易时,无需扫描整个硬盘账本即可确认资金是否已被花费。
- 决定打包逻辑:全节点在验证脚本通过后,才会将交易放入交易池,并决定是否将其打包进下一个区块。
五、 核心名词总结
- ScriptSig:解锁脚本,证明"我有权花这笔钱"。
- ScriptPubKey:锁定脚本,规定"谁能花这笔钱"。
- Stack-based Language:比特币脚本是一种简单的、非图灵完备的、基于栈的编程语言,这种设计是为了安全,防止死循环攻击。
- UTXO (Unspent Transaction Output):尚未被花费的交易输出,是比特币账本的基本组成单位。
