दिसम्बर 6/2021
परिचय
RSI गणना टीम ने हमें सामान्य शासन अनुबंधों को बेहतर बनाने और उन्हें अधिक लचीलापन देने के अंतिम लक्ष्य के साथ अनुबंधों के एक सेट की समीक्षा और ऑडिट करने के लिए कहा। हमने कोड देखा और अब हमारे परिणाम प्रकाशित करते हैं।
सिस्टम सारांश
प्रणाली तीन मुख्य अनुबंधों पर निर्भर करती है:
- A
SafeGuard
अनुबंध टेम्पलेट। यह अनुबंध हैadmin
एक कीTimelock
अनुबंध करता है, और इसके ऊपर मॉड्यूलर भूमिकाओं की एक परत जोड़ता हैTimelock
की हरकतें। यह अनुबंध कई भूमिकाओं को परिभाषित करता है जिनकी एक प्रस्ताव की स्थिति (कतार, रद्दीकरण और निष्पादन) पर अलग जिम्मेदारी और पहुंच होती है। - A
SafeGuardFactory
अनुबंध एक नया तैनात करता हैSafeGuard
और एक संबंधित नयाTimelock
अनुबंध। फिर यह टाइमलॉक एड्रेस को के अंदर सेट करता हैSafeGuard
अनुबंध और नया पंजीकृत करता हैSafeGuard
मेंRegistry
. - A
Registry
जो तैनात की एक सूची रखती हैSafeGuards
उनकी संगत के साथ संस्करण संख्या.
RSI SafeGuardFactory
मूल रूप से पैदा होगा a नई SafeGuard
जब भी कहा जाता है। ए SafeGuard
चारों ओर लपेट है Timelock
आपरेशनों जो प्रत्येक क्रिया के लिए अलग और अलग भूमिकाएँ जोड़ता है। भूमिकाएँ OpenZeppelin's . के उपयोग के माध्यम से संरचित की जाती हैं AccessControlEnumerable
अनुबंध मल्टीसिग वॉलेट और व्यावसायिक उपयोग के मामलों में अधिक लचीलापन और अनुकूलता प्रदान करता है जहां कई पते समान साझा भूमिका निभा सकते हैं।
अपडेट: में पीआर # 10टैली टीम ने हटाने का फैसला किया है Registry
अनुबंध। तैनात सुरक्षा उपायों की सूची अब के भीतर संग्रहीत है SafeGuardFactory
अनुबंध, में safeGuards
गणनीय सेट, उनके संस्करण के साथ में संग्रहीत safeGuardVersion
मानचित्रण।
भूमिकाओं
RSI SafeGuard
अनुबंध निम्नलिखित भूमिकाओं को परिभाषित करता है:
अपडेट: RSI CREATOR_ROLE
L02 समस्या के समाधान के रूप में भूमिका को हटा दिया गया है।
विस्तार
हमने ऑडिट किया b2c63a9dfc4090be13320d999e7c6c1d842625d3
का safeguard
भंडार। दायरे में स्मार्ट अनुबंध हैं contracts
निर्देशिका। हालांकि mocks
निर्देशिका को दायरे से बाहर माना गया था।
मान्यताओं
सिस्टम अपग्रेड करने योग्य नहीं है। Registry
पता सेट है कंस्ट्रक्टर में का SafeGuardFactory
और प्रत्येक SafeGuard
हो सकता है Timelock
केवल एक बार सेट करें. इसका मतलब यह है कि यदि कोई नया Registry
एक नया तैनात किया गया है SafeGuardFactory
भी तैनात किया जाना चाहिए। अगर Timelock
कार्यान्वयन परिवर्तन, पुराना SafeGuard
s अप्रचलित हो जाएंगे, और नए को तैनात करना होगा।
इसके अलावा, सिस्टम काफी हद तक a . के कार्यान्वयन पर निर्भर करता है Timelock
अनुबंध जिसे इस लेखापरीक्षा के दायरे से बाहर माना गया था। टीम ने अभी तक के कार्यान्वयन को अंतिम रूप नहीं दिया है Timelock
अनुबंध। यह रिपोर्ट लिखते समय, कंपाउंड का टाइमलॉक का कार्यान्वयन परियोजना में उपयोग किया जा रहा है।
एक सप्ताह के दौरान दो लेखा परीक्षकों द्वारा कोड आधार का लेखा-जोखा किया गया है और यहां हम अपने निष्कर्ष प्रस्तुत कर रहे हैं।
गंभीर गंभीरता
कोई नहीं.
उच्च गंभीरता
[एच01] ईटीएच को अंदर बंद किया जा सकता है Timelock
अनुबंध
RSI Tally
टीम मूल रूप से उनके कार्यान्वयन के आधार पर आधारित थी GovernorBravoDelegate
यौगिक अनुबंध।
इस लेखापरीक्षा के दौरान, Tally
टीम की खोज की एक सीमा कंपाउंड के गवर्नर में जहां ईटीएच सीधे भेजा जाता है Timelock
शासन प्रस्तावों द्वारा उपयोग के लिए उपलब्ध नहीं है, और यद्यपि यह स्थायी रूप से अटका नहीं है, फिर भी इसे प्राप्त करने के लिए एक विस्तृत समाधान की आवश्यकता है।
ऐसा इसलिए है क्योंकि राज्यपाल के कार्यान्वयन के लिए प्रस्ताव के सभी मूल्यों को संलग्न करने की आवश्यकता होती है msg.value
उस खाते से जो निष्पादन को ट्रिगर करता है, किसी भी तरह से उपयोग नहीं कर रहा है Timelock
ईटीएच फंड।
RSI बाद में इसी मुद्दे की पहचान की गई थी SafeGuard
कार्यान्वयन और टीम इस मुद्दे से अवगत है और इसे ठीक करने की प्रक्रिया में है।
समस्या को ठीक करते समय, दृष्टिकोण का उपयोग करने पर विचार करें इसी मुद्दे के लिए OpenZeppelin पुस्तकालय द्वारा अपनाया गया.
अपडेट: प्रतिबद्ध में फिक्स्ड 7337db227edda83533be586135d96ddac4f5bf29
.
[H02] SafeGuardFactory को फ्रीज किया जा सकता है
RSI Registry
अनुबंध का उद्देश्य सभी का ट्रैक रखना है SafeGuards
कि SafeGuardFactory
पैदा करता है. इसमें बाहरी register
समारोह जिसका उपयोग इस उद्देश्य के लिए किया जाता है।
इसी समय, SafeGuardFactory
इसके निर्माता में, स्थानीय का असाइनमेंट है registry
इनपुट मूल्य के लिए मूल्य. के मूल्य को बदलने की कोई संभावना नहीं है registry
चर और इस कारण से, यदि कोई नया Registry
तैनात हो जाता है, एक नया कारखाना भी लगाया जाना चाहिए।
RSI SafeGuardFactory
है createSafeGuard
समारोह, पहले के प्रभारी एक नया तैनात करना SafeGuard
, तो एक नया Timelock
के पते के साथ SafeGuard
as admin
, फिर सेटिंग timelock
का चर SafeGuard
अनुबंध और अंत में पंजीकरण करना SafeGuard
रजिस्ट्री में.
मुद्दा यह है कि कोई भी कॉल createSafeGuard
एक हमलावर द्वारा विफल होने के लिए मजबूर किया जा सकता है जो सीधे नए के नियतात्मक पते को पंजीकृत कर सकता है SafeGuard
इसके निर्माण से पहले। जब भी कोई ठेका एक बनाता है new
उदाहरण, इसके गैर को बढ़ाया जाता है, और जहां अनुबंध का नया उदाहरण तैनात किया जाएगा, उसका पता मूल अनुबंध पते और इसके गैर द्वारा निर्धारित किया जा सकता है। इसलिए, एक हमलावर कई पतों का पूर्व-गणना कर सकता है जहां नया SafeGuards
तैनात किया जाएगा और उन पतों को दर्ज किया जाएगा Registry
फोन करके register
समारोह। यह करने के लिए कॉल में परिणाम होगा createSafeGuard
सेवा मेरे लौट आना के बाद से Registry
पहले से ही पता है।
बाहरी अभिनेताओं को सार्वजनिक रूप से कॉल करने से बचने के लिए Register
अनुबंध, तक पहुंच को प्रतिबंधित करने पर विचार करें register
द्वारा विशेष रूप से कॉल स्वीकार करने का कार्य SafeGuardFactory
.
अपडेट: में तय किया पीआर # 10. टैली टीम ने हटा दिया है Registry
अनुबंध।
मध्यम गंभीरता
कोई नहीं.
कम गंभीरता
[एल01] कोड आउट टिप्पणी की
RSI Registry
अनुबंध में शामिल हैं कोड की एक टिप्पणी की गई रेखा. पठनीयता में सुधार के लिए, इसे कोडबेस से हटाने पर विचार करें।
अपडेट: में तय किया पीआर # 10 और प्रतिबद्ध 7fd27df16fc879d990d36a167a0b6e719e578558
.
[L02] SafeGuard का व्यवस्थापक किसी भी पते पर निर्माता की भूमिका सौंप सकता है
RSI SafeGuard
अनुबंध a . की भूमिका को परिभाषित करता है CREATOR_ROLE
जो, जैसा कि नाम से पता चलता है, रक्षोपाय के निर्माता को सौंपा गया है।
हालाँकि, आह्वान करके la grantRole
का कार्य AccessControlEnumerable
अनुबंध OpenZeppelin अनुबंध पुस्तकालय में, एक व्यवस्थापक इस भूमिका को किसी भी पते पर प्रदान कर सकता है। यह भ्रम पैदा कर सकता है क्योंकि के निर्माता SafeGuard
केवल हो सकता है SafeGuardFactory
.
पूरे कोडबेस में, इस भूमिका का उपयोग केवल उपयोगकर्ताओं को इसके साथ बातचीत करने से प्रतिबंधित करने के लिए किया गया है setTimelock
समारोह का SafeGuard
अनुबंध। डिजाइन द्वारा, सिस्टम यह सुनिश्चित करता है कि setTimelock
समारोह केवल एक बार कॉल किया जा सकता हैसे, के अंदर SafeGuardFactory
अनुबंध.
हटाने पर विचार करें CREATOR_ROLE
से भूमिका SafeGuard
अनुबंध और का उपयोग करना onlyOwner
आपरिवर्तक में setTimelock
समारोह.
अपडेट: में तय किया पीआर # 10.
[एल03] गलत इंटरफ़ेस परिभाषा और कार्यान्वयन
RSI ISafeGuard
इंटरफ़ेस परिभाषित नहीं करता है queueTransactionWithDescription
समारोह में लागू किया गया SafeGuard
अनुबंध, और साथ ही, यह परिभाषित करता है __abdicate, __queueSetTimelockPendingAdmin और __executeSetTimelockPendingAdmin कार्य करते हैं लेकिन उनका क्रियान्वयन नहीं होता है।
कोडबेस में शुद्धता और स्थिरता में सुधार करने के लिए, रिफैक्टरिंग पर विचार करें ISafeGuard
इंटरफ़ेस बिल्कुल मिलान करने के लिए SafeGuard
कार्यान्वयन.
अपडेट: प्रतिबद्ध में फिक्स्ड 7fd27df16fc879d990d36a167a0b6e719e578558
.
[एल04] लापता डॉकस्ट्रिंग
कोड आधार में कुछ अनुबंधों और कार्यों में दस्तावेज़ीकरण की कमी है। उदाहरण के लिए, कुछ फ़ंक्शन में SafeGuard
अनुबंध।
इसके अतिरिक्त, कुछ डॉकस्ट्रिंग अनौपचारिक भाषा का उपयोग करते हैं, जैसे कि एक इसके ऊपर setTimelock
समारोह में SafeGuard
अनुबंध.
यह समीक्षकों को कोड के इरादे की समझ में बाधा डालता है, जो न केवल सुरक्षा बल्कि शुद्धता का सही आकलन करने के लिए मौलिक है। इसके अतिरिक्त, डॉकस्ट्रिंग पठनीयता में सुधार करते हैं और रखरखाव को आसान बनाते हैं। उन्हें कार्यों के उद्देश्य या इरादे को स्पष्ट रूप से स्पष्ट करना चाहिए, जिन परिदृश्यों के तहत वे विफल हो सकते हैं, भूमिकाओं को उन्हें कॉल करने की अनुमति दी गई है, मूल्य लौटाए गए हैं और उत्सर्जित घटनाएं हैं।
उन सभी कार्यों (और उनके मापदंडों) का अच्छी तरह से दस्तावेजीकरण करने पर विचार करें जो अनुबंधों के सार्वजनिक एपीआई का हिस्सा हैं। संवेदनशील कार्यक्षमता को लागू करने वाले कार्य, भले ही सार्वजनिक न हों, स्पष्ट रूप से भी प्रलेखित होने चाहिए। डॉकस्ट्रिंग लिखते समय, निम्नलिखित पर विचार करें एथेरियम प्राकृतिक विशिष्टता प्रारूप (नैटस्पेक)।
अपडेट: में आंशिक रूप से तय किया गया पीआर # 10. पूरे कोड बेस में विभिन्न कार्यों में उचित डॉकस्ट्रिंग जोड़े गए हैं। हालाँकि, वर्तमान परिवर्तनों के अलावा, निम्नलिखित परिवर्तन करने पर विचार करें:
-
description
जैसा@param
उपरोक्त डॉकस्ट्रिंग मेंqueueTransactionWithDescription
समारोह -
@param
में डॉकस्ट्रिंग इसके ऊपरcreateSafeGuard
समारोह मेंSafeGuardFactory
अनुबंध -
@return
कार्यों के ऊपर डॉकस्ट्रिंग मेंSafeGuardFactory
अनुबंध।
[एल05] बेकार या दोहराया कोड
कोडबेस में ऐसे स्थान हैं जहां कोड या तो दोहराया जाता है या इसकी आवश्यकता नहीं होती है। कुछ उदाहरण निम्न हैं:
- 29-32 लाइनों का
Registry
अनुबंध बेकार हैं, क्योंकि_add
का कार्यEnumerableSet
अनुबंध पहले से ही ये जाँच करता है पहले से सेट किए जा रहे मानों के विरुद्ध। - रेखाएँ १२, 67, 73 और 78 का
SafeGuard
अनुबंध सभी एक ही सटीक संचालन दोहरा रहे हैं। डुप्लिकेट कोड से बचने के लिए इसे आंतरिक फ़ंक्शन में इनकैप्सुलेट करने पर विचार करें। - 62-63 लाइनों और 67-68 of
SafeGuard
दोहराया जाता है। उन्हें एक आंतरिक कार्य में समाहित करने पर विचार करें। - का उपयोग
gasleft
यह निर्दिष्ट करने के लिए कि फ़ंक्शन के कॉल में कितनी गैस अग्रेषित की जानी चाहिएexecuteTransaction
अनावश्यक है। ऐसा इसलिए है, क्योंकि निष्पादन के उस समय, निष्पादन को जारी रखने के लिए बची हुई पूरी गैस का उपयोग किया जाएगा। यदि यह खोजकर्ता के लिए नहीं है, तो इसे हटाने पर विचार करेंgas
कॉल से पैरामीटर।
क्लीनर कोड बनाने के लिए सुझाए गए फिक्स्ड को लागू करने और कोडबेस पर स्थिरता और मॉड्यूलरिटी में सुधार करने पर विचार करें।
अपडेट: में तय किया पीआर # 10 और प्रतिबद्ध 7fd27df16fc879d990d36a167a0b6e719e578558
.
नोट्स और अतिरिक्त जानकारी
[एन01] असंगत शैली
कोड आधार में कुछ स्थान हैं, जहां शैली में अंतर पठनीयता को प्रभावित करता है, जिससे कोड को समझना अधिक कठिन हो जाता है। कुछ उदाहरण निम्न हैं:
- RSI
Registry
अनुबंध पूरे अनुबंध में डॉकस्ट्रिंग के लिए विभिन्न शैलियों का उपयोग करता है। - RSI
SafeGuard
अनुबंध एक घटना का उत्सर्जन कर रहा है जबqueueTransactionWithDescription
कहा जाता है लेकिन लेनदेन से निपटने वाले अन्य कार्यों में कोई घटना नहीं निकलती है। - में
SafeGuard
अनुबंध, कभी-कभी मूल्य नामित पैरामीटर के रूप में प्रयोग किया जाता है और कभी-कभी _मूल्य प्रयोग किया जाता है।
मूल्य को ध्यान में रखते हुए एक सुसंगत कोडिंग शैली परियोजना की पठनीयता में जोड़ती है, एक मानक कोडिंग शैली को लागू करने पर विचार करें, जैसे कि सॉल्हिंट, लिंटर टूल्स की मदद से।
अपडेट: में तय किया पीआर # 10 और प्रतिबद्ध 7fd27df16fc879d990d36a167a0b6e719e578558
.
[एन02] लाइसेंस गुम है
कोड आधार के भीतर निम्नलिखित अनुबंधों में एक एसपीडीएक्स लाइसेंस पहचानकर्ता नहीं है।
कंपाइलर चेतावनियों को शांत करने और कोडबेस में निरंतरता बढ़ाने के लिए लाइसेंस पहचानकर्ता जोड़ने पर विचार करें। ऐसा करते समय का जिक्र करने पर विचार करें एसपीडीएक्स.देव दिशा निर्देशों।
अपडेट: में तय किया पीआर # 10 और प्रतिबद्ध 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N03] OpenZeppelin अनुबंध की निर्भरता को पिन नहीं किया गया है
के मामले में अप्रत्याशित व्यवहार को रोकने के लिए भविष्य के अद्यतन में परिवर्तन जारी किए जाते हैं ओपनजेपेलिन कॉन्ट्रैक्ट्स लाइब्रेरी, इस निर्भरता के संस्करण में पिनिंग पर विचार करें package.json फ़ाइल.
अपडेट: में तय किया पीआर # 10.
[एन04] सॉलिडिटी कंपाइलर संस्करण पिन नहीं किया गया है
पूरे कोड आधार पर, के संस्करण को पिन करने पर विचार करें सॉलिडिटी कंपाइलर अपने नवीनतम स्थिर संस्करण के लिए। इससे असंगत भावी रिलीज़ के कारण अनपेक्षित बग्स को शुरू करने से रोकने में मदद मिलनी चाहिए। एक विशिष्ट संस्करण चुनने के लिए, डेवलपर्स को परियोजना के लिए आवश्यक कंपाइलर की सुविधाओं और दोनों पर विचार करना चाहिए ज्ञात बग की सूची प्रत्येक सॉलिडिटी कंपाइलर संस्करण के साथ जुड़ा हुआ है।
अपडेट: में तय किया पीआर # 10.
[एन05] टाइपो
पूरे कोड बेस में विभिन्न उदाहरणों पर, शब्द role
के रूप में गलत वर्तनी है rol
. ऐसा ही एक उदाहरण है के भीतर डॉकस्ट्रिंग constructor
का SafeGuard
अनुबंध.
कोड की पठनीयता में सुधार के लिए इन त्रुटियों को ठीक करने पर विचार करें।
अपडेट: में आंशिक रूप से तय किया गया पीआर # 10. जबकि की वर्तनी role
सही कर दिया गया है, टिप्पणी "एक परिभाषित व्यवस्थापक पते के लिए व्यवस्थापक भूमिका सेट करें" होना चाहिए "एक परिभाषित व्यवस्थापक पते पर व्यवस्थापक भूमिका सेट करें"। इसके अतिरिक्त, "निष्पादित" की वर्तनी गलत है SafeGuard
अनुबंध पर लाइन 69, लाइन 82, लाइन 96 और लाइन 110 और "उपलब्ध" पर गलत वर्तनी है लाइन 70, लाइन 83, लाइन 97, लाइन 111. साथ ही, अनौपचारिक शब्दों को बदलने पर विचार करें जैसे "होने वाला" in SafeGuard
औपचारिक विकल्पों जैसे "जाने" के साथ अनुबंध।
[एन06] uint को uint256 के रूप में घोषित करें
कोडबेस में कई घटनाएँ होती हैं जहाँ चर घोषित किए जाते हैं uint
के बजाय डेटा प्रकार uint256
। उदाहरण के लिए, eta
चर में QueueTransactionWithDescription
घटना का SafeGuard
अनुबंध।
स्पष्टता के पक्ष में, के सभी उदाहरण uint
के रूप में घोषित किया जाना चाहिए uint256
.
अपडेट: में तय किया पीआर # 10 और प्रतिबद्ध 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N07] अप्रयुक्त आयात
RSI SafeGuard
अनुबंध आयात करता है console
अनुबंध करता है लेकिन कभी इसका उपयोग नहीं करता है।
कोड की पठनीयता में सुधार करने के लिए, किसी भी अप्रयुक्त आयात को हटाने पर विचार करें।
अपडेट: में तय किया पीआर # 10.
निष्कर्ष
एक उच्च और कई अन्य छोटी कमजोरियां पाई गई हैं और सिफारिशों और सुधारों का सुझाव दिया गया है।
- &
- पहुँच
- लेखा
- के पार
- कार्य
- कार्रवाई
- अतिरिक्त
- पता
- व्यवस्थापक
- सब
- पहले ही
- हालांकि
- एपीआई
- दृष्टिकोण
- चारों ओर
- आडिट
- मूल रूप से
- जा रहा है
- कीड़े
- व्यापार
- कॉल
- मामलों
- कारण
- परिवर्तन
- प्रभार
- कोड
- कोडन
- सामान्य
- यौगिक
- भ्रम
- विचार
- शामिल हैं
- जारी रखने के
- अनुबंध
- ठेके
- सका
- निर्माता
- वर्तमान
- तिथि
- व्यवहार
- डिज़ाइन
- डेवलपर्स
- विभिन्न
- की खोज
- विस्तृत
- ETH
- कार्यक्रम
- घटनाओं
- उदाहरण
- कारखाना
- विशेषताएं
- अंत में
- प्रथम
- फिक्स
- लचीलापन
- पाया
- समारोह
- धन
- भविष्य
- गैस
- देते
- लक्ष्य
- शासन
- राज्यपाल
- दिशा निर्देशों
- होने
- मदद
- यहाँ उत्पन्न करें
- हाई
- कैसे
- HTTPS
- कार्यान्वित
- बढ़ना
- वृद्धि हुई
- इंटरफेस
- IT
- जानने वाला
- भाषा
- ताज़ा
- पुस्तकालय
- लाइसेंस
- लाइन
- सूची
- स्थानीय
- बंद
- देखा
- निर्माण
- मैच
- मॉड्यूलर
- मल्टीसिग
- अन्य
- वर्तमान
- प्रक्रिया
- परियोजना
- प्रस्ताव
- सार्वजनिक
- प्रकाशित करना
- रजिस्टर
- विज्ञप्ति
- रिपोर्ट
- कोष
- परिणाम
- की समीक्षा
- सुरक्षा
- सेट
- की स्थापना
- साझा
- स्मार्ट
- स्मार्ट अनुबंध
- दृढ़ता
- राज्य
- अंदाज
- प्रणाली
- यहाँ
- भर
- पहर
- उपकरण
- ट्रैक
- लेनदेन
- अपडेट
- us
- उपयोगकर्ताओं
- मूल्य
- कमजोरियों
- जेब
- सप्ताह
- कौन
- अंदर
- शब्द
- लिख रहे हैं