比特币脚本是比特币网络内置的一种基于堆栈的、非图灵完备的编程语言。它通过在交易输出中设定“锁定脚本”来规定花费条件,在花费时提供“解锁脚本”来满足条件。网络节点通过执行两者组合成的程序来验证交易合法性,从而实现了从简单的单签名支付到复杂的多重签名、时间锁等多种条件性交易逻辑。

1.核心概念
要理解比特币脚本,首先需要跳出将比特币交易简单视为账户间转账的思维。在比特币底层,每一笔“钱”都是一个未花费交易输出,它并非绑定在某个账户名下,而是被一个公开的程序(脚本)锁定着。
这个锁定程序,就是比特币脚本的核心部分之一:scriptPubKey(公钥脚本),你可以把它想象成一个保险箱上的密码锁。而花费这笔钱时,你需要提供的解锁数据,是scriptSig(签名脚本),它相当于开锁的钥匙。
整个验证过程由比特币网络中的全节点自动执行。节点会将scriptSig和scriptPubKey按顺序组合,形成一个完整的程序,然后在虚拟机中逐条运行。如果程序最终在堆栈顶部留下一个非零值(通常为“True”或“1”),则验证通过,交易有效;否则,交易被拒绝。
这种设计的革命性在于,它用可编程的条件替代了传统的账户身份验证。所有权不再由“账户名”决定,而是由“谁能满足这个输出上设定的条件”来决定。这使得比特币脚本成为了价值转移规则的终极载体。
2.运行原理
比特币脚本采用一种简洁的基于堆栈的执行模型。你可以将“堆栈”想象成一摞盘子,数据(如数字、签名、公钥)像盘子一样被一个个压入栈顶,操作码(OP_CODE)则负责处理栈顶的数据。
脚本的执行严格遵循从左到右的顺序,且是确定性的——不存在循环或跳转指令,因此其执行时间和结果是可预测的,这从根本上杜绝了无限循环等安全隐患,也是其“非图灵完备”特性的体现。
以常见的“支付到公钥哈希”脚本为例,其执行流程清晰地展现了堆栈的运作:
解锁方提供的签名和公钥被先后压入堆栈。
执行OP_DUP,复制栈顶的公钥。
执行OP_HASH160,对复制出的公钥进行哈希计算,结果压回栈顶。
将锁定脚本中预设的公钥哈希压入堆栈。
执行OP_EQUALVERIFY,验证两个哈希值是否一致。若不一致,脚本直接失败。
执行OP_CHECKSIG,用公钥验证签名。验证成功,则在栈顶留下“1”(True)。
整个过程中,比特币脚本虚拟机不关心参与者的身份,只机械地验证数据逻辑。这种去信任的验证机制,是比特币系统安全与自治的基石。

1.基础条件:所有权证明
最基础的条件是“证明对应私钥的所有权”,通过OP_CHECKSIG操作码实现。无论是早期的P2PK(支付到公钥),还是目前主流的P2PKH(支付到公钥哈希),其核心都是要求花费者提供一个有效的数字签名,以证明他控制了相应的私钥。这是最基本也是最重要的条件性。
2.进阶条件:多重签名与时间锁
脚本的能力远不止于此。通过OP_CHECKMULTISIG操作码,可以实现M-of-N多重签名。例如,一个公司保险柜可以设置为5个董事中至少3人签名才能动用资金。这通过在锁定脚本中预设N个公钥和要求的最小签名数M来实现。
另一个关键特性是时间锁,分为两类:
nLockTime(交易级别时间锁):使整笔交易在某个特定区块高度或时间戳之后才有效。
OP_CHECKSEQUENCEVERIFY/OP_CHECKLOCKTIMEVERIFY(脚本级别时间锁):可以在脚本中设定更精细的条件,如“这笔钱在锁定后1000个区块内不能被花掉,但1000个区块后可以由A单方面取出”。
3.高阶封装:支付到脚本哈希
P2SH是提升比特币脚本灵活性与效率的关键创新。在P2SH交易中,锁定脚本不再包含冗长的复杂条件,而是简化为“谁提供了能哈希成这个特定值的脚本,并满足该脚本中的条件,谁就可以花费”。
这带来了两大好处:
发送者负担减轻:复杂脚本的存储和费用成本,从创建输出的发送方转移到了花费输出的接收方。
隐私性增强:在资金被花费前,复杂的赎回条件(如多重签名的成员和阈值)是完全隐藏的,仅以哈希形式存在。

