स्मार्ट अनुबंधों की पुष्टि करना
अंतिम संपादन: @pettinarip(opens in a new tab), 23 नवंबर 2023
स्मार्ट अनुबंध को "भरोसेमंद" होने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि उपयोगकर्ताओं को अनुबंध के साथ बातचीत करने से पहले तीसरे पक्ष (जैसे, डेवलपर्स और कंपनियों) पर भरोसा नहीं करना चाहिए। विश्वसनीयता के लिए एक आवश्यकता के रूप में, उपयोगकर्ताओं और अन्य डेवलपर्स को स्मार्ट अनुबंध के स्रोत कोड को सत्यापित करने में सक्षम होना चाहिए। स्रोत कोड सत्यापन उपयोगकर्ताओं और डेवलपर्स को आश्वस्त करता है कि प्रकाशित अनुबंध कोड वही कोड है जो एथेरियम ब्लॉकचेन पर अनुबंध पते पर चल रहा है।
"स्रोत कोड सत्यापन" और "औपचारिक सत्यापन" के बीच अंतर करना महत्वपूर्ण है। स्रोत कोड सत्यापन, जिसे नीचे विस्तार से समझाया जाएगा, यह सत्यापित करने के लिए संदर्भित करता है कि एक उच्च-स्तरीय भाषा (जैसे Solidity) में स्मार्ट अनुबंध का दिया गया स्रोत कोड अनुबंध पते पर निष्पादित होने वाले उसी बाइटकोड को संकलित करता है। हालांकि, औपचारिक सत्यापन एक स्मार्ट अनुबंध की शुद्धता की पुष्टि करने का वर्णन करता है, जिसका अर्थ है कि अनुबंध अपेक्षित व्यवहार करता है। हालांकि संदर्भ-निर्भर, अनुबंध सत्यापन आमतौर पर स्रोत कोड सत्यापन को संदर्भित करता है।
स्रोत कोड सत्यापन क्या है?
एथेरियम वर्चुअल मशीन (EVM) में किसी स्मार्ट अनुबंध को लागू करने से पहले, डेवलपर्स कॉन्ट्रैक्ट के सोर्स कोड-निर्देश, यानी Solidity में लिखे या किसी और हाई-लेवल प्रोग्रामिंग लैंग्वेज में लिखे निर्देशों को बाइटकोड में कंपाइल करते हैं। चूंकि EVM उच्च-स्तरीय निर्देशों को संकलित नहीं कर सकती, इसलिए EVM में अनुबंध संबंधी तर्क निष्पादित करने के लिए स्रोत कोड को बाइटकोड (यानी निम्न-स्तरीय, मशीन निर्देश) में शामिल करना आवश्यक है।
स्रोत कोड सत्यापन एक स्मार्ट अनुबंध के स्रोत कोड और किसी भी अंतर का पता लगाने के लिए अनुबंध निर्माण के दौरान उपयोग किए जाने वाले संकलित बाइटकोड की तुलना कर रहा है। स्मार्ट अनुबंधों की पुष्टि करना मायने रखता है, क्योंकि विज्ञापित अनुबंध कोड ब्लॉकचेन पर चलने वाले से अलग हो सकता है।
स्मार्ट अनुबंध सत्यापन यह जांचने में सक्षम बनाता है कि मशीन कोड को पढ़े बिना, उच्च-स्तरीय भाषा के माध्यम से एक अनुबंध क्या करता है। फ़ंक्शंस, मान और आमतौर पर चर नाम और टिप्पणियाँ मूल स्रोत कोड के साथ समान रहती हैं जिसे इकट्ठा और डिप्लॉय किया जाता है। इससे कोड पढ़ना बहुत आसान हो जाता है। स्रोत सत्यापन कोड प्रलेखन के लिए भी प्रावधान करता है, ताकि अंतिम उपयोगकर्ताओं को पता चले कि स्मार्ट अनुबंध क्या करने के लिए डिज़ाइन किया गया है।
पूर्ण सत्यापन क्या है?
स्रोत कोड के कुछ भाग हैं जो संकलित बाइटकोड को प्रभावित नहीं करते हैं जैसे टिप्पणियां या चर नाम। इसका मतलब है कि अलग-अलग चर नामों और अलग-अलग टिप्पणियों वाले दो स्रोत कोड दोनों एक ही अनुबंध को सत्यापित करने में सक्षम होंगे। इसके साथ, एक दुर्भावनापूर्ण गतिविधि के ज़रिए धोखा देने वाली टिप्पणियां जोड़ी जा सकती हैं या स्रोत कोड के अंदर भ्रामक चर नाम दे सकता है और अनुबंध को मूल स्रोत कोड से अलग स्रोत कोड के साथ सत्यापित कर सकता है।
स्रोत कोड की सटीकता के लिए क्रिप्टोग्राफिक गारंटी के रूप में और संकलन जानकारी के फिंगरप्रिंट के रूप में सेवा करने के लिए बाइटकोड में अतिरिक्त डेटा जोड़कर इससे बचना संभव है। आवश्यक जानकारी Solidity के अनुबंध मेटाडेटा(opens in a new tab) में पाई जाती है, और इस फ़ाइल का हैश अनुबंध के बाइटकोड में जोड़ा जाता है। आप इसे मेटाडेटा प्लेग्राउंड(opens in a new tab) में कार्रवाई में देख सकते हैं
मेटाडेटा फ़ाइल में स्रोत फ़ाइलों और उनके हैश सहित अनुबंध के संकलन के बारे में जानकारी होती है। मतलब, अगर कोई भी संकलन सेटिंग्स या स्रोत फ़ाइलों में से एक बाइट भी बदलती है, तो मेटाडेटा फ़ाइल बदल जाती है। इस वजह से मेटाडेटा फ़ाइल का हैश, जो बाइटकोड में जोड़ा जाता है, वह भी बदल जाता है। इसका मतलब है कि अगर किसी अनुबंध का बाइटकोड + शामिल मेटाडेटा हैश दिए गए स्रोत कोड और संकलन सेटिंग्स के साथ मेल खाता है, तो हम यह सुनिश्चित कर सकते हैं कि यह मूल संकलन में उपयोग किया जाने वाला बिल्कुल वही स्रोत कोड है, यहां तक कि एक बाइट भी अलग नहीं है।
मेटाडेटा हैश का लाभ उठाने वाले इस प्रकार के सत्यापन को "पूर्ण सत्यापन(opens in a new tab)" ("पूर्ण सत्यापन" भी) कहा जाता है। अगर मेटाडेटा हैश मेल नहीं खाते हैं या सत्यापन में नहीं माने जाते हैं, तो यह एक "आंशिक मिलान" होगा, जो वर्तमान में अनुबंधों को सत्यापित करने का अधिक सामान्य तरीका है। दुर्भावनापूर्ण कोड सम्मिलित करना संभव है(opens in a new tab) जो पूर्ण सत्यापन के बिना सत्यापित स्रोत कोड में परिलक्षित नहीं होगा। ज़्यादातर डेवलपर्स को पूर्ण सत्यापन के बारे में पता नहीं है और वे अपने संकलन की मेटाडेटा फ़ाइल नहीं रखते हैं, इसलिए आंशिक सत्यापन अब तक अनुबंधों को सत्यापित करने का असल तरीका रहा है।
स्रोत कोड सत्यापन क्यों महत्वपूर्ण है?
अविश्वासहीनता
अविश्वासहीनता यकीनन स्मार्ट अनुबंधों और विकेन्द्रीकृत एप्लिकेशनों (डैप्स) के लिए सबसे बड़ा आधार है। स्मार्ट अनुबंध "अपरिवर्तनीय" हैं और इन्हें बदला नहीं जा सकता है; एक अनुबंध केवल लागू करते समय कोड में निर्धारित व्यावसायिक तर्क को निष्पादित करेगा। इसका मतलब है कि डेवलपर्स और उद्यम एथेरियम पर लागू होने के बाद अनुबंध के कोड के साथ छेड़छाड़ नहीं कर सकते हैं।
एक स्मार्ट अनुबंध भरोसेमंद होने के लिए, अनुबंध कोड स्वतंत्र सत्यापन के लिए उपलब्ध होना चाहिए। जबकि प्रत्येक स्मार्ट अनुबंध के लिए संकलित बाइटकोड ब्लॉकचेन पर सार्वजनिक रूप से उपलब्ध है, निम्न-स्तरीय भाषा को समझना मुश्किल है - डेवलपर्स और उपयोगकर्ताओं दोनों के लिए।
प्रोजेक्ट्स अपने अनुबंधों के स्रोत कोड को प्रकाशित करके विश्वास मान्यताओं को कम करती हैं। लेकिन यह एक और समस्या की ओर जाता है: यह सत्यापित करना मुश्किल है कि प्रकाशित स्रोत कोड अनुबंध बाइटकोड से मेल खाता है। इस परिदृश्य में, अविश्वसनीयता का मान खो जाता है क्योंकि उपयोगकर्ताओं को किसी अनुबंध को ब्लॉकचेन पर लागू करने से पहले इसके व्यावसायिक तर्क (यानी, बाइटकोड बदलकर) को नहीं बदलने के लिए डेवलपर्स पर भरोसा करना पड़ता है।
स्रोत कोड सत्यापन टूल गारंटी प्रदान करते हैं कि एक स्मार्ट अनुबंध की स्रोत कोड फाइलें असेंबली कोड से मेल खाती हैं। परिणाम एक भरोसेमंद पारिस्थितिकी तंत्र है, जहां उपयोगकर्ता तीसरे पक्ष पर आँख बंद करके भरोसा नहीं करते हैं और इसके बजाय अनुबंध में धन जमा करने से पहले कोड सत्यापित करते हैं।
उपयोगकर्ता सुरक्षा
स्मार्ट अनुबंधों के साथ, आमतौर पर स्टेक पर बहुत सारा पैसा लगाया जाता है। यह उच्च सुरक्षा गारंटी और इसका उपयोग करने से पहले एक स्मार्ट अनुबंध के तर्क के सत्यापन की मांग करता है। समस्या यह है कि बेईमान डेवलपर्स स्मार्ट अनुबंध में दुर्भावनापूर्ण कोड डालकर उपयोगकर्ताओं को धोखा दे सकते हैं। सत्यापन के बिना, दुर्भावनापूर्ण स्मार्ट अनुबंधों में बैकडोर(opens in a new tab), संदेहास्पद एक्सेस कंट्रोल सिस्टम, भेद्य कमजोरियां और अन्य चीजें हो सकती हैं जो उपयोगकर्ता सुरक्षा को खतरे में डालती हैं और जिनकी जांच चूक जाएगी।
एक स्मार्ट अनुबंध के स्रोत कोड फ़ाइलों को प्रकाशित करना संभावित हमले वैक्टर के लिए अनुबंध का आकलन करने के लिए रुचि रखने वाले व्यक्तियों जैसे लेखा परीक्षकों के लिए आसान बनाता है। कई पार्टियों के स्वतंत्र रूप से एक स्मार्ट अनुबंध की पुष्टि करने के साथ, उपयोगकर्ताओं के पास इसकी सुरक्षा की मजबूत गारंटी है।
एथेरियम स्मार्ट अनुबंधों के स्रोत कोड को कैसे सत्यापित करें
एथेरियम पर एक स्मार्ट अनुबंध परिनियोजित करने के लिए एक विशेष पते पर डेटा पेलोड (संकलित बाइटकोड) के साथ लेनदेन भेजने की आवश्यकता है। डेटा पेलोड स्रोत कोड को संकलित करके उत्पन्न होता है, साथ ही लेनदेन में डेटा पेलोड में संलग्न अनुबंध उदाहरण के कन्स्ट्रक्टर तर्क(opens in a new tab) को संकलित करता है। संकलन नियतात्मक है, जिसका अर्थ है कि यह हमेशा एक ही आउटपुट (यानी, अनुबंध बाइटकोड) का उत्पादन करता है यदि एक ही स्रोत फ़ाइलें, और संकलन सेटिंग्स (जैसे कंपाइलर संस्करण, ऑप्टिमाइज़र) का उपयोग किया जाता है।
एक स्मार्ट अनुबंध की पुष्टि करने में मूल रूप से निम्नलिखित चरण शामिल हैं:
स्रोत फ़ाइलों और संकलन सेटिंग्स को एक कंपाइलर में इनपुट करें।
कंपाइलर अनुबंध के बाइटकोड को आउटपुट करता है
किसी दिए गए पते पर लागू अनुबंध का बाइटकोड प्राप्त करें
पुन: संकलित बाइटकोड के साथ लागू बाइटकोड की तुलना करें। यदि कोड मेल खाते हैं, तो अनुबंध दिए गए स्रोत कोड और संकलन सेटिंग्स के साथ सत्यापित हो जाता है।
इसके अतिरिक्त, यदि मेटाडेटा बाइटकोड मैच के अंत में हैश होता है, तो यह एक पूर्ण मिलान होगा।
ध्यान दें कि यह सत्यापन का एक सरलीकृत विवरण है और ऐसे कई अपवाद हैं जो इसके साथ काम नहीं करेंगे जैसे कि अपरिवर्तनीय चर(opens in a new tab)।
स्रोत कोड सत्यापन टूल
अनुबंधों को सत्यापित करने की पारंपरिक प्रक्रिया जटिल हो सकती है। यही कारण है कि हमारे पास एथेरियम पर लागू स्मार्ट अनुबंधों के लिए स्रोत कोड की पुष्टि करने के लिए टूल हैं। ये टूल स्रोत कोड सत्यापन के बड़े हिस्से को स्वचालित करते हैं और उपयोगकर्ताओं के लाभों के लिए सत्यापित अनुबंधों को भी क्यूरेट करते हैं।
इथरस्कैन
हालांकि ज्यादातर एथेरियम ब्लॉकचेन एक्सप्लोरर के रूप में जाना जाता है, Etherscan स्मार्ट अनुबंध डेवलपर्स और उपयोगकर्ताओं के लिए सोर्स कोड सत्यापन सेवा(opens in a new tab) भी प्रदान करता है।
Etherscan आपको मूल डेटा पेलोड (स्रोत कोड, लाइब्रेरी पता, कंपाइलर सेटिंग्स, अनुबंध पता, आदि) से अनुबंध बाइटकोड को फिर से संकलित करने की अनुमति देता है यदि पुन: संकलित बाइटकोड ऑन-चेन अनुबंध के बाइटकोड (और कन्स्ट्रक्टर पैरामीटर) से जुड़ा हुआ है, तो अनुबंध सत्यापित(opens in a new tab) है।
एक बार सत्यापित होने के बाद, आपके अनुबंध का स्रोत कोड एक "सत्यापित" लेबल प्राप्त करता है और दूसरों के ऑडिट के लिए Etherscan पर प्रकाशित होता है। यह सत्यापित अनुबंध(opens in a new tab) अनुभाग में भी जोड़ा जाता है - सत्यापित स्रोत कोड के साथ स्मार्ट अनुबंधों का भंडार।
अनुबंधों को सत्यापित करने के लिए Etherscan सबसे अधिक उपयोग किया जाने वाला टूल है। हालांकि, Etherscan के अनुबंध सत्यापन में एक खामी है: यह ऑन-चेन बाइटकोड के मेटाडेटा हैश की तुलना करने में विफल रहता है और बाइटकोड को पुन: संकलित करता है। इसलिए Etherscan में मैच आंशिक मैच हैं।
Etherscan पर अनुबंधों की पुष्टि करने पर अधिक(opens in a new tab)।
Sourcify
Sourcify(opens in a new tab) अनुबंधों को सत्यापित करने के लिए एक और टूल है जो ओपन-सोर्स और विकेन्द्रीकृत है। यह ब्लॉक एक्सप्लोरर नहीं है और केवल अलग EVM आधारित नेटवर्क(opens in a new tab) पर अनुबंधों का सत्यापन करता है। यह अन्य टूल्स के निर्माण के लिए एक सार्वजनिक बुनियादी ढांचे के रूप में कार्य करता है, और इसका उद्देश्य मेटाडेटा फ़ाइल में पाए जाने वाले ABI और NatSpec(opens in a new tab) टिप्पणियों का उपयोग करके अधिक मानव-अनुकूल अनुबंध इंटरैक्शन को सक्षम करना है।
Etherscan के विपरीत, Sourcify मेटाडेटा हैश के साथ पूर्ण मिलान का समर्थन करता है। सत्यापित अनुबंधों को HTTP पर इसके सार्वजनिक भंडार(opens in a new tab) और IPFS(opens in a new tab) में परोसा जाता है, जो एक विकेन्द्रीकृत, सामग्री-संबोधित(opens in a new tab) स्टोरेज है। यह IPFS पर अनुबंध की मेटाडेटा फ़ाइल लाने की अनुमति देता है क्योंकि संलग्न मेटाडेटा हैश एक IPFS हैश है।
इसके अतिरिक्त, कोई भी IPFS पर स्रोत कोड फ़ाइलों को पुनः प्राप्त कर सकता है, क्योंकि इन फ़ाइलों के IPFS हैश मेटाडेटा में भी पाए जाते हैं। एक अनुबंध को मेटाडेटा फ़ाइल और स्रोत फ़ाइलें उसके API या UI(opens in a new tab) पर प्रदान करके या प्लगइन्स का उपयोग करके सत्यापित किया जा सकता है। Sourcify मॉनिटरिंग टूल नए ब्लॉकों पर अनुबंध निर्माण को भी सुनता है और अनुबंधों को सत्यापित करने का प्रयास करता है यदि उनके मेटाडेटा और स्रोत फ़ाइलें IPFS पर प्रकाशित होती हैं।
Sourcify पर अनुबंधों की पुष्टि करने पर अधिक(opens in a new tab)।
Tenderly
Tenderly प्लेटफॉर्म(opens in a new tab) Web3 डेवलपर्स को स्मार्ट अनुबंध बनाने, परीक्षण करने, मॉनिटर करने और संचालित करने में सक्षम बनाता है। अवलोकन और बुनियादी ढांचे के निर्माण ब्लॉकों के साथ डिबगिंग टूल का संयोजन, Tenderly डेवलपर्स को स्मार्ट अनुबंध विकास में तेजी लाने में मदद करता है। Tenderly सुविधाओं को पूरी तरह से सक्षम करने के लिए, डेवलपर्स को कई तरीकों का उपयोग करके सोर्स कोड सत्यापन निष्पादित करने की आवश्यकता होती है(opens in a new tab)।
किसी अनुबंध को निजी या सार्वजनिक रूप से सत्यापित करना संभव है। यदि निजी रूप से सत्यापित किया जाता है, तो स्मार्ट अनुबंध केवल आपको (और आपके प्रोजेक्ट के अन्य सदस्यों) को दिखाई देता है। किसी अनुबंध को सार्वजनिक रूप से सत्यापित करने से यह Tenderly प्लेटफॉर्म का उपयोग करने वाले सभी लोगों के लिए दृश्यमान हो जाता है।
आप डैशबोर्ड(opens in a new tab), टेंडरली हार्डहाट प्लगइन(opens in a new tab), या CLI(opens in a new tab) का उपयोग करके अपने अनुबंधों को सत्यापित कर सकते हैं।
डैशबोर्ड के माध्यम से अनुबंधों की पुष्टि करते समय, आपको स्रोत फ़ाइल या Solidity कंपाइलर, पता/नेटवर्क और कंपाइलर सेटिंग्स द्वारा उत्पन्न मेटाडेटा फ़ाइल आयात करने की आवश्यकता होती है।
Tenderly Hardhat प्लगइन का उपयोग करने से कम प्रयास के साथ सत्यापन प्रक्रिया पर अधिक नियंत्रण की अनुमति मिलती है, जिससे आप स्वचालित (नो-कोड) और मैन्युअल (कोड-आधारित) सत्यापन के बीच चयन कर सकते हैं।