स्मार्ट कॉन्ट्रैक्ट सिक्योरिटी के लिए सॉलिडिटी बेस्ट प्रैक्टिस

ब्लॉग 1NewsDevelopersEnterpriseBlockchain समझाया और सम्मेलनसमाचार

Contents

हमारे न्यूज़लेटर की सदस्यता लें.

ईमेल पता

हम आपकी निजता का सम्मान करते हैं

HomeBlogBlockchain विकास

स्मार्ट कॉन्ट्रैक्ट सिक्योरिटी के लिए सॉलिडिटी बेस्ट प्रैक्टिस

मॉनीटरिंग से लेकर टाइमस्टैम्प के विचारों तक, आपके एथेरम स्मार्ट कॉन्ट्रैक्ट को फोर्टीफाइड करने के लिए कुछ प्रो टिप्स दिए गए हैं। ConsenSysAugust 21, 2020 द्वारा 21 अगस्त, 2020 को पोस्ट किया गया

सॉलिडिटी बेस्ट प्रैक्टिस हीरो


ConsenSys Diligence द्वारा, ब्लॉकचेन सुरक्षा विशेषज्ञों की हमारी टीम.

अगर आपने स्मार्ट कॉन्ट्रैक्ट सिक्योरिटी माइंडसेट को दिल से लगा लिया है और ईवीएम की आइडिएसिप्रेसरीज पर काम कर रहे हैं, तो कुछ सिक्योरिटी पैटर्न पर विचार करने का समय है जो सॉलिडिटी प्रोग्रामिंग लैंग्वेज के लिए विशिष्ट है। इस राउंडअप में, हम सॉलिडिटी के लिए सुरक्षित विकास सिफारिशों पर ध्यान केंद्रित करेंगे जो अन्य भाषाओं में स्मार्ट कॉन्ट्रैक्ट विकसित करने के लिए शिक्षाप्रद भी हो सकती हैं. 

ठीक है, चलो अंदर कूदते हैं.

मुखर (), आवश्यकता (), वापस () का ठीक से उपयोग करें

सुविधा कार्य करता है ज़ोर तथा की आवश्यकता होती है यदि शर्तों को पूरा नहीं किया जाता है तो शर्तों की जांच करने और अपवाद को फेंकने के लिए इस्तेमाल किया जा सकता है.

 ज़ोर फ़ंक्शन का उपयोग केवल आंतरिक त्रुटियों के परीक्षण के लिए, और आक्रमणकारियों की जांच के लिए किया जाना चाहिए.

 की आवश्यकता होती है फ़ंक्शन का उपयोग वैध स्थितियों को सुनिश्चित करने के लिए किया जाना चाहिए, जैसे इनपुट, या अनुबंध राज्य चर मिलते हैं, या कॉल से बाहरी अनुबंध पर वापसी मूल्यों को मान्य करने के लिए. 

इस प्रतिमान के बाद औपचारिक विश्लेषण उपकरण यह सत्यापित करने की अनुमति देते हैं कि अमान्य ओपकोड कभी नहीं पहुंच सकता है: जिसका अर्थ है कि कोड में कोई भी उल्लंघनकर्ता उल्लंघन नहीं करता है और कोड औपचारिक रूप से सत्यापित है.

