1. 首页
  2. 官方动态

IOTA智能合约白皮书

作者:Evaldas Drąsutis,IOTA基金会(evaldas@iota.org)

2021年11月15日

摘要:

该文件介绍了IOTA智能合约,一种分布式账本技术(DLT)和多区块链智能合约框架,能够在IOTA UTXO账本的第1层以无信任和可扩展的方式进行跨链交易。主要目标是介绍这一概念背后的原因和架构要素。该白皮书的风格是非正式的。

免责声明:在白皮书中提出的设计决策在未来可能会改变。有些主题是初步计划,正在积极研究中,不能保证实际的开发路径会详细遵循本文档的指导方针。

非常感谢Levente Pap, David Hagman, David Phillips, Jorge Silva 和 Gunnar Stenzel 的反馈、大量建议和对文案的编辑。

本中文版译者:Bruceio

译者语:为了方便大量没有足够的技术背景的读者能更好的领悟白皮书的内容,译者斗胆会对部分词句做一些尽可能更让人读懂的修订(非直译),部分段落可能会注明有一些带有个人见解的不一定准确的注解,不当之处,敬请谅解并来信斧正。收信地址为:wagmi@disroot.org,如果您对该中文版的内容有所疑义,请访问原英文版链接予以比对:https://files.iota.org/papers/ISC_WP_Nov_10_2021.pdf

1  总结

在白皮书中,我们介绍了IOTA智能合约(ISC)背后的原理,并介绍了其主要的架构决定。ISC是IOTA分布式账本技术(DLT)的一部分。

ISC是一个框架,它扩展了IOTA DLT第一层(L1)的基础协议,在第二层(L2)的基础上引入了多个可编程的账本,将形成一个多链环境,在这里所有的链都锚定在IOTA的L1账本上。每条链都是一个独立的区块链,上面有智能合约,功能上等同于以太坊智能合约,并且彼此之间完全可以组合。ISC环境还实现了不同链之间的智能合约在L1上的无须信任的交易和可组合性,具有高吞吐量和高扩展性。理论上,ISC作为分布式和分片的多链DLT,涵盖了L1和L2,可以扩展到每秒数十万次的智能合约交易。

ISC概念还包括对IOTA未用交易输出(UTXO)账本的重大扩展,具有可配置的UTXO类型和先进的代币化功能。结合L1和L2概念与先进的代币化功能,使ISC成为UTXO账本、多链可扩展性和准图灵完备可编程性的独特组合。

本白皮书是对2019-2021年期间ISC在研究和几个工作原型和发布方面所做努力的一个浓缩介绍。它代表了2021年10月为实验性IOTA 2.0 DevNet发布的ISC早期测试版的ISC概念的最先进水平。白皮书以通用的方式描述了ISC的概念、目标、原理和架构,与基础IOTA协议的特定版本无关。IOTA智能合约是作为Wasp节点软件实现的。本文件可能包括某些功能的特殊性甚至是实施细节。本文件还包括初步声明和计划在未来实施的和/或正在进行的研究的一些特性。我们不保证这些功能将以本白皮书中描述的方式实施。

2  目标和用例

可扩展性是DLT领域的主要挑战,还包括与可扩展性相关的问题,如拥堵和每笔交易成本不断增加。在其最初的形态下,区块链不是一个可扩展的设置。市场上有一种越来越强烈的信念,即DLT和加密货币行业的未来是多链和多账本。DLT的多链愿景通常与通过引入多个并行的L2账本来分化L1有关。

然而,多账本也意味着每个分布式账本都要由它自己的验证者(或 “矿工”)来保障安全。这就导致如果两个账本/区块链之间没有可信的一方,如桥梁或中继,就很难转移价值。跨链的鸿沟也破坏了同一区块链上智能合约的舒适的可组合性,这是多链系统的主要限制。

为了应对这些挑战,IOTA基金会的ISC旨在为多链DLT提供一个通用的框架和平台,承载并行的且可组合的智能合约,通过使用可扩展的IOTA账本作为骨干的无须信任的跨链交易的原生能力来实现。通过ISC,IOTA基金会旨在建立高度可扩展的分布式账本,来满足现实世界的行业要求,以及每秒成千上万次的写入和价值转移的吞吐量。

ISC的设计考虑到了以下几大类使用情况:

  • 在公共IOTA网络之上运行的多链智能合约网络的联盟部署(Consortium deployments)
  • 在公共IOTA网络之上的开放的无需许可的多链环境和生态系统,以满足可扩展的公共去中心化应用(dApps),例如去中心化金融(DeFi)的需要。
  • 企业部署(Corporate deployments),为公共和私人机构、私人、半封闭和开放的部署,如泛欧洲和全球范围内的公共、能源、物流、食品和其他行业垂直的分布式账本。

ISC还旨在为多链/多账本环境中的任何账上资产的代币化提供一个全面的框架。任何链上的任何智能合约资产,无论是ERC-20代币、太阳能电池板的传感器读数,还是艺术品NFT,都可以被代币化并在多个智能合约之间进行交易,而中间无需任何额外的信任。。

ISC提供了一个多账本范式。无论是轻量级还是重量级的,每个账本都是一个可与其他模块组合的模块,来建立任意规模的系统。在这个范式中,我们可将 L1账本与L2上的多个账本一起视为一个协议,它具有巨大的可扩展性和为不同用例进行配置的潜力。

3 原理

ISC旨在扩展基础的IOTA分布式账本协议,这是一个可扩展的、可并行的、无费用的和无矿工的DLT,在账本上进行着分布式无信任计算。这里我们提供了关于我们如何实现这一目标的理由,以及为什么我们选择这种方法。

智能合约本质上是一个状态机,在外部输入(如触发器或调用)后,获取账本状态并对其产生更新。状态机,它的程序,是账本本身的一部分。智能合约成为账本状态转换功能的延伸。智能合约不是以硬编码的交易逻辑作为状态转换的唯一选择,而是以账本状态转换功能的可插拔的逻辑来实现静态交易概念的扩展。可插拔的扩展的计算模型的范围可以从有限的可配置逻辑和脚本,如比特币的脚本,到以太坊虚拟机(EVM)和Solidity提供的丰富的准图灵完整的编程环境。通过ISC,我们的目标是后者。

让我们来看看现有的账本可编程性的范式。

3.1 区块链智能合约

智能合约是由分布式处理器运行的程序,即多个处理器对计算结果达成共识。智能合约的基本要求是客观的(账本)状态,即所有更新它的智能合约都能平等感知到的状态。这里的客观性意味着运行分布式处理器的所有节点对当前账本状态(计算的主要输入)具有完全一致的看法。

区块链是一个完全排序的账本更新链,它通过严格排序的链结构和分布式共识机制,将序列化的状态更新到账本,从而达到全局客观状态(global objective state)。共识机制允许多个全局状态的竞争版本同时存在,但最终只会留下一个。

在DLT领域有两个著名的账本模型:UTXO账本模型和基于账户的账本模型。

UTXO账本由UTXO(未花费的交易产出,见附件:关于L1 UTXO账本的假设)组成,这些UTXO按目标地址被归入账户。因此,UTXO账户的资产余额是多个UTXO的余额之和。UTXO账本的基本属性是,它允许并发写入,即并发地更新账户的状态。在这种情况下,对于账户的使用者来说,它使UTXO账户的状态成为非确定性的。

在基于账户的模型中,账户和相关余额是全局的原子实体,只能按顺序更新。这意味着,基于账户的账本中的账户余额是确定的(或客观的)。

虽然区块链使用UTXO(如比特币和Cardano)和基于账户(如以太坊)的账本模型来表示全局客观状态,但基于账户的模型和全局账户对区块链来说是很自然的,而将UTXO放入区块则取消了UTXO账本的并行性。

全局和客观状态的存在立即使区块链成为智能合约的自然环境。区块链账本使所有智能合约对账本状态的感知完全相同(客观的),并在同一块中更新它。

区块链智能合约通常是“准”图灵完备的,也就是说,它们可以通过假设无限的时间和内存资源来实现任何算法。为此,他们可以使用通用的计算模型和语言,如EVM/Solidity、WebAssembly等等。“准”意味着这些程序的运行空间在运行时被有意限制,通常是通过引入gas的概念来防止计算机资源的滥用。

区块链智能合约对相同状态的同步感知使它们具有高度的可组合性,这是一个活跃在像DeFi这样的区块链生态系统中的特性。

与此同时,区块链的顺序和同步结构也将基于区块链的DLT的基本瓶颈引入到了智能合约,并最终导致了其有限的可扩展性。简单来说:你无法在区块链的全局状态上运行并行的智能合约和并行的状态更新。越来越快地运行它们并不能消除基本的瓶颈,而分片通常将全局账本状态分割成子状态,严格地说,账本不再是区块链。

正如下面所解释的(参见IOTA DLT), IOTA账本的DAG结构和IOTA共识不允许节点拥有账本账户的全局客观状态。这一事实从根本上与IOTA L1账本的并行性和可伸缩性有关。IOTA账本上缺乏全局客观状态,导致IOTA无法在其L1上直接实现区块链智能合约模型。

3.2 UTXO智能合约

UTXO智能合约(也称为UTXO脚本)是一种计算模型,它将程序的运行空间限制为一个事务。由于UTXO账簿的并行性质,UTXO智能合约在状态的独立分支上并行运行。

有一些在L1上使用UTXO智能合约实现UTXO账本可编程的著名例子;例如,比特币脚本或Cardano的EUTXO模型。在任何UTXO账簿上实现这些内容都很简单,包括IOTA UTXO账簿。

有人可能会问:为什么不使用这种方法为IOTA账本增加可编程性呢?

简单的回答是,为了L1的可编程性,我们可以遵循这个模型,来支持ISC和高级代币化。然而,作为智能合约的通用方法,它对于真实世界的行业用例来说太有限了。我们将详细说明原因。

UTXO智能合约的吞吐量受到L1本身吞吐量的限制。此外,UTXO脚本在基础层的吞吐量上引入了显著的开销,因此它不能满足实际行业的需求。

与区块链生态系统中主流的准图灵完备的智能合约的表达性和丰富性相比, UTXO智能合约的计算模型过于有限。最好的例子是以太坊的EVM和Solidity。

UTXO智能合约(也称为UTXO脚本)不能访问全局状态,不能对总账上的全局顺序进行预设(否则,它将无法扩展,或者将导致对中心化的需求;例如,向每个L1验证者脚本的交付等等)。因此,UTXO智能合约消耗和产生的状态从根本上受到交易边界的限制,这阻止了UTXO脚本使用通常的全面编程机制,比如EVM和Solidity提供的机制。相反,在UTXO脚本上编写现实的dapp,还需要非传统的方法和工具(包括语言)来将计算表示为功能有限的有限状态机和数据结构的集合。这种方法会导致显著的性能和用户体验(UX)的损失。

