मुख्य सामग्री पर जाएं

स्मार्ट अनुबंध सुरक्षा दिशानिर्देश

solidity
स्मार्ट अनुबंध
सुरक्षा
मध्यवर्ती
Trailofbits
6 सितंबर 2020
6 मिनट पढ़ें

अधिक सुरक्षित स्मार्ट अनुबंध बनाने के लिए इन उच्च-स्तरीय अनुशंसाओं का पालन करें।

डिज़ाइन दिशानिर्देश

कोड की कोई भी लाइन लिखने से पहले, अनुबंध के डिज़ाइन पर पहले से चर्चा की जानी चाहिए।

दस्तावेज़ीकरण और विनिर्देश

दस्तावेज़ीकरण विभिन्न स्तरों पर लिखा जा सकता है, और अनुबंधों को लागू करते समय इसे अपडेट किया जाना चाहिए:

  • सिस्टम का सरल भाषा में विवरण, जो यह बताता हो कि अनुबंध क्या करते हैं और कोडबेस पर कोई भी मान्यताएँ क्या हैं।
  • स्कीमा और आर्किटेक्चरल आरेख, जिसमें अनुबंध इंटरैक्शन और सिस्टम की स्थिति मशीन शामिल है। स्लिथर प्रिंटर (opens in a new tab) इन स्कीमा को उत्पन्न करने में मदद कर सकते हैं।
  • विस्तृत कोड दस्तावेज़ीकरण, Solidity के लिए NatSpec प्रारूप (opens in a new tab) का उपयोग किया जा सकता है।

ऑनचेन बनाम ऑफचेन गणना

  • जितना हो सके उतना कोड ऑफचेन रखें। ऑनचेन लेयर को छोटा रखें। डेटा को ऑफचेन कोड के साथ इस तरह से प्री-प्रोसेस करें कि ऑनचेन सत्यापन सरल हो। क्या आपको एक क्रमित सूची की आवश्यकता है? सूची को ऑफचेन सॉर्ट करें, फिर केवल ऑनचेन इसके क्रम की जांच करें।

अपग्रेड करने की क्षमता

हमने अपने ब्लॉगपोस्ट (opens in a new tab) में विभिन्न अपग्रेड करने की क्षमता वाले समाधानों पर चर्चा की है। कोई भी कोड लिखने से पहले अपग्रेड करने की क्षमता का समर्थन करने या न करने का सोच-समझकर चुनाव करें। यह निर्णय प्रभावित करेगा कि आप अपने कोड की संरचना कैसे बनाते हैं। सामान्य तौर पर, हम अनुशंसा करते हैं:

  • अपग्रेड करने की क्षमता के बजाय अनुबंध माइग्रेशन (opens in a new tab) को प्राथमिकता दें। माइग्रेशन सिस्टम में अपग्रेड करने योग्य सिस्टम के समान कई फायदे होते हैं, बिना उनकी कमियों के।
  • delegatecallproxy के बजाय डेटा पृथक्करण पैटर्न का उपयोग करें। यदि आपके प्रोजेक्ट में स्पष्ट एब्स्ट्रैक्शन पृथक्करण है, तो डेटा पृथक्करण का उपयोग करके अपग्रेड करने की क्षमता के लिए केवल कुछ समायोजन की आवश्यकता होगी। delegatecallproxy के लिए EVM विशेषज्ञता की आवश्यकता होती है और इसमें त्रुटि होने की संभावना बहुत अधिक होती है।
  • तैनाती से पहले माइग्रेशन/अपग्रेड प्रक्रिया का दस्तावेजीकरण करें। यदि आपको बिना किसी दिशानिर्देश के तनाव में प्रतिक्रिया करनी पड़े, तो आप गलतियाँ करेंगे। पालन की जाने वाली प्रक्रिया को पहले से लिख लें। इसमें शामिल होना चाहिए:
    • वे कॉल जो नए अनुबंधों को आरंभ करते हैं
    • कुंजियाँ कहाँ संग्रहीत हैं और उन तक कैसे पहुँचें
    • तैनाती की जांच कैसे करें! तैनाती के बाद की स्क्रिप्ट विकसित करें और उसका परीक्षण करें।

कार्यान्वयन दिशानिर्देश

सरलता का प्रयास करें। हमेशा सबसे सरल समाधान का उपयोग करें जो आपके उद्देश्य के अनुकूल हो। आपकी टीम का कोई भी सदस्य आपके समाधान को समझने में सक्षम होना चाहिए।

फ़ंक्शन संरचना

आपके कोडबेस का आर्किटेक्चर ऐसा होना चाहिए जिससे आपके कोड की समीक्षा करना आसान हो। ऐसे आर्किटेक्चरल विकल्पों से बचें जो इसकी शुद्धता के बारे में तर्क करने की क्षमता को कम करते हैं।

  • अपने सिस्टम के लॉजिक को विभाजित करें, या तो कई अनुबंधों के माध्यम से या समान फ़ंक्शंस को एक साथ समूहित करके (उदाहरण के लिए, प्रमाणीकरण, अंकगणित, ...)।
  • स्पष्ट उद्देश्य के साथ छोटे फ़ंक्शन लिखें। इससे समीक्षा करना आसान हो जाएगा और व्यक्तिगत घटकों के परीक्षण की अनुमति मिलेगी।

