📜 Bitcoin Script Bitcoin Script
比特币内置的一种小型编程语言,为每一枚币设定花费规则。可以把它想象成挂在你钱上的一把锁,外加打开它的钥匙:规则决定谁有资格花这笔钱,网络只负责核对规则有没有被满足。
🔐 最简单的说法 — 一把锁和它的钥匙
每次转出比特币,到账的币都会随身带着一小段程序,写明它接下来能怎么花。这段程序就是锁定脚本(技术名叫 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 吗?
- 几乎用不着。每次你收币或转币,钱包都会在幕后替你把锁定脚本和解锁脚本拼好。只有当你去配置多重签名钱包、时间锁这类进阶玩法时,才会直接打交道。