木星链 木星链
Ctrl+D收藏木星链

ALI:打破区块链的不可篡改性:代理模式如何实现智能合约升级?

作者:

时间:1900/1/1 0:00:00

代理模式使智能合约能够升级其逻辑,同时维持其链上地址和状态值。对代理合约的调用会通过delegateCall的方式执行来自逻辑合约的代码,以修改代理合约的状态。

本文将为大家概述代理合约的类型、相关的安全事件和建议,以及使用代理合约的最佳实践。

可升级的合约和代理模式简介

我们都知道区块链的「不可篡改」特质,智能合约代码在部署于区块链上后就无法被修改。

因此当开发者想为逻辑升级、修复错误或因安全更新试图更新合约代码时,他们必须部署一个新的合约,并会生成一个新的合约地址。

想要解决这个问题,就可以用代理模式。

代理模式实现了合约的可升级性,并且不会改变合约的部署地址,这也是目前最普遍的合约升级模式。

代理模式是一个可升级的合约系统,包括代理合约和逻辑实现合约。

代理合约处理用户交互和数据及合约状态存储。用户对代理合约的调用会通过delegatecall()执行来自逻辑合约的代码,从而改变代理合约的状态。升级则是通过更新在代理合约预定存储槽里记录的逻辑合约地址来实现。

较为常规的三种代理模式分别是透明代理、UUPS代理和Beacon代理。

透明代理

在透明代理模式中,升级功能是在代理合约中实现的。代理合约的管理员角色被赋予了操作代理合约的直接权限,以更新代理对应的逻辑实现地址。没有管理员权限的调用者则会把他们的调用委托给实现合约。

注意:代理合约管理员不能是逻辑实现合约的关键角色,甚至也不能是普通用户,因为代理管理员无法与实现合约进行交互。

Bitget合约大数据中心:BTC多头打破僵局:据Bitget合约大数据中心行情播报,截至今日11:00,Bitget交易所BTC/USDT合约过去24小时交易量高达8.7亿美金,其中:盈利用户占比25%,多头盈利4%,空头盈利43%;亏损用户占75%,多头亏损18%,空头亏损35%。此外,Bitget正向合约当前盘口价差在0.5USDT左右,合约基差在0.2USDT左右。Bitget合约分析师表示,BTC四小时线看,呈现开口上行姿态,KDJ和RSI指标均三线向上发散。[2020/7/23]

UUPS代理

在UUPS(Universal Upgradeable Proxy Standard)模式中,合约升级功能是在逻辑合约中实现的。由于升级机制存储在逻辑合约中,升级过后的版本可以删除升级相关的逻辑,以禁止未来的升级。在这种模式下,所有对代理合约的调用都会被转发给逻辑实现合约。

Beacon代理

Beacon代理模式允许多个代理合约通过引用Beacon合约来共享同一个逻辑实现。Beacon合约为调用的代理合约提供逻辑实现合约的地址,当升级到一个新的逻辑实现地址时,只需要更新Beacon合约里记录的地址即可。

代理误用和安全事件

开发人员可以利用代理模式合约来实现可升级的合约系统。然而,代理模式也有一定的操作门槛,如果使用不当,可能会给项目带来堪称毁灭性的安全问题。以下部分展示了与代理误用相关的事件,以及代理带来的中心化风险。

声音 | 加密货币爱好者:比特币或打破三重底上涨规律:据Beincrypto报道,加密货币爱好者/img/202379224543/3.jpg" />

(3)在基础合约中包含存储间隙

逻辑合约需要在合约代码中包含存储间隙,以便在部署新的逻辑实现时预测到新的状态变量。在添加新的状态变量后,需要适当地更新间隙的大小。

(4)不在构造函数或声明过程中设置状态变量的值

在声明期间或构造函数中分配状态变量只会影响逻辑合约中的值,不会影响代理合约。非不可变的参数应该使用initialize()函数来分配。

合约继承

(1)可升级合约只能继承自其他可升级合约

与不可升级的合约相比,可升级的合约具有不同的结构。例如,构造函数与改变代理状态不兼容,它使用initialize()函数来设置状态变量。

