本文作者: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
好莱坞制片人Niels Juul计划制作一部完全由NFT提供融资的电影:12月3日消息,制作了《爱尔兰人》的好莱坞执行制片人Niels Juul成立了一家名为NFT Studios的新公司,并希望制作一部完全由NFT提供融资的电影。该公司的首部电影“A Wing and A Prayer”将根据Brian Milton的真实故事改编,他是1998年乘坐微型飞机完成环球飞行的第一人。公司团队在其网站上表示,该片有望于明年4月在马耳他和伦敦开拍。据悉,Juul希望通过向公众和机构投资者出售NFT筹集800万到1000万美元的资金。此外,NFT Studios与伦敦上市公司NFT Investments达成了一项协议,后者将出资100万美元收购NFT Studios 20%的股份。(Forkast)[2021/12/3 12:49:40]
functionupgradeToAndCall(addressnewImplementation,bytesmemorydata)externalpayablevirtual{}function_authorizeUpgrade(addressnewImplementation)internalonlyOwner(){}
公告 | 火币全球站已于今日15:00上线UUU/USDT交易:据火币公告,因 UUU (U Network) 符合火币全球站USDT交易区的上线标准,火币全球站定于2019年8月5日15:00上线UUU/USDT交易。[2019/8/5]
其中,openzeppelin通过回滚检测,来检查是否升级成功,避免了EIP-1822中遇到的问题:
function_upgradeToAndCallSecure(addressnewImplementation,bytesmemorydata,boolforceCall)internal{//第一步:设置newImpl地址到实现合约地址addressoldImplementation=_getImplementation();_setImplementation(newImplementation);//第二步:针对新的实现合约地址进行初始化if(data
//第三步:执行回滚检查//PerformrollbacktestifnotalreadyinprogressStorageSlot
UUNIO与Essentia达成合作伙伴:韩国区块链公司UUNIO为了应对欧洲的GDPR(个人信息保护规定)与Essentia达成合作伙伴协议。[2018/5/21]
}
Openzepplin的实现漏洞分析
在上述的Openzeppelin的实现中,其通过回滚检测避免了EIP-1822中遇到的问题:即升级到一个不满足EIP-1822规范的合约时,此时代理合约和实现合约就完全被锁死,无法继续升级。但是其又引入了一个新的问题,即:回滚操作中事实上模拟了一遍新的实现合约地址中的upgradeTo操作,并且是通过delegatecall方式来进行调用。
通过delegatecall调用新合约地址的upgradeTo方法有什么问题呢?
查看黄皮书中关于delegatecall的定义为:
Message-callintothisaccountwithanalternativeaccounts'code,butpersistingthecurrentvaluesforsenderandvalue
金色财经现场报道 :UUNIO CEO Connor Tack:去中心化社交改变收益模式:金色财经现场报道,在今天举办的2018金融科技上海峰会暨区块链世界论坛上,UUNIO 公司 CEO Connor Tack 做了题为“区块链技术重新定义社交网络经济”的演讲,他指出,数字内容市场在2019年将达到5亿美元的规模,但当前数字内容领域却面临着原创作者开发难、版权问题、以及内容供不应求的情况。现在的千禧一代,大家不太喜欢那种订阅模式,而喜欢每次进行小额支付。区块链社交媒体可以用更多的赞换来更多的收益、通过小额支付来售卖内容、零手续费的赞助、多中心化审查下的版权保护等改变。这样一来,每一个内容制造商都可以从每一次内容制造中获得收益,也会对自己的内容质量有很好的效果反馈。”[2018/4/19]
thismeansthatthereceipientisinfactthesameaccountasatpersent,simplythatthecodeisoverwrittenandthecontextisalmostentirelyidentical
经济学家Tuur Demeester认为分叉会带来经济损失:经济学家Tuur Demeester今日表示分叉能够为最大化用户使用效率提供良好的解决方案,但是Token持有者来说很难保障他们现有的经济利益。[2018/3/21]
从黄皮书的定义来看,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
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。