虽然总的UTXO可编程方法提供了显著的优点,如UTXO脚本的可验证性,但在我们看来,这并不能弥补在许多(或大多数)真实世界用例中存在的实际缺点。许多行业用例,包括DeFi,需要无限制的数据结构、复杂的算法、良好的用户体验、可扩展性和高吞吐量。

IOTA账本的免费性质。IOTA账本中没有手续费,这阻碍了我们通过UTXO脚本引入全面的可编程性,因为它不能方便地引入L1上计算的gas和gas预算概念。这是一个必要的特性,以防止处理器和存储资源的智能合约程序的滥用。

3.3 IOTA智能合约方案

消除可扩展性瓶颈是IOTA DLT的主要目标之一。通过ISC,我们的目标是通过水平扩展来消除智能合约系统中的瓶颈。

简而言之:我们的目标是在不丧失可组合性的情况下启用并行的智能合约。为了实现这一点,我们将L2上的区块链智能合约和L1上的高级UTXO类型结合在一个框架中。

3.3.1 IOTA DLT

IOTA通过使用基于有向无环图(DAG)的部分有序数据结构,而不是区块链的严格顺序和完全有序的结构,克服了分布式账本已知的可伸缩性瓶颈。

在IOTA中, DAG结构出现在账本层和共识层中。IOTA协议与其他区块链有两个重要的区别:

IOTA账本,也称为UTXO账本(或有时称为UTXO DAG,即使它是一个比DAG更复杂的数据结构)。对于UTXO事务,不需要访问帐户的全局状态,因此可以对账本进行并行更新(或“写入”)。这是实现可伸缩性和高吞吐量的必要条件。

IOTA Tangle,一个基于DAG的无许可、无手续费、无矿工的共识协议。Tangle共识协议是基于账本用户本身对账本的验证,而不是矿工对账本的验证。用户通过验证两个已经附加的交易及其过去的锥,将交易添加到账本中,然后将其交易附加到这两个交易中,从而通过对选定的交易进行投票来扩展Tangle。共识中的均衡来自于这样一个假设,即(诚实的)用户的最佳策略是附加其交易,以使其被他人选择的机会最大化,而这只有在你附加历史上有效的账本时才有可能。

IOTA Tangle能够在UTXO账本状态上实现全局一致,而不需要在不相关的账本状态更新(事务)之间强加线性顺序。这允许在不损害UTXO账本可伸缩特性的情况下就帐户状态达成共识。

上面的两个组件不能没有彼此。这两种方法的结合为IOTA DLT提供了一个独特的可伸缩性特性:理论上,可以对账本进行无限的并行写操作。

请注意,基于区块链的共识协议,如果应用于UTXO账本模型,通过将UTXO账本固有的并行结构锁定到区块和严格的链序列中,就会抵消后者提供的可伸缩性优势。

IOTA通过支持全局的分布式账本的并行更新来解决可伸缩性问题。这使得该方法从根本上不同于许多区块链平台,这些平台在L1上使用经典的中本或BFT共识区块链系统,无论它们的账本模型是基于UTXO,还是基于全局账户系统。

可伸缩性的优势导致了不可避免的权衡,即确定性程序不可能假定任何全局状态。UTXO账本上的账户是一组目标地址相同的UTXO的集合。它可以由异步实体并行地更新,因此不同方对它的感知可能不同。这使得UTXO账户的状态(和整个账本的状态)是主观的,也就是说,不同的方(例如,智能合约)对它的看法并不总是相同的。

由于帐户缺乏客观全局状态,IOTA无法以经典区块链的智能合约的形式实现L1的准图灵完备可编程性。

3.3.2 锚定L1的多个L2账本

IOTA选择在IOTA账本之上构建多个全局有序的账本(本质上是第2层(L2)区块链),并结合L1上UTXO账本的扩展功能,通过状态锚定和高级代币化功能支持L2多链环境。这样可以达到以下效果:

  • 准准图灵完备的智能合约,在每个L2链上具有丰富的表达和可组合性。
  • 系统的可扩展性,通过多个并行账本(也称为“分片shards”)和并行智能合约实现大规模并行。

IOTA智能合约白皮书

每条这样的链将承载许多智能合约,它们共享相同的链的客观状态。这使得可以在它上运行准图灵完整的智能合约(包括原始EVM合约),同时控制L1上UTXO账簿上的资产。每个链也将能够处理直接发送到链的高吞吐量事务。

多链系统的可扩展性是巨大的。例如,如果吞吐量目标为100,000 TPS,那么理论上的配置是什么呢? 让我们保守地假设每条这样的链能够并行处理每秒200个事务(例如传感器读数)。因此,500个链将能够在它们的总账中每秒结算100,000个读数。

在L1上这500个链条将消耗多少资源? 每条链每10秒产生并确认一个状态锚交易(或“区块”),即每个区块2000个交易。所有这500条链将每10秒在L1账本上锚定一次它们的状态,所以它们在L1上将只消耗大约50个TPS。

3.3.3 ISC链的验证

验证者是一个真实世界的实体(个人或组织),它通过参与其他验证者的分布式共识来验证ISC链的安全性。在网络中用其公钥识别验证者;然而,ISC并没有明确说明验证者是如何被激励去验证链的。我们将在验证激励中介绍一些可能的选项。

验证者拥有一个或多个验证者节点(当前实现为Wasp节点)。每个ISC链由它自己的一组验证者节点运行。每个验证者节点都代表它所属的验证者验证链。因此,每当我们谈到验证者节点的行为,无论是正确的还是错误的,这种行为的责任和动机都与验证者这个真实世界的实体相联系。

要运行ISC链,验证者形成一个有限的组,称为验证者委员会并将验证者节点委托给它。验证者委员会通过集体控制L1帐户(称为“链帐户”)来控制一个链,并将其作为一个输入,并对帐户进行更新。

  • 验证者委员会在状态更新/块上运行拜占庭容错(BFT)共识协议。这使得ISC链和其上的智能合约成为一个容错的分布式系统,其中⌊2N/3⌋+ 1的非错误验证者足以产生有效的状态更新(这里N是验证者的数量,如果委员会)。
  • 验证者委员会可以根据治理模型轮换。通过轮换验证者委员会,验证者可以被删除、添加或替换。
  • 我们使链的验证者能够通过阈值签名来控制L1上的帐户,作为验证者之间共识的证明(参见状态转换有效性中的替代方法)。委员会中的每个验证者节点都拥有其私有密钥共享,该私有密钥共享用于生成事务的部分签名。要为事务生成有效的阈值签名,⌊2N/3⌋+ 1个验证者节点的多数派就足够协作了。验证者节点和签名聚合的合作是共识过程的一部分。
  • 为了生成一个验证者委员会,节点运行一个分布式密钥生成(DKG)过程。在DKG过程之后,每个验证者都安全地生成一个只有它自己知道的私钥共享,并将其保存在自己的私有密钥共享中。

我们可以把每个ISC链看作是一个分布式钱包,由一组分布式验证者运行:“钱包”接受进入帐户的资产,并根据一个程序更新帐户。

如上所述,IOTA账本(L1)上没有直接的方法来看到不同节点上这样一个“钱包”的帐户的目标状态。这使得ISC上的共识运行不同于经典的区块链(如比特币):

  • 在经典的区块链共识中,验证者(或“矿工”)根据假设的当前状态和它选择的一组事务建议计算自己的未来状态版本(这也创造了矿工可提取值-MEV的现象)。当前状态对于其他挖掘者来说是有效的状态,因此确定性地计算出的未来状态对于它们也是有效的。然后验证者就在全局账本中使用哪个版本的未来状态达成共识,例如通过运行工作证明(PoW)竞争。
  • 在ISC中,账户的当前状态是不确定的,所以验证者必须首先就当前状态达成共识。结果是验证者对帐户的当前状态和其他不确定性输入(例如要处理的请求批)达成共识。在对输入达成共识后,剩下的只是由VM运行的确定性可验证的计算;因此,每个验证者节点都可以自己计算它。

因此,为了为智能合约提供一个全局的目标状态,我们通过在IOTA账本上构建(区块)链来扩展账户。ISC链的验证者委员会对账户的状态达成共识。在UTXO帐户之上使用链来扩展该帐户的方法也可以看作是UTXO账本的L2分片。

通过这种方式,我们可以在L2上有尽可能多的平行账本,就像在L1上有尽可能多的可能账户一样,即理论上是无限的。我们称之为链,也称为智能合约链或ISC链。

每个链控制存储到链上的资产,并将其状态提交到L1上的同一个账户。我们将这个操作称之为状态锚定。

3.3.4 状态转换的有效性

通过提供状态锚定事务的有效阈值签名,链提供了共识证明(即证明链验证者在状态转换上达成了共识),因为只有⌊2N/3⌋+ 1的超级多数验证者才能产生有效的阈值签名。如果没有共识的证明(有效的签名),L1账本将不会通过消耗状态锚定的输出并产生下一个状态锚定事务来确认状态的转换。

这一事实将状态转换的有效性完全置于链验证者的大多数投票机制。一旦在L1上确认了状态锚定,状态转换就结束了,成为不可变和不可逆的。但是,L1账本不能验证状态转换。⌊2N/3⌋+ 1验证者的大多数合集有可能产生一个无效的状态转换,该状态转换具有有效的签名,例如,分配资金不根据智能合约程序的确定性规定。这将是一个不当行为的例子,类似于PoW区块链51%的攻击。

防止此类多数攻击的方法属于博弈理论的安全领域,例如以太坊乐观聚类(optimistic rollups)中使用的方法。有关详细信息,请参阅安全性考虑。

阈值签名是一种易于理解和简单,并具有良好性能特征的共识证明。这是我们在ISC链上锚定状态的主要方法。

另一种具有强大属性的替代方法是,通过有效性证明来控制链的帐户(和状态转移),而不是通过阈值签名的共识证明。这是一个基于零知识证明的方向。验证者共同计算链的下一个状态,并提供压缩的加密证明,证明状态转移是由虚拟机的确定性算法计算的。零知识证明在L1上进行检查。它的有效性是状态转换发生在L1上的一个条件。

这种方法的主要挑战是计算零知识证明的虚拟机的复杂性,以及这个过程的计算量非常大的事实。有效性证明方法是ISC中状态锚定的一个可能的研究方向。

3.3.5 无需信任的跨链交易

通过锚定,ISC链上的智能合约能够根据算法拥有和操作IOTA账本上的L1资产。同样的机制使得智能合约可以与其他链(即跨链)上的其他智能合约交换原生IOTA资产,而无需任何额外的信任或桥接。

智能合约链的状态与其他智能合约链的状态解耦。这使得智能合约可在不同的链上并行(即异步状态),然而通过利用IOTA的链间无需信任和无手续费的L1资产转移,可以通过无信任的事务来实现跨链互操作性和可组合性。