इनहेरिटेंस

  • इनहेरिटेंस को प्रबंधनीय रखें। लॉजिक को विभाजित करने के लिए इनहेरिटेंस का उपयोग किया जाना चाहिए, हालांकि, आपके प्रोजेक्ट का लक्ष्य इनहेरिटेंस ट्री की गहराई और चौड़ाई को कम करना होना चाहिए।
  • अनुबंधों के पदानुक्रम की जांच करने के लिए स्लिथर के इनहेरिटेंस प्रिंटर (opens in a new tab) का उपयोग करें। इनहेरिटेंस प्रिंटर आपको पदानुक्रम के आकार की समीक्षा करने में मदद करेगा।

घटनाएँ

  • सभी महत्वपूर्ण ऑपरेशनों को लॉग करें। घटनाएँ विकास के दौरान अनुबंध को डीबग करने और तैनाती के बाद इसकी निगरानी करने में मदद करेंगी।

ज्ञात कमियों से बचें

निर्भरताएँ

  • अच्छी तरह से परीक्षण की गई लाइब्रेरी का उपयोग करें। अच्छी तरह से परीक्षण की गई लाइब्रेरी से कोड आयात करने से आपके द्वारा बग वाले कोड लिखने की संभावना कम हो जाएगी। यदि आप एक ERC-20 अनुबंध लिखना चाहते हैं, तो ओपनजेपेलिन (opens in a new tab) का उपयोग करें।
  • निर्भरता प्रबंधक का उपयोग करें; कोड को कॉपी-पेस्ट करने से बचें। यदि आप किसी बाहरी स्रोत पर निर्भर हैं, तो आपको इसे मूल स्रोत के साथ अद्यतित रखना चाहिए।

परीक्षण और सत्यापन

  • विस्तृत यूनिट-टेस्ट लिखें। उच्च गुणवत्ता वाले सॉफ़्टवेयर बनाने के लिए एक व्यापक परीक्षण सूट महत्वपूर्ण है।
  • स्लिथर (opens in a new tab), एकिड्ना (opens in a new tab) और मैन्टिकोर (opens in a new tab) कस्टम चेक और गुण लिखें। स्वचालित उपकरण यह सुनिश्चित करने में मदद करेंगे कि आपका अनुबंध सुरक्षित है। कुशल चेक और गुण लिखना सीखने के लिए इस गाइड के बाकी हिस्सों की समीक्षा करें।
  • crytic.io (opens in a new tab) का उपयोग करें। Crytic, GitHub के साथ एकीकृत होता है, निजी स्लिथर डिटेक्टरों तक पहुंच प्रदान करता है, और एकिड्ना से कस्टम प्रॉपर्टी चेक चलाता है।

Solidity

  • 0.4 और 0.6 के बजाय Solidity 0.5 को प्राथमिकता दें। हमारी राय में, Solidity 0.5 अधिक सुरक्षित है और इसमें 0.4 की तुलना में बेहतर अंतर्निहित प्रथाएं हैं। Solidity 0.6 उत्पादन के लिए बहुत अस्थिर साबित हुआ है और इसे परिपक्व होने के लिए समय चाहिए।
  • संकलित करने के लिए एक स्थिर रिलीज़ का उपयोग करें; चेतावनियों की जांच करने के लिए नवीनतम रिलीज़ का उपयोग करें। जांचें कि आपके कोड में नवीनतम कंपाइलर संस्करण के साथ कोई रिपोर्ट की गई समस्या नहीं है। हालाँकि, Solidity का रिलीज़ चक्र तेज़ है और कंपाइलर बग का इतिहास रहा है, इसलिए हम तैनाती के लिए नवीनतम संस्करण की अनुशंसा नहीं करते हैं (स्लिथर की solc संस्करण अनुशंसा (opens in a new tab) देखें)।
  • इनलाइन असेंबली का उपयोग न करें। असेंबली के लिए EVM विशेषज्ञता की आवश्यकता होती है। यदि आपने येलो पेपर में महारत हासिल नहीं की है तो EVM कोड न लिखें।

तैनाती दिशानिर्देश

एक बार अनुबंध विकसित और तैनात हो जाने के बाद:

  • अपने अनुबंधों की निगरानी करें। लॉग देखें, और अनुबंध या वॉलेट से समझौता होने की स्थिति में प्रतिक्रिया करने के लिए तैयार रहें।
  • अपनी संपर्क जानकारी blockchain-security-contacts (opens in a new tab) में जोड़ें। यदि कोई सुरक्षा खामी पाई जाती है तो यह सूची तीसरे पक्षों को आपसे संपर्क करने में मदद करती है।
  • विशेषाधिकार प्राप्त उपयोगकर्ताओं के वॉलेट सुरक्षित करें। यदि आप हार्डवेयर वॉलेट में कुंजियाँ संग्रहीत करते हैं तो हमारी सर्वोत्तम प्रथाओं (opens in a new tab) का पालन करें।
  • घटना प्रतिक्रिया योजना रखें। विचार करें कि आपके स्मार्ट अनुबंधों से समझौता किया जा सकता है। भले ही आपके अनुबंध बग-मुक्त हों, एक हमलावर अनुबंध स्वामी की कुंजियों पर नियंत्रण कर सकता है।