प्रैग्म सॉलिडिटी ^ 0.5.0; कॉन्ट्रैक्ट शेयरर {फंक्शन सेंहलफ़ (पता देय एड्र) सार्वजनिक देय रिटर्न (यूंट बैलेंस) {आवश्यकता (msg.value% 2 == 0), "यहां तक ​​कि मूल्य की आवश्यकता है."); // आवश्यकता () में एक वैकल्पिक संदेश स्ट्रिंग uint balanceBeforeTransfer = पता (यह) हो सकता है। (बूल सफलता,) = addr.call.value (msg.value / 2) (""); आवश्यकता (सफलता); // चूंकि हम ट्रांसफ़र में विफल होने पर वापस लौट आए, इसलिए हमारे पास अभी भी आधे पैसे होने का कोई रास्ता नहीं है। मुखर (पता) (यह) .balance == balanceBeforeTransfer – msg.value / 2); // आंतरिक त्रुटि जाँच पते के लिए उपयोग किया जाता है (यह)। }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

ले देख SWC-110 & एसडब्ल्यूसी -123

केवल जाँच के लिए संशोधक का उपयोग करें

एक संशोधक के अंदर कोड आमतौर पर फ़ंक्शन बॉडी से पहले निष्पादित किया जाता है, इसलिए कोई भी राज्य परिवर्तन या बाहरी कॉल का उल्लंघन होगा जाँच-प्रभाव-सहभागिता पैटर्न। इसके अलावा, इन कथनों को भी डेवलपर ने अनसुना किया जा सकता है, क्योंकि संशोधक के लिए कोड फ़ंक्शन घोषणा से बहुत दूर हो सकता है। उदाहरण के लिए, संशोधक में एक बाहरी कॉल पुनर्खरीद हमले का कारण बन सकता है:

अनुबंध रजिस्ट्री {पता मालिक; functionVoter (पता _addr) बाहरी रिटर्न (बूल) {// कोड}} अनुबंध चुनाव {रजिस्ट्री रजिस्ट्री; संशोधन योग्य है (पता _addr) {आवश्यकता (रजिस्ट्री.विसवोटर (_addr)); _; } फ़ंक्शन वोट () योग्य है (msg.sender) जनता {// कोड}} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

इस स्थिति में, रजिस्ट्री अनुबंध Election.vote () isVoter () के अंदर कॉल करके एक पुनर्विचार हमला कर सकता है.

ध्यान दें: प्रयोग करें संशोधक कई कार्यों में डुप्लिकेट स्थिति की जाँच करने के लिए, जैसे कि isOwner (), अन्यथा फ़ंक्शन के अंदर आवश्यकता या पुन: उपयोग करें। यह आपके स्मार्ट कॉन्ट्रैक्ट कोड को अधिक पठनीय और ऑडिट करने में आसान बनाता है.

पूर्णांक विभाजन के साथ गोलाई से सावधान रहें

सभी पूर्णांक विभाजन निकटतम पूर्णांक तक गोल होते हैं। यदि आपको अधिक सटीकता की आवश्यकता है, तो गुणक का उपयोग करने पर विचार करें, या अंश और भाजक दोनों को संग्रहीत करें.

(भविष्य में, सॉलिडिटी ए होगी निर्धारित बिंदू प्रकार, जो इसे आसान बना देगा।)

// बुरा uint x = 5/2; // परिणाम 2 है, सभी पूर्णांक डिवीजन राउंड निकटतम पूर्णांक भाषा में डाउनलोड करें: जावास्क्रिप्ट (जावास्क्रिप्ट)

एक गुणक का उपयोग करना नीचे की ओर बढ़ने से रोकता है, भविष्य में x के साथ काम करते समय इस गुणक को ध्यान में रखना होगा:

// अच्छा यूंट गुणक = 10; uint x = (5 * गुणक) / 2; कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

अंश और हर को संग्रहीत करने का मतलब है कि आप अंश / हर-श्रृंखला के परिणाम की गणना कर सकते हैं:

// अच्छा uint अंश = 5; uint भाजक = 2; कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

के बीच tradeoffs के बारे में पता होना सार अनुबंध तथा इंटरफेस

दोनों इंटरफेस और अमूर्त अनुबंध स्मार्ट अनुबंधों के लिए एक अनुकूलन योग्य और पुन: प्रयोज्य दृष्टिकोण प्रदान करते हैं। सॉलिडिटी 0.4.11 में पेश किए गए इंटरफेस, एब्सट्रैक्ट कॉन्ट्रैक्ट्स के समान हैं, लेकिन इसमें कोई फंक्शन लागू नहीं किया जा सकता है। इंटरफेस की सीमाएँ भी होती हैं जैसे भंडारण तक पहुँच न होना या अन्य इंटरफेस से विरासत में मिलना जो आमतौर पर अमूर्त अनुबंधों को अधिक व्यावहारिक बनाता है। हालांकि, कार्यान्वयन से पहले अनुबंधों को डिजाइन करने के लिए इंटरफेस निश्चित रूप से उपयोगी हैं। इसके अतिरिक्त, यह ध्यान रखना महत्वपूर्ण है कि यदि कोई अनुबंध एक सार अनुबंध से विरासत में मिला है, तो उसे ओवरराइडिंग के माध्यम से सभी गैर-कार्यान्वित कार्यों को लागू करना होगा या यह भी सार होगा.

पतन के कार्य

फ़ॉलबैक फ़ंक्शंस को सरल रखें

पतन के कार्य कहा जाता है जब एक अनुबंध को बिना किसी तर्क (या जब कोई फ़ंक्शन से मेल नहीं खाता) के साथ एक संदेश भेजा जाता है, और केवल एक ssend () या .transfer () से कॉल करने पर 2,300 गैस तक पहुंच होती है। यदि आप एक .send () या .transfer () से ईथर को प्राप्त करने में सक्षम होना चाहते हैं, तो सबसे अधिक आप एक फ़ॉलबैक फ़ंक्शन में कर सकते हैं एक ईवेंट लॉग है। यदि अधिक गैस की गणना की आवश्यकता हो तो एक उचित कार्य का उपयोग करें.

// खराब फ़ंक्शन () देय {शेष [msg.sender] + = msg.value; } // अच्छा फ़ंक्शन जमा () देय बाहरी {शेष [msg.sender] + = msg.value; } फ़ंक्शन () देय {आवश्यकता (msg.data.length == 0); LogDepositReceived (msg.sender) का उत्सर्जन करें; } कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

फ़ॉलबैक फ़ंक्शंस में डेटा की लंबाई जांचें

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

// खराब फ़ंक्शन () देय {emit LogDepositReceived (msg.sender); } // अच्छा कार्य () देय {आवश्यकता (msg.data.length == 0); LogDepositReceived (msg.sender) का उत्सर्जन करें; } कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

स्पष्ट रूप से देय कार्यों और राज्य चर को चिह्नित करें

सॉलिडिटी 0.4.0 से शुरू होकर, ईथर प्राप्त करने वाले प्रत्येक फ़ंक्शन को देय संशोधक का उपयोग करना चाहिए, अन्यथा यदि लेनदेन में msg.value है > 0 वापस कर देंगे (जब मजबूर किया तो छोड़कर).

ध्यान दें: कुछ जो स्पष्ट नहीं हो सकता है: देय संशोधक केवल बाहरी अनुबंधों से कॉल पर लागू होता है। यदि मैं एक ही अनुबंध में देय फ़ंक्शन में एक गैर-देय फ़ंक्शन को कॉल करता हूं, तो गैर-देय फ़ंक्शन विफल नहीं होता है, हालांकि msg.value अभी भी सेट है.

फ़ंक्शन और राज्य चर में दृश्यता को स्पष्ट रूप से चिह्नित करें

स्पष्ट रूप से कार्यों और राज्य चर की दृश्यता को लेबल करें। कार्यों को बाहरी, सार्वजनिक, आंतरिक या निजी होने के रूप में निर्दिष्ट किया जा सकता है। कृपया उनके बीच के अंतर को समझें, उदाहरण के लिए, सार्वजनिक के बजाय बाहरी पर्याप्त हो सकता है। राज्य चर के लिए, बाहरी संभव नहीं है। स्पष्ट रूप से दृश्यता को लेबल करने से गलत धारणाओं को पकड़ना आसान होगा, जो फ़ंक्शन को कॉल कर सकते हैं या चर तक पहुंच सकते हैं.

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

// बुरा यूं x; // डिफ़ॉल्ट राज्य चर के लिए आंतरिक है, लेकिन इसे स्पष्ट फ़ंक्शन खरीदना () {// डिफ़ॉल्ट सार्वजनिक है / सार्वजनिक कोड} // अच्छा uint निजी y होना चाहिए; फंक्शन बाय () एक्सटर्नल {// केवल कॉलेबल एक्सटर्नल रूप से या इस का उपयोग करके .buy ()} फंक्शन यूटिलिटी () पब्लिक {// कॉलेबल एक्सटर्नली, साथ ही आंतरिक रूप से: इस कोड को बदलने के लिए दोनों मामलों के बारे में सोचने की आवश्यकता होती है। } फंक्शन इंटरएक्शन () इंटरनल {// इंटरनल कोड} कोड भाषा: PHP (php)

ले देख एसडब्ल्यूसी -100 तथा SWC-108

विशिष्ट संकलक संस्करण के लिए प्रैग्मस को लॉक करें

अनुबंधों को उसी संकलक संस्करण और झंडे के साथ तैनात किया जाना चाहिए, जिसके साथ उनका परीक्षण किया गया है। प्राग्मा को लॉक करने से यह सुनिश्चित करने में मदद मिलती है कि अनुबंधों का उपयोग गलती से नहीं किया जाता है, उदाहरण के लिए, नवीनतम संकलक जिसमें अनदेखे कीड़े के उच्च जोखिम हो सकते हैं। अनुबंधों को दूसरों द्वारा भी तैनात किया जा सकता है और प्राग मूल लेखकों द्वारा निर्धारित संकलक संस्करण को इंगित करता है.

// बुरा प्रचार सॉलिडिटी ^ 0.4.4; // अच्छा प्रचार सॉलिडिटी 0.4.4; कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

नोट: एक फ्लोटिंग प्राग्मा वर्जन (यानी। 0.4.25) 0.4.26-nightly.2018.9.2.25 के साथ ठीक संकलित करेगा, हालांकि रात के बिल्ड का उपयोग कभी भी उत्पादन के लिए कोड संकलित करने के लिए नहीं किया जाना चाहिए.

चेतावनी: जब एक पुस्तकालय या EthPM पैकेज में अनुबंध के साथ मामले में अन्य डेवलपर्स द्वारा खपत के लिए एक अनुबंध का इरादा है, तो प्रज्ञा कथन को तैरने की अनुमति दी जा सकती है। अन्यथा, डेवलपर को स्थानीय रूप से संकलन करने के लिए मैन्युअल रूप से प्रगति को अपडेट करने की आवश्यकता होगी.

ले देख एसडब्ल्यूसी -103

अनुबंध गतिविधि की निगरानी के लिए घटनाओं का उपयोग करें

यह तैनात होने के बाद अनुबंध की गतिविधि की निगरानी करने का एक तरीका होना उपयोगी हो सकता है। इसे पूरा करने का एक तरीका अनुबंध के सभी लेनदेन को देखना है, हालांकि यह अपर्याप्त हो सकता है, क्योंकि अनुबंध के बीच संदेश कॉल ब्लॉकचेन में दर्ज नहीं हैं। इसके अलावा, यह केवल इनपुट मापदंडों को दिखाता है, न कि राज्य में किए जा रहे वास्तविक परिवर्तनों का। उपयोगकर्ता इंटरफ़ेस में फ़ंक्शन को ट्रिगर करने के लिए भी घटनाओं का उपयोग किया जा सकता है.

अनुबंध चैरिटी {मैपिंग (पता =)> uint) संतुलन; समारोह दान () देय सार्वजनिक {शेष [msg.sender] + = msg.value; }} कॉन्ट्रैक्ट गेम {फंक्शन buyCoins () देय पब्लिक {// 5% चैरिटी के लिए जाती है ।donate.value (msg.value / 20) (); }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

यहाँ, गेम अनुबंध, Charity.donate () के लिए एक आंतरिक कॉल करेगा। यह लेनदेन चैरिटी की बाहरी लेनदेन सूची में दिखाई नहीं देता है, लेकिन केवल आंतरिक लेनदेन में दिखाई देता है.

एक घटना अनुबंध में हुई किसी चीज़ को लॉग करने का एक सुविधाजनक तरीका है। ईवेंट को ब्लॉकचेन में अन्य अनुबंध डेटा के साथ रहने के लिए उत्सर्जित किया गया था और वे भविष्य के ऑडिट के लिए उपलब्ध हैं। चैरिटी के दान का इतिहास प्रदान करने के लिए घटनाओं का उपयोग करके ऊपर दिए गए उदाहरण में सुधार किया गया है.

अनुबंध चैरिटी {// ईवेंट ईवेंट लॉगऑनडेट (uint _amount); मानचित्रण (पता =)> uint) संतुलन; समारोह दान () देय सार्वजनिक {शेष [msg.sender] + = msg.value; // emit इवेंट Emit LogDonate (msg.value); }} कॉन्ट्रैक्ट गेम {फंक्शन buyCoins () देय पब्लिक {// 5% चैरिटी के लिए जाती है ।donate.value (msg.value / 20) (); }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

यहां, सभी लेनदेन जो चैरिटी अनुबंध के माध्यम से जाते हैं, या तो सीधे या नहीं, दान किए गए धन की राशि के साथ उस अनुबंध की घटना सूची में दिखाई देंगे.

नोट: नए सॉलिडिटी निर्माण को प्राथमिकता दें. सेल्फस्ट्रक्ट (आत्महत्या से अधिक) और केकेक 256 (शै 3 से अधिक) जैसे निर्माण / उपनामों को प्राथमिकता दें। आवश्यकता जैसे msgs (msg.sender.send (1 ईथर)) को भी msg.sender.transfer (1 ईथर) के रूप में स्थानांतरण () का उपयोग करके सरल बनाया जा सकता है। चेक आउट सॉलिडिटी चेंज लॉग अधिक समान परिवर्तनों के लिए.

ज्ञात हो कि aware बिल्ट-इन ’को छायांकित किया जा सकता है

वर्तमान में यह संभव है साया बिल्ट-इन ग्लोबल्स सॉलिडिटी में। यह कॉन्ट्रैक्ट्स को मेस और रिवर्ट () जैसे अंतर्निहित इन्स की कार्यक्षमता को ओवरराइड करने की अनुमति देता है। इस यद्यपि इरादा है, यह अनुबंध के उपयोगकर्ताओं को अनुबंध के वास्तविक व्यवहार के रूप में भ्रमित कर सकता है.

अनुबंध PretendingToRevert {function revert () आंतरिक स्थिरांक {}} अनुबंध ExampleContract PretendingToRevert {function somethingBad () public {revert (); }}

अनुबंध उपयोगकर्ता (और ऑडिटर) को किसी भी एप्लिकेशन के पूर्ण स्मार्ट कॉन्ट्रैक्ट सोर्स कोड के बारे में पता होना चाहिए जिसका वे उपयोग करने का इरादा रखते हैं.

Tx.origin के उपयोग से बचें

प्राधिकरण के लिए कभी भी tx.origin का उपयोग न करें, एक अन्य अनुबंध में एक विधि हो सकती है जो आपके अनुबंध को कहेगी (जहां उपयोगकर्ता के पास उदाहरण के लिए कुछ धन है) और आपका अनुबंध उस लेनदेन को प्राधिकृत करेगा जैसा कि आपका पता tx.origin में है.

अनुबंध MyContract {पता स्वामी; समारोह MyContract () सार्वजनिक {मालिक = msg.sender; } फ़ंक्शन sendTo (पता रिसीवर, यूंट राशि) सार्वजनिक {आवश्यकता (tx.origin == स्वामी); (बूल सफलता,) = receiver.call.value (राशि) (""); आवश्यकता (सफलता); }} अनुबंध AttackingContract {MyContract myContract; पता हमलावर; function AttackContract (पता myContractAddress) सार्वजनिक {myContract = MyContract (myContractAddress); हमलावर = msg.sender; } function () public {myContract.sendTo (हमलावर, msg.sender.balance); }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

आपको प्राधिकरण के लिए msg.sender का उपयोग करना चाहिए (यदि कोई अन्य अनुबंध आपके अनुबंध को कॉल करता है msg.sender अनुबंध का पता होगा और अनुबंध को कॉल करने वाले उपयोगकर्ता का पता नहीं होगा).

आप इसके बारे में यहां और अधिक पढ़ सकते हैं: सॉलिडिटी डॉक्स

चेतावनी: प्राधिकरण के साथ समस्या के अलावा, एक मौका है कि tx.origin को भविष्य में Ethereum प्रोटोकॉल से हटा दिया जाएगा, इसलिए tx.origin का उपयोग करने वाला कोड भविष्य की रिलीज़ के साथ संगत नहीं होगा विटालिक: ‘यह मत मानो कि tx.origin प्रयोग करने योग्य या सार्थक रहेगा।’

यह भी उल्लेखनीय है कि tx.origin का उपयोग करके आप अनुबंधों के बीच अंतर को सीमित कर रहे हैं क्योंकि tx.origin का उपयोग करने वाले अनुबंध को अनुबंध के रूप में किसी अन्य अनुबंध द्वारा उपयोग नहीं किया जा सकता tx.origin हो सकता है.

ले देख एसडब्ल्यूसी -११५

टाइमस्टैम्प निर्भरता

एक अनुबंध में किसी महत्वपूर्ण कार्य को निष्पादित करने के लिए टाइमस्टैम्प का उपयोग करते समय तीन मुख्य विचार हैं, खासकर जब कार्रवाई में फंड ट्रांसफर शामिल होता है.

टाइमस्टैम्प हेरफेर

ज्ञात हो कि ब्लॉक के टाइमस्टैम्प को एक खनिक द्वारा हेरफेर किया जा सकता है। इस पर विचार करो अनुबंध:

uint256 निरंतर निजी नमक = block.timestamp; फंक्शन रैंडम (uint Max) निरंतर निजी रिटर्न (uint256 परिणाम) {// यादृच्छिकता के लिए सबसे अच्छा बीज प्राप्त करें uint256 x = नमक * 100 / मैक्स; uint256 y = नमक * ब्लॉक.नंबर / (नमक% 5); uint256 बीज = ब्लॉक.नंबर / 3 + (नमक% 300) + Last_Payout + y; uint256 h = uint256 (block.blockhash (seed)); वापसी uint256 ((h / x))% अधिकतम + 1; // यादृच्छिक संख्या 1 और अधिकतम के बीच} कोड भाषा: PHP (php)

जब अनुबंध टाइमस्टैम्प का उपयोग एक यादृच्छिक संख्या में बीज के लिए करता है, तो खनिक वास्तव में ब्लॉक के 15 सेकंड के भीतर एक टाइमस्टैम्प को मान्य किया जा सकता है, प्रभावी रूप से माइनर को लॉटरी में उनके अवसरों के लिए एक विकल्प को और अधिक अनुकूल बनाने की अनुमति देता है। टाइमस्टैम्प यादृच्छिक नहीं हैं और उस संदर्भ में उपयोग नहीं किया जाना चाहिए.

15 सेकंड का नियम

 पीला कागज (Ethereum के संदर्भ विनिर्देश) समय में कितना ब्लॉक बहाव कर सकते हैं, इस पर एक बाधा निर्दिष्ट नहीं करता है, लेकिन यह निर्दिष्ट करता है प्रत्येक टाइमस्टैम्प अपने माता-पिता के टाइमस्टैम्प से बड़ा होना चाहिए। लोकप्रिय एथेरियम प्रोटोकॉल कार्यान्वयन जेठ तथा समानता दोनों भविष्य में 15 सेकंड से अधिक टाइमस्टैम्प वाले ब्लॉक को अस्वीकार करते हैं। इसलिए, टाइमस्टैम्प के उपयोग का मूल्यांकन करने में अंगूठे का एक अच्छा नियम है: यदि आपके समय-निर्भर घटना का पैमाना 15 सेकंड तक भिन्न हो सकता है और अखंडता बनाए रख सकता है, तो ब्लॉकमैस्टैम्प का उपयोग करना सुरक्षित है.

एक टाइमस्टैम्प के रूप में ब्लॉक.नंबर का उपयोग करने से बचें

ब्लॉक.नंबर प्रॉपर्टी का उपयोग करके समय डेल्टा का अनुमान लगाना संभव है औसत ब्लॉक समय, हालाँकि यह भविष्य का प्रमाण नहीं है क्योंकि ब्लॉक समय बदल सकता है (जैसे कि कांटा पुनर्गठन और यह कठिनाई बम) का है। बिक्री के दिनों में, 15-सेकंड का नियम किसी को समय का अधिक विश्वसनीय अनुमान प्राप्त करने की अनुमति देता है.

ले देख SWC-116

एकाधिक विरासत सावधानी

सॉलिडिटी में मल्टीपल इनहेरिटेंस का उपयोग करते समय, यह समझना महत्वपूर्ण है कि कंपाइलर इनहेरिटेंस ग्राफ को कैसे बनाता है.

अनुबंध फाइनल {uint public a; फ़ंक्शन फ़ाइनल (uint f) सार्वजनिक {a = f; }} कॉन्ट्रैक्ट बी फाइनल है {इंट पब्लिक फीस; function B (uint f) फाइनल (f) पब्लिक {} फंक्शन setFee () पब्लिक {फी = 3; }} कॉन्ट्रैक्ट सी फाइनल है {इंट पब्लिक फीस; समारोह C (uint f) अंतिम (f) सार्वजनिक {} फ़ंक्शन सेटीफी () सार्वजनिक {शुल्क = 5; }} अनुबंध A B है, C {function A () public B (3) C (5) {setFee (); }} कोड भाषा: PHP (php)

जब कोई अनुबंध परिनियोजित किया जाता है, तो कंपाइलर दाईं से बाईं ओर वंशानुक्रम को लीन कर देगा (कीवर्ड के बाद माता-पिता को सबसे आधार से सूचीबद्ध किया जाता है-सबसे व्युत्पन्न)। यहाँ अनुबंध A का रैखिककरण है:

अंतिम <- ख <- सी <- ए

रैखिककरण का परिणाम 5 का शुल्क मूल्य प्राप्त करेगा, क्योंकि सी सबसे व्युत्पन्न अनुबंध है। यह स्पष्ट लग सकता है, लेकिन उन परिदृश्यों की कल्पना करें जहां सी महत्वपूर्ण कार्यों को छाया देने में सक्षम है, बूलियन क्लॉस को फिर से व्यवस्थित करता है, और डेवलपर को शोषक अनुबंध लिखने का कारण बनता है। स्थैतिक विश्लेषण वर्तमान में ओवरशैड कार्यों के साथ समस्या नहीं उठाता है, इसलिए इसे मैन्युअल रूप से निरीक्षण किया जाना चाहिए.

योगदान में मदद करने के लिए, सॉलिडिटी के गितूब में ए परियोजना सभी विरासत संबंधी मुद्दों के साथ.

ले देख SWC-125

प्रकार की सुरक्षा के लिए पते के बजाय इंटरफ़ेस प्रकार का उपयोग करें

जब कोई फ़ंक्शन एक कॉन्ट्रैक्ट एड्रेस को एक तर्क के रूप में लेता है, तो कच्चे पते के बजाय एक इंटरफ़ेस या कॉन्ट्रैक्ट टाइप पास करना बेहतर होता है। यदि फ़ंक्शन स्रोत कोड के भीतर कहीं और कहा जाता है, तो संकलक यह अतिरिक्त प्रकार की सुरक्षा गारंटी प्रदान करेगा.

यहाँ हम दो विकल्प देखते हैं:

अनुबंध सत्यापनकर्ता {फ़ंक्शन को सत्यापित करें (यूइंट) बाहरी रिटर्न (बूल); } अनुबंध TypeSafeAuction {// अच्छा फ़ंक्शन validateBet (Validator _validator, uint _value) आंतरिक रिटर्न (बूल) {बूल वैध = _validator.validate (_value); वैध वापसी; }} कॉन्ट्रैक्ट TypeUnsafeAuction {// खराब फंक्शन validateBet (पता _addr, uint _value) आंतरिक रिटर्न (बूल) {Validator validator = Validator (_addr); बूल वैध = validator.validate (_value); वैध वापसी; }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

ऊपर TypeSafeAuction अनुबंध का उपयोग करने के लाभ तब निम्न उदाहरण से देखे जा सकते हैं। यदि सत्यापनकर्ता () को एक पते के तर्क के साथ कहा जाता है, या मान्यकर्ता के अलावा कोई अनुबंध प्रकार है, तो संकलक इस त्रुटि को फेंक देगा:

अनुबंध NonValidator {} अनुबंध नीलामी TypeSafeAuction है {NonValidator nonValidator; फंक्शन बेट (uint _value) {बूल वैध = वैद्यबेट (नॉनवेलेगेटर, _वल्यू); // TypeError: फ़ंक्शन कॉल में तर्क के लिए अमान्य प्रकार। // अनुबंध NonValidator से अमान्य निहित रूपांतरण // अनुबंधित Validator का अनुरोध किया। }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

बाहरी स्वामित्व वाले खातों की जांच करने के लिए एक्सकोडेसाइज़ का उपयोग करने से बचें

निम्न संशोधक (या एक समान चेक) का उपयोग अक्सर यह सत्यापित करने के लिए किया जाता है कि क्या कॉल बाहरी स्वामित्व वाले खाते (EOA) या अनुबंध खाते से किया गया था:

// खराब संशोधक असेंबली {size: = extcodesize (_a)} की आवश्यकता (आकार == 0); _; } कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

यह विचार सीधे आगे है: यदि किसी पते में कोड है, तो यह एक ईओए नहीं, बल्कि एक अनुबंध खाता है। हालाँकि, एक अनुबंध में निर्माण के दौरान स्रोत कोड उपलब्ध नहीं है. इसका मतलब यह है कि जब कंस्ट्रक्टर चल रहा है, तो यह अन्य अनुबंधों के लिए कॉल कर सकता है, लेकिन इसके पते के लिए एक्सकोडॉडाइज शून्य है। नीचे एक न्यूनतम उदाहरण दिया गया है जो दिखाता है कि इस जाँच को कैसे दरकिनार किया जा सकता है:

अनुबंध OnlyForEOA {uint सार्वजनिक ध्वज; // खराब संशोधक असेंबली {len: = extcodesize (_a)} की आवश्यकता (len == 0); _; } function setFlag (uint i) public isNotContract (msg.sender) {flag = i; }} अनुबंध FakeEOA {कंस्ट्रक्टर (पता _a) सार्वजनिक {OnlyForEOA c = OnlyForEOA (_a); c.setFlag (1); }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

क्योंकि कॉन्ट्रैक्ट पतों की गणना पहले से की जा सकती है, यह जाँच भी विफल हो सकती है यदि यह एक ऐसे पते की जाँच करता है जो ब्लॉक एन पर खाली है, लेकिन जिसके पास एन से अधिक कुछ ब्लॉक में तैनात कॉन्ट्रैक्ट है.

चेतावनी: यह मुद्दा अति सूक्ष्म है। यदि आपका लक्ष्य आपके अनुबंध को कॉल करने में सक्षम होने से अन्य अनुबंधों को रोकने के लिए है, तो एक्सकोकोडाइज़ चेक संभवतः पर्याप्त है। एक वैकल्पिक तरीका यह है कि (tx.origin == msg.sender) के मूल्य की जांच करें, हालांकि यह भी कमियां हैं.

ऐसी अन्य परिस्थितियां हो सकती हैं जिनमें एक्सकोडॉडाइज चेक आपके उद्देश्य की पूर्ति करता है। यहां उन सभी का वर्णन करना दायरे से बाहर है। ईवीएम के अंतर्निहित व्यवहार को समझें और अपने फैसले का उपयोग करें.

क्या आपका ब्लॉकचैन कोड सुरक्षित है?

हमारे सुरक्षा विशेषज्ञों के साथ 1-दिवसीय स्पॉट चेक बुक करें। आपकी आज की पुस्तक का परिश्रम आज नवीनतम न्यूज़रेम समाचार, उद्यम समाधान, डेवलपर संसाधन, और अधिक के लिए हमारे न्यूज़लेटर के लिए सदस्यता लें।कैसे एक सफल ब्लॉकचेन उत्पाद बनाने के लिएवेबिनार

कैसे एक सफल ब्लॉकचेन उत्पाद बनाने के लिए

कैसे सेट अप करें और एक Ethereum नोड चलाएंवेबिनार

कैसे सेट अप करें और एक Ethereum नोड चलाएं

अपनी खुद की Ethereum API कैसे बनायेवेबिनार

अपनी खुद की Ethereum API कैसे बनाये

सोशल टोकन कैसे बनाएंवेबिनार

सोशल टोकन कैसे बनाएं

स्मार्ट अनुबंध विकास में सुरक्षा उपकरणों का उपयोग करनावेबिनार

स्मार्ट अनुबंध विकास में सुरक्षा उपकरणों का उपयोग करना

फ्यूचर ऑफ़ फ़ाइनेंस डिजिटल एसेट्स एंड डेफीवेबिनार

भविष्य का वित्त: डिजिटल एसेट्स और डीआईएफआई

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me