在一个智能合约链中,我们提供了一个至少在功能上相当于经典以太坊智能合约平台的环境,包括基于对链上所有智能合约全局状态的同步访问的全同步可组合性。同时,多个链在同一个分布式账本上进行交易,提高了平台的全局属性,特别是可扩展性。

3.3.6 UTXO账本扩展

为了实现上述功能,我们在L1上特意扩展了UTXO账簿。 有了这个扩展,我们的目标是实现:

  • L1对L2链进行锚定的支持。
  • 实现智能合约和链之间的链上交易;L1和L2上用于智能合约跨链可组合的高级代币化特性的介绍。详见附件:L1 UTXO账本的设定。

4 验证的激励

如上所述,验证者将它们的验证者节点委托给验证者委员会,以代表它们验证ISC链。为什么验证者要花费它的资源来运行验证者节点?

一般来说,ISC并不明确验证者的激励机制,也不明确比特币协议中内置的矿工激励机制。ISC既针对无许可的环境,也针对企业环境,既包括收费的情形,也包括免费的情形;因此,意图是对所有用例开放。这里我们讨论几种选择。

4.1 收费

一种选择是基于费用收入的验证激励。验证者通过其验证者节点为所提供的资源被支付费用。通常,这些费用是从智能合约用户(也称为请求者)那里收取的,并分配给验证者。另一个可能的模型是链的所有者(也称为管理者),直接对验证者提供的资源进行补偿。在任何情况下,验证者提供资源来验证链的动机都与来自费用的未来预期收入流有关。在财务上,它可以被建模为未来预期收入的净现值。这种未来收入的损失(例如由于相应节点的故障)是对这种行为的经济抑制(或惩罚)。费用收入是在无许可验证环境中验证的主要激励方法。

ISC中的收费机制是在虚拟机级别内建的。它负责向请求者(即链服务的用户)收取固定和/或基于gas的费用。收取的费用以公平的方式分配给链的验证者。由于使用的BFT共识的性质,“公平”意味着收取的费用是平均地(随着时间的推移)分配给验证者。但是,某些贡献特征,例如可用性率和类似的因素,也可以加以考虑。收费政策是由链的治理定义的。

收取的费用被分成两个可选部分:验证者的费用发给链的验证者,所有者的费用发给链的管理者,例如,去中心化自治组织(Decentralized Autonomous Organization, DAO)。

4.2 免费

在公司或私人机构中,链的验证是由特定于用例的动机所激励的。联盟成员是链的验证者。因此,运行验证者节点的动机与参与联盟的动机相同。这种架构不需要任何基于费用的经济激励,所以这个链条可能完全没有费用。然而,即使在封闭的架构中,费用依然可以以联盟策略定义的方式使用,例如为了防止垃圾邮件攻击和类似的动机。

4.3 验证L1的激励

用户向IOTA L1账本中添加一个交易也是在对L1账本进行验证:向Tangle提交交易也是对账本过去的一个圆锥的验证,这就是IOTA Tangle共识协议的工作原理。

对于ISC链,IOTA L1账本的用户是L2上该链的验证节点。验证者节点共同生成一个锚定事务,并将其发布到L1。这样,ISC链的每个验证者(通过它运行的L2验证者节点)自然会对L1上确认的验证者节点产生的事务感兴趣。因此验证者成为了IOTA L1账本的用户,因此必须验证它。

然而, L2上的ISC验证者节点不能验证IOTA L1账本本身,所以它必须信任IOTA L1节点,它所连接的IOTA L1节点将其事务附加到Tangle上。将事务发布到L1而不需要信任运行IOTA的第三方节点的唯一方法是由验证者自己运行IOTA节点。这意味着每个L2验证者都有明确的动机来运行自己的IOTA节点,作为对L1账本的可信和安全访问,以正确地连接到Tangle,防止eclipsing攻击、停机等。

换句话说,每个L2验证者都有运行自己IOTA节点的明确动机,从而成为IOTA L1账本的验证者。

5 安全考虑

ISC是建立分布式账本的框架(或工具);因此,它对各种配置都是开放的。特别是,它并没有明确说明使用什么样的游戏规则或代币经济模型。上面对激励的概述是针对链中的安全性问题的不同用例特定方法的基本表述。

5.1 介绍

分布式账本的安全性取决于它的验证者。ISC链由有限的(但可轮换的)验证者委员会进行验证。ISC并没有具体说明这些委员会是如何成立的。

验证者委员会是一个不同于工作量证明(在那里任何人都可以验证账本(换句话说,生成区块),只要他们有足够的哈希功率)的区块链的验证设置。无许可验证提供了高度的活力和安全性,但没有真正的终结性和有限的可伸缩性。它促使市场寻找更快、更便宜的替代品。

在ISC中,我们使用基于委员会的BFT共识,这是一种易于理解的、具有优秀性能特征的选择。这里的权衡是,节点不能自己决定是否成为链的验证者。(然而,需要注意的是,这并不妨碍无许可参与链的验证。参见共享安全:无许可设置)。

我们将ISC视为一种工具,将ISC链视为各种系统、dApps和生态系统的构建块。我们认为正确的验证安全方法是视用例而定的。它可以从不同的角度来处理,这取决于我们想要在每个特定的情况下实现什么。

假设一个账本是分布式的(容错的)、去中心化的和无需信任的,通常意味着我们不应该也不相信任何一个特定的验证者是诚实的。然而,在某种程度上,我们相信所有的验证者作为一个整体。通过查看分布式账本的验证者和它们在账本状态上的分布式共识过程,我们给自己一个信任分布式账本的理由。信托可以被视为分布式账本中的一种可感知的安全,即我们认为我们在分布式账本上的资产有多安全。

安全性本身可以从不同的角度以不同的方式建模。为了简化问题,我们假设DLT的安全性是由这样一种可能性来定义的:特定的大多数验证者(取决于特定的共识机制)将串通起来协调它们的活动,以产生一个无效的状态转换。无效的状态转换是不同于由账本的确定性状态转移函数所规定的所计算的结果。这就是“验证者窃取我的资金”的本质含义。

在运行中本聪PoW共识的无许可验证系统中,如比特币或以太坊,任何实体都可以按照自己的意愿成为验证者。相互勾结的可能性(51%的算力)取决于动态情况(即算力的集中程度)和博弈理论因素,例如在主导验证者(矿池)之间的勾结中可以获得什么。具有无许可验证的系统通常依赖于一个激励反馈循环来吸引更多的验证者,以使系统更安全(攻击成本更高),从而导致运行系统的总成本更高,并出现可伸缩性瓶颈。具有无许可验证的系统通常是非常值得信任的,即使它足以联合四个左右的顶级验证者来控制状态转换。信任的来源在于,任何不当行为都是公开的、可证明的和可追溯至串谋方的。这种高度信任背后隐含的博弈论推理是,在这种情况下,共谋将给共谋方带来净损失。

在所谓的需许可设置中,节点不能自己决定是否成为账本的验证者:它必须满足某些条件才能被接受成为验证者。许多基于BFT共识的系统在这个意义上是需允许的。例如,许多现实世界的系统也是需许可的,而代议制民主是无需许可的(任何人都可以被选举),议会制是需许可的(一个人必须被其他人选举)。

在ISC链中,验证者委员会是一个分布式的容错系统。只要有⌊2N/3⌋+ 1个无缺陷的节点,就可以使链状态正确。

验证者委员会本身是一个被许可的设置,在某种意义上,节点不能自己决定是否成为一个验证者。相反,验证者委员会中的所有节点都通过分散的DKG过程绑定在一起。它本质上意味着每个验证者节点必须被其他节点“增选”到委员会中。这是验证者之间的一种协议。主要的问题是,这个协议能有多可信?

在ISC链中,⌊N/3⌋犯错的(行为不端的)验证者可以阻止链产生状态更新(在这种情况下不会产生错误的结果)。为了产生错误的状态更新,⌊2N/3⌋+ 1验证者必须相互勾结。⌊2N/3⌋+ 1的验证者串通的几率取决于许多因素,这些因素都取决于委员会的具体设置。在这里,我们将展示几个特定于用例的方法的例子。

5.2 联盟

在许多分布式账本的企业用例中,一个常见的设置是一个联盟,它形成了一个验证者委员会。联盟合作伙伴之间通常互不信任,他们受法律约束,有自己在现实世界中的声誉。联盟中相互信任的伙伴越少越好,因为任何一方的不当行为在确定性系统中都是可证明的,而且竞争对手也在不断地相互监视。因此,验证者委员会中相互信任程度越低的联盟伙伴,链就越安全。

组建联盟的一个共同原因正是因为激烈竞争的各方互不信任,而需要在彼此之间建立一个共同的交易基础。因此,联盟的合作伙伴可能会离开联盟,其他的可能会加入,但竞争对手之间的勾结是非常不可能的。这使得一个由不相关方组成的联盟成为一个高度可信的组织。

分布式账本的大多数企业用例(例如在能源、物流或金融服务中)是行业市场参与者、(竞争)公司和监管者的联盟。公共部门联盟的例子可以是申根条约或欧盟。

类似地,由运行ISC链的竞争性加密交易所组成的联盟,或在联盟中建立去中心化交易所(DEX)的联盟,将比任何由一个实体运行的集中式交易所更受信任。

5.3 公司或DAO架构

一个组织可能希望在它的部门之间分发一个系统。验证者节点由全球不同的部门运行,这一事实将使容错系统得到组织总部(并不信任其部门)和组织客户(无论如何都在一定程度上信任该组织)的信任。

一个公司可能想要将其核心链的验证外包给一组分布式的外部验证者,通过要求每个验证者持有资金作为抵押品来防止不当行为。聘请外部验证者可能采取公开市场竞标的形式,本质上是一种无需许可的设置。设置还可能包括DAO元素,例如对某些决策进行投票。这种架构的一个例子就是币安智能链。

分布式自治组织(DAO)本质上是一个由社区管理的企业架构。它可能希望将链的验证外包给其他的分布式团体,就像其他任何组织一样,通过要求安全抵押担保来防止行为不当。

5.4 共享的安全:多链共享验证者

假设相同的验证者验证多个ISC链。同一组验证者为每个链组成一个委员会。在此配置中,所有这些多个链将具有相同的信任源,因此共享安全性。不管特定的链是什么,这些链之间的无需信任的交易都保持在相同的信任假设中。它使这种多链系统成为一个具有多个并行分片的分布式账本,是一个高度可扩展的系统。它将在上面并行运行可互操作的智能合约。

此架构可用于联盟或公司的设置。例如,同一个DAO可以为不同的用途运行单独的并行链:代币化、DEX、oracle、其他dApps等等。这种配置的可伸缩性实际上是无限的。

5.5 共享安全:无需许可的架构

通过无需许可的设置,我们理解了任何实体都具备声称它一个开放和透明的市场中为一个链作为验证者的能力。

