这是第二篇文章 系列 深入研究各个盟约提案,这些提案已达到了成熟度,值得深入崩溃。
checksigfromstack (CSFS)由布兰登·布莱克(Brandon Black)和杰里米·鲁宾(Jeremy Rubin)与Bip 348提出,这不是一条盟约。正如我在本系列介绍性文章中所说的那样,我要涵盖的一些建议不是盟约,而是以某种方式协同或与之相互关联。 CSF是第一个例子。
CSFS是一个非常简单的操作码,但是在我们仔细研究它的工作原理之前,让我们看看比特币脚本实际工作原理的基础知识。
脚本是一种基于堆栈的语言。这意味着数据在堆栈上彼此“堆叠”在一起,并通过将项目从堆栈顶部删除以根据OpCode所做的操作来操作,以将数据或从数据结果返回数据到堆栈顶部进行操作。
脚本最终被执行和验证时,有两个部分,提供“证人”以解锁脚本,以及所花费的输出中包含的脚本。证人/解锁脚本被“添加”到锁定脚本的左侧,然后将每个元素添加到(或操作)堆栈一左右。查看此示例(“|标志着证人和剧本之间的边界):
1 2 | ON_ADD 3 ON_EQUAL
此示例脚本将值“ 1”添加到堆栈中,然后在其中添加值“ 2”。 OP_ADD将堆栈的前两个元素添加在一起,并将结果添加到堆栈中(因此,现在堆栈上的所有内容都是“ 3”)。然后将另一个“ 3”添加到堆栈中。最后一项,op_equal,将堆栈的前两个项目带到了堆栈中(1和0代表真或错误以及数字)。
脚本必须以堆栈顶部的最后一项结尾为真,否则脚本(和执行它的事务)失败,并且认为共识无效。
这是付费 – 帕基·哈什(P2PKH)脚本的基本示例,即以“ 1”开头的遗留地址:
首先,签名和公钥添加到堆栈中。然后称为DUP,该dup占用顶部堆栈项目并将其复制,然后将其返回到堆栈的顶部。 HASH160采用顶部堆栈项目(公共密钥副本),哈希,然后将其返回到堆栈的顶部。脚本的公共密钥哈希放在堆栈顶部。均等功能与相等的功能相同,它抓住了两个顶部堆栈项目,并根据结果返回1或0。唯一的区别是等值也可以在等值后运行,如果顶部堆栈项目不是1,则会使事务失败,并且还删除了顶部堆栈项目。最终运行检查,该检查抓住了前两个堆栈项目,假设它们是签名和公开的,并隐含地验证了签名,以验证被验证的交易的哈希。如果有效,则将1放在堆栈顶部。
CSF的工作原理
CheckSig是比特币中最常用的Opcodes之一。每笔交易几乎没有例外,都在其一个脚本中的某个时刻使用此操作码。签名验证是比特币协议的基础组成部分。问题是,您正在检查签名的信息几乎没有灵活性。 CheckSig只能验证签名与正在验证的交易。有一定的灵活性,即您可以在某种程度上决定签名适用的交易中的哪些部分,但仅此而已。
CSF的目的是通过允许将签名直接推向堆栈的任何任意消息来改变这一点,而不是仅限于对交易本身的签名验证。 OpCode遵循一个非常基本的操作结构:
签名和消息放在堆栈的顶部,然后将公共密钥放在它们的顶部,最后CSF从堆栈中抓住了前三项项目,假设它们是从上到下的公共密钥,消息和签名,从而验证了针对消息的签名。如果签名有效,则将1放在堆栈上。
就是这样。一个简单的checksig变体,可让用户指定任意消息,而不仅仅是支出交易。
什么CSF对
那么这到底是什么呢?在堆栈上使用任意消息而不是与支出交易的任意消息检查签名的用途是什么?
首先,结合 CTV 它可以提供等同于闪电开发人员从一开始就想要的东西的功能,即可以连接到不同交易的浮动签名。这最初是作为签名的新的Sighash标志提出的(决定了签名适用的交易部分的字段)。之所以需要这是因为事务签名涵盖创建所花费的输出的交易的事务ID。这意味着签名仅对交易支出有效 精确的 输出。
这是闪电的理想行为,因为它可以消除渠道处罚。过去的每个闪电状态都需要罚款键和交易,以确保您的频道对方从不使用其中任何一个来试图要求他们不拥有的资金。如果他们尝试,您可以索取他们的所有钱。卓越的功能将使您简单地将当前状态交易“附加”到任何以前的交易,以通过正确分配资金而不是没收它们来阻止盗窃尝试。
这可以通过基本脚本来完成,该脚本需要使用CTV哈希和使用CSF检查的签名。这将允许该CSFS密钥签名的任何事务哈希,以花费使用此脚本创建的任何输出。
另一个有用的功能是对UTXO的控制。与CSFS密钥签名的任何CTV哈希相同的方式可以有效地花费使用为此设计的脚本的UTXO,可以将其他变量传递到脚本中以进行检查,例如新的公共密钥。可以构造脚本,允许CSFS键在 任何 公共密钥,然后可以使用CSF验证,并用于正常检查验证。这将使您能够将UTXO花费给其他任何人的能力,而无需在链上移动它。
最后,与CAT结合使用,CSF可用于构成更复杂的内省功能。正如我们将在该系列的后面看到的那样,实际上并不需要CSF模仿任何更先进的行为,因为仅CAT就可以这样做。
结束思想
CSFS是一个非常基本的OpCode,除了提供简单的有用功能外,即使是最简单的Covenant Opcodes,也可以很好地创建非常有用的功能。虽然上面有关浮动签名的示例专门引用了闪电网络,但浮动签名是一种通常有用的原始符号,适用于使用预先签名的交易构建的任何协议。
除了浮动签名外,脚本代表团是一个非常有用的原始性,它将远远超出将UTXO的控制权与新的公共密钥一起委派。事实验证流入脚本验证流之后,“局部加载”变量的基本能力也可以适用于任何事物,而不仅仅是公共键。 timelock值,hashlock预图像等。任何硬码要验证的变量的脚本现在都可以在事实后动态添加这些值。
最重要的是,CSF是一个非常成熟的建议。它具有已在液体网络和元素上进行的实现(代码库液体用途) 自2016年以来。另外,比特币现金还有一个 版本 自2018年以来。
CSF是一个非常成熟的建议,在概念上几乎可以追溯到我在这个空间中,具有多个成熟的实现,并且可以将其应用于非常清楚的用例。