本文作者: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);}
韩国央行:将联手商业银行启动央行数字货币测试:7月12日消息,韩国中央银行(BOK)已表示将开始对数字韩元原型产品进行真实世界测试,但拒绝说明是否真的打算推出央行数字货币(CBDC)。目前已有包括新韩银行和农协银行在内的10家韩国国内商业银行宣布有意参与下一阶段的韩国央行数字货币试点。
据悉,截至2021年年底,韩国央行一直在与包括互联网巨头Kakao的子公司在内的私营部门公司进行闭门测试,他们表示多阶段试点的下一部分将专注于真实金融服务环境中的汇款和支付交易,因此需要商业银行支持。(cryptonews)[2022/7/12 2:06:45]
getModulesPaginated-拿到所有的模块列表
functiongetModulesPaginated(addressstart,uint256pageSize)externalviewreturns(addressmemoryarray,addressnext){array=newaddress(pageSize"""""""");//遍历链表,不包括哨兵addresscurrentModule=modules;uintmoduleCount=0;while(currentModule!=address(0)&¤tModule!=SENTINEL_MODULES&&moduleCount<pageSize){array=currentModule;moduleCount=1;currentModule=modules;}next=currentModule;//设置正确的array大小assembly{mstore(array,moduleCount。
加拿大央行:加息的时间和速度取决于实现2%通胀目标的承诺:1月26日,加拿大央行表示,预计将需要加息,加息的时间和速度取决于实现 2% 通胀目标的承诺,考虑在加息开始后抛售债券。(金十)[2022/1/27 9:15:27]
execTransactionFromModuleReturnData-通过模块执行方法
functionexecTransactionFromModuleReturnData(addressto,uint256value,bytesmemorydata,Enum
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)
在上面的创建Proxy合约的过程中,其实质是调用了create这一opcode。又因为create这一个opcode的创建合约的地址仅与Factory合约的地址和nonce有关,故导致钱包地址可被人手动推算出来。导致任何通过Factory合约这一方法创建钱包的人的钱包地址都可以被推断,出现安全隐患。
中国央行:以ICO和虚拟货币手段非法集资非常隐蔽:4月23日金色财经讯,由中国人民银行牵头召开的“防范和处置非法集资法律政策宣传座谈会”上,央行总结目前的互联网金融非法集资有四大特点:第一,专业化趋势明显;第二,非法集资新型方式层出不穷,其中一些不法分子以代币发行融资(ICO)、各类虚拟货币等“互联网金融创新”为幌子进行非法集资,噱头新颖,隐蔽性更强;第三,线上宣传和线下推广相结合;第四,“多头在外”躲避监管打击,一些非法集资涉案人员通过藏身境外、租用境外服务器搭建网络集资平台,将涉案资金转移至境外躲避监管。[2018/4/23]
地址的推算方法如下:
//首先拿到工厂合约的地址: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.
多签钱包Gnosis Safe GIP-29提案已通过,将向积极用户发放Token空投:4月17日消息,Gnosis 团队产品经理 Lukas Schor 在社交媒体上发文表示,多签钱包 Gnosis Safe GIP-29 提案已通过。Gnosis Safe 将从 Gnosis Ltd. 中拆分出来,类似于 CowSwap 此前的拆分。同时将建立 SafeDAO,并通过发行 SAFE Token 来管理 Gnosis Safe 生态系统和基础设施。
根据提案,SAFE 总量共计 10 亿枚,由 SAFE 基金会铸造。10% 的 SAFE 将空投于推进项目的社区成员和 Gnosis Safe 的积极用户,并已完成快照,快照时间暂未披露。[2022/4/17 14:29: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;
xDai与Gnosis合并提案已通过 STAKE代币将置换为GNO代币:12月8日消息,以太坊扩容解决方案xDai宣布与Gnosis合并的提案已经通过,接下来将正式启动将STAKE代币置换为GNO代币的工作,同时xDai Chain将更名为Gnosis Chain。[2021/12/8 12:57:58]
将上面的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'Picks
狂野西部,遇到监管新时代2021年9月21日,SEC主席GaryGensler接受《华盛顿邮报》专栏作家DavidIgnatius专访《加密货币:前进的道路》.
本期投票上币活动已圆满结束,感谢广大用户的参与和支持。Gate.io投票上币活动将持续带来更多有潜力的优质项目,敬请期待.
9月24日消息,中国人民银行发布进一步防范和处置虚拟货币交易炒作风险的通知。通知指出,近期,虚拟货币交易炒作活动抬头,扰乱经济金融秩序,滋生、非法集资、、、等违法犯罪活动,严重危.
1.关于首发项目NFTrade(NFTD)认购结果Gate.ioStartup首发项目NFTrade代币NFTD于2021年09月23日18:00开始下单,16小时内下单同等对待,总共有3.
原文作者|?AlexGladstein,BitcoinMagazine 编译|夏克立 整理|白泽研究院 快如闪电 我正站在一条未铺砌的街道旁的一家小咖啡店里,在一个没有红绿灯的中美洲村庄.
据Globenewswire9月22日报道,比特币矿企GenesisDigitalAssets宣布完成4.31亿美元战略融资,Paradigm领投.