对于ISC链的无许可设置,我们设想类似于以太坊optimistic rollup、Polkadot、BSC等中使用的安全架构,使用ISC链作为基础协议来实现。下列要素是必不可少的:

  • 每个验证者都有一个安全抵押担保,这是作为抵押品交给第三方的资产,通常是一个(质押)智能合约。
  • 任何其他第三方,称为渔民(fisherman),可以提供欺诈证据–一种验证者委员会对链状态进行了错误更新的密码证明。渔民可以受到赏金的激励去监视链的活动,也可以周期性的意想不到的检查没有得到警告而被阻止。
  • 链验证者已经有有效的链的状态,并计算下一个有效的状态,所以他们是作为渔民的主要候选人。他们被鼓励提交无效状态转换的欺诈证明,以从其他验证者那里收集利益,并保护自己的链——这意味着只要验证者委员会中至少有一个诚实的验证者,链就不会受到恶意状态转换的威胁。
  • 提交的欺诈证明将由质押合约进行验证。这可能是由于VM和签名的确定性。如果索赔是有效的,并且证明了状态更新是无效的,则质押合约将通过拿走其抵押担保(也称为“没收”)来惩罚验证者委员会。

这种设置确保了链验证的博弈论的安全性:假设只要行为不当(在本例中是偷窃资金)带来的净收益为负,就没有一方会行为不当。显然,链的安全性取决于抵押担保的金额大小。

上面的描述是显著的概括和省略了细节,如欺诈证明的确切形式。此外,必须做出某些同步性假设,例如提交证明的时间窗口和争议时间期限(DTD)。

无许可的架构的基本元素是有可信的第三方,即一个质押智能合约,它保存安全抵押担保并处理欺诈证明(也称为争议解决)。我们可以把质押合约比喻为最高法院。所有链共有的这种“最高法院”的存在,在链之间创建了共享的安全性,这些链由共同的质押合约中的验证者进行验证:所有链的最高信任锚将是相同的。“最高法院”的设置为链验证者的无许可市场创造了基础。任何实体都可以用自己的一份子来参与市场,链将通过支付验证奖励(例如通过收费机制和/或对所涉资本支付利息)来雇佣验证者。

在以太坊rollups中,“最高法院”是一个运行在以太坊主链上的智能合约。问题是,为ISC链的无许可设置运行的“最高法院”的合约在哪里?

ISC对无许可设置的方法是在智能合同的根链上创建一个单独的ISC链,来实现所有必要的“最高法院”逻辑。根链将是在无许可设置中验证的所有ISC链的信任和安全性的共享来源。它将运行所有的质押逻辑以及开放的验证者市场智能合约。

接下来的问题是,哪些实体将验证根链本身?

在IOTA 2.0账本中,根链的验证者将从所谓的高mana值节点中选择。高mana验证者是L1 IOTA节点的所有者,以访问mana和共识mana作为权重因子,在L1节点上以去中心化的方式选择。高mana验证者有最大的影响并和L1账本有切身利益。总而言之,高mana验证者将集中在网络中的主要mana值,并将与整个IOTA 2.0账本一样值得信赖。

通过高mana节点对根链的验证,L2上IOTA智能合约链的安全假设就等同于IOTA L1账本的安全假设了。

例如,在pre-Coordicide网络中,由分布式协调器运行,根链将由运行分布式协调器的相同实体进行验证。这为L1和多个L2账本创建了一个共享的信任源。

值得注意的是, IOTA基金会的策略是移除公共主网中的协调器机制。同时,以分布式协调器和根链作为全系统信任和共享安全来源的L1总账的配置,是一种为泛欧洲和全球规模的大型企业和公共网络提供服务的强大平台。因此,即使去掉了公共主网中的协调器, IOTA L1的协调器配置版本也很有可能作为一个受支持的版本和大型企业部署的选项。

6 IOTA智能合约链

6.1 智能合约链

ISC是一个多链环境。我们可以在IOTA账本的L2上运行许多平行的区块链。每条链都有以下属性:

它有自己的账本状态,可以与其他链的状态一起独立的并行更新。

  • 链的账本状态使用基于账户的模型(与L1的UTXO模型相反)。
  • 它的状态在L1上的特定IOTA UTXO账户中被提交(或锚定)(详见附件:状态.锚定状态)。
  • 链由它自己的一组验证者进行验证,称为验证者委员会。验证者通过BTF共识协议(见共识)就状态更新达成共识。然后验证者作为锚定过程的一部分,向L1账本提供共识的证明;
  • 每条链可托管多个智能合约。在链的边界内,它们可以通过同步调用完全组合,就像任何区块链上的智能合约一样。我们称之为同步可组合性(也称为原子可组合性)。
  • 每个智能合约可以通过L1账本上的锚定机制,以无须信任和无手续费的方式与其他IOTA智能合约链上的其他智能合约进行交易(即交换资产)。它使智能合约完全可跨链组合。我们称之为异步可组合性。

IOTA智能合约白皮书

6.2 链账户和链ID

关于UTXOs和L1账本的详细信息,详见附件:关于L1 UTXO账本的预设

链帐户是由链地址(也称为链ID)控制的UTXO总账(L1)上的帐户。它是一种特殊的地址—别名地址,它从链的身份中抽象出控制实体(状态控制器地址):链的控制实体可能会改变,而链ID对账本的用户保持相同的透明度。

链账户包含许多utxo,包括状态锚(也称为别名输出)、链上请求的积压和其他L1资产。

链ID是链生命周期内的唯一标识符。它由协议在链的原始事务中创建第一个别名输出时分配(或创建),并且在别名输出的整个生命周期中保持不变。UTXO账本上的链是通过其别名地址唯一标识的。该协议保证具有特定的链 ID(别名地址)的唯一别名输出总是在L1账本状态下出现。

ISC链在其帐户中控制UTXO的集合。链账户上的所有UTXO都属于以下两组:

链上资产是由链在其数据状态下跟踪的UTXO(见链上帐户)。这些UTXO代表链的智能合约所拥有的L1资产。链上资产可以是任意类型的UTXO:扩展输出、NFT、铸造厂、别名输出,可能还有其他。链上资产的集合因此在链账户本身的锚(别名输出类型)中提交。不可变的锚定和数据状态使链上资产成为链上帐户的确定性(客观的)部分:每个验证者节点能以相同的方式感知链上资产。

链上请求的积压是账户中尚未被链处理的UTXO。它们由异步代理(也称为请求者)并行地添加到链的帐户中。它是链帐户的非确定性部分,因为验证者节点可能在每个时刻都有不同的感知。链通过消耗UTXO来处理积压中的UTXO(也称为账上(On-ledger)请求),从而将它们从积压中清理掉。

处理积压是一个原子操作:从非确定性积压中删除UTXO,并将其处理的影响添加到确定性数据状态。参见图5:L1和L2上的“平衡表”。

6.3 状态:锚定状态

链的状态是确定的,即所有验证者节点都能平等地感知。它包括:

  • 在L1上的链上资产(见上面)。
  • L2上任意键/值对的集合(称为数据状态)。表示内部链记账的数据状态,以及智能合约存储在链中的特定于用例的数据。数据状态由链的所有验证者和访问节点存储在它们的数据库中(参见节点)。

锚定状态的意思是:

  • 核算所有处于数据状态的链上资产,从而跟踪哪个链上资产或余额属于哪个智能合约或L1地址。
  • 提交的数据状态状态索引放到别名输出中,始终包含在链的帐户中。
    对数据的提交是一个值,例如数据状态的Merkle树的根,这使得在不更改提交的情况下不可能修改状态中的数据状态。参见“提交状态”。

状态索引(也称为块高度)是随着每个新的状态锚而增加的一个增量值。状态索引递增的一致性由L1上的UTXO账本强制执行。

锚定保证了数据状态(通过提交)与智能合约所拥有的资产之间的原子关系。

链的别名输出保证UTXO账本上的每个链总是有一个这样的输出。我们称它为状态锚,而包含的事务为链的锚事务

通过锚定机制,L1上的UTXO账簿:

  • 保证了对链状态的全局共识。这条链不可能分叉。
  • 使状态不可变和防篡改。
  • 使状态转换可控、原子化并与资产余额一致。
  • 使数据状态在链内具有全局性和客观性—准图灵完备的智能合约的需求。

状态锚包含:

  • 链的标识(链ID,一个别名地址)。
  • 状态控制器的地址(背后有私钥来控制别名的地址)。
  • 对数据状态的提交(参见提交状态)。
  • 状态索引(也称为块高度),它随着下一个状态输出(状态转换)而增加(参见状态转换)。
  • 一个连续的状态的时间戳。

状态提交和链上资产由链账户拥有。锚输出和由别名地址控制的所有资产只能通过提供状态控制器的有效签名来移动,状态控制器本身是在别名输出中指定的。

对于状态控制器签名,ISC使用阈值签名(BLS或基于Schnorr/ED25519)。它确保至少⌊2N/3⌋+1的验证者节点必须为锚定事务提供有效的签名,以使其有效。

这样,链的状态和资产就由验证者委员会中的验证者的多数规则来控制。

可以通过更改状态锚中的状态控制器地址来轮换(更改)验证者委员会。注意,轮换不会改变链的身份、链的帐户、受控资产、数据状态和账上请求的积压。状态控制器的轮换对智能合约和链是完全透明的。

6.4 状态提交(Committing)

链的数据状态是键/值对的集合。每个键和每个值都是任意的字节数组。数据状态的键/值对用于实现各种链上概念:从链上账户到使用智能合约状态的特定案例数据。

ISC中链状态的概念与区块链中的同名概念略有不同:ISC中的链状态是键/值对的通用集合,本质上是状态变量及其值。而区块链的不同之处在于,链的状态结构并不反映转变的历史,即状态是如何创建的。由于可审计性和同步性的原因,转变(块)的历史记录被单独保存在数据库中,但是状态本身没有块的概念。

在其持久形式中,数据状态存储在链的L1 UTXO账本之外的键/值数据库中。这意味着链的数据状态在一个已知的节点圈内。这一事实可用于在L1使用公共IOTA网络的同时为链数据寻求隐私的用例,以及符合欧洲GDPR法规的情况。

通过“对(数据)状态的提交”,我们指的是对整个状态中的数据的密码学上的提交(cryptographical commitment)。

为了为审计和其他目的提供一致的历史信息,链将其保持在状态本身,即状态的块日志分区中。该块包含对之前所有块和状态、已处理的请求和事件的提交。因此,对数据状态的提交也是对其历史的提交。

对状态的提交最常见的例子是默克尔树的根,它是从状态的数据计算出来的。在以太坊中,状态提交是以Merkle Patricia trie的形式计算的。默克尔树并不是状态提交的唯一方式,也不是最有效的方式。

在ISC链中,通过使用所谓的verkle树,我们遵循了一种更有效的状态提交模式:一种基于树节点对其子节点的向量提交的树。向量提交通常基于不同于Merkle树中使用的哈希函数的加密。

树形式的提交基于从树根到数据元素的路径,提供数据元素包含的证明(也称为存在证明)。包含证明的大小取决于行为的方法和树的分支因子d(子结点的数量)。对于基于哈希的二叉Merkle树,分支因子为d = 2,对于以太坊中使用的Patricia trie,分支因子为d = 16。Merkle树中数据元素的包含证明是d × O(logd N),其中N是数据状态的大小(其中的键/值对的数量)。这使得默克尔树对于较大的分枝因子d不实用。

通过在verkle树中使用其他类型的提交,我们可以使包含证明的大小O(logdN),即d倍更小。它支持使用具有较大分支因子的树,例如256。这使得状态证明非常快速、小而有效。最有前途的verkle树承诺方案是Kate (KZG)和Pedersen多项式提交方案。

假设我们有一个S链的状态。与S的键/值存储并行,ISC节点维护verkle树(S)。对状态C(S)的提交是verkle树的根。它被存储在L1上的状态锚中,以便使链S的状态对任何人都是不可变的,除了由链的验证者集体产生的转变。注意,状态包含自己在块日志分区中的历史,因此链也被提交到历史中。

通过对当前状态Si应用一个突变Mi来更新链的状态:Si+1 = apply(Si, Mi)。转变Mi是一种状态转变,由虚拟机从输入和之前的状态计算得出:Mi = V M(Si,输入)。输入是VM要处理的请求,而智能合约程序是状态Si的一部分。

状态提交方案的重要需求是能够从突变中有效地更新verkle树:trie(Si+1) = updateT rie(trie(Si), Mi)。

在ISC中,链的数据状态完整地存储为当前状态(请参见状态转换)。要在ISC中访问一个键/值对,你不需要通过Merkle树来证明它包含在某个特定的区块中,就像在以太坊和比特币区块链中一样。这些块(状态的突变)只是为了使未同步的节点能够赶上和出于可审核的目的而保留的。因此,状态提交树对于链的操作是不需要的。

然而,在以下用例中需要状态提交:

在L1上的UTXO账本状态中,作为一个整体的,子状态和可审计的历史的提交。

在分布式长期存储解决方案中几乎任意大小的键/值对的包含(存在)证明。

无状态:能够对状态的一个片段进行一致的操作,并证明该片段的包含。这个属性对于欺诈证明和共享安全解决方案非常重要。

状态裁减:能够从状态中删除历史旧数据,而不会失去证明状态中包含任何裁减数据元素的能力。当具有链状态的数据库迅速变得太大时,这是任何高TPS用例的先决条件。

处理欧洲GDPR要求,“忘记”某些数据:数据可以在不违反状态一致性的情况下从状态删除。

状态快照:在状态本身中存储对过去状态的提交。这样就可以使用引用当前状态来验证过去的状态。

6.5 状态转换

数据状态通过其键/值对的转变来更新。每次修改都是设置键的值,或者从数据状态中删除带有值的键。对数据状态的任何更新都可以简化为一个有序的转变序列。通过将序列转变应用于当前数据状态,状态将被更新(转变)。

数据状态的一组转变,作为一个单元应用,我们称之为块:

nextDataState = apply(currentDataState, block)

链中的状态转换与链资产的移动和事务中新数据状态的状态确认的更新一起以原子的方式发生,该事务使用之前的状态输出(或“之前的状态锚”)并产生下一个状态锚。

IOTA智能合约白皮书

在任何时刻,链的数据状态都是应用历史区块序列的结果,从空数据状态开始。因此区块链。ISC块不包含块头或事务,只包含键/值对的转变。

此同时,状态的历史在L1上的UTXO账本上表示为状态锚的序列(或“链”),每个状态锚控制链的L1账户中的资产和对数据状态的确认。如图L1和L2上的链条所示。

注意,不是所有过去的状态锚都可用:由于实际原因,L1上的旧事务可能会被修剪(删除)并不可用。然而,可以保证的是,链锚UTXO的尖端在账本状态下总是可用的,它是全局唯一的,并且可以很容易地通过链ID定位到链账户中。

锚定状态的块和状态输出由VM计算,VM是一个确定性的处理器或“黑匣子”。VM负责状态转变和数据状态的一致性。

6.6 状态同步与验证

任何可以访问区块链和L1上的UTXO账本的一方(特别是一个节点),都可以按顺序地将区块应用到原始状态或从状态的一些有效快照开始,来重构链的数据状态。

节点可以通过计算确认来验证状态,并将其与L1下UTXO账本状态的状态锚上的状态确认进行比较:如果状态锚上的值等于计算出的确认,状态锚上的状态确认就是有效的。

每个节点在数据库中保存自己的数据状态副本,并使用状态锚进行检查,以确保它是唯一可能的有效数据状态。

保持状态副本有效和最新(即最新的)的过程,我们称之为状态同步或同步。最新(当前)状态由状态锚的唯一UTXO决定。

任何一方可以在任何时间查询UTXO账簿,并检索链的当前状态锚。如果状态锚中包含的状态索引和状态确认等于数据库中当前数据状态的状态索引和状态确认,则表示该方在其数据库中拥有最新状态,即同步状态。

如果数据库中存储的数据状态的状态索引小于状态输出的状态索引,则表示节点滞后,即未同步。请注意,通过状态索引,节点知道它在最新状态的后面到底有多少块。

节点可以通过从其他节点查询丢失的数据块,并依次应用到数据库中自己的数据状态的迭代过程来追赶和同步自己的状态。每个这样的步骤产生新的数据状态,节点可以计算它的确认值。重复这个过程,直到数据状态达到一个状态指数,状态确认值等于当前状态锚中的确认。注意:

旧的状态锚可能无法在账本中使用(换句话说,它被“裁减”了)。但是,流程将始终完成,因为当前状态锚始终处于账本状态中。

进程可能从源头状态开始。这在许多情况下都不实际,因此我们可能希望从数据状态的快照开始同步。在本例中,我们将通过达到当前状态(或不达到)来确定快照是否表示一个有效的过去状态。

6.7 链上账本

每个ISC链在其数据状态中使用其自身的有效性约束实现其自己的账本。虚拟机(VM)的确定性逻辑负责保持链上账本的一致性。链的账本状态转换由只能由虚拟机计算。

6.7.1 智能合约

智能合约是部署在链上账本的程序。我们所说的“部署”是指智能合约在链的数据状态中存储了二进制代码,这使得它是不可变的。二进制代码由确定性虚拟机解释。它使每个智能合约成为虚拟机的确定性的延展。

每个智能合约(或“程序”)都可以访问链的账本的一个分区。只有特定的智能合约对其分区具有读/写访问权限。链的整个数据状态被分割成非交叉的分区或子状态,每个分区或子状态由智能合约控制。

一些被称为“系统分区”的分区被内置到每个链中。每个系统分区由对应的核心智能合约控制。核心合约被硬编码到VM中,并自动部署。他们负责用户定义的智能合约所使用的链上基础设施,如智能合约的注册、账上账户或链配置数据。核心智能合约可以被视为虚拟机本身的一部分。

6.7.2 链上的账户

链的账本实现了账户自己的账本—链上账户。ISC链使用基于账户的账本模型(不像L1使用的UTXO模型)。链内智能合约的账户是全局的。智能合约可以假定帐户的共享的和客观的全局状态。

账户账本被实现为链数据状态的一个分区,由一个名为账户合约的核心智能合约控制。每个链上账户包含:

  • L1原生的iotas和其他数字资产(如铸造厂或NFT)的余额。
  • 帐户所有者,即帐户的控制实体。只有所有者才能从链上账户转移资产。帐户将所有者的ID作为accountID。

accountID要么是L1账本上的地址(后面有私钥/公钥对),要么是智能合约的ID,与另一个ISC链相同。该账户合约为其所有者提供了控制和安全访问资金的权限。访问帐户请求的发送方总是通过签名进行安全识别(请参阅请求智能合约)。

IOTA智能合约白皮书

链控制的 L1链上资产与L2链上账户的一致性由以下保证:

  • 通过状态锚定机制对数据状态和L1账户进行原子更新;
  • 虚拟机的一般确定性和账户核心智能合约的特定性。
  • 验证者的共识。

IOTA智能合约白皮书

VM逻辑保证了链上账户账本的主要不变量:任何状态转换都保持链上账户中的资产总和等于L1上链上资产控制的资产。以上等价于传统复式记账法中资产负债表上的相等资产和负债:链上账户可以被视为资产负债表负债侧,L1上的链上资产为资产负债表资产侧。

待处理的事项具有“尚未处理/待处理的输入/资产”的语义。参见请求智能合约。

7 节点

7.1 验证者节点与访问节点

每个链有一个ISC节点的子网。我们称子网中的节点为访问节点。通过调用,我们想说(a)每个访问节点在其数据库中保存一个有效的状态(b)它(可选地)为外部调用者提供对智能合约的访问,这些外部调用者希望通过视图调用查询链的状态,并希望直接向访问节点发送帐外(off-ledger)请求。

每个接入节点都连接到IOTA L1节点,以便接收链上账户的更新。请参见验证L1的激励。

子网中的对等体(即其他接入节点)通过静态分配的信任关系相互连接。这意味着每个访问节点在子网中都有其已知身份的邻居。通常,并非所有的访问节点都是其他节点的邻居,因此子网的拓扑可能不是同质的。

链子网中的一些访问节点是验证节点。验证者节点组成验证者委员会,这是一组有序的节点。委员会上的所有验证者节点都是彼此信任的邻居。

验证者节点可能通过API向外部提供访问,也可能不提供。验证者节点暴露在子网内部而不暴露在外部是很常见的:其他访问节点可能会屏蔽它们以保护它们不受外部攻击。

验证者委员会共同执行VM计算的输入和输出的共识,产生状态更新和锚事务(见consensus)。

其他访问节点正在监听由验证者委员会提交给IOTA L1的新状态锚。每当检测到新的状态锚时,访问节点通过请求其他节点的块并根据新的状态锚验证状态,将其链的状态与其他节点同步。

验证者节点通常都可以通过自己的IOTA节点访问L1。这使得访问L1上的Tangle就像访问链的验证者本身一样分散:L1账本访问没有单一的信任点。

链的每个验证者节点都有一个私有密钥共享,只有它自己知道。验证者节点使用它的私钥共享来签署事务。共识过程收集签名,并将它们聚合成最终有效的门限签名,而不需要访问主密钥,任何人都不知道。只要有一部分签名T,就可以生成有效的最终签名。通常,阈值参数T =⌊2N/3⌋+ 1,其中N是验证者委员会的规模。

私钥共享在安全的分布式密钥生成(DKG)过程中(在ISC的第一个版本中,我们使用的是Rabin-Genaro算法)在验证者节点之间分发。随着该领域的快速发展,新的有趣的替代方案也将不断涌现)。

