本文作者: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);}
Gnosis Chain發布去中心化支付網絡Gnosis Pay和自托管借記卡Gnosis Card:7月17日消息,Gnosis Chain在巴黎EthCC(Ethereum Community Conference)大會上發布去中心化支付網絡Gnosis Pay和自托管借記卡Gnosis Card。Gnosis Pay基于Gnosis Chain,使Web3開發人員能夠集成各種傳統支付方式,包括Visa,用戶可以在任何接受Visa的地方直接從錢包中使用加密資產消費;Gnosis Card是經過Visa認證的自托管消費者借記卡,需要進行KYC認證,建立在GnosisPay去中心化支付網絡上,直接鏈接到鏈上錢包,支持線下線上的各種刷卡消費,每筆交易通過智能合約。此外Gnosis Pay支持用戶將ENS與卡片綁定,用戶可以將其與任何錢包一起使用,每個社區或每個錢包都能發行自己品牌的對應Visa卡。[2023/7/17 11:00:08]
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。
Gnosis Safe公布首批Safe守護者,將追溯分配2500萬枚SAFE代幣:6月21日消息,數字資產管理平臺Gnosis Safe公布首批Safe守護者,并將追溯分配2500萬枚SAFE代幣,包括1inch、Angle Protocol、Autonolas、Block Science、Bootnode、Bulla Banker、Cardstack、Castle、Ceramic、Circles、Cobo、Coinshift、Cow Protocol以及Curve等。
這2500萬枚SAFE代幣中,50%可立即申領,另外一半將在4年內釋放。今年5月份,Gnosis Safe啟動Safe守護者計劃(Safe Guardians Programvol.1),并將分配5000萬枚SAFE代幣(占總供應量的5%)獎勵給Safe守護者,其中2.5%可立即申領,另外2.5%將在4年內釋放。守護者指任何已為Safe生態系統做出積極貢獻的社區活躍成員。[2022/6/22 4:43:43]
execTransactionFromModuleReturnData-通過模塊執行方法
functionexecTransactionFromModuleReturnData(addressto,uint256value,bytesmemorydata,Enum
modifierauthorized(){require(msg
思考3:代理合約通過delegatecall來訪問主合約,而調用主合約中的執行模塊方法時,可以選擇用call來執行傳入的to地址上的方法,那么delegatecall的上下文環境里,再使用call,最后它的狀態變化發生在哪里?是代理合約里呢還是call中的to地址上?
多簽錢包Gnosis Safe安全監護人成員將獲獨立Token分配,申請將于5月30日截止:5月24日消息,多簽錢包GnosisSafe宣布安全監護人的申請將于5月30日截至,安全監護人為Gnosis Safe官方認證的、曾以任意方式為社區的安全建設做出可觀貢獻的集體或個人。
據了解,申請成功的安全監護人將被給予額外的SAFE Token分配。此前報道,Gnosis Safe將從GnosisLtd.中拆分出來,同時將建立SafeDAO,并通過發行SAFEToken來管理Gnosis Safe生態系統和基礎設施。SAFE總量共計10億枚,目前已完成向歷史用戶的Token空投快照,但并未透露快照的具體區塊高度。[2022/5/24 3:38:30]
問題實質是msg
可以看到在構造函數里有一個參數address_singleton,作為工廠合約,最簡單的生產一個Proxy的方法如下:
functioncreateProxy(addresssingleton,bytesmemorydata)publicreturns(GnosisSafeProxyproxy){proxy=newGnosisSafeProxy(singleton);//初始化(boolsuccess,bytesmemoryres)=address(proxy)
在上面的創建Proxy合約的過程中,其實質是調用了create這一opcode。又因為create這一個opcode的創建合約的地址僅與Factory合約的地址和nonce有關,故導致錢包地址可被人手動推算出來。導致任何通過Factory合約這一方法創建錢包的人的錢包地址都可以被推斷,出現安全隱患。
全鏈式DEX Sifchain正式發布Magnolia版本,包含IBC v2等功能:1月27日消息,全鏈式DEX Sifchain宣布正式發布Magnolia版本,該版本功能包括可執行一個游戲計劃來解決Terra的所有問題、IBC v2允許以太坊連接至Cosmos,以及支持多個代幣的獎勵支付。
據了解,Sifchain是基于Cosmos SDK構建的一個全鏈式去中心化交易平臺,此次升級將使它成為目前唯一一個同時可以交易ERC20掛鉤資產和Cosmos生態系統資產的DEX。[2022/1/27 9:17:24]
地址的推算方法如下:
//首先拿到工廠合約的地址: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.
Gnosis12月12日將在柏林舉行開發者見面會:Gnosis (GNO)將于12月12日在柏林舉行開發者見面會。[2017/12/10]
即將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;
將上面的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
Tags:MODESSGNORESArbitrage Analysis Beyond CommodityCHESSChampignons of ArborethiaCoinfresh
Gate.io“芝麻金融”雙幣寶理財服務現已推出BTC/USDT、ETH/USDT雙幣投資理財產品,今日BTC專區產品持倉期限2-16天,掛鉤參考價格為38000-50000美元.
1900/1/1 0:00:00此前,Gate.io已開啟SAFEMOON/USDT,YGG/USDT,SDAO/USDT,ILV/USDT,RAD/USDT交易對新版流動性礦池,目前上述交易對流動性充足、交易活躍.
1900/1/1 0:00:00親愛的Pool-X用戶:Pool-X將于2021年9月24日18:00:00(UTC8)上線HYDRA持倉競賽第六輪.
1900/1/1 0:00:00據南華早報9月23日消息,總部位于香港的全球化加密金融服務商AmberGroup正考慮未來兩年內在美國直接上市,全球業務發展有助于其抵御有關生息產品的監管不確定性.
1900/1/1 0:00:00親愛的用戶:幣安將于2021年09月22日14:00上線Illuvium,并開通ILV/BTC、ILV/BNB、ILV/BUSD、ILV/USDT交易對.
1900/1/1 0:00:00尊敬的歐易OKEx用戶:由于節點升級,OKEx將于2021年9月24日10:30(HKT)暫停ARK的充提,待升級完成后開放.
1900/1/1 0:00:00