本文作者:bixia1994
参考链接:UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity
EIP-1967
在UUPS中,其实现了EIP-1967
作为一个实现EIP-897的代理合约,其在代理合约中会实现这两个函数。
UUPSEIP-1822
EIP-1822讨论的合约升级模式与Openzeppelin的透明合约升级模式的不同点在于:EIP-1822的代理合约只读取实现合约的地址,并将所有的方法都代理给实现合约,包括修改实现合约地址的逻辑部分也在实现合约里。而透明合约升级模式中,proxy合约管理着实现合约的地址,要实现合约升级,只需要在proxy合约中更改实现合约的地址即可。其他的逻辑代理给实现合约。
也就是说EIP-1822的实现合约既包含了普通的业务逻辑处理,更包含了自身的升级逻辑处理。简单来讲就是EIP-1822的实现合约部分,都需要继承自一个公共的可升级实现合约:proxiable
OpenZeppelin Contracts V4.1 发布 引入廉价 UUPS 代理:据官方消息,以太坊技术服务商 OpenZeppelin 发布 OpenZeppelin Contracts V4.1 版本,该版本引入 UUPS 代理作为透明代理的一种更为便宜的替代方案,另外,新的 ERC20 扩展允许使用内置的闪电铸造(flash minting)轻松创建代币。此外,一个新的效用合约提供了一种批处理机制,而不需要进行任何额外的设置。[2021/4/30 21:13:30]
functionupgradeToAndCall(addressnewImplementation,bytesmemorydata)externalpayablevirtual{}function_authorizeUpgrade(addressnewImplementation)internalonlyOwner(){}
其中,openzeppelin通过回滚检测,来检查是否升级成功,避免了EIP-1822中遇到的问题:
声音 | Tuur Demeester:美联储向市场注入超1040亿美元,相当于比特币经损失调整后87%的市值:据华尔街日报报道,美国纽约联邦储蓄银行周四(10月17日)向金融市场注入了1041.5亿美元的临时流动资金。此次干预分为两个部分。其中一项是通过期限回购协议操作,该操作将持续15天,注入金额为306.5亿美元;另一项是通过为期一天的回购操作进行的,总额达735亿美元。对此,Adamant Capital创始合伙人Tuur Demeester评论称,美联储仅仅此次的量化宽松注入金额就达到了1040亿美元,这相当于比特币经过损失调整后87%的市值。[2019/10/19]
function_upgradeToAndCallSecure(addressnewImplementation,bytesmemorydata,boolforceCall)internal{//第一步:设置newImpl地址到实现合约地址addressoldImplementation=_getImplementation();_setImplementation(newImplementation);//第二步:针对新的实现合约地址进行初始化if(data
动态 | Vitalik Buterin 反驳 Tuur Demeester 对以太坊的批评:以太坊创始人 Vitalik Buterin 在 Reddit 上逐条点评和反驳了 Adamant Capital 创始人 Tuur Demeester 此前对以太坊做出的批评。Vitalik Buterin 称,这些批评意见无视以太坊在研究和开发方面取得的进展,忽视了以太坊社区在过去一年中规模的扩张和专业度的提升。此前,Tuur Demeester 连发 50 条推文,历数他眼中以太坊的种种短板,认为以太坊最多是一个科学实验,其目前市值已经跌至 130 亿美元,依然估值过高,这一系列推文引发大量讨论。[2019/1/1]
//第三步:执行回滚检查//PerformrollbacktestifnotalreadyinprogressStorageSlot
}
Openzepplin的实现漏洞分析
在上述的Openzeppelin的实现中,其通过回滚检测避免了EIP-1822中遇到的问题:即升级到一个不满足EIP-1822规范的合约时,此时代理合约和实现合约就完全被锁死,无法继续升级。但是其又引入了一个新的问题,即:回滚操作中事实上模拟了一遍新的实现合约地址中的upgradeTo操作,并且是通过delegatecall方式来进行调用。
动态 | 短账号 kr 被 zytzmfuuqx32 账户竞得:据 IMEOS 报道,zytzmfuuqx32 于北京时间2018-12-20 04:56:17 以 15200.0 EOS 竞得账户名 kr。[2018/12/21]
通过delegatecall调用新合约地址的upgradeTo方法有什么问题呢?
查看黄皮书中关于delegatecall的定义为:
Message-callintothisaccountwithanalternativeaccounts'code,butpersistingthecurrentvaluesforsenderandvalue
thismeansthatthereceipientisinfactthesameaccountasatpersent,simplythatthecodeisoverwrittenandthecontextisalmostentirelyidentical
UUU(U Network)今日35.77%领涨Hadax:UUU(U Network)的愿景是成为全球“内容价值第一公链”,团队认为内容产业的问题不仅是如何帮内容生产者牟利,更是如何帮用户发现有价值的内容。UUU(U Network)的这一理念获得超过30家中美一线机构和项目的投资和支持,包括硅谷殿堂级VCDraper Dragon,硅谷丹华资本DHVC,PreAngel,Qtum(量子链),D Fund等。[2018/5/15]
从黄皮书的定义来看,delegatecall事实上保存了当前账户的余额和msg
functionmint(addressto,uint256amount)publiconlyOwner{_mint(to,amount);}function_authorizeUpgrade(addressnewImplementation)internalonlyOwneroverride{}}
注意这里的TestToken是UUPS升级合约的实现合约部分,而不是代理合约部分。那么应该如何去做这个TestToken的POC呢?
POC
这里不能直接在malicious合约中的upgradeTo方法中写selfdestruct,而是应该利用ForceCall部分的delegatecall,并通过写入rollbackTesting
function_authorizeUpgrade(addressnewImplementation)internal{}}
讨论
那么在openzeppelin的UUPS实现中,使用delegatecall来进行回滚测试有什么问题呢?
问题就是:
Address
}
上述openzeppelin实现的代码中,最为核心的一条是理解:当delegatecall到一个selfdestruct方法后,程序所有的代码都会被直接清空,不会继续往下执行,也就不会去执行后面的require判断条件。
然而在remix中执行时,发现delegatecall之后的require语句还是执行了:
这是不对的,需要进一步理解黄皮书中关于selfdestruct这个opcode的定义:
selfdestruct:Haltexecutionandregisteraccountforlaterdeletion
function_functionDelegateCall(addresstarget,bytesmemorydata)privatereturns(bytesmemory){require(AddressUpgradeable
当delegatecall到一个selfdestruct的方法时,其返回值为0,然后代码继续运行。如果此笔交易在后续的执行过程中成功,则上下文地址上的代码将会被清空。如果该笔交易在后续的执行过程中失败,则整体状态会回滚。
参考资料
bixia1994-互联网小工:https://learnblockchain.cn/people/3295
UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity:https://forum.openzeppelin.com/t/uupsupgradeable-vulnerability-post-mortem/15680
ContractsWizard-OpenZeppelinDocs:https://docs.openzeppelin.com/contracts/4.x/wizard
免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。
本文来源于非小号媒体平台:
登链社区
现已在非小号资讯平台发布105篇作品,
非小号开放平台欢迎币圈作者入驻
入驻指南:
/apply_guide/
本文网址:
/news/10378667.html
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场
上一篇:
每周编辑精选WeeklyEditors'Picks
标签:IONCALENTALLGame X Change PotionCALIT币Dentacointrustwallet大陆无法访问
据ZDNet消息,从今年年初到8月底,与加密货币投资局相关的损失占向澳大利亚竞争和消费者委员会报告的局总数的四分之一以上.
亲爱的大币网(Dcoin)用户: ??? ????Dcoin将于9月30号前陆续暂停部分地区的短信通知服务。包含但不限于交易类通知,其中包括风险率预警、强平通知等时效性较强的重要通知.
9月28日,香港金融管理局联同国际结算银行创新枢纽辖下香港中心、泰国中央银行、中国人民银行数字货币研究所及阿拉伯联合酋长国中央银行发布题为“Inthanon-LionRocktomBridge:.
亲爱的币在·BitZ用户:为了提高产品性能,给您带来更优质的交易体验,币在·BitZ将于2021年09月23日17:00-18:00进行双仓合约交易系统升级,预计时长1小时.
尊敬的用户:? 本着保护用户的宗旨,BKEXGlobal为保证交易币种的高标准,将定期对平台内的代币进行综合性审查;如项目方出现对投资者不利因素,我们将采取对应措施,并下架对应项目.
第九次波卡插槽拍卖正在火热进行中。目前KintsugiBTC以172,952.5764KSM的质押量排名靠前,截至2021年9月29日14:00,Gate.ioKINT锁仓理财已锁133.713.