每个密钥集合代表一个特定的验证者委员会,该委员会通过主公钥和状态控制器地址识别。状态控制器地址包含在状态锚事务的别名输出中。这样,验证者节点的多数决策规则就可以控制链的状态和资金:L1账本需要验证者的多数决策规则在状态转换上的一致;否则状态转换是不可能的。阈值签名是共识的证明。

可以通过替换状态锚输出中的状态控制器地址来更改(轮换)验证者委员会。通过这种方式,验证者委员会可以通过添加、删除或替换节点来修改,而无需更改链的身份,并且对智能合约及其请求者是完全透明的。

7.2 共识

智能合约链的状态更新是其验证者节点之间共识过程的结果。ISC中使用的共识是无领导的和异步的。我们在这里概括地描述它:

  • 在新周期开始时(在L1中作为节点的共享源),每个验证者节点查询其内存池并产生一批请求,称为批处理建议。对于每个验证者节点,批处理提议很可能是不同的,因为mempool是异步填充账本上和账本外请求的。每个验证者节点都将自己的主观时间戳和签名按自己的当前状态哈希私钥共享放入批处理建议中。
  • 验证者节点运行一种分布式共识算法,根据输入和提议对批量请求达成共识。ISC使用了HoneyBadger异步通用集(ACS)算法:一个无领导的异步拜占庭容错共识协议。时间假设的缺失(由于异步性)和领导者的缺失使得共识能够抵抗特定的攻击。
  • ACS的输出用于确定地计算每个验证者节点中相同的请求列表,时间戳和不可预测的随机性。

时间戳从建议的时间戳集确定地计算出来,并根据状态的时间约束进行调整。随机性来自于作为ACS共识输入的一部分提供的部分签名的聚合阈值签名。

  • 批量请求的确定性排序是基于ACS共识所产生的不可预测的随机性。这样,最终的批量请求中的顺序对于任何验证者节点都是不可预测的,因此不会受到验证者节点数量少于大多数决策者的影响。参见MEV预防。
  • 这种共识保证了每个验证者节点中完全相同的请求、时间戳和不可预测的随机性。最终的批量请求都可以由验证者节点的相同仲裁来处理,即每个验证者节点都有足够的信息独立于其他节点计算结果。
  • 如果批量请求的一致性不为空,它被用作虚拟机的输入。否则,将以新的批量提案重新启动这一轮。
  • 确定性的虚拟机产生的输出:(a)状态(块)的突变和(b)状态锚事务本质(尚未签署)。所有非故障节点产生完全相同的输出,这是唯一可能的有效结果。不同的结果意味着拜占庭故障,这是一种不当行为。
  • 每个节点用自己的私钥共享来签署交易,并将部分签名传播给其他验证者(只有签名,没有交易)。请注意,签名的错误结果将可追溯成为到特定故障节点的不当行为证明。
  • 每个节点将从对等体接收到的部分签名聚合到最终的阈值签名中,因此每个非故障节点产生相同的最终交易,准备发布到L1账本。
  • 所有节点以随机但确定的顺序发送最终事务到L1节点。如果几个节点向L1提交了相同的事务, L1共识会处理它,并确保UTXO账簿的一致性。在一般的行动过程中,这是罕见的。

状态锚事务在L1账本上确认后,各节点将独立于L1账本收到通知。在节点收到确认的锚事务后,它将更新的状态和相应的块提交给数据库。不参与共识的访问节点也将从L1节点接收到新的锚事务。访问节点将从其他节点查询丢失的块,然后验证其状态并将其同步到最新的状态。

7.3 MEV 防范

MEV代表矿工可提取价值。当区块链的验证者(矿工)有能力确定块中的事务流时, MEV成为可能。通过分析买入/卖出交易的流入流,矿工可以利用自己的技巧插入自己的交易来赚取利润。一个例子就是偷跑者。在受监管的股票市场,偷跑投资和类似的策略被认为是非法和不道德的。

在运行工作证明共识协议的区块链中, MEV是很难防止的。原因是每个矿工提交自己的块,因此事务在其中。其他的矿工只接受工作证明竞赛获胜者提出的区块,并且只在提议的事务上运行VM来验证它。通过这种方式,矿工就链的下一个(未来)状态达成共识。

相比之下, ISC在验证者之间运行,对虚拟机的输入、批量请求达成共识,即对当前状态达成共识。在对输入达成一致意见后,每个验证者节点运行VM单独计算块(由于VM的确定性,它总是有效的)。

ISC共识通过共识轮本身产生的不可预测的随机性将输入到VM的顺序随机化。这使得批处理的内容(包括订单)对验证者来说不可预测,除非⌊2N/3⌋+ 1的验证者串通。

因此, ISC共识通过使验证者无法确定块的内容来防止MEV。

8 虚拟机

虚拟机(VM)是ISC链的一个确定性部分,负责链上账本的一致状态转换。VM有一个硬编码部分,包括核心智能合约和内置解释器,如WebAssembly (Wasm)解释器或EVM。智能合约是虚拟机和确定性状态转换功能的扩展。

ISC的虚拟机遵循以太坊虚拟机(EVM)的模型:智能合约是可解释的二进制文件,可以调用被提议或来自其他智能合约的交易(称为“请求”),可以在只读模式(或“视图”)中调用它来访问链的状态。ISC还努力将虚拟机的核心功能从其具体实现中抽象出来。请参见调用智能合约:可组合性。

智能合约部署后,其二进制代码存储在链的数据状态中。智能合约从数据状态加载,并由虚拟机的内置解释器解释。

8.1 虚拟机的抽象

通过虚拟机抽象,虚拟机可以在同一链上同时支持几种类型的智能合约程序解释器:例如, WebAssembly二进制文件的不同解释器和EVM的不同配置。链的核心和VM对于智能合约程序的二进制解释器的确切类型是不可知的。

VM抽象包括:

VM解释器的抽象。主要目标是WebAssembly和EVM。

处理器的抽象,一个智能合约程序加载到解释器(与沙盒链接)并准备运行。

沙盒(Sandbox)接口:虚拟机为其插件提供的抽象接口,即智能合约。沙盒通过智能合约提供了对链资源的确定性访问:数据状态、资产/账户、调用其他智能合约、发布跨链请求、用于重型加密的实用函数等。

沙盒可视(SandboxView)接口:用于从智能合约的只读方法只读访问链的状态,这是视图的入口点。

8.2 核心合约

每条链可以有多个智能合约。其中一些被称为核心合约,在VM中具有特殊的功能,并且是硬编码的。核心合约作为链部署过程的一部分被自动部署,并与所有其他智能合约遵守相同的接口。这使得核心合约可以也可以像其他合约被外部用户和其他智能合约调用。请参见调用智能合约:可组合性。

每条链包含6个核心智能合约,它们与链本身一起自动部署。每个核心合约使用链级数据控制自己的分区,这些数据由VM维护:

根合约:部署新的智能合约和合约的注册。

账户合约:注册链上账户、所有权、在链上账户之间移动资产。

blob合约:大型二进制数据对象的注册,如Wasm二进制文件,相关的数据模式,程序源码。

块日志合约:跟踪区块,请求和事件日志。它是链的可审计历史。

治理合约:链的配置,如管理员权限、费用策略、委员会轮换、合同部署策略。

• _default 默认合约:当目标合约未找到时,就调用它。

8.3 Gas 和费用

8.3.1 Gas 的考量

IOTA DLT的核心特性是无手续费的,ISC中的智能合约也是如此。然而,为了量化完整的计算量,我们需要gas的概念来限制处理器和存储资源的滥用,以防止失控的程序和在状态下产生垃圾。gas的概念假定gas单位的成本与消耗的资源量成比例。

gas的作用有两个方面:

  • 给资源定价。它被换算成iotas/gas。请求者为链的资源支付iotas。
  • 为智能合约的调用设置上限,即gas预算。智能合约程序在运行时燃烧gas。超过预算意味着取消处理。

与EVM不同, ISC在同一链上可以有不同的程序解释器和不同的gas计量。这使得客观地校准gas成本变得困难。

因此,在ISC中,gas计量是特定于用例的,并且依赖于由链的治理所设定的gas和费用政策。gas政策的例子包括:

  • 没有费用,没有gas预算(在私有部署中可能被接受,但在公共设置中很容易被攻击)。
  • 无费用,每个合约固定的gas预算(企业和私有部署)。
  • 链层面每个合同固定的费用,每个合同固定的gas预算(主要用于企业部署)。
  • 基于gas的费用,在链级iota/gas定价,基于gas预算(公共部署)。

目前,我们看到gas价格在iotas主要由治理决策来确定。gas市场是可能的,而且可能是未来的一个选择;然而,iota/gas价格的波动通常是要避免的。

请注意,多链环境的目的是防止由于一条链的有限吞吐量和不断增长的需求而造成的拥塞。在ISC中,生成另一个并行链以增加总吞吐量以防止拥塞始终是一个选项。

8.3.2 费用

除了上文提到的通过gas控制拥塞,收费还具有激励验证者和链所有者(管理者)运行和验证链的作用。

通常,费用以IOTA或任何IOTA原生代币支付。选择取决于治理决策。收取的费用(如果有的话)分为两部分:验证者的费用和所有者的费用。分割策略由链的治理来设置。验证者的费用发放给验证者委员会中的验证者的账户,通常采用轮询或确定性伪随机方式。验证者的费用是对验证者验证链的激励。

所有者的费用进入链上所谓的公共账户,由链的管理者控制(见下文)。

9 链的治理

ISC是一个多链环境,不同链上的智能合约可以在没有任何额外信任的情况下进行交易。同时,每个ISC链是一个单独的分布式账本,具有特定的参数和配置。用例特定的链参数和配置的例子包括:

  • 治理者本身。
  • 验证者委员会的轮换参数。
  • 链中可信访问节点的子网配置。
  • 费用政策:gas资费,它定义了费用是否收取以及如何计算、收费、分发,以及使用何种代币、退款机制等。
  • 权限(如果受限制):部署智能合约,使用blob空间,发布请求,设置各种限制等。
  • 众多共识和智能合同执行的技术参数和限制。

被授权更改链配置的实体称为管理者或所有者。核心智能合约检查受限操作的授权。管理者只能做核心智能合约规定的事情;它不能做任何事情来改变链上的链更新的确定性流。例如,调控器不做任何事务验证,这是验证者节点的工作。

同样,验证者节点不参与链参数的任何决策。链的管理者通常有两种类型:

  • 一个普通的IOTA地址后面有一个公钥/私钥对。通常这是一个中心化的治理模型,其中一个人或组织来决定链的参数。
  • 同一条链或另一条链上的智能合约,代表分布式治理主体在链上执行治理操作——例如,一个DAO。这是一个去中心化的治理模式。治理的智能合约可以实现自己的治理逻辑:例如,它可能需要治理机构对某些决策进行安全的投票。在DAO智能合约中实现的治理模型的范围是无限的。

