月亮链 月亮链
Ctrl+D收藏月亮链

MOD:GnosisSafe - 合约结构分析_komodo

作者:

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

本文作者:bixia1994-互联网小工

上篇文章简单分析GnosisSafe中的部分业务逻辑,主要是链下签名与链上验证的逻辑,关于方法执行,Gas费用扣减等并未涉及到。因为主要是目前也暂时用不到那一块。这一篇文章主要是分析下GnosisSafe的合约结构。代码以最新release的v1

enableModule-使能该模块,实际上是添加该模块到链表里

//sentinel->A<->AfunctionenableModule(addressmodule)publicauthorized{//要求该module不能重复添加。如果该module在链表尾部,则该module应该指向自己require(modules==address(0));//将该module->A<->Amodules=modules;//将哨兵重新指向module:sentinel->module->A<->Amodules=module;}

disableModule-废弃该模块,将该module移除链表

//sentinel->prevModule->module->B<->BfunctiondisableModule(addressprevModule,addressmodule)publicauthorized{//要求要废除的module和该module前的preModule都在链表中,且prevModule->modulerequire(modules!=address(0)&&modules!=address&&modules=module);//sentinel->prevModule->B<->Bmodules=modules;//module->address(0)modules=address(0);}

安全团队:gnosisSafe金库合约0xF6eb0被利用:金色财经报道,据CertiK官方推特发布消息称,一个gnosisSafe金库合约0xF6eb0被利用。漏洞利用者地址:0xb9c77db3C0e1254D073E65dc0455ba6DDd3ce385。漏洞利用者已获得9.76万美元。[2023/8/13 16:23:11]

getModulesPaginated-拿到所有的模块列表

