区块链数字货币行业媒体资讯-币大大 其他文章 打破区块链的不可篡改,代理模式如何以最佳方式实现智能合约升级?(区块链app推广)

打破区块链的不可篡改,代理模式如何以最佳方式实现智能合约升级?(区块链app推广)

okx

OKX欧易App

欧易交易所app是全球排名第一的虚拟货币交易所。

APP下载   官网注册

严格来说新闻稿:责任编辑意在传达更多市场重要信息,不形成任何人投资提议。该文仅代表者译者看法,不代表者MarsBit官方立场。

小贴士:记得关注哦

来源:CertiK

原文标题:冲破区块链的不容盗用,全权商业模式如何以最差形式同时实现智能化合同升级换代?

全权商业模式使智能化合同能够升级换代其方法论,同时维持其链上门牌号和状况值。对全权合同的初始化会透过delegateCall的形式继续执行源自方法论合同的标识符,以修正全权合同的状况。责任编辑将为大家概述全权合同的类型有关的恶性事件和提议,以及使用全权合同的最差实践

可升级换代的合同和全权商业模式简介

我们都知道区块链的「不容盗用」个人风格,也说明了智能化合同标识符在布署于区块链上时就难以被修正。

因此当开发人员想为方法论升级换代、修复错误或因安全预览试图预览合同标识符时,她们必须布署两个捷伊合同,并会生成两个捷伊合同门牌号。

想要解决这个问题,就能用全权商业模式。

全权商业模式同时实现了合同的可升级换代性,并且不会发生改变合同的布署门牌号,这也是目前最普遍的合同升级换代商业模式。

全权商业模式是两个可升级换代的合同控制系统,包括全权合同和方法论同时实现合同。

全权合同处理使用者可视化和数据及合同状况储存。使用者对全权合同的初始化会透过delegatecall继续执行源自方法论合同的标识符,从而发生改变全权合同的状况。升级换代则是透过预览在全权合同预定储存槽里历史记录的方法论合同门牌号来同时实现。

较为常规的三种全权商业模式分别是透明化全权、UUPS全权和Beacon全权。

透明化全权

在透明化全权商业模式中,升级换代机能是在全权合同中同时实现的。全权合同的图书馆员配角被赋予了操作方式全权合同的间接职权,以预览全权对应的方法论同时实现门牌号。没有图书馆员职权的初始化者则会把她们的初始化委托给同时实现合同。

注意:全权合同图书馆员不能是方法论同时实现合同的关键配角,甚至也不能是普通使用者,因为全权图书馆员难以与同时实现合同进行可视化。

UUPS全权

在UUPS(Universal Upgradeable Proxy Standard)商业模式中,合同升级换代机能是在方法论合同中同时实现的。由于升级换代监督机制储存在方法论合同中,升级换代过后的版本能删除升级换代有关的方法论,以禁止未来的升级换代。在这种商业模式下,所有对全权合同的初始化单厢被发送到方法论同时实现合同。

Beacon全权

Beacon全权商业模式允许多个全权合同透过引用Beacon合同来共享同两个方法论同时实现。Beacon合同为初始化的全权合同提供方法论同时实现合同的门牌号,当升级换代到两个捷伊方法论同时实现门牌号时,只需要预览Beacon合同里历史记录的门牌号即可。

全权误为和恶性事件

开发人员能借助全权商业模式合同来同时实现可升级换代的合同控制系统。不过,全权商业模式也有一定的操作方式门槛,如果操作方式失误,可能会给项目增添堪称毁灭性的安全问题。以下部分展示了与全权误为有关的事件,以及全权增添的虚拟化风险

全权管理的公钥外泄

全权图书馆员控制着透明化全权商业模式的升级换代监督机制,如果图书馆员的公钥被外泄,普通使用者能升级换代方法论合同并在全权状况上继续执行她们自己的蓄意方法论。

2021年3月5日,PAID Network遭受了由于公钥管理不善而引起的“铸币”攻击。PAID Network被普通使用者借助,普通使用者盗取了全权图书馆员的公钥并触发了升级换代监督机制以更改方法论合同。升级换代后,普通使用者能销毁使用者的PAID,并为自己铸造了一批PAID,随后再将其出售。标识符这类并不存在恶意软件,而是普通使用者从图书馆员那里获取了升级换代合同的公钥。

未初始化的UUPS全权同时实现

对于UUPS全权商业模式,在全权合同的初始化过程中,初始参数由初始化者传给全权合同,再由全权合同初始化方法论合同里的initialize表达式同时实现初始化。

