📖 术语 🟢 通俗解释 🔰 新手

📜 Bitcoin Script Bitcoin Script

比特币内置的一种小型编程语言,为每一枚币设定花费规则。可以把它想象成挂在你钱上的一把锁,外加打开它的钥匙:规则决定谁有资格花这笔钱,网络只负责核对规则有没有被满足。

💡
常见误解 — 比特币没有编程层?不对!比特币从一开始就带着 Script。它为了安全被刻意做得简单,但照样能撑起多重签名钱包、时间锁这样的真实合约。
🔑 解锁脚本scriptSig / witness — 你的凭证✍️签名 + 公钥(钥匙)🔒 锁定脚本scriptPubKey — 写在币上的规则📜「只有对得上的钥匙才能花」🧮同一个栈先跑解锁脚本,再跑锁定脚本 — 压入 & 弹出✅ 栈顶为 TRUE → 币可转移  ·  ❌ 否则 → 被拒绝
🔑 你的钥匙和 🔒 币上的规则都在 🧮 同一个栈上运行。如果栈顶最终是 ✅ TRUE,币就能转移;否则 ❌ 这笔花费被拒绝。网络核对的是规则,而不是你是谁。

🔐 最简单的说法 — 一把锁和它的钥匙

每次转出比特币,到账的币都会随身带着一小段程序,写明它接下来能怎么花。这段程序就是锁定脚本(技术名叫 scriptPubKey)——通常它的意思是「只有这个地址的主人才能花我」。日后要动这些币,你得提供一段解锁脚本(叫 scriptSig,在新式交易里则是 witness),里面装着你的数字签名公钥。钥匙对得上锁,这笔花费就有效。它就像一台自动售货机:机器有自己的规矩,你按规矩投进它要的东西,它就出货,至于你是谁,只要满足规矩它根本不在乎。

🧮 节点究竟是怎么核对的

Script 是基于栈的,说白了就是按一份指令清单一条一条往下走,把值往一摞上面压,再从顶上取下来(后进先出)。当你想花一笔币时,节点会先跑你的解锁脚本,再跑锁定脚本,两段都在同一摞上运行。如果全程没出错,并且最后栈顶留下一个「真」值,币就获准转移。只要中间有一步过不去,这笔花费就被拒绝,币原地不动。

组成作用
🔒 锁定脚本(scriptPubKey)设定花费条件 — 挂在币上的那把锁
🔑 解锁脚本(scriptSig / witness)提供能满足锁的签名和钥匙
🧮 栈节点验规则时压值、取值的草稿纸

🛡️ 为什么要刻意做得简单

Script 没有循环,没有递归,两次运行之间也不留任何记忆。说人话就是它没法无限运行,也做不了开放式的复杂计算。这听着像是个缺陷,其实是一种安全上的取舍:每段脚本都跑得飞快,谁也别想用一段永不停止的程序把网络堵死——那正是拒绝服务攻击的常见套路。规则又小又固定,一笔花费会是什么结果也就一目了然。

🧩 它真正撑起的那些合约

哪怕有这些限制,Script 也足以搭出货真价实的可编程货币。人们口中的「比特币智能合约」,指的就是这些:

  • 🖊️ 多重签名 — 需要好几把钥匙才能花的币,比如 3 把里凑齐 2 把,常用于共管金库和托管(参见多重签名钱包
  • 时间锁 — 在指定时间或区块到来之前都不能花的币,适合做归属解锁和托管
  • 哈希时间锁合约(HTLC)闪电网络和跨链兑换背后的基础构件

🌿 Taproot 升级(2021 年 11 月激活)带来了 Schnorr 签名,还有名为 Tapscript/MAST 的特性,让复杂的 Script 合约看上去和普通支付别无二致——更私密,也更高效。

❓ 常见问题

这么说比特币没法做智能合约?
能做,只是方式有限。比特币从第一天起就带着 Script,它支撑着实打实的可编程花费,比如多重签名钱包、时间锁,以及闪电网络背后的合约。它是被刻意设计得简单,而不是根本做不了合约。
为什么要故意把 Bitcoin Script 做得这么受限?
为了安全和可预测。Script 没有循环,也没法无限运行,所以每段脚本都能很快跑完。这就堵住了攻击者用一段永不停止的脚本拖垮网络的路子,也让一笔花费的结果一目了然、容易预判。
我自己需要写 Bitcoin Script 吗?
几乎用不着。每次你收币或转币,钱包都会在幕后替你把锁定脚本和解锁脚本拼好。只有当你去配置多重签名钱包、时间锁这类进阶玩法时,才会直接打交道。

🔗 相关术语 · 币种