首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合同数据检索

合同数据检索
EN

Ethereum用户
提问于 2019-12-19 07:06:59
回答 1查看 52关注 0票数 0

每当我修改合同并再次部署合同时,随着新合同部署到新地址,现有合同中的数据将完全丢失。

例如,我有一份注册合同。当我第一次部署时,我忘记了检索用户名。因此,我不得不修改合同并重新部署它。在这种情况下,我丢失了注册到我的应用程序的用户的所有注册细节。

现在我的问题是:是否有一种方法可以将存储在旧合同中的所有数据检索到我的新合同中?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-12-19 08:33:42

当然,有几种方法可以做到这一点,所有这些方法都有各自的优点和不足:

  1. 使用代理合同。您的想法是部署两个契约:代理契约和实现契约。用户使用代理契约,甚至可能不知道实现契约的存在。代理契约通过DELEGATECALL操作码将几乎所有的请求委托给执行契约,因此在代理契约的范围内执行执行操作码,从而使用代理合同的存储。当您需要升级契约逻辑时,您可以部署新版本的实现契约,并告诉代理将请求委托给新地址。只要新旧实现契约都使用代理的存储,并且代理地址没有改变,数据就不会丢失。另一个好处是,从用户的角度看,新合同地址也不会改变。这个模式在开放齐柏林飞艇中有一个实现
  2. 使用存储合同。其思想是部署两个契约:控制器契约和存储契约。存储契约允许控制器读取/写入存储契约的任意存储槽。控制器契约不将任何业务数据存储在自己的存储中,而是调用存储契约来存储/检索数据。当您需要升级契约逻辑时,部署使用相同存储契约实例的控制器契约的新版本,然后告诉存储契约接受来自新控制器的请求(并停止接受来自旧控制器的请求)。只要新旧控制器合同使用相同的存储契约,数据就不会丢失。
  3. 把旧合同包在新合同里。其思想是部署一个正常的契约,当您需要升级它时,您可以将它切换到只读模式,并在一个新的地址部署一个新的版本。这个新版本只存储升级后添加/更改的数据,对于所有其他数据,它只是查询以只读模式运行的旧契约。此方法对于支持传输冻结的ERC-20令牌合同非常有效。

如果您需要更多关于这些选项的详细信息,请告诉我。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/78381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档