比特币SV上的有状态智能合约

比特币上的智能合约

与流行的看法相反,比特币自诞生以来就具有智能签约功能,具有一种称为脚本的基于堆栈的本地编程语言。每个比特币交易都由输入和输出组成。每个输出都使用指示合约义务的脚本锁定某些比特币。如果输入中包含执行输出智能合约的脚本,则它将解锁该输出中的比特币,并将其移至新的输出中。这就是比特币所有权转让的工作方式。

比特币SV上的有状态智能合约

脚本通常被认为是极其有限的,因此无法进行复杂的智能合约。人们经常提到的比特币智能合约的缺陷是缺乏状态。以太坊应该克服的主要限制之一就是证明它的存在。

有些智能合约本质上是有状态的,因为它们要求缔约方在多个阶段进行交互并依赖于时变状态,例如链上投票和博彩。我们展示了一种维护比特币智能合约状态的通用机制。我们还使用sCrypt(一种可编译为本机脚本的高级语言)实现有状态合约。

先决条件:OP_PUSH_TX

在介绍如何维护比特币智能合约的状态之前,我们介绍了一种称为OP_PUSH_TX的强大技术。可以将其视为伪操作码,它将当前事务推送到堆栈中,然后可以在运行时对其进行检查。更准确地说,它可以检查在BIP143中定义的签名验证中使用的原图像。原像的格式如下:


比特币SV上的有状态智能合约

状态合约实施

一旦我们可以检查智能合约的交易环境,就可以对智能合约的输入和输出施加任意约束。

在合约中实现状态的一种方法是将锁定脚本中的合约分为两部分:数据和代码。数据部分是状态,代码部分包含对状态转换规则进行编码的合约的业务逻辑。数据作为OP_RETURN <data>或OP_PUSHDATA <data> OP_DROP被动地附加到代码中。即使未评估它,它仍然会影响合约的有效性,因为前面的代码部分对其进行了验证。

使用OP_PUSH_TX,我们可以从第5部分中获取正在使用的输出的锁定脚本,并从第8部分中获取新输出的锁定脚本。为了保持状态,我们要求锁定脚本的代码部分不得更改并且数据/状态更改必须符合,在代码部分中包含状态转换规则。


比特币SV上的有状态智能合约

这类似于面向对象编程中的对象概念,其中代码是方法,而数据是对象的成员变量 方法是一成不变的。成员变量被封装并且只能通过方法进行突变。从解锁脚本中调用方法,对要调用的方法及其参数进行编码。

示例合约:Counter

比特币SV上的有状态智能合约

第3行和第4行确保原映像来自当前事务。我们在第9行中获得了先前的锁定脚本,在原映像的第5部分中也称为scriptCode。从第12行的scriptCode中提取先前的计数器状态,然后将其递增并放入第14行的新锁定脚本中。请注意,计数器是锁定脚本中唯一更改的部分。其余部分确保输出包含新的锁定脚本。

这是部署智能合约并重复调用其函数increment()的代码。可以找到计数器从0到9递增的合约实例:0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8->9。请注意,计数器状态 在第一个事务输出的脚本的末尾。

比特币SV上的有状态智能合约

结    论




脚本的许多假定限制是由于无法实现其潜力。当我们对脚本可以实现的内容进行解释和演示时,人们会发现它非常可扩展,通用且面向未来。我们将证明,比特币没有人为限制,可以运行其他区块链可以运行的任何智能合约,同时可以无限扩展。通过经济激励,可以利用它来使整个行业的许多应用程序更加高效和安全。

关键词: 比特币SV  智能合约  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28062

联系我们

aliyinhang@gmail.com