functiongetModulesPaginated(addressstart,uint256pageSize)externalviewreturns(addressmemoryarray,addressnext){array=newaddress(pageSize"""""""");//遍历链表,不包括哨兵addresscurrentModule=modules;uintmoduleCount=0;while(currentModule!=address(0)&&currentModule!=SENTINEL_MODULES&&moduleCount<pageSize){array=currentModule;moduleCount=1;currentModule=modules;}next=currentModule;//设置正确的array大小assembly{mstore(array,moduleCount。

execTransactionFromModuleReturnData-通过模块执行方法

functionexecTransactionFromModuleReturnData(addressto,uint256value,bytesmemorydata,Enum

GnosisDAO新提案建议金库将至少50%的stETH持有量转移到rETH:5月23日消息,GnosisDAO社区发起一项新提案,建议GnosisDAO承诺随着时间的推移将其至少50%的stETH持有量转移到rETH,该GIP旨在指导Gnosis金库管理方Karpatkey采取行动减少对stETH的依赖,并在其DeFi策略中引入额外的rETH,以降低DAO的风险并为去中心化以太坊质押提供支持。

该提案投票截止时间为5月30日01:48。截至上次通知,Gnosis金库持有64,124枚wstETH(约1.3亿美元)和5,725stETH(约1000万美元)、712枚rETH(约140万美元)和18,622枚ETH。[2023/5/23 15:20:44]

modifierauthorized(){require(msg

思考3:代理合约通过delegatecall来访问主合约,而调用主合约中的执行模块方法时,可以选择用call来执行传入的to地址上的方法,那么delegatecall的上下文环境里,再使用call,最后它的状态变化发生在哪里?是代理合约里呢还是call中的to地址上?

问题实质是msg

可以看到在构造函数里有一个参数address_singleton,作为工厂合约,最简单的生产一个Proxy的方法如下:

functioncreateProxy(addresssingleton,bytesmemorydata)publicreturns(GnosisSafeProxyproxy){proxy=newGnosisSafeProxy(singleton);//初始化(boolsuccess,bytesmemoryres)=address(proxy)

Gnosis Safe发布社区挑战,提交可获得25%已保存SAFE:9月8日消息,据官方推特,鉴于即将发布的SafeDAO,社区将重新发布SAFE分配制度,降低了分配标准,以覆盖更多用户。[2022/9/8 13:17:44]

在上面的创建Proxy合约的过程中,其实质是调用了create这一opcode。又因为create这一个opcode的创建合约的地址仅与Factory合约的地址和nonce有关,故导致钱包地址可被人手动推算出来。导致任何通过Factory合约这一方法创建钱包的人的钱包地址都可以被推断,出现安全隐患。

地址的推算方法如下:

//首先拿到工厂合约的地址:addressfactory=0xa6b71e26c5e0845f74c812102ca7114b6a896ab2;假设nonce=1,则RLP((s,n))为:ethers.utils.RLP.encode()=>RLP((factory,nonce))=0xd694a6b71e26c5e0845f74c812102ca7114b6a896ab201Keccak256(RLP((factory,nonce)))=0x4c2134364fb2823682748fe543e77ba9f5e59cefb97d55cf58641ebb7beb22c4address=0x43e77ba9f5e59cefb97d55cf58641ebb7beb22c4

使用create2这一OPCODE就没有这个问题,但使用create2时,需要理解构造函数中的参数应该怎么传入进去:

Argumentsfortheconstructorofacontractaredirectlyappendedattheendofthecontract’scode,alsoinABIencoding.Theconstructorwillaccessthemthroughahard-codedoffset,andnotbyusingthecodesizeopcode,sincethisofcoursechangeswhenappendingdatatothecode.

The Graph将Gnosis链添加到其去中心化区块链索引协议中:金色财经报道,?The Graph的组织Graph基金会周四表示,Gnosis 链(GNO)将是以太坊以外第一个在The Graph Network上得到支持的链,其代币是GRT。该基金会还宣布了一项900万美元的激励基金,以帮助引导该网络。[2022/8/26 12:50:21]

即将contructor里的参数直接以ABI编码后贴在contract.creationCode里。

bytesmemorydata=abi.encode(type(GnosisSafeProxy).creationCode,uint256(uint160(singleton)))

注意点2:代理合约与实现合约的Storage插槽排布是否一致

由于代理合约GnosisSafeProxy与实现合约GnosisSafe是通过delegatecall来调用,故需要仔细检查两边的插槽排布,需让其保持一致。

首先是GnosisSafeProxy代理合约:

slot_00=>singleton

然后是GnosisSafe实现合约

contractGnosisSafeisEtherPaymentFallback,Singleton,ModuleManager,OwnerManager,SignatureDecoder,SecuredTokenTransfer,ISignatureValidatorConstants,FallbackManager,StorageAccessible,GuardManagerEtherPaymentFallback=>无全局变量Singleton=>有全局变量slot_00=>singletonModuleManagerisSelfAuthorized,ExecutorSelfAuthorized=>无全局变量Executor=>无全局变量ModuleManager=>有全局变量mapping(address=>address)internalmodulesOwnerManagerisSelfAuthorizedSelfAuthorized=>无全局变量OwnerManager=>有全局变量mapping(address=>address)internalowners;uint256internalownerCount;uint256internalthreshold;SignatureDecoder=>无全局变量SecuredTokenTransfer=>无全局变量ISignatureValidatorConstants=>无全局变量FallbackManagerisSelfAuthorizedSelfAuthorized=>无全局变量FallbackManager=>有全局变量keccak256("fallback_manager.handler.address")=>fallback_handlerStorageAccessible=>无全局变量GuardManagerisSelfAuthorizedSelfAuthorized=>无全局变量GuardManager=>有全局变量keccak256("guard_manager.guard.address")=>set_guardGnosisSafe=>有全局变量uint256publicnonce;bytes32private_deprecatedDomainSeparator;mapping(bytes32=>uint256)publicsignedMessages;mapping(address=>mapping(bytes32=>uint256))publicapprovedHashes;

以太坊钱包Gnosis Safe Multisig推出智能合约交互功能:非托管以太坊钱包Gnosis Safe Multisig推出一个前端“智能合约交互(Contract Interaction)”功能,允许用户直接与以太坊智能合约进行交互。Gnosis表示该功能旨在提高使用智能合约的灵活性,并允许以太坊智能合约和应用程序直接交互,并支持尚未添加到Gnosis界面中智能合约,例如用户可以使用该功能与ENS交互并定义部分参数。Gnosis同时表示宣布推出桌面版钱包,并“增加额外的安全性”。[2020/5/20]

将上面的GnosisSafe实现合约的插槽整理如下:

slot_00=>singletonslot_01=>mapping(address=>address)internalmodulesslot_02=>mapping(address=>address)internalowners;slot_03=>uint256internalownerCount;slot_04=>uint256internalthreshold;slot_05=>uint256publicnonce;slot_06=>bytes32private_deprecatedDomainSeparator;slot_07=>mapping(bytes32=>uint256)publicsignedMessages;slot_08=>mapping(address=>mapping(bytes32=>uint256))publicapprovedHashes;keccak256("fallback_manager.handler.address")=>fallback_handlerkeccak256("guard_manager.guard.address")=>set_guard

可以看到代理合约Proxy和实现合约GnosisSafe的插槽并不完全一致,但是在代理合约Proxy的插槽排布中,slot_00位置处的值都是singleton,并未出现碰撞。可能是Gnosis想让proxy合约尽可能小,所以这样设计。

注意点3:与compound的Unitroller部分对比

Compound中的Unitroller是一个可升级合约架构,即其对应的实现comptrollerImplementation合约地址可以通过Unitorller中的方法去更改,从而实现合约升级。而GnosisSafeProxy并不是一个可升级合约架构,它对应的实现singleton是在初始化时就写死的,没有办法去更改实现。

作为一个代理合约,其实现地址通常需要在创建时就传入进去,然后再调用init方法来进行初始化。

参考资料

上篇文章:https://learnblockchain.cn/article/2980

Gas费用:https://learnblockchain.cn/2019/06/11/gas-mean

多签:https://learnblockchain.cn/article/1127

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10362787.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

每周编辑精选WeeklyEditors&#039;Picks

标签:MODESSRESDDRkomodoBusiness 99SporesDDRT

以太坊价格热门资讯
FIL:FIL预言家 预言抽奖中奖高达100%_fil币价格今日行情金色财经

尊敬的用户:?行情反复,WBF推出“FIL预言家预言享壕礼”特别活动,预测价格,踩准节奏,瓜分5000U奖励,交易FIL进行抽奖.

1900/1/1 0:00:00
GATE:Gate.io 双币宝BTC、ETH专区上线理财新品(2-19天期)_Gate.io

Gate.io“芝麻金融”双币宝理财服务现已推出BTC/USDT、ETH/USDT双币投资理财产品,今日BTC专区产品持仓期限2-19天,挂钩参考价格为40000-50000美元.

1900/1/1 0:00:00
区块链:关于WBF上线CBD定期理财的公告_FEX

尊敬的用户:CBD-30天定期理财即将上线,具体详情如下:CBD-30天定期理财币种认购时间预计年华锁定期限认购额度起投数量利息发放币种代币发放规则CBD9月22日-9月26日200%30天10.

1900/1/1 0:00:00
ORA:Orangex关于警惕虚假平台公告_Kranz Token

尊敬的Orangex用户:?近期,市场上出现了模仿抄袭并冒用Orangex交易所之名对市场用户进行虚假宣传、诱导投资等虚假平台,Orangex官方郑重提示,请用户认准Orangex官方平台.

1900/1/1 0:00:00
NFT:构建NFT社区像在郊区盖大厦,那该怎么让人住进来?_区块链游戏币拍卖

本文来自Darkstar,原文作者:Darkstar?,由Odaily星球日报译者Katie辜编译。我们正在进入在线生活时代,越来越多的人只在网上工作。我们与线上的关系也越来越紧密.

1900/1/1 0:00:00
BUGG:XT关于BUGG合约更换完成的公告_HTT

尊敬的XT用户:BUGG合约地址更换已完成,用户在平台的BUGG资产已切换为BUGG新合约资产,平台已开放BUGG新合约代币的充提,交易将于2021年09月27日18:00开启.

1900/1/1 0:00:00