Script(大多数时候都被直译为 “脚本”)是比特币所用的一种微型编程语言,用于为比特币交易的输出提供一种 锁定 机制。
- 每个输出都带有一个锁定脚本。
- 为了解锁一个输出(即将它用作一笔交易的输入时),必须提供一个解锁脚本。
如果完整的脚本(解锁脚本 + 锁定脚本)是有效的,相应的输出就会 “被解锁”,可以花费了。
什么是 Script 语言?
Script 是一种非常基础的编程语言。它由两种类型的对象组成:
- 数据(Data) —— 例如:公钥 和 签名;
操作码(OPCODE)
—— 操作 数据的简单函数。
这里是比特币的一个标准的 P2PKH(支付到公钥哈希值)脚本的简单图示:
如何运行 Script 语言?
- 数据总会被 推入 栈中。
OPCODE
可以把栈中的元素 弹出 并做一些操作;操作完后,有时候会把新的元素 “推入” 栈中。
- ` DUP ` 操作码会复制栈顶的元素 -
什么样的脚本是有效的?
栈顶的元素是
1
(或者更大的数值)且栈中只余一个元素则表明这是一个有效的脚本。在哪里可以找到脚本?
交易的每一个输出中都放置了一个锁定脚本:
而交易的每一个输入都必须提供一个解锁脚本:
每个节点都会把解锁脚本和锁定脚本前后拼接起来并运行,以保证自己验证了脚本。
为什么我们要使用 Script 语言?
- 问:为什么不直接使用公钥和签名的组合,把所有这些
操作码
和堆栈抛在一边呢?
- 答:因为你可以使用
操作码
的 不同组合 创建不同类型的锁。
1. 数学谜题
为了花费这个输出,你需要提供和为 8 的两个数字。
- 可能是世界上最不安全的锁定脚本 -
2. 哈希谜题
在这里,你只需要提供一个可以得出(跟锁定脚本中)相同的哈希值的数据,就可以花费这个输出。
3. 哈希碰撞谜题
这是一种很酷的锁。你需要提供两段可以得出相同哈希值的数据,才能解锁它。
换句话说,这是一种激励人们去发现 “哈希碰撞” 的锁。
- 使用这个脚本锁定的比特币可以在这里找到:`35Snmmy3uhaer2gTboc81ayCip4m9DT4ko`。但是,脚本本身是使用 P2SH 锁定脚本封装过的,所以你看不出原本的锁定脚本(有人来解锁时才会曝光)。 -
标准的脚本
虽然我们可以使用
操作码
的不同组合产生多样的锁定脚本,但大部分节点只会转发少数 “标准脚本” 的交易:- P2PK(支付给公钥)
- P2PKH(支付给公钥哈希值)
- P2MS(支付给多签名)
- P2SH(支付给脚本哈希值)
总结
Script 是一种微型的编程语言,用在比特币中,为比特币交易的输出提供锁定机制。
- 每个输出都有一个 “锁定脚本”。
- 为了花费一个输出,你必须在交易中提供 “解锁脚本”。
当一个节点收到了一笔交易时,它会将解锁脚本和锁定脚本拼接起来并运行。如果脚本运算完后栈顶的元素为
1
并且栈中没有别的元素,那么这个脚本就是有效的,这个输出可以被花费。参考文献
脚注
3. https://bitcoin.stackexchange.com/questions/73728/why-can-non-standard-transactions-be-mined-but-not-relayed/ ↩