比特币的智能合约OP_PUSH_TX

关于比特币脚本的一个常见误解是,其访问仅限于锁定脚本和相应的解锁脚本中提供的数据。因此其范围和能力受到极大限制。我们设计了一种算法来获取包含正在评估的脚本的当前事务。我们将其称为OP_PUSH_TX,因为它用作将当前事务推送到堆栈中的伪操作码。我们使用sCrypt(一种可编译为本机脚本的高级语言)来实现它,并通过示例演示其用法。

OP_CHECKSIG

OP_CHECKSIG是验证ECDSA签名的操作码。如果验证成功,则返回true,否则返回false。它从堆栈中获取两个输入,一个公共密钥和一个签名。另外它将当前事务作为输入。交易是要签名的消息。在ECDSA中,对消息进行哈希处理,然后将摘要用于签名生成和验证。在OP_CHECKSIG中,摘要算法计算以下原像的double SHA256:

比特币的智能合约OP_PUSH_TX

OP_PUSH_TX

通常OP_CHECKSIG中使用的签名是链外生成的,并在解锁脚本中推送到堆栈中。为了获得当前交易,我们改为在ON CHAIN上生成签名。使用脚本实现OP_PUSH_TX算法,如下所示:

1.推送当前事务(更精确地说是摘要preimage)
2.推送一个虚拟私钥
3.使用脚本中的ECDSA签名算法,使用事务和步骤1和2中推送的私钥生成签名。
4.推入从步骤2中推入的私钥派生的公钥
5.OP_CHECKSIG

步骤1、2和4在解锁脚本中完成,步骤3和5在锁定脚本中完成。如果OP_CHECKSIG返回true,则可以确定在步骤1中推送的事务是当前事务,因为OP_CHECKSIG仅在签名是针对当前事务时才成功,而不管签名是如何生成的。

值得注意的是,通常在步骤2中的脚本在此处公开了通常被保密的私钥。这不是问题,因为它仅用于验证交易是否最新,而不是证明比特币的所有权。实际上,它甚至可以重复使用。

脚本实施

sCrypt实现OP_PUSH_TX算法并将其打包在称为Tx的标准智能合约中。例如我们使用它来开发一个称为CheckLockTimeVerify的合约,该合约可确保代币被锁定时间,并且在达到成熟时间之前不能花费,类似于OP_CLTV。仅需两行代码(第5行和第7行),就可以获取当前事务。


比特币的智能合约OP_PUSH_TX

OP_PUSH_TX允许检查智能合约内部的整个交易,包括所有输入和输出。我们可以在智能合约中对它们进行任意约束。这将为比特币上的各种智能合约开辟无限的可能性,我们将演示。

本文是有关比特币智能合约可以做什么以及如何实现它们的系列文章的第一篇。

关键词: 比特币  智能合约  

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

联系我们

aliyinhang@gmail.com