随着比特币的发展,其脚本应用也演化出几种高度标准化、广泛使用的模式,它们平衡了功能、安全性与效率。
| 脚本类型 | 缩写 | 核心锁定条件 | 地址前缀(主网) | 特点与用途 |
|---|---|---|---|---|
| 支付到公钥哈希 | P2PKH | 用一个公钥哈希锁定,需对应签名 | 1 | 最经典、最广泛接受的格式,兼容性最佳。 |
| 支付到脚本哈希 | P2SH | 用一个赎回脚本的哈希锁定,需提供匹配脚本并满足其条件 | 3 | 实现了复杂条件的封装,支持多重签名、P2WSH嵌套等。 |
| 原生隔离见证支付到公钥哈希 | P2WPKH | SegWit版本的公钥哈希支付,将签名数据移至“见证”字段 | bc1q | 费用更低,修复了交易延展性,签名验证效率更高。 |
| 原生隔离见证支付到脚本哈希 | P2WSH | SegWit版本的脚本哈希支付,用于复杂条件 | bc1q | 具备P2WPKH所有优点,且能承载更复杂、体积更大的脚本。 |
2017年激活的隔离见证是一次重大升级,它通过将签名数据(见证数据)从交易主体中分离出来,创造了新的脚本类型P2WPKH和P2WSH。
这不仅解决了交易延展性问题,还带来了容量提升和手续费降低。重要的是,它为后续的闪电网络等二层扩展方案铺平了道路。这些新脚本的验证逻辑更为高效,代表了比特币脚本发展的未来方向。
比特币脚本语言在设计上有着明确的自我限制。它被设计为非图灵完备,这意味着它不支持循环或递归等复杂逻辑。这并非缺陷,而是一种深思熟虑的安全权衡:它保障了脚本的执行必然是有限、可预测且快速的,避免了因无限循环导致的网络资源耗尽攻击,保障了整个网络的稳定与安全。
同时,脚本语言的操作码集合是受限的,中本聪最初禁用了一些可能带来安全风险的复杂操作码。这种保守性使得比特币主网极其稳健,但也将更复杂的智能合约功能留给了以太坊等其他区块链。
当前,比特币开发者社区的研究重点已不局限于主链脚本的复杂化。扩展比特币交易条件性的主战场正转向二层网络:
闪电网络:利用HTLC哈希时间锁合约,在链下实现近乎即时、海量且极低成本的小额支付,其条件性逻辑比主链脚本更为复杂和精巧。
Taproot升级:通过引入Schnorr签名和Merkle化脚本,使得无论多重签名条件多么复杂,在链上呈现时都可以与普通单签名交易无异,提升了隐私性和效率。
未来,比特币脚本的进化很可能将持续遵循“主链稳健、二层创新”的路径。主链脚本作为价值存储和清算的最终安全基石,其变化将极其审慎;而承载复杂交易条件性和创新应用的任务,将由建立在脚本原语之上的二层协议来承担。

比特币脚本作为比特币系统的核心创新,成功地将可编程性与价值转移相结合,奠定了去中心化数字货币的基石。它为多重签名、时间锁等高级金融逻辑提供了安全可靠的基础层实现。然而,也必须清醒认识到,出于对绝对安全与稳定的追求,比特币脚本被刻意设计为功能受限、非图灵完备。这意味着它无法支持过于复杂的智能合约,其创新节奏也相对保守。开发者与用户需理解其设计哲学与能力边界,在利用其构建可靠应用的同时,避免对其功能产生不切实际的预期。
关键词标签:比特币脚本,比特币脚本是什么