以太坊可更新智能合约研究与开发综述
原文地址:https://ethfans.org/posts/ethereum-upgradeable-smart-contract-strategies
这篇文章是对以太坊可更新智能合约领域里的研究和开发的综述。它意图成为一篇便利的资源帖,集中迄今为止的研究,并推进技术讨论。此外,我已经创建了一个关于不同策略的优缺点比较的简要表格,下面会放出来。如果你正在研究或者开发领域工作或者观摩,请对本文作出评论,给出你对这份表格和我对不同策略的描述的支持、反对或是其它意见。
除了几个月前我自己为 AvanceHub 项目贡献的部分以外,这篇文章没有加入新的技术开发和研究。本文中对不同策略进行了排序,但这不应被解读成它们的接受度以及我或者是开发者社区的偏爱。作为 indorse.io 项目的一部分,本文将从对我们的可更新策略的介绍开始,我们认为这是有必要的。
在文章底部可以看到一份比较综合的列表,里面包含了我认为迄今为止重要的研究和发展。
策略 | 优点 | 缺点 |
---|---|---|
代理合约(Proxy Contract) | 1. 使用这种策略,不需要重新设计就可以更新合约 | 1. 代理的合约代码将不会反映出它存储的状态;2. 无法改变目标合约的字段,但可以添加新字段;3. 合约的交互界面必须保持原样; |
将逻辑与数据分离 | 1. 数据可以从数据合约中正常读取;2. 用在数据合约中的数据结构可以更新和添加 | 1. 合约必须被分成数据合约和逻辑合约;2. 合约交互界面必须保持原样;3. 变更复杂的数据类型(例如,结构体)的方式比较复杂; |
将逻辑与数据分离,并使用"key-value"对 | 1. Key-value更加普遍也更加点;2. 用在数据合约中的数据结构可以更新和添加 | 1. 合约必须被分成数据合约和逻辑合约;2.合约交互界面必须保持原样;3. 因为数据储存在 Key-value 对中,读取数据的过程非常抽象; |
部分可更新智能合约系统 | 1. 让合约系统的简单部分变成不可更改的,以维系信任 | 1. (显然)不可更新的合约代码永远也不能更新 |
100% 可更新机制
使用更多的智能合约基础设施,创建一套完全可以更新逻辑的智能合约是有可能的。这种策略有两个分支:代理、逻辑与数据分离为不同合约。而分离合约中的数据和逻辑有两种方式。
所有这些方法解决的基本问题都是如何更新智能合约的逻辑、同时维持通往合约状态的通道。
我没有看过这些策略中的任何一个用于生产或是通过合理的安全审计。在下文中我哦哦给出了这些策略如何生效的简短描述,但我推荐大家到文末阅读最新的资源,以充分地熟悉它们的工作原理(尤其是,如果你正要开始跑进可更新合约的兔子洞的话)。
代理合约
一个代理合约使用 delegatecall 操作码,将函数调用请求发送给一个可以被更新的哦目标合约。因为 delegatecall 会保持函数调用的状态,目标函数的逻辑是可以被更新的,并且状态会保留在代理合约中以供可更新目标合约的逻辑使用。也因为 delegatecall, msg.sender 将保持代理合约调用者的身份。
因为最近的拜占庭硬分叉让一个函数调用返回值的大小变得可知,这种方法现在变成普遍的了(比起 Nick Johnson 初次提议的时候)。你可以在 Daonomic 的资源中看到普遍代理合约的一个例子,当然,该文同时也是一篇值得阅读的好文章,讲到了这种机制的更多细节。
逻辑与数据分离
这种方法包括将智能合约分成一个带有合适 getter 和 setter 的数据合约,包含了数据(变量、结构体、映射,等等);以及一个逻辑合约,包含了如何更新数据的所有业务逻辑。逻辑合约通过 setter 更新数据,数据合约只允许逻辑合约调用 setter。这让在保持数据储存在同一个地方的同时让逻辑可以被替换,允许一个完全可更新的系统。
这样的话合约就可以更新,通过指定用户使用新的逻辑合约(通过一个 resolver 比如 ENS实现)、更新数据合约的许可以使新的逻辑合约可以运行 setter。
观看 @Thomas Wiesner 的视频以获得对这种机制更好的理解。
逻辑与数据分离并使用 Key-value 形式的数据
观看 David Rugendyke 的文章以获得对这种机制的更深入的理解。
部分可更新的策略
创建一个完全可更新的合约听起来很棒,但它要在信任问题上要求一个大妥协:合约的不可更改性。使用部分可更新的合约系统在很多情况下也许是有意义的。
在这种策略中,智能合约的核心功能可以变成不可更新的。其他的也许更不基础或者更加复杂(因此更有可能要求更新)的组件则使用一个可更新的策略来实现。
我已经看到了这种策略的一些好例子,当然如果你知道别的也请告诉我:
- 以太坊域名系统(ENS):核心的 ENS 合约是一个非常简单的合约,也是不可变更的。而域名登记者(例如,对“.eth”域名来说)可以由管理员更新。“.eth”域名的登记者是所有权(Deed)合约的一个合约参数;每一个所有权都会创立一个所有权合约,所以如果使用一个新的域名管理器,它也可以被重新连接到所有之前的所有权以及它们的状态,没有什么麻烦。
- 0x 项目:603 行核心 DEX(去中心化交易)智能合约完全可以更新,同时代理合约(每一个用户都有)保持原样。0x “代理”合约(与上述的代理策略并不等同)保留了用户的资金和设置。因为这一点,它要求更多信任,它也是 0x 合约系统中一个不可更新的部分。
其它挑战
- 所有情况都要求治理上的权衡:妥协掉智能合约的不可更改性。一个有力的治理策略也是一个可更新策略的一部分。
- 创建一个选择性可更新智能合约系统是可能的,对用户来说也是有意义的,但会增加复杂性。
- Solidity 编译器的变化也许会打破新旧合约之间的协作性。
- 在形成一个可更新的策略时要考虑 gas 运营成本。
结论
没有一种策略是完美的,选择正确的策略依赖于要实现的智能合约系统。所有策略都是复杂的,而智能合约设计者们应该非常熟悉他们选择的可更新策略,以避免安全上的脆弱性。
我的观点
- 要创建一个可更新的智能合约,代理机制在这些策略中看起来是最好的,因为他允许程序员将可更新机制从它们的合约设计中分离,这会到这事情变得更容易思考和使用,也会让错误更少(这可是一个最初我们需要可更新合约的根本原因)。
- 使用一个综合的部分可更新策略,让最简单的核心逻辑变成不可更改的同样是一个好主意,可以强有力地维护用户对合约的信任。
- 首先设计你的不可更新的智能合约,然后形成一个可更新的策略;这似乎是一个有实践意义的方式,也是理想的方式。
以太坊可更新智能合约研究与开发综述相关推荐
- 基于以太坊网络的智能合约开发、部署和测试(入门)
为什么80%的码农都做不了架构师?>>> 基本概念: 以太坊是一个开放的.公开的区块链平台,允许用户构建自己的去中心化应用在上面运行 Solidity是一种语法类似JavaSc ...
- 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件
目录 1. 元宇宙核心技术 2. 元宇宙实例及应用实例 3. 以太坊里的智能合约开发 3.1. World Wide Web的访问能力 3.2. 初始化以太坊钱包 3.3. 开发4方合约 3.4. 手 ...
- 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
比特币开发者Udi Wertheimer发推称,我觉得这是以太坊作为顶级智能合约平台的最后一个周期了. 昨天币安智能链(BSC)结算500万ETH,以太坊本身结算700万ETH左右.这可能会很快结束. ...
- 以太坊—开放的智能合约完整解决方案
什么是以太坊(Ethereum)? 通俗的讲,以太坊是一种新的法律.传统的合同合约依据法律订立,执行.违约处理依赖律师.法院:以太坊解决了这一系列问题,合约通过程序订立.执行,人工无法干预,所以几乎可 ...
- 区块链入门文章二《以太坊:下一代智能合约和去中心化应用平台》
以太坊:下一代智能合约和去中心化应用平台 以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有 ...
- 3.25 以太坊:实战智能合约众筹1
这次我们来看看怎么实现以太坊的众筹智能合约案例,首先我们了解一下下面的概念 1.什么是ICO? ICO是以初始产生的数字加密货币作为投资回报的一种筹措资金的方式,它的概念源自证券界的Initial ...
- solidity开发以太坊代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- 附录2 以太坊:下一代智能合约和去中心化应用平台(选译)
以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有资产担保或内生价值[1],也没有中央发行者 ...
- 以太坊:下一代智能合约和去中心化应用平台
以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有资产担保或内生价值[1],也没有中央发行者 ...
最新文章
- Android工程目录
- 什么是光纤的波长?看看有哪些是你不知道的!
- 使用Amoeba实现MySQL读写分离详细步骤(推荐的方式)
- JDK8-lambda表达式四种forEach性能对比
- python输入一个字符串、计算其中小写字符的个数_编写程序,输入一个字符串,统计其中大小写字母数字和其他符号的个数并输出,要求统计过程在函数COUNT中进行...
- 上周热点回顾(2.19-2.25)
- JSP乱码(Tomcat和Weblogic)
- hobbits.me+霍比特+php,霍比特人:意外之旅(MP3+中英字幕) 第24期:飞贼霍比特人
- 班级校园网页设计作业 静态HTML我的班级网页 DW班级网站模板下载 大学生简单班级网页作品代码 我的大学网页制作 学生班级网页设计作业
- 单元测试总结反思_单元测试反思300字
- C#/.NET 通过代码打开浏览器
- Mac上安装虚拟机搭载window系统
- 展望 | 2023年十大科技趋势
- linux软件 mac地址,Linux MAC地址
- 点击table中的某一个td,获得这个tr的所有数据
- win8 php 64位下载地址,万能驱动win8/win8.1下载 64位32位
- 零基础无实物一步一步学PLCS7-1200仿真(三)-电动机正反转控制(互锁)
- 基于vue练习demo:发表评论案例 (使用localStorage存储数据)
- Django+vue 分页展示
- m3u8合并解密 TS视频文件分片合并解密