术语表 /开发者参考
赎回脚本
又称 Redeem script。
- 赎回脚本是什么?
- 赎回脚本是隐藏在支付到脚本哈希(pay-to-script-hash)输出背后的完整花费合约,由花费方附在签名脚本末尾提供,并通过哈希运算验证其是否匹配。
规定于 BIP-16。
BIP-16允许付款方向一个20字节的哈希付款,而不是向整个合约付款,赎回脚本就是该哈希所代表的合约。它必须能放入一个栈元素,因此520字节是硬性上限。丢失这些字节,您的私钥就一文不值,所以赎回脚本属于备份的一部分,而不是软件的一部分。
运作方式
币未动用时,赎回脚本是不可见的。持有这些币的输出只包含一个哈希和共识规则所识别的一种模式,该规则自2012年4月1日起在区块173,805由全网强制执行。向您付款的人无法得知任何关于条件的信息,区块浏览器也同样无法得知。
赎回脚本在花费时才会披露。签名脚本先压入合约所需的各项参数,最后以序列化的合约本身收尾。验证节点取出最后这一项,对其进行哈希运算,将结果与输出中的哈希比较,然后才反序列化该项,并将其作为代码针对栈中其余内容运行。两个阶段都必须通过,而且由于承载它的字段只能包含压入操作,脚本本身无法在受检验之前夹带任何行为。
现存最常见的赎回脚本根本不是合约。自2017年起,既想获得 SegWit 节省的费用、又希望仍能接收旧软件付款的钱包,把见证程序包装进了脚本哈希,因此其赎回脚本只有22字节:一个版本字节和一个20字节的密钥哈希,没有任何需要执行的内容。数以百万计以3开头的交易所提币地址所隐藏的正是这个,别无其他。
在哪里会遇到它
每当您创建脚本地址时,Bitcoin Core 都会把赎回脚本交给您,其 decodescript 命令可以把十六进制内容还原为可读的汇编。在描述符中,脚本被显式写为 sh(wpkh(...)) 或 sh(multi(...)),这是记录它的现代方式,因为描述符钱包于2021年1月随 Bitcoin Core 0.21.0问世,使过去导入裸地址的做法过时了。
丢失的情形是真实而具体的。助记词可以重新生成密钥,却无法重新生成任意脚本,也无法告诉您其他共同签名者的公钥,因此在2-of-3的安排中,如果每位参与者只保管了自己的助记词,这笔资金就无法花费。有人持有完整的私钥,却没有这些密钥所组成脚本的任何记录,结果丢失了币。请把描述符与每份助记词备份一起保存,并在地址存入您舍不得损失的金额之前,先用小额资金从描述符恢复一次。
另一件需要了解的事是大小限制。十五个压缩公钥,加上它们的压入前缀和周围的操作码,合计513字节,刚好放得下;第十六个就放不下了。把脚本地址限制在十五位共同签名者的,是这个上限,而不是任何关于多重签名的规则。
赎回脚本 vs 见证脚本
赎回脚本和见证脚本在两个不同时代占据相同的概念位置,区别在于字节的传输位置和承诺方式。赎回脚本通过160位哈希承诺,随签名脚本传输,每字节占四个权重单位。见证脚本通过完整的256位 SHA-256承诺,随见证数据传输,每字节占一个权重单位,因此同样的策略花费时的成本大约只有前者的四分之一。嵌套方案同时使用两者:赎回脚本是34字节的见证程序,见证脚本才是实际的合约。如果您要为包装式 SegWit 多重签名记录备份,需要把两者都写下来,而不是只记其中一个。