
解读Bitcoin Script:基于栈的脚本语言及其执行模型
Bitcoin Script是一种基于栈执行的脚本语言,用于验证交易花费条件。本文从栈的概念出发,通过例子说明其执行过程,并探讨P2PKH、受限设计、BSV应用等关键点,帮助理解这一链上验证语言的核心机制。
林知衡
technical_editor
一句话理解
Bitcoin Script 是一种基于栈执行的脚本语言——数据和操作码按顺序进入栈、弹出栈、计算结果。理解“栈”这个执行模型,可以帮助你看懂 P2PKH、签名验证、哈希检查和更复杂的 BSV 脚本。
什么是栈
栈是一种后进先出的数据结构。可以想象成一摞盘子:新盘子放在最上面,取盘子时也从最上面取。最后放进去的,最先被拿出来——这就是 LIFO:Last In, First Out。
Script 执行时,数据会被推入栈,操作码会从栈中取出数据并放回结果。
一个简单例子
假设有一个脚本:
执行过程大致是:
- push 2
- push 3
- OP_ADD:弹出 2 和 3,相加得到 5,压回栈
- push 5
- OP_EQUAL:比较两个 5,结果为 true
最终结果为 true,脚本通过。真实 Bitcoin/BSV Script 的细节更多,但基本直觉就是:用栈保存中间数据,用操作码处理它们。
P2PKH 中的栈式执行
P2PKH 脚本也可以用栈来理解。Unlocking script 先提供:签名、公钥;Locking script 再执行:复制公钥、计算公钥哈希、与锁定的公钥哈希比较、验证签名。每一步都在栈上推入、弹出、比较或验证数据。这就是为什么数据顺序非常重要——如果签名和公钥顺序错了,脚本可能无法正确执行。
Script 不是 JavaScript
“Script”这个词容易误导新手。Bitcoin Script 不是 JavaScript,也不是 Python。它没有常规高级语言里的复杂运行环境,更像一种受限制的、面向验证的栈式语言。它的目的不是写任意程序,而是判断某个 output 是否可以被当前 input 花费。
为什么使用受限制脚本
Bitcoin Script 设计得相对受限,是为了让验证更可预测。区块链节点要验证大量交易,如果脚本像通用程序一样可以无限循环、访问外部网络、读写任意状态,验证成本会失控。因此,Script 更关注:哈希、签名验证、数据比较、栈操作、条件判断、受控的验证逻辑。BSV 强调恢复和使用 Bitcoin Script 的能力,但它仍然是链上验证语言,不是通用后端语言。
BSV 应用中的 Script
BSV 应用可以通过 Script 表达更丰富的花费条件。例如:
- 普通支付:要求签名。
- 多签控制:要求多个签名。
- 哈希锁:要求给出某个哈希的原像。
- Token 状态:要求符合协议转移规则。
- 凭证更新:要求发行方或持有人签名。
不过,复杂脚本会带来更高开发和调试成本。初学时应先理解 P2PKH 和 OP_RETURN,再逐步接触自定义脚本。
栈顺序的重要性
栈式语言对顺序非常敏感。例如某个操作码期待栈顶是签名,下面是公钥。如果你把顺序放反,脚本就会失败。这也是为什么手写脚本时要非常谨慎。SDK 和模板可以降低错误概率,但理解栈模型有助于调试。
新手常见误解
- Bitcoin Script 不是 JavaScript。
- Script 的核心用途是验证花费条件,不是写通用应用后端。
- 栈顺序会影响脚本结果。
- P2PKH 也是脚本执行,不是特殊账户逻辑。
- 复杂脚本需要考虑标准性、费用和矿工策略。
- 应用数据协议不应该把所有逻辑都硬塞进脚本,很多逻辑可以放在 Overlay 或应用层验证。
参考来源
推荐文章