任何继承另一个合约的合约都需要使用其继承合约的initialize()函数来分配各自的变量。当使用OpenZeppelin库或编写自己的代码时,确保可升级的合约只能继承其他的可升级合约。

(2)不要在逻辑合约中实例化新合约

通过Solidity创建实例化的合约将不可升级。合约应单独部署,并将其地址作为参数传递给可升级的逻辑合约,以实现可升级状态。

(3)Parent合约初始化风险

当初始化Parent合约时,__{ContractName}_init函数将初始化其Parent合约。调用多个 __{ContractName}_init可能导致Parent合约的第二次初始化。注意__{ContractName}_init_unchained()将只初始化{ContractName}的参数,而不会调用其Parent合约的初始化器。

然而,这并不是一个值得推荐的做法,因为所有的Parent合约都需要被初始化,不初始化所需的合约会导致以后的执行问题。

逻辑合约的实现

避免使用selfdestruct()或对不信任的合约执行selegatecall()/call()

如果合约中存在selfdestruct()或delegatecall(),攻击者就有可能利用这些函数来破坏逻辑实现或执行自定义逻辑。开发者应验证用户的输入,不允许合约执行对不信任合约的delegatecall/calls。此外,不建议在逻辑合约中使用delegatecall(),因为在多个合约的代理链中管理存储布局会很麻烦。

写在最后

代理合约通过使协议在部署后能够更新其代码逻辑,来绕过区块链的不可篡改特质。然而,开发代理合约仍然需要十分谨慎,不正确的实现可能会导致项目安全与逻辑问题。

总的来说,最佳实践是使用权威提供的且经过广泛测试的解决方案,因为透明、UUPS和Beacon代理模式每个都有针对各自用例的经过验证的升级机制。除此之外,升级代理的特权角色也应该被安全地管理,以防止攻击者改变代理逻辑。

逻辑实现合约也应注意不要使用delegatecall(),这样可以防止攻击者执行某些恶意代码,如selfdestruct()。

虽然遵循最佳实践可以确保代理合约部署的稳定,同时保持可升级的灵活性,但所有代码都容易出现可能危及项目的新安全或逻辑问题。因此所有的代码最好由具备审计和保护代理合约协议经验的安全专家团队进行审计。

CertiK中文社区

企业专栏

阅读更多

金色早8点

Odaily星球日报

金色财经

Block unicorn

DAOrayaki

曼昆区块链法律

标签:ALIALLCALIZEDecentralized Hash Miningtrustwallet钱包怎么交易ethical和ethnic区别Decentralized Social

Gate交易所热门资讯
NBS:铭文2.0时代:递归铭文使比特币链上智能合约成为可能?

作者:雾海,PANews自从比特币链上协议 Ordinals 被推出,随后被开发者 domo 提出的 brc 20 概念引爆.

1900/1/1 0:00:00
TER:者劫持八个推特账户 窃取近100万美元加密货币

编译:深链DCNews 在过去的几周里,者劫持了加密领域知名人士的八个Twitter帐户,以进行网络钓鱼.

1900/1/1 0:00:00
WEB:Web3基础设施阶段的神话

最近我与许多 Web3 的从业者和投资者交谈时得知,Web3 的推广目前仍受制于基础设施的缺乏.

1900/1/1 0:00:00
比特币:美国司法部揭秘全文:两个俄罗斯人从 Mt. Gox 盗走 64 万个比特币

作者:美国司法部;编译:吴说区块链原文链接:https://www.justice.gov/usao-sdny/pr/russian-nationals-charged-hacking-one-.

1900/1/1 0:00:00
ARC:深入剖析Archway:Cosmos的价值捕获链

编者注:CoinList将于2023年6月15日UTC时间17:00开始Archway社区销售活动.

1900/1/1 0:00:00
MIT:签名就被盗?用过Uniswap的请警惕 揭秘Permit2签名钓鱼

本文由Beosin特邀独立研究员菠菜菠菜!(twitter/img/202379230713/0.

1900/1/1 0:00:00