主页 > imtoken 官网 > 干货| 以太坊可更新智能合约研发综述

干货| 以太坊可更新智能合约研发综述

imtoken 官网 2023-03-29 05:54:07

这篇文章是对以太坊可更新智能合约领域的研究和开发的调查。 它旨在成为一个方便的资源帖子,汇集最新研究并推进技术讨论。 此外,我还创建了一个比较不同策略优缺点的简要表格,该表格将在下面发布。 如果您在研究或开发领域工作或观察,请对本文发表评论,表达您对这张表和我对不同策略的描述的支持、不同意或其他意见。

除了我自己几个月前对 AvanceHub() 项目的贡献外,这篇文章没有包含新的技术发展和研究。 本文对不同的策略进行了排名,但这不应被理解为我或开发人员社区对它们的接受和偏爱。 作为 indorse.io() 项目的一部分,本文将首先介绍我们认为有必要的可更新策略。

在文章的底部,您可以看到我认为迄今为止重要的研究和发展的更全面的列表。

策略优缺点

代理合同

1. 使用此策略,无需重新设计即可更新合约

1.代理的合约代码不会反映其存储状态; 2. 目标合约的字段不可更改,但可以添加新字段; 3. 合约界面必须保持不变;

将逻辑与数据分离

1、数据合约可以正常读取数据; 2.数据合约中使用的数据结构可以更新和添加

1、合约必须分为数据合约和逻辑合约; 2. 合约界面必须保持不变; 3、改变复杂数据类型(如结构体)的方式比较复杂;

将逻辑与数据分离并使用“键值”对

图解以太坊智能合约_以太坊智能合约理解_以太坊solidity智能合约开发

1. key-value比较普遍和指向; 2.数据合约中使用的数据结构可以更新和添加

1、合约必须分为数据合约和逻辑合约; 2. 合约界面必须保持不变; 3、因为数据是以Key-value对的形式存储的,所以读取数据的过程非常抽象;

部分可更新的智能合约系统

1. 使合约系统的简单部分不可变以保持信任

1.(显然)不可更新的合约代码永远无法更新

100%更新机制

使用更多的智能合约基础设施,可以创建一套逻辑可以完全更新的智能合约。 该策略有两个分支:代理、逻辑和数据被分离到不同的合约中。 有两种方法可以在合约中分离数据和逻辑。

所有这些方法解决的根本问题是如何更新智能合约的逻辑,同时保持对合约状态的访问。

我没有看到任何这些策略在生产中使用或通过合理的安全审计。 我在下面简要描述了这些策略的工作原理,但我建议阅读文章末尾的最新资源,以完全熟悉它们的工作原理(特别是如果你刚刚开始遇到可续订合同。兔子洞) .

代理合同

代理合约使用 delegatecall 操作码将函数调用请求发送到可以更新的目标合约。 因为delegatecall会保持函数调用的状态,目标函数的逻辑可以更新,对于可更新目标合约的逻辑,状态会保存在代理合约中。 同样由于 delegatecall,msg.sender 将仍然是委托合约的调用者。

以太坊solidity智能合约开发_图解以太坊智能合约_以太坊智能合约理解

由于最近的拜占庭硬分叉使函数调用的返回大小为人所知,因此这种方法现在更加普遍(比 Nick Johnson 首次提出它时)。 您可以在 Daonomic 的 (@weka) 资源中看到通用代理合约的示例,这当然也是一本很好的读物以太坊solidity智能合约开发,其中详细介绍了该机制。

逻辑和数据分离

这种方法涉及将智能合约拆分为具有适当的 getter 和 setter 的数据合约,其中包含数据(变量、结构、映射等),以及一个逻辑合约,其中包含有关如何更新数据的所有业务逻辑。 逻辑合约通过setter更新数据,而数据合约只允许逻辑合约调用setter。 这允许在将数据存储在同一位置的同时替换逻辑,从而实现完全可更新的系统。

这样就可以更新合约,通过指定用户使用新的逻辑合约(通过解析器如ENS实现),更新数据合约的权限,使新的逻辑合约可以运行setter。

观看@ThomasWiesner 的视频以更好地了解此机制。

逻辑和数据分离以太坊solidity智能合约开发,使用Key-value形式的数据

该策略的工作方式与前一个类似,但不是使用以 Key-value 形式存储的数据结构(结构、映射等)。 使用围绕 sha256 哈希算法的标准命名系统来发现数据的价值。

请参阅 David Rugendyke (@darcius) 的文章以更深入地了解此机制。

部分可更新策略

创建一个完全可更新的合约听起来不错,但它需要在信任问题上做出重大妥协:合约不变性。 在许多情况下,使用部分可更新的合约系统可能是有意义的。

在这个策略中,智能合约的核心功能可以变得不可更新。 其他组件,可能不太基本或更复杂(因此更有可能需要更新),是使用可更新策略实现的。

以太坊solidity智能合约开发_图解以太坊智能合约_以太坊智能合约理解

我已经看到了这个策略的一些很好的例子,当然如果你知道其他人请告诉我:

其他挑战

综上所述

没有一种策略是完美的,选择正确的策略取决于要实施的智能合约系统。 所有策略都很复杂,智能合约设计者应该非常熟悉他们选择的可更新策略以避免安全漏洞。

我的观点

我的推特:@theblockstalk

研究论文

一般文学

代理合同

2018–02–22 Jorge Izquierdo:ERC DelegateProxy #897

2018-02-15 Daonomic:可升级的以太坊智能合约,Github 项目

以太坊solidity智能合约开发_图解以太坊智能合约_以太坊智能合约理解

2018-01-11Team B9lab:可升级的Github项目

2018–01–10Manuel Araoz:Solidity-proxy Github 项目

2017–06–02 @Ownage:Ether-router Github 项目

2017-05-24 Nick Johnson:疯狂的区块链科学:一个 100% 可升级的合约,Gist 文件

2017-03-15Jorge Izquierdo:高级 Solidity 代码部署技术

2017–03–07Manuel Araoz:Solidity 中的代理库

2017-02-13Jorge Izquierdo:Solidity 中的库驱动开发

2017-01-21Tjaden Hess:可升级的智能合约

2016–06–16 @MartinSwende:隐式方法代理

逻辑和数据分离

2017–12–09 @ThomasWiesner:升级链上智能合约

图解以太坊智能合约_以太坊solidity智能合约开发_以太坊智能合约理解

2017–11–13 Jack Tanner:可升级,Github 项目

2017-08-21Lukas K:可升级的智能合约。 我们在区块链上构建保险的经验

2016–08–16 @nikolai:Dapp-a-day 6:可升级代币

@monax:Solidity 1:五种类型模型

@monax:Solidity 7:更新 Solidity 合约

@Z.com 云区块链:解决方案——版本升级问题

逻辑和数据分离,使用Key-value形式的数据

2018-01-20 Hassan Abdel-Rahman:Solidity 中的可升级合约

2017-11-22 David Rugendyke:可升级的 Solidity 合约设计,Github 项目

2017-06-29Chandan Gupta:Interfaces make your Solidity contracts upgradeable,Github 项目

2016-06-08Elena Dimitrova:用 Solidity 编写可升级的合约

原文链接: