专栏名称: 渡鸦区块链
区块链领域创业公司的首发阵地 投资机构必读公众号
目录
相关文章推荐
51好读  ›  专栏  ›  渡鸦区块链

从并发视角来看智能合约(上)【渡鸦论文系列】

渡鸦区块链  · 公众号  · 区块链  · 2017-09-13 09:00

正文

请到「今天看啥」查看全文



在区块链中使用智能合约的帐户就像在共享内存中使用并发对象的线程。

在共享内存中使用并发对象的线程。通过并发对象,我们意味着用于在同时运行的多个线程(进程)之间交换数据和管理交互的大量数据结构[20] 。并发对象的典型示例是区块,队列和原子计数器 - 通常通过诸如java,util,concurrent的数据库使用。同时,在运行时,这些并发对象被分配到正在运行的线程可访问的共享内存块中。由线程同时访问对象而产生的行为 - 即干扰是难以预测的,因此极难理解。


其不利用适当同步的并发对象(例如,具有锁定或障碍物)可以在干扰下会出现数据竞争[2]行为,导致内存完整性的丧失。即使对于无竞争对象,在一个或多个客户端的观点下,观察到的干扰行为可能是错误的。例如,特定的线程可能不会“预见”具有共享对象的其他线程采取的动作,因此可能不会期望该对象以干扰方式改变。


帐户使用智能合约块。智能合约类似于并发对象。他们储存在块状物中而不是一个共享的记忆中; 不是由线程使用,而是由帐户(用户或其他合约)调用。像并发对象一样,它们具有内部可变状态,管理资源(例如资金),并且可以在块内和多个块中的多方访问。与传统并发对象不同,由于计算的事务模型,智能合约的方法而是原子的。也就是说,合约的单一调用(或一系列调用一系列相互调用的合约)是有序执行 - 没有中断 - 并且在成功更新区块链之后终止或者中止并且回到之前的配置。


然而,“原子性自由”的概念是欺骗性的,因为在区块链的水平上仍然可以观察到并发行为:


-    在交易执行时,包含在交易中的交易的顺序并不确定,因此,结果可以在很大程度上取决于其他交易的排序[27].


-    几个编程任务需要将合约逻辑分散在几个区块链交易中(例如,当合约与块之外的世界进行“通信”时),从而实现真正的并发行为。


-    调用其他合约可以被认为是一种多任务合作。通过协同多任务,多个线程可以运行,但不要中断,除非它们明确地“产生”。也就是说,从合约A到合约B的呼叫可以被认为是从合约A的角度来看的收益,合约B在返回时收益。智能合约的关键在于,合约B可以运行合约A的设计者无意识到的代码,这使得情况比典型的顺序设备更接近并发设置。[3]特别地,合约B可以在调用期间修改合约A可能承担的状态。这是DAO错误[9],的精髓,合约B在返回[27]之前调用合约A来修改A的本地状态。然而,重入并不是表现出来的唯一错误,因为:


-    不难想象某种合约被用作其他区块(用户和合约),管理对共享资源的访问以及在某种意义上作为并发库的场景。随着多重交易变得越来越普遍,各种观察到的干涉模式,也应该考虑在内。


我们的目标和动机。幸运的是,在过去三十年中进行的并行和分布式编程的研究为大量的理论和应用框架提供了代码,指定,理由和正式验证并发对象及其实现的框架。因此,本文的目标是双重的。首先,我们将简要概述在智能合约中可能发生的一些已知的并发问题,在更传统的并发抽象方面表征问题。第二,我们的目标是建立一个直观的“良好”和“不良”的合约行为,可以相应地识别和验证/检测,使用现有的正式方法推理并发。


2.并发行为示例


在这里,我们讨论了已经部署在Ethereum块上的两个合约,每个合并都说明了并发类型行为的不同方面。BlockKing的合约,像今天的Ethereum集团许多其他人一样,实现了一个简单的赌博游戏[2]。虽然BlockKing使用不广泛,但我们研究它是因为它展示了Oraclize服务的潜在用途[4],这是一种允许合约与块之外的世界进行通信的服务,从而了解真正的并发性。由于Oraclize服务的早期采用者将其作为该服务的演示,并将其源代码免费提供,希望使用Oraclize的许多其他合约可能会在其实现中反映出来。


我们讨论的第二个例子是DAO中广泛研究的错误[1]。 DAO与18,000多名投资者建立了一个业主管理的风险投资基金;它吸引了当时存在的14%的以太币。随后的攻击使投资者花费了大约360万Ether,当时价值约5000万美元。 DAO采用了我们所说的“不协调的多任务”,因为当DAO向收件人发送钱时,那个接收者能够运行代码,通过DAO的合约状态来干扰DAO的合约状态,假设DAO在调用期间不会改变。







请到「今天看啥」查看全文