IOTA智能合同简介
我要感谢IOTA基金会的同事,他们为本文提供了素材和反馈。特别是领导Qubic项目的Eric Hop,他现在加入了IOTA 智能合约计划,还有Jake Cahill,他负责大部分的文案。
IOTA智能合约是IOTA基金会正在进行的一项工作。本文的目的是让社区了解我们在做什么,以及IOTA智能合约的发展方向。它还提供了一个机会,让社区开始通过提问和反馈来为项目做出贡献。
背景
最近,Eric Hop在他的文章“the State of Qubic”中介绍了Qubic项目,并解释了我们目前只关注智能合约的决定。自然,这些进展引发了关于IOTA智能合约如何与Qubic的愿景相关的许多问题。
本文将回答这些问题,提供一些来龙去脉和IOTA智能合约的技术介绍。尽管IOTA智能合约的许多方面来自Qubic项目,但在许多方面它本身就是一个独立的项目。我们相信我们正在采取的方向有很大的潜力,我们现在正在采取必要的步骤在实践中证明它。
什么是合约?
在我们定义智能合约之前,首先了解什么是法律意义上的合约是很重要的。
法律意义上的合约是不确定的协议,服从于复杂的法律制度。有关合约的法律依据很多因素而不同,比如合约各方是在哪个国家签订的。这里最重要的词是“不确定性”。这意味着合约往往模棱两可,其主观解释可能导致纠纷。
什么是智能合约?
相比之下,智能合约是一种程序化的协议,完全确定并自动执行。这使得争论变得不可能。
智能合约的概念是由Nick Szabo于90年代在他的论文Forming and Securing Relationships on Public Networks中提出的。在本文中,他设想将合约规则编码为计算机代码。
例如,智能合约可以被编程为以下协议:
如果F航班延误超过3小时,则向Alice支付保险金额A。“航班延误”是协议的一个条件,“向爱丽丝支付保险金额a”是该条件的后果。
执行智能合约的结果取决于一组条件,我们称之为状态。
例如,智能合约的状态可能包括:
航班: 准时
Alice账户余额: 0
智能合约账户余额: 1000
保险金额: 100
赔付状态: 否
智能合约的状态被发布到分布式账本上。当一个更新发生并且网络对变更达成一致意见时,一个新的交易被附加到账本以更新合约的状态:
航班: 延误(对具有延迟证据的另一个事务的引用)
Alice账户余额: 100
智能合约账户余额: 900
保险金额: 100
赔付状态: 是
智能合约在分布式账本上留下了不可改变的审计踪迹,其自动化为相关各方节省了时间和金钱。这个概念很简单,并且可以在各种有趣的用例中应用于几乎每个行业,从跟踪贯穿供应链的货物到交换股票和债券的所有权。然而,智能合约是一项新兴技术。它们如何适应现有的法律框架仍然是一个有待解决的问题,在它们充分发挥潜力之前,还有许多工作要做。
智能合约的分类
第一层 链上合约 (“On-chain”)
“链上”智能合约,如那些在Ethereum,本身是核心协议的一部分。这意味着它们由网络中的所有节点执行和验证。
优点
- 智能合约的安全性与网络的规模成正比;
- 智能合约可以在不提供签名的情况下从他们的账户中转移代币。
缺点
- 智能合约的规模很小,因为它们的程序必须由所有节点执行;
- 智能合约受制于网络交易费,且因为其标的的代币价格一样不稳定;
- 智能合约交易的平均成本大致与标的代币价格成比例;
第二层 链外合约(“Off-chain”)
“链外”智能合约在核心协议之外执行。只有被称为委员会的节点子集需要执行它们,并且可以在核心协议之外达成一致意见。
优点
- 智能合约不会给网络的其他部分带来负担;
- 智能合约交易的平均成本较低且可预测;
- 智能合约的必要分散级别(以及安全性)可以根据每个用例进行调整。
缺点
- 为了转移代币,智能合约程序必须签署交易,以证明他们能够访问该账户地址
- 智能合约的权力下放(以及由此带来的安全性)取决于委员会的规模、委员会的成员以及设立委员会的实体。
为什么IOTA需要智能合约?
在IOTA的许多垂直领域,包括供应链、智能城市、工业物联网等,智能合约都是必不可少的。IOTA智能合约帮助这些行业中的合约义务自动化。
与区块链相比,IOTA智能合约有很多好处,这得益于Tangle的可伸缩性、高吞吐量和无手续费事务的特性。
IOTA的智能合约是如何运行的?
IOTA智能合约定义为不可变状态机:
- 状态机:每个智能合约都有一个附加到Tangle的状态。状态包含账户余额、输入条件和随时间变化的结果等数据。每个状态更新表示Tangle上的一个状态转换。
- 不可变的:状态和智能合约程序代码都是不可变的,因为它们存储在Tangle上。可以通过将新事务附加到Tangle状态来增量地更新状态。
Tangle提供了状态转换的可验证的审计跟踪。它允许我们相信状态转换是有效的,它们不会被恶意的或错误的节点破坏。
第二层智能合约用例
为了促进IOTA包括物联网在内的用例,我们正在第二层“off-Tangle”上构建IOTA智能合约。
尽管Ethereum的“on-chain”智能合约由于其特性而流行,但它们也有一些明显的缺点。最突出的一点是,对于存在的每一个智能合约,每个节点都需要保存一份合约的程序代码和状态。当智能合约被触发时,网络中的每个节点都必须执行完全相同的代码。
对于为了生成单个结果而必须运行相同代码的节点数量没有限制。随着网络的增长,产生相同结果所需的处理量也在增加。这是可伸缩性的巨大障碍。
除了交易费用你需要支付被考虑列入账本,你还需要支付gas费用,以保持程序运行足够长的时间以完成它。这意味着运行这些智能合约的成本变得高得令人望而却步,但在某些类用例中,成本开销相对微不足道。
这就是为什么IOTA智能合约不是作为核心协议的一部分实现的,而是作为第二层协议实现的原因。
因此,IOTA智能合约为运行分布式计算提供了一种更自然的方式。每个智能合约都可以在本地环境下执行,而不必强制整个网络执行它们。这也意味着IOTA智能合约将不会成为未来利用分片解决方案扩展IOTA网络的障碍。
智能合约所有者
每个智能合约都有一个所有者,他负责:
- 创建智能合约程序并提交给网络。
- 决定委员会的规模(N),并选择网络节点作为其中的一部分。
- 决定有多少个委员会节点必须就智能合同状态更新达成共识。这个数字称为裁定人数;
- 定义智能合同的其他通用配置参数。
所有者可以是单个实体,比如一个组织或一个人,也可以是一个分散的同行集合,比如一个组织联合体。在每种情况下,所有者只管理智能合约的搭建和配置,而不参与它的运行。
所有者可以根据情形和目的选择如何建立智能合约。例如,处理高价值事务的智能合约可能需要一个大型节点委员会。而处理微事务的智能合约可能只需要一个包含20-30个节点的委员会。
动机:报酬和声誉
创建或运行智能合约可能有很多原因。一个原因是报酬。
虽然IOTA交易是无手续费的,但IOTA智能合约为企业提供了一个机会,可以用IOTA代币收取费用,比如用于支付运营成本。我们称这种费用为报酬。
所有者和委员会节点都可以获得智能合约报酬。由业主与委员会节点运营商协商,确定可接受的最低报酬。
- 委员会节点可以通过执行提供报酬的特定智能合约来获得报酬。
- 所有者还可以选择创建智能合约,收取一定比例的报酬。
成为委员会成员的另一个潜在动机是建立良好的声誉。智能合约所有者可以选择只由拥有良好声誉的节点组成委员会。
这种声誉系统可以为委员会节点创建一个开放的市场,来鼓励网络上的良好行为。
智能合约程序
智能合约程序是一种包含虚拟机(VM)指令的算法。我们将使用WebAssembly (WASM)作为IOTA智能合约的主虚拟机。但通常,VM可以使用任何语言,甚至可以在节点的软件中硬编码。
程序接受两个事务作为输入:请求事务和当前状态事务。下一个状态事务总是引用请求事务和前一个状态事务。这样,智能合约程序就有了确定的方式来构建由传入请求触发的状态更新链。
程序的散列存储在Tangle中,因此是不可变的。
(注意:IOTA智能合约是由一个事务而不是一个包定义的,因为我们是在去协调器后的IOTA协议中实现它们的,该协议对价值事务使用UTXO模型)
一个智能合约程序的例子
下面是FairRoulette智能合约的简短描述,它是我们用于测试的内部概念验证用例。
设想通过一个智能合约程序,来实现在一个轮盘赌轮上下注。智能合约将在其账户中包含已押注的IOTA代币,以及每笔下注(金额、颜色、玩家)的数据。后者是支付给轮盘赌游戏赢家所需要的。
要下注,您需要向智能合约发送一个请求交易。该交易将包括:
- 一笔以IOTA代币来支付执行成本;
- 你下注的IOTA代币;
- 你选定下注的颜色;
然后,当委员会节点看到此交易时,它们将执行智能合约的程序以更新您的下注状态。
在游戏结束后,奖金将根据智能合约的程序自动执行。
委员会和裁定人数
智能合约的账户地址归委员会所有。这个地址包含存放的IOTA代币。只有一定数量的委员会节点才能将令牌从该地址转移出去。换句话说,必须满足裁定数量的委员会节点进行合作,才能将IOTA令牌从帐户中移走。
我们使用BLS多重签名地址来给予委员会中的节点对该地址的平分的所有权。这些地址支持阈值签名,这意味着委员会中满足裁定数量的节点必须使用他们的密钥在同一交易上签名,以产生有效的签名,从而更新智能合约的状态,并转移智能合约控制的资金。
智能合约是如何创建的?
智能合约的所有者创建程序,其二进制代码存储在委员会节点中。程序的散列总是可以通过状态事务访问的,因此智能合约是不可变的。
所有者建立一个节点委员会,负责执行程序,监听Tangle上的请求事务,并共同更新智能合约的状态。
在委员会设置期间,所有者决定委员会和仲裁的大小,并初始化委员会节点之间的分布式密钥生成(DKG)过程。这一过程产生:
- 一个由智能合约控制的账户地址。
- 每个委员会节点的私钥(所有者或其他委员会节点并不知道)。
这个过程可以是集中的,也可以是分散的。在集中式版本中,所有者能够在需要时使用主密钥来覆盖委员会的决定。在去中心化版本中,所有者不能重写决策。
如何更新智能合约的状态?
委员会节点一直在监听Tangle上的请求事务,以便将其发送到智能合约。
当委员会节点检测到一个事务时,它通过执行智能合约程序来计算下一个状态。这样,诚实的和同步的节点将始终生成完全相同的状态更新事务。委员会节点从来不交换真正的结果,只交换散列。因此,没有节点可以复制彼此的结果来尝试操控和骗取回报。
如果节点不同意更新状态,它们将分别签署不同的事务,从而导致无效的签名。因此,节点必须就更新状态达成多数共识。
在Tangle的异步设置中,每个委员会节点可能会看到不同的状态,这取决于它的本地或邻居的时钟。因此,委员会节点必须运行一个分布式的共识算法来对结果达成共识。共识的结果是结果实质的散列、部分BLS签名的集合和一个时间戳。所有智能合约事务都有时间戳,并且时间戳与大多数节点的本地时钟一致。
当所有节点达成一致意见时,委员会的一个成员,称为leader,在提交最终交易给Tangle之前,将所有节点的部分BLS签名集合起来。此事务必须引用前一个状态来生成一个状态更新链,该链作为审计跟踪。交易确认后,成为智能合约的新状态。
挑战
IOTA智能合约非常灵活,但这种灵活性也带来了挑战,其中一些我们已经开发了相应的解决方案。
状态分叉
状态分叉是智能合约状态的一个冲突副本。当两个或多个事务被附加到Tangle,以不同的方式来更新状态,就会发生这种情况。尽管我们希望状态分叉很少出现,但理论上它们可以在异步环境中发生。例如,就在发布最终事务之前,领导节点失去与Tangle的连接,在超时后,另一个节点接管领导权。在这种情况下,两个领导节点可以对Tangle进行状态更新。
为了防止状态分叉——在智能合约的设置中,创建了一个唯一的染色代币,称为智能合约代币(总供应量为1)并转移到智能合约地址。每个状态更新都将唯一的智能合约代币发送到相同的地址,从而将相应的未使用输出移动到新事务。这样,事务就形成了一个不可分叉的链,因为它不可能将智能合约代币的输出分割和花费两次。
快照
快照是节点节省磁盘空间的一种方式。某个日期之前的交易可能会被“快照”掉。在这样做的时候,旧的智能合约状态事务和更新可能会丢失。
为了缓解这个问题,智能契约可以通过收集所有状态信息并将其添加到单个事务中来执行自己的快照。该事务成为新链的开始。
大量代币
如果你可以依靠整个网络来处理一大笔钱,就像以太坊第一层智能合约一样,那么在合约中长期锁定一大笔钱就会安全得多。然而,有限规模的委员会不能保证在很长一段时间后仍然存在。对于这些用例,聪明的合约所有者可能会根据具体情况制定其他应急计划。
密钥管理
节点需要为它们所属的每个委员会管理一个密钥。因此,当一个节点是许多委员会的成员时,存储和管理这些密钥是一项基本任务。节点将需要一个解决方案来进行安全和可伸缩的密钥管理。
结论
IOTA智能合约是由第二层(off-Tangle)上的授权委员会执行的智能合约程序。节点委员会通过向Tangle提交已签名的事务(使用阈值签名)来共同更新账本。
IOTA智能合约非常灵活,比其他替代的区块链方案相比需要更少的资源。它们可以使那些不能只用费用作为唯一激励应用场景成为可能,在物联网领域尤其如此,微型合约和微型交易有望成为规范。我们计划在第一个版本中使用WebAssembly,但我们不局限于单个虚拟机(VM),将来可能会使用其他编程语言和VM。
我们邀请整个社区通过官方的Discord服务器的SmartContracts频道来分享他们的想法,想法和反馈。
本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:http://www.iota.love/202008/iota-smart-contract-official-introduction/