链的治理合约的功能示例包括:

  • 通过授权/索赔协议将所有权(治理权)转移到另一个实体。
  • 将链的验证者轮换到由地址所表示的另一组验证者(委员会)(这是一个多步骤的过程)。
  • 设置收费/gas政策。收费政策还包括如何在验证者和链的所有者之间分配费用。

链上的一个特殊帐户,即公共帐户,总是由管理者(不管是谁)控制。有意或无意中发送到核心合约的任何资产/代币最终会进入公共账户,只能由链的管理者/所有者移动。

10 智能合约的调用:可组合性

调用智能合约的一般方式有两种:调用(Calling)合约是对程序的同步调用。请求(Requesting)合约是对程序的异步调用。

这两种方法具有不同的语义,在不同的环境中使用。当智能合约调用其他智能合约时,这两种方法代表了智能合约的两种不同的可组合方式:

  • 调用提供了同一ISC链上的智能合约的同步可组合性(也称为原子可组合性)。
  • 请求提供了智能合约交叉链的异步可组合性,即不同链上的智能合约之间。

10.1 调用智能合同

在区块链中,智能合约通过调用彼此进行交互,就像程序中的函数一样。这是像以太坊这样的区块链上智能合约之间互操作性的主要方式。这样,同一链上的智能合约就可以在原子上组合。原子性表明,所有智能合约都在一个区块的上下文中访问相同的全局状态,并以同步方式修改它;因此,要么所有智能合约的所有更新都包含在区块的账本中,要么都不包含。例如,如果一个合同调用了ERC-20合同,然后是去中心化交易(DEX)合同, DEX又调用了oracle合同,都在同一个区块中,那么它们都处于相同的状态。

同步可组合性是区块链智能合约生态系统(如以太坊)的一个重要属性。ISC在每个智能合约链中完全支持这种可组合性。由于全局目标状态假设,这种类型的可组合性具有有限的可伸缩性。

视图调用是通过调用只读(视图)入口点,从链外同步调用智能合约。智能合约程序在链当前状态的上下文中运行,并将结果返回给调用者。例如,web服务器使用视图调用在web页面上显示智能合约的状态。

10.2 请求智能合同

请求是从链外的环境中调用智能合约的一种方式。请求由用户从他们的钱包或其他链上的其他智能合约发送(或“发布”)。每个请求都带有发送方私钥的签名,因此可以安全地识别请求的发送方。这一请求“包装”了一个对智能合约的调用。

到智能合约的请求流没有确定的顺序。请求本质上是异步的。在钱包用户或智能合约发送/发布请求后,它到达目标链的验证者节点的mempool。然后由验证者节点之间的分布式共识过程选择它,并调用智能合约程序(见上面),调用数据包装在每个验证者节点上的请求中,状态与输入相同。结果是L2上的新的区块的链(和智能合约)的状态更新和L1上的锚定交易。

对智能合约的请求包含:

  • 发件人ID(发件人地址)。
  • 目标链(chainID,一个别名地址)。
  • 链中的目标智能合约ID。
  • 合同中的目标入口点ID。
  • 附加资产:iotas和其他原生代币。
  • 调用参数:键/值对的集合。

链上请求也可能包含UTXO选项:时间锁定期限、到期期限、返还金额等(见附件:L1 UTXO账本的预设)。

有两种方式可以请求智能合约:

  • 在L1 UTXO账本上以UTXO事务的形式:这是链上请求。
  • 以签名API调用数据的形式直接发送到链的访问节点:这是链外请求。

10.2.1 账上请求

账上请求是对封装在UTXO中的智能合同的调用。这意味着,账上请求是L1上的一个事务。UTXO的目标地址被视为目标链的ID。

链账户中所有未被识别为链上资产的UTXO都被视为账上请求。它们构成了需要处理的链上请求的积压(参见链账户和链ID)。该链是一个L2实体,从待办事项中获取未处理的请求,处理它们并从待办事项中删除它们。

账上请求被使用于:

  • 从用户钱包(地址)发送(存款)资产到链上的智能合约。钱包创建一个带有输出的事务,该输出具有目标链ID作为目标地址,其他调用数据封装在输出的元数据中。表示请求的输出出现在目标链的待办事项列表中并得到处理。
  • 用于不同链上智能合约之间的跨链交易。智能合约通过将带有包装调用数据的输出包含到状态更新的锚定事务中,将请求发送到另一个链上的另一个合约。

向目标链的积压提交请求并从那里删除请求的操作都是原子操作。对于跨链请求这两个事件,(a)发送方链的状态转换和(b)发送方请求在目标待办事项中的出现,都是一个原子单元。

10.2.2 异步可组合性

通过在L1上的UTXO账本上执行的资产和数据的有保证的和无须信任的交付,账上请求为不同链上的智能合约的无信任异步可组合性提供了基础。

它通常与UTXO中的到期时间选项一起工作(参见附件:L1 UTXO账簿的假设)。发送方被保证,一旦请求被发送到目标链,它将被目标智能合约处理,否则资产(整个输出)将被原样返回。因此,即使是异步请求,L1也能保证一致性,而无需在链之间附加任何信任:不需要中继和跨链桥。

由于上面描述的属性,通过使用请求元数据的公共标准(也可以由UTXO账本强制执行),智能合约可以在不同的链之间组合,即使没有同步假设。我们称之为异步可组合性:智能合约之间不会产生可伸缩性瓶颈的那种可组合性。

例如,一条链可以将其ERC-20或类似的智能合约资产打包到跨链请求中,并将其发送到另一条链上,在去中心化交易所(DEX)上出售。该交易中涉及的唯一信任是对运行DEX的智能合约链的信任;然而,跨链沟通发生在同一账本上,因此不需要对两者之间的信任进行额外的假设。这两个链独立运行各自的智能合约,即并行运行。被包装的资产总是可以追溯到发起者、ERC-20合同和链。

10.2.3 账外请求

账外请求由用户从他们的钱包直接发送到链的访问节点。它是一个API调用,而不是L1上的事务。它们不能被智能合约发送到其他智能合约(智能合约对节点是不可知的)。

账外请求比账上请求要快得多,成本也低得多(例如,它不需要粉尘质押)。账外请求使高吞吐量(一条链上有数百个TPS)成为一种常态。

账外请求通过链子网中的一种传播机制直接传递到验证者节点的mempool。账外请求绕过了UTXO账,因此其账外吞吐量仅受智能合约链本身的限制,而不受L1的限制。

账外请求在功能上相当于向以太坊节点提交交易。

除了UTXO特定的选项(如时间锁)外,账外请求包含与账上请求相同的调用数据。它总是具有发送方的签名和一个特定于帐户的增量nonce,作为重播预防的一部分。

签名可以安全地识别发送者。VM检查发送方是否有足够的余额支付费用的链上帐户。如果帐户不存在或余额不足以支付费用,则取消处理。请求中指定的资产余额指的是发送方的对账账户中的资产。这些检查通过后,账外请求在功能上是等价的,并且具有与账上请求相同的安全属性。

账上请求不能重播;这是由事务哈希的惟一性保证的。然而,账外请求需要一种特殊的机制来防止重放,即攻击者重复相同的签名请求。

为了防止账外请求再次发生,VM根据数据状态(块日志)上的ID来检查请求的接收情况,看看它在过去是否已经被处理过。假设我们有所有过去的请求id,并且这些id是唯一的(从不重复),这就足以防止重放。但是,由于将数据库保持在合理大小的实际需求,旧的请求收据会不时地被删除。这使得不可能确定请求是否在遥远的过去已经得到处理。

为了防止重放很久以前的请求,VM会检查nonce对帐户来说是否太旧。用户需要通过一个接一个地增加请求的次数来发送请求。nonce是请求哈希(ID)的一部分。整个重放保护方案旨在克服已处理请求的历史内存有限和块中处理的批量请求中不存在确定顺序的问题。由于篇幅的原因,我们在此不作详细说明。

10.3 代币化:银行和现金的比喻

ISC多链系统的设计包括L1和L2上的高级代币化概念,也称为代币化框架(见附件:L1 UTXO账簿的假设)。

智能合约本身已经通过与ERC-20或类似的合约拥有强大的代币化功能。在ISC中,这被称为L2代币化。此外,ISC链上的智能合约可以拥有和操作L1资产,如iotas、原生代币、nft等。

原生代币和特殊的UTXO类型(如铸币厂)使L1上的代币化成为可能。

高级代币化的概念将L1和L2集成到一个框架中。我们在推理的时候也会用银行和现金的比喻。

“银行”将是L2上的一个智能合约,例如,它有自己的账户系统,相当于ERC-20。这些链上账户是用户的借据(IOU),就像在真正的银行一样。

“现金”将是L1上的原生代币, “银行”通过销毁链上相应的借据来为客户铸造这些代币。它锁定智能合约(例如ERC-20)中相应的L2代币(IOUs),并将新生成的L1代币移交给用户的L1地址。因此,用户(地址)将不再能够访问链上的ERC-20资金。相反,用户将在钱包中拥有一个本地L1代币,并能够在L1上与其他用户进行交易,就像用现金支付一样。

IOTA UTXO账本支持这种银行和现金的比喻,通过铸造凭空输出的原生代币的功能。铸造输出在账本上是唯一的;它有一个不可变的ID,并强制一个铸造模式,该模式在创建时不可变地链接到创造它的铸币厂。

一旦铸造完成,本地代币的新供应就会被赋予代币ID,因此它总是可追踪到特定的铸币厂输出。UTXO账簿通过铸造厂的不可变规定强制供应的一致性,例如代币的循环数量。原生资产可以由任何UTXO转移。这样一来,原生资产就成了IOTA账本中的一等公民。它们可以通过钱包和智能合约的通常机制被拥有和转移。它们还承载了铸币厂的元数据,因此可以在智能合约中以任何方式解释它们。

代币包装(Wrapping)的概念是解释原生资产的一种方式。让我们设想一个类似于智能合约链上ERC-20的智能合约。这是一个常见的代币化模式——例如,以太坊的代币化模式。

在ISC链上,这样的合同将拥有一个由ERC-20合同拥有和控制的铸造输出,供应模式承载着链和智能合同本身的身份。根据请求,智能合约将铸造新的代币,并锁定智能合约上由请求方拥有的各自代币(实质上是销毁IOU权利)。这意味着L1现在有了一个新的token,该token具有链和ERC-20合约的标识。智能合约将保持代币锁定,直到生成的代币从L1返回。否则,新创建的原生资产将在UTXO账簿上的地址之间自由循环,而不考虑特定链上智能合约中锁定的代币。

高级的代币化特性为不同链/账本的智能合约之间的丰富互操作性提供了一种媒介。包装可以被赋予各种语义,而不仅仅是币和代币。例如,电力传感器读数可以通过可追溯的来源证明被标记为可交易资产。

