使用 EIP-2535 “钻石” 升级智能合约代码和存储布局

本文介绍了EIP-2535 "钻石"模式如何解决以太坊智能合约的不可变性和代码大小限制问题,通过代理合约实现代码可升级性。EIP-2535引入了Diamond存储布局,允许在不改变合约地址的情况下升级存储布局。文章探讨了升级存储布局的策略,包括添加、删除和更改字段,以及处理动态类型时的挑战和缓解措施。
摘要由CSDN通过智能技术生成

1ace8f2267c500c985b9425a40c5d3e7.jpeg


介绍


以太坊智能合约代码是不可变的:部署后无法更改。这与区块链的去信任性密切相关,但阻碍了智能合约的开发和维护。除此之外,智能合约代码大小限制为 24 KB。


除了代码之外,每个智能合约都有自己的内部存储,即 256 位插槽阵列。 Solidity 是以太坊智能合约最流行的编程语言,它将状态变量分配给存储槽并处理低级细节。但是,在许多情况下,开发人员可能希望在部署后更改存储布局,例如添加变量或优化存储读/写操作。


为了缓解这些问题,EIP-2535 提出了一种复杂的代理模式,它允许添加、替换和删除功能,并实际上消除了对代码大小的任何限制;以及创新的存储布局,抗碰撞且非常灵活。


在以下部分中,我们将介绍 EIP-2535 的基础知识,以及它如何实现代码可升级性。然后,我们将看到它是如何实现存储布局升级的。最后,我将提出一些与升级动态字段任务相关的注意事项,并提出缓解措施。


EIP-2535 及升级功能


尽管智能合约具有不可变的代码,但它们可以调用其他智能合约的函数。特别是,他们也可以这样做,同时通过委托调用保留存储上下文。此功能是启用高级代理合约的基础。


EIP-2535 中提出的代理合约,即 Diamond,代码很少,完全通用。同时,所有特定于应用程序的功能都由称为 Facets 的合约实现。在构造时,钻石只公开两个函数:一个 diamondCut 函数,它允许钻石所有者添加、替换和/或删除函数实现,以及一个 fallback 函数,它动态地将函数调用无缝地分派到适当的方面。


EIP 还指定了一个名为 Diamond Loupe 的接口,它允许对可以通过 fallback 函数调用的函数进行自省。这对于测试升级时的开发人员和使钻石

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值