LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 构建BitcoinSV智能合约之合约标识

构建BitcoinSV智能合约之合约标识

2020-08-29 徐经理176微8885电 来源:区块链网络

Bitcoin SV智能合约模式:合约标识当我们谈论某个具体的合约时,需要用一个不变且唯一的标识来表示一个合约,这样就可以没有歧义地进行沟通,无论是人与人之间、人与应用之间还是应用与应用之间。

在以太坊中,合约地址起到了这样的作用。那么,在Bitcoin SV中呢?

可以用地址来表示一个合约吗?不能。

首先,以太坊里的合约“地址”和Bitcoin SV里说的“地址”不是一个意思。以太坊的合约地址是通过合约创建者的地址(账户)和nonce(发送交易的序号)一起计算出来的。对于Bitcoin BSV来说,这更像是一个txid,而不是地址。

在Bitcoin SV中,地址表示一类脚本模板。在合约中可以理解为一套合约代码。同样的合约代码,可以部署成多个合约实例(instance)。就像面向对象里的一个类(class)可以有多个实例(instance)一样。比如一个计数器合约代码可以部署多个实例,每个实例都有自己的计数器值(状态),两个计数器值会根据各自被调用的次数而独立计数。比如其中一个的计数器值是5(被调用5次),而另一个是8(被调用8次)。

所以,地址不能作为合约标识,因为不具备唯一性。

可以用合约UTXO来表示一个合约吗?在以太坊中,与合约进行交互时,是通过合约地址进行的。在Bitcoin SV中,与合约的交互,实际上是与合约UTXO进行的。那么是否可以通过合约UTXO来表示一个合约呢?

不能。

这与Bitcoin SV的合约运行特点有关:合约与UTXO绑定,而合约状态的变化会引起对应UTXO的变化。

合约UTXO变化

如上图所示,合约最开始与tx1 output 0这个UTXO绑定,当我们要与该合约交互时,实际上就是要花费tx1 output 0,可以说此时我们的交互对象是tx1 output 0。但一旦交互完成,tx1 output 0这个UTXO就被花费了,合约UTXO变成了tx2 output 0,合约逻辑和状态也都更新到了新的utxo中。我们想要再与这个合约进行交互时,交互对象就变成了tx2 output 0。

因此,不能用合约UTXO来表示一个合约,因为不具备不变性。

并且,Bitcoin SV的一个合约可能对应多个UTXO,“基于UTXO的层一Token方案”就是一个例子。我们将在以后介绍合约的并行时会详细说明这种模式。也就是说,合约UTXO也不能保证唯一性。

可能的方案合约部署时对应的txid和output index是一个可能的合约标识方案。

合约的部署时,肯定会对应到某个tx的某个output index。这个output里包含了合约逻辑代码和合约初始状态。后续所有合约的变迁都可以追溯到该tx的output,这保证了不变性。

同时,即使用的是同一套合约代码,不同的合约部署,也会产生不同的txid和output index。这保证了唯一性。

这个方案在sCrypt的文章“基于UTXO的层一Token方案”的文末也有提到。

对基础设施的需求假设我们用部署合约的txid和output index作为合约标识,就需要合约应用有能力通过UTXO回溯到合约最初的txid和output index。比如一个钱包,需要通过这种能力来辨别出收到的token是哪种token。

对于所有的应用(比如钱包),实现这种回溯能力要做的工作都是类似的。所以,这种能力完全可以作为一项数据服务由数据服务商统一提供,而钱包等应用只需要使用数据服务商提供的服务,不必各自开发。

不仅“通过UTXO回溯到合约标识”需要支持,反向“通过合约标识查询当前合约UTXO”也需要支持,以便能与合约进行交互。这种能力也可以由数据服务商统一提供。

同时,这一合约标识方案也需要进行更细节的标准化工作。

产品顾问:徐文——\/ : OrangeAndLemonCream

—-

编译者/作者:徐经理176微8885电

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...