11 附件:L1 UTXO账本预设

ISC对UTXO账本进行了重要的扩展,称为UTXO类型。

需要注意的是,ISC作为一种协议,只对L1上的账本的结构和功能做了预设。它没有对L1上的共识协议进行预设。

在这里,我们非正式地描述L1上的UTXO账本模型,它提供了对ISC链和高级代币化特性的支持。

11.1 介绍

账本状态由未使用的事务输出(Unspent TransaXtion Outputs (UTXOs))组成:S = {U1, U2, …, UN }。每个输出都有一个ID,并且在账上是唯一的。每个输出都有输出类型,并包含输出数据(元数据)。资产的余额和这些资产被输出发送到的目标地址是输出数据的例子。

UTXO事务是输入、输出和解锁数据的集合: Tx = (IN, OUT, Unlock),如:

  • IN = IN(T x) = {I1, …, IN } 是一个已消耗(consumed)(或“已花费(spent)”)的UTXO的引用列表。我们说这些输出被事务消耗。
  • OUT = OUT(T x) = {U1, …, UM} 是该事务产生的新UTXO的列表。
  • Unlock是用来解锁输入的数据,通常是通过某种加密的授权证明来消费/花费in (T x)中列出的输出。在大多数情况下Unlock是输入和输出的数字签名,可以用输入地址进行验证。

账本是UTXO交易的集合: L = {T x1, …., T xK},账本状态S(L)由utxo组成,这些utxo不会被当前账上的任何交易消耗,因此术语名为“未花费的交易输出(unspent transaction outputs)”。

输出类型定义了特定的账本约束,当包含的交易被添加到账中时,输出给账本带来这些约束。通过constraints(S, U) = true,我们表示由输出U(取决于其输出类型)施加的所有约束都与账本一致。

根据定义,账本状态S(L)是一致的,即只有当所有处于账本状态的UTXO: U∈S(L)满足constraints(S, U)=true。

账本约束由交易验证规则强制执行。有人可能认为输出类型是硬编码的验证脚本。

账本是一种只追加的结构:这意味着我们只能向它添加交易。因此,每个事务都是账本状态的原子更新。假设我们有账本L,账本状态是一致的,即consistent(S(L)) =true。通过将该事务添加到账本中,我们修改了账本的状态,并发生了状态转换:Lprev∪{Tx} = Lnext。只有当事务Tx满足以下所有有效条件时才有效:

Tx 在语法上是有效的。

  • 输入IN(Tx)引用账本状态S(Lprev)上现有的UTXO,即不会被账本上已经存在的任何交易消耗的UTXO。
  • Unlock(Tx)是一个有效的解锁,即签名是有效的。
  • 状态转换保持账本状态的一致性: constraints(S(Lnext)) = true 和 可以通过使用事务Tx的上下文来确定,即它的输入、输出和解锁块的事实。

UTXO账本的重要属性是,状态更新(事务)的有效性可以由事务本身决定,而不需要访问账本的全局状态。

上面的内容意味着每个输出最多只能被一个事务消耗,否则两个事务将产生双花。账本一致性规则不允许双花,所以账本也不会有双花。

上述规则也使UTXO账本结构部分有序:根据其构造方式,它不能包含循环。UTXO账本从创世块、事务和输出开始,这是UTXO账本任何交易的最终前身。

创世的L0的账本预设是一致的。每个状态转换的一致性Li→Li+1保证了每个账本状态的一致性。我们可以讨论一个账本不变式I(L) = const,它由每个事务(账本状态的转换)保存。在创世状态中,不变量由创世事务定义:I(originLedger) = const。之后,当通过添加一个新的事务来更新账本时,账本不变量的所有条件(约束)都保持满足。例如,除其他事项外,IOTA账本不变量维持了在创世中定义的IOTA代币的恒定供应量:2,779,530,283,277,761。

11.2 UTXO账簿的可扩展性

UTXO账簿的一个重要属性是,它的结构是可并行的,因此是可扩展的。每个交易,即账本状态更新,只消耗一个特定的UTXO集合,也就是说,它只依赖于整体账本状态的某个片段。

Tx1和Tx2两个事务只要求它们没有共同输入时就可以同时添加到账本中,即 IN(T x1) ∩ IN(T x2) = ∅.

检查一笔交易是否双花是很容易的。此外,可以将独立的事务并行地添加(写入)到账本中,因为它们不会产生冲突(双花)。此属性使并行账本更新成为可能。

11.3 账本、账本状态和裁减

我们需要区分两件事:UTXO账本L本身和UTXO账簿状态S(L)。账本的主要目的是保持账本状态的一致性。账本本身,即事务的历史,对账本的操作并不重要;

然而,处于审计的目的它是必要,用来阐述事务是如何从起源开始走向当前的账本状态的历史。

一旦一个输出被一个交易花费,它就不再出现在账本状态,可以被删除(或“裁减”)。事务也是如此:事务是保持输入和输出之间联系的原子输出组。因此,事务只需要用于账本状态更新的原子性:在一笔交易被添加到账本之后,它只需要用于审核目的,即证明账本状态转换是有效的。否则,事务可能被遗忘(即删除),即使不是它所有的输出都被消耗了。

总之,账本状态总是可用的,而整个账本不是。

11.4 UTXO账本账户

账户是账本状态的一个子集。它是由某个实体控制的UTXO的集合。通常实体通过私钥/公钥对控制帐户。帐户在账本中按其地址进行识别。为了证明其控制帐户的权限,实体通过私钥提供签名,协议规则检查签名是否与地址相对应。

在以太坊等基于账户的账本中,账户本质上是代币和数据的余额:这被称为账户状态。帐户状态可以由地址的所有者(即私钥)修改(或控制)。在基于账户的账本中,账户是全局的,始终具有客观状态。如果帐户的所有者是一个智能合约,它总是接收相同的帐户状态作为其程序的输入,无论程序在哪个节点上执行。对于智能合约,状态在特定区块的上下文中是确定性的。

相反, UTXO账本中的帐户由UTXO(未用完的输出)组成,其目标地址为特定的地址。对账本并发写入也意味着对账户状态并发写入。因此,在UTXO账本中,账户的状态不是客观的:不同的节点可能会看到账户中UTXO的总体集合略有不同(除非他们将它们放入块,像比特币或Cardano)。因此,使用不同节点上相同UTXO帐户状态的程序可能会有不同的感知,并为程序提供不同的输入。

上述情况意味着处理帐户状态的智能合约必须首先处理UTXO帐户的非确定性的特性。

11.5 UTXO 扩展

在IOTA UTXO账本中,输出类型决定了输出给账本带来的约束。可以将输出类型视为硬编码的可配置约束验证脚本或状态机,它将事务上下文和UTXO作为输入,并在检查约束的结果中产生true或f alse,从而在账本中强制执行某些约束。UTXO(和事务)只有在结果为真时才有效,即不允许带有无效约束的账本状态。

最简单类型的UTXO模型假设输出中只存在资产余额。这种输出的约束是保留输入和输出中的代币余额:例如,在账本中保留固定数量的代币。

我们正在通过添加特殊的输出类型来扩展IOTA UTXO账本。这些设计是为了通过向UTXO账本添加其他约束来编程,以便在IOTA UTXO账本之上支持具有高级代币化功能的L2账本。

这里我们非正式地提供了一个不完整的输出类型列表。有关详细信息,请参考rfc# 38:代币化和智能合约的输出类型。

  • 单别名输出(An alias Output)是一种输出类型,它允许构建由输出本身指定的状态控制器地址控制的不可分叉链。别名输出被铸造(即新创建的),协议为它分配一个随机和唯一的ID,称为别名地址,在它的生命周期内。它给账本带来的约束保证账本上总是有一个(而且只有一个)具有给定ID的别名输出。我们总是可以通过账本上的别名ID查询别名输出。
    别名输出可以通过状态控制器地址的有效签名解锁。一旦锁定为事务中的输入,就必须在事务的输出中放入一个具有相同ID的别名输出。新的别名输出可以修改元数据和状态控制器地址。这样,通过使用别名输出,状态控制器(即地址后面的私钥)可以构建不可分叉的链。
    别名输出实现了账本上的地址别名的一个特性:即改变帐户的控制实体(即私钥)的能力,而不用改变地址,即对地址的用户透明。
    ISC使用别名输出进行状态锚定,这意味着在UTXO账本状态上提交到链的全局唯一状态。通过在链中产生下一个输出,我们在UTXO账本(L1)上自动记录链的下一个状态。地址别名化也使链的标识与状态控制器的标识解耦。
  • 扩展的价值传输输出(Extended value transfer output )(也称为扩展输出)使用可配置的验证选项扩展了简单的价值传输输出类型。它允许将IOTA代币和本地资产转移到目标地址,目标地址可以是任何类型的地址,包括别名地址。
    扩展的价值传输输出可以通过提供地址的签名来使用,或者,如果目标地址是别名地址,则在同一事务中解锁对应的别名输出。通过这种方式,别名输出的状态控制器还使用别名输出的目标地址控制所有扩展输出
    ISC为链和地址之间的账本请求使用扩展的值转移输出。输出的元数据还包含请求的参数。输出在同一个事务当中被别名输出作为状态转换被消费掉。消费输出的语义相当于对链“处理账本上的请求”。
    扩展的价值传输输出配置选项还包括时间锁、其消费的到期期限等。
  • 铸币厂输出(Foundry Output)是一种特殊的输出类型,它用新类型的代币(所谓的原生资产)来扩展账本。它可以铸造新的代币,并通过通胀(凭空创造)或紧缩(摧毁铸币厂拥有的代币)来控制它们。一个铸币厂输出对应于账本上代币的供应,账本强制代币帐户的一致性:只有铸币厂可以创建或销毁特定的代币。铸币厂可以被视为拥有自己“货币政策”的中央银行。在这种情况下,货币政策是铸币厂在其创建时设置的不变属性。它由协议和铸币厂输出类型验证规则强制执行。具体的“货币政策”可以是“没有通胀,只有紧缩”,“固定供给”,“年度通胀不超过10%”或类似的例子。铸币厂输出本身由创建它的别名地址控制;换句话说,对特定代币的供应的控制最终会转移到别名输出的控制私钥。
  • NFT输出(NFT output)类似于单别名输出,因此它的约束保证总有一个NFT输出具有账本上的特定ID。NFT代表不可替代代币。就像任何UTXO一样,NFT输出的所有权属于一个地址,因此可以在L1上的帐户之间拥有和转移它。NFT输出的另一个基本属性是,它包含一个不可变的来源证明,由账本约束强制执行:无论是谁创建(或“铸币”)了NFT输出,他们的公钥在NFT输出的生命周期内都不可变。

 

本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:https://www.iota.love/202201/iota-smart-contract-whitepaper/