initialize表达式通常被“initializer”缩排保护,以限制该表达式只能被初始化一次。在初始化initialize表达式后,从全权合同的角度看,方法论合同被初始化了。不过,从方法论合同的角度来看,方法论合同并没有被初始化,因为initialize并没有在方法论合同中被间接初始化。鉴于方法论合同这类未被初始化,任何人人都能初始化initialize表达式来初始化它,将状况变量设置为两个蓄意的值,并有可能接手方法论合同。

方法论合同被接手的影响取决于控制系统中的合同标识符。在最坏的情况下,普通使用者能将UUPS全权商业模式中的方法论合同升级换代为蓄意合同,并继续执行“隐身”表达式初始化,这可能导致整个全权合同变得毫无价值,合同中的资产将永久丢失。

案例

① Parity Multisig Freeze:未初始化方法论合同。普通使用者触发了许多钱包的初始化,并透过初始化 selfdestruct 将以太币锁定在合同中。

Harvest Finance、Teller、KeeperDAO和Rivermen都使用了未初始化的方法论合同,这将允许普通使用者任意设置合同的初始化参数,并在delegatecall 期间继续执行selfdestruct将全权合同销毁。

储存冲突

在两个可升级换代的合同控制系统中,全权合同不会新闻稿状况变量,而是使用伪随机储存槽来储存重要数据。

全权合同将方法论合同状况变量的值保存在它们被新闻稿的相对位置。如果全权合同新闻稿了它自己的状况变量,这时全权和方法论合同都试图使用同两个储存槽,就会发生储存冲突

OpenZeppelin库提供的全权合同不会在合同中新闻稿状况变量,而是基于EIP 1967标准,将需要储存的数值(如管理门牌号)保存到特定的储存槽中,以防止冲突。

案例

北京时间2022年7月23日,去虚拟化音乐平台Audius遭到黑客攻击,该事件是由于在全权合同中引入捷伊方法论,从而产生储存冲突所导致的。

全权合同新闻稿了两个proxyAdmin门牌号状况变量,在继续执行方法论合同标识符时,其值会被错误地读取。

项目方私自定义的proxyAdmin的值被错误的当成了initialized和initializing的值,使得initializer缩排返回了错误的结果,进而允许普通使用者再次初始化initialize表达式并将管理合同的职权授予自己。普通使用者随后更改了投票参数并透过了她们的蓄意提案,以盗取Audius资产。

在方法论合同里初始化delegatecall或不信任的合同

假设delegatecall存在于两个方法论合同中,而合同没有正确验证初始化目标。在这种情况下,普通使用者能借助该表达式来继续执行对其控制的蓄意合同的初始化,以破坏方法论同时实现或继续执行自定义方法论。

同样地,方法论合同中若有两个不受限制的address.call表达式,一旦普通使用者蓄意提供门牌号和数据字段,就能借助其充当全权合同。

案例

Pickle Finance、Furucombo以及dYdX攻击事件。

在这几起事件中,存在漏洞的合同获得了使用者token的批准,并且合同内存在两个由使用者提供初始化合同门牌号和数据的call/delegatecall,普通使用者将能够初始化具有transferFrom机能的合同,以提取使用者余额。在dYdX事件中,dYdX继续执行了她们自己的白帽攻击以保护资金。

最差实践

一般情况

①仅在必要的时候才使用全权商业模式

不是每个合同都需要升级换代。如上文所示,使用全权商业模式涉及很多风险。“可升级换代”的属性也会引起信任问题,因为全权图书馆员能在没有得到社区同意的情况下升级换代合同。我们提议仅在必要时才将全权商业模式整合到项目中。

② 不要修正全权库

全权合同库很复杂,尤其是处理储存管理和升级换代监督机制的部分。修正中的任何人错误单厢影响全权和方法论合同的工作。我们在审计过程中发现的大量与全权有关的高严重性bug都是由不正确的全权库修正造成的。Audius事件就是两个典型的例子,展示了全权合同修正不当所增添的后果。

全权合同操作方式管理要点

① 初始化方法论合同

普通使用者能接手两个未初始化的方法论合同,并有可能借此破坏全权合同控制系统。因此请在布署后初始化方法论合同,或者在方法论合同的构造表达式中使用_disableInitializers源自动禁用初始化。

② 确保全权管理账户的安全

两个可升级换代的合同控制系统通常需要两个“全权图书馆员”的特权配角来管理合同的升级换代。如果管理公钥外泄,普通使用者能自由地将合同升级换代为蓄意合同,就能盗取使用者的资产。我们提议谨慎管理全权管理账户的公钥,以避免任何人被黑客攻击的潜在风险。能使用多签名钱包来防止单点的公钥管理失败。

③为透明化全权管理使用单独的账户

全权管理和方法论治理应该是独立的门牌号,以防止丢失与方法论同时实现的可视化。如果全权管理和方法论治理引用同两个门牌号,就不会转发任何人初始化来继续执行特权机能,从而禁止治理机能的更改。

全权合同储存有关

①在全权合同中新闻稿状况变量时要小心谨慎

正如Audius黑客事件中所解释的那样,全权合同在新闻稿自己的状况变量时必须谨慎。在全权合同中以正常形式新闻稿的状况变量会在读写数据时造成数据冲突。如果全权合同需要两个状况变量,请将该值保存在两个类似EIP1967的储存槽中,以防止在继续执行方法论合同标识符时发生冲突。

② 维护方法论合同的变量新闻稿顺序和类型

每个版本的方法论合同都必须保持状况变量相同的顺序和类型,并且需要在现有变量的末尾添加捷伊状况变量。否则,委托初始化会导致全权合同读取或覆盖不正确的储存值,而且旧的数据可能与新新闻稿的变量有关联,这会给应用程序增添严重的问题。

③ 在基础合同中包含储存间隙

方法论合同需要在合同标识符中包含储存间隙,以便在布署捷伊方法论同时实现时预测到捷伊状况变量。在添加捷伊状况变量后,需要适当地预览间隙的大小。

④ 不在构造表达式或新闻稿过程中设置状况变量的值

在新闻稿期间或构造表达式中分配状况变量只会影响方法论合同中的值,不会影响全权合同。非不容变的参数应该使用initialize表达式来分配。

合同继承(Contract Inheritance)

① 可升级换代合同只能继承自其他可升级换代合同

与不容升级换代的合同相比,可升级换代的合同具有不同的结构。例如,构造表达式与发生改变全权状况不兼容,它使用initialize表达式来设置状况变量。任何人继承另两个合同的合同都需要使用其继承合同的initialize表达式来分配各自的变量。当使用OpenZeppelin库或编写自己的标识符时,确保可升级换代的合同只能继承其他的可升级换代合同

② 不要在方法论合同中实例化新合同

透过Solidity创建实例化的合同将不容升级换代。合同应单独布署,并将其门牌号作为参数传达给可升级换代的方法论合同,以同时实现可升级换代状况。

③ Parent合同初始化风险

当初始化Parent合同时,__{ContractName}_init表达式将初始化其Parent合同。初始化多个 __{ContractName}_init可能导致Parent合同的第二次初始化。注意__{ContractName}_init_unchained将只初始化{ContractName}的参数,而不会初始化其Parent合同的初始化器。

不过,这并不是两个值得推荐的做法,因为所有的Parent合同都需要被初始化,不初始化所需的合同会导致以后的继续执行问题

方法论合同的同时实现

① 避免使用selfdestruct或对不信任的合同继续执行delegatecall/call。

如果合同中存在selfdestruct或delegatecall,普通使用者就有可能借助这些表达式来破坏方法论同时实现或继续执行自定义方法论。开发人员应验证使用者的输入,不允许合同继续执行对不信任合同的delegatecall/calls。此外,不提议在方法论合同中使用delegatecall,因为在多个合同的全权链中管理储存布局会很麻烦。

写在最后

全权合同透过使协议在布署后能够预览其标识符方法论,来绕过区块链的不容盗用个人风格。不过,开发全权合同仍然需要十分谨慎,不正确的同时实现可能会导致项目安全与方法论问题。

总的来说,最差实践是使用权威提供的且经过广泛测试的解决方案,因为透明化、UUPS和Beacon全权商业模式每个都有针对各自用例的经过验证的升级换代监督机制。除此之外,升级换代全权的特权配角也应该被安全地管理,以防止普通使用者发生改变全权方法论。

方法论同时实现合同也应注意不要使用delegatecall,这样能防止普通使用者继续执行某些蓄意标识符,如selfdestruct。

虽然遵循最差实践能确保全权合同布署的稳定,同时保持可升级换代的灵活性,但所有标识符都容易出现可能危及项目的新安全或方法论问题。因此所有的标识符最好由如CertiK这般的具备审计和保护全权合同协议经验的安全专家团队进行适当的审计

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 764327034@qq.com 举报,一经查实,本站将立刻删除。https://www.98xmw.com/11202/.html
okx

OKX欧易App

欧易交易所app是全球排名第一的虚拟货币交易所。

APP下载   官网注册

作者: 币大大

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

17538149680

在线咨询: QQ交谈

邮箱: 76427034@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们