स्मार्ट अनुबंधों का परीक्षण
इथेरियम जैसे सार्वजनिक ब्लॉकचेन अपरिवर्तनीय होते हैं, जिससे तैनाती के बाद स्मार्ट अनुबंध के कोड को बदलना मुश्किल हो जाता है। "वर्चुअल अपग्रेड" करने के लिए अनुबंध अपग्रेड पैटर्न मौजूद हैं, लेकिन इन्हें लागू करना मुश्किल है और इसके लिए सामाजिक सर्वसम्मति की आवश्यकता होती है। इसके अलावा, कोई अपग्रेड किसी त्रुटि को उसके खोजे जाने के बाद ही ठीक कर सकता है—यदि कोई हमलावर पहले भेद्यता का पता लगा लेता है, तो आपके स्मार्ट अनुबंध के शोषण का जोखिम होता है।
इन कारणों से, मेननेट पर तैनात करने से पहले स्मार्ट अनुबंधों का परीक्षण करना सुरक्षा के लिए एक न्यूनतम आवश्यकता है। अनुबंधों का परीक्षण करने और कोड की शुद्धता का मूल्यांकन करने के लिए कई तकनीकें हैं; आप क्या चुनते हैं यह आपकी आवश्यकताओं पर निर्भर करता है। फिर भी, विभिन्न उपकरणों और दृष्टिकोणों से बना एक परीक्षण सूट अनुबंध कोड में छोटी और बड़ी दोनों सुरक्षा खामियों को पकड़ने के लिए आदर्श है।
पूर्वापेक्षाएँ
यह पृष्ठ बताता है कि इथेरियम नेटवर्क पर तैनात करने से पहले स्मार्ट अनुबंधों का परीक्षण कैसे करें। यह मानकर चलता है कि आप स्मार्ट अनुबंधों से परिचित हैं।
स्मार्ट अनुबंध परीक्षण क्या है?
स्मार्ट अनुबंध परीक्षण यह सत्यापित करने की प्रक्रिया है कि किसी स्मार्ट अनुबंध का कोड अपेक्षानुसार काम करता है। परीक्षण यह जाँचने के लिए उपयोगी है कि क्या कोई विशेष स्मार्ट अनुबंध विश्वसनीयता, उपयोगिता और सुरक्षा की आवश्यकताओं को पूरा करता है।
हालाँकि दृष्टिकोण अलग-अलग होते हैं, अधिकांश परीक्षण विधियों में एक स्मार्ट अनुबंध को उस डेटा के एक छोटे नमूने के साथ निष्पादित करने की आवश्यकता होती है जिसे उसे संभालने की अपेक्षा की जाती है। यदि अनुबंध नमूना डेटा के लिए सही परिणाम देता है, तो यह माना जाता है कि यह ठीक से काम कर रहा है। अधिकांश परीक्षण उपकरण यह जाँचने के लिए परीक्षण मामले (test cases) (एक नए टैब में खुलता है) लिखने और निष्पादित करने के लिए संसाधन प्रदान करते हैं कि क्या अनुबंध का निष्पादन अपेक्षित परिणामों से मेल खाता है।
स्मार्ट अनुबंधों का परीक्षण करना क्यों महत्वपूर्ण है?
चूँकि स्मार्ट अनुबंध अक्सर उच्च-मूल्य वाली वित्तीय संपत्तियों का प्रबंधन करते हैं, इसलिए छोटी प्रोग्रामिंग त्रुटियाँ उपयोगकर्ताओं के लिए भारी नुकसान (एक नए टैब में खुलता है) का कारण बन सकती हैं और अक्सर बनती हैं। हालाँकि, कठोर परीक्षण आपको स्मार्ट अनुबंध के कोड में दोषों और समस्याओं का जल्दी पता लगाने और मेननेट पर लॉन्च करने से पहले उन्हें ठीक करने में मदद कर सकता है।
हालाँकि बग का पता चलने पर अनुबंध को अपग्रेड करना संभव है, अपग्रेड जटिल होते हैं और यदि अनुचित तरीके से संभाला जाए तो त्रुटियों का कारण बन सकते हैं (एक नए टैब में खुलता है)। किसी अनुबंध को अपग्रेड करना अपरिवर्तनीयता के सिद्धांत को और नकारता है और उपयोगकर्ताओं पर अतिरिक्त विश्वास मान्यताओं का बोझ डालता है। इसके विपरीत, आपके अनुबंध के परीक्षण के लिए एक व्यापक योजना स्मार्ट अनुबंध सुरक्षा जोखिमों को कम करती है और तैनात करने के बाद जटिल लॉजिक अपग्रेड करने की आवश्यकता को कम करती है।
स्मार्ट अनुबंधों के परीक्षण के तरीके
इथेरियम स्मार्ट अनुबंधों के परीक्षण के तरीके दो व्यापक श्रेणियों के अंतर्गत आते हैं: स्वचालित परीक्षण (automated testing) और मैनुअल परीक्षण (manual testing)। स्वचालित परीक्षण और मैनुअल परीक्षण अद्वितीय लाभ और समझौते (tradeoffs) प्रदान करते हैं, लेकिन आप अपने अनुबंधों का विश्लेषण करने के लिए एक मजबूत योजना बनाने के लिए दोनों को जोड़ सकते हैं।
स्वचालित परीक्षण
स्वचालित परीक्षण उन उपकरणों का उपयोग करता है जो निष्पादन में त्रुटियों के लिए स्वचालित रूप से स्मार्ट अनुबंध के कोड की जाँच करते हैं। स्वचालित परीक्षण का लाभ अनुबंध की कार्यक्षमता के मूल्यांकन का मार्गदर्शन करने के लिए स्क्रिप्ट (एक नए टैब में खुलता है) का उपयोग करने से मिलता है। स्क्रिप्टेड परीक्षणों को न्यूनतम मानवीय हस्तक्षेप के साथ बार-बार चलाने के लिए निर्धारित किया जा सकता है, जिससे स्वचालित परीक्षण परीक्षण के मैनुअल दृष्टिकोणों की तुलना में अधिक कुशल हो जाता है।
स्वचालित परीक्षण विशेष रूप से तब उपयोगी होता है जब परीक्षण दोहराए जाने वाले और समय लेने वाले होते हैं; मैन्युअल रूप से करना मुश्किल होता है; मानवीय त्रुटि के प्रति संवेदनशील होते हैं; या महत्वपूर्ण अनुबंध कार्यों का मूल्यांकन शामिल होता है। लेकिन स्वचालित परीक्षण उपकरणों में कमियाँ हो सकती हैं—वे कुछ बग्स को याद कर सकते हैं और कई गलत सकारात्मक (false positives) (एक नए टैब में खुलता है) उत्पन्न कर सकते हैं। इसलिए, स्मार्ट अनुबंधों के लिए मैनुअल परीक्षण के साथ स्वचालित परीक्षण को जोड़ना आदर्श है।
मैनुअल परीक्षण
मैनुअल परीक्षण मानव-सहायता प्राप्त है और इसमें स्मार्ट अनुबंध की शुद्धता का विश्लेषण करते समय आपके परीक्षण सूट में प्रत्येक परीक्षण मामले को एक के बाद एक निष्पादित करना शामिल है। यह स्वचालित परीक्षण के विपरीत है जहाँ आप एक साथ एक अनुबंध पर कई अलग-अलग परीक्षण चला सकते हैं और सभी विफल और उत्तीर्ण परीक्षणों को दिखाने वाली रिपोर्ट प्राप्त कर सकते हैं।
मैनुअल परीक्षण एक ही व्यक्ति द्वारा एक लिखित परीक्षण योजना का पालन करते हुए किया जा सकता है जो विभिन्न परीक्षण परिदृश्यों को कवर करता है। आप मैनुअल परीक्षण के हिस्से के रूप में एक निर्दिष्ट अवधि में कई व्यक्तियों या समूहों को स्मार्ट अनुबंध के साथ बातचीत भी करवा सकते हैं। परीक्षक अपेक्षित व्यवहार के विरुद्ध अनुबंध के वास्तविक व्यवहार की तुलना करेंगे, किसी भी अंतर को बग के रूप में चिह्नित करेंगे।
प्रभावी मैनुअल परीक्षण के लिए काफी संसाधनों (कौशल, समय, धन और प्रयास) की आवश्यकता होती है, और यह संभव है—मानवीय त्रुटि के कारण—परीक्षण निष्पादित करते समय कुछ त्रुटियों को याद करना। लेकिन मैनुअल परीक्षण भी फायदेमंद हो सकता है—उदाहरण के लिए, एक मानव परीक्षक (जैसे, एक ऑडिटर) उन एज केसेस (edge cases) का पता लगाने के लिए अंतर्ज्ञान का उपयोग कर सकता है जिन्हें एक स्वचालित परीक्षण उपकरण याद कर सकता है।
स्मार्ट अनुबंधों के लिए स्वचालित परीक्षण
यूनिट परीक्षण
यूनिट परीक्षण अनुबंध कार्यों का अलग-अलग मूल्यांकन करता है और जाँचता है कि प्रत्येक घटक सही ढंग से काम करता है। अच्छे यूनिट परीक्षण सरल, चलाने में तेज़ होने चाहिए और यदि परीक्षण विफल हो जाते हैं तो क्या गलत हुआ इसका स्पष्ट विचार प्रदान करना चाहिए।
यूनिट परीक्षण यह जाँचने के लिए उपयोगी होते हैं कि फ़ंक्शन अपेक्षित मान लौटाते हैं और फ़ंक्शन निष्पादन के बाद अनुबंध संग्रहण ठीक से अपडेट किया गया है। इसके अलावा, अनुबंध के कोडबेस में परिवर्तन करने के बाद यूनिट परीक्षण चलाने से यह सुनिश्चित होता है कि नया लॉजिक जोड़ने से त्रुटियाँ नहीं आती हैं। प्रभावी यूनिट परीक्षण चलाने के लिए नीचे कुछ दिशानिर्देश दिए गए हैं:
स्मार्ट अनुबंधों के यूनिट परीक्षण के लिए दिशानिर्देश
1. अपने अनुबंध के व्यावसायिक लॉजिक और वर्कफ़्लो को समझें
यूनिट परीक्षण लिखने से पहले, यह जानना मददगार होता है कि एक स्मार्ट अनुबंध क्या कार्यक्षमता प्रदान करता है और उपयोगकर्ता उन कार्यों तक कैसे पहुँचेंगे और उनका उपयोग कैसे करेंगे। यह विशेष रूप से हैप्पी पाथ परीक्षण (happy path tests) (एक नए टैब में खुलता है) चलाने के लिए उपयोगी है जो यह निर्धारित करते हैं कि क्या किसी अनुबंध में फ़ंक्शन वैध उपयोगकर्ता इनपुट के लिए सही आउटपुट देते हैं। हम इस अवधारणा को एक नीलामी अनुबंध (एक नए टैब में खुलता है) के इस (संक्षिप्त) उदाहरण का उपयोग करके समझाएंगे
constructor(
uint biddingTime,
address payable beneficiaryAddress
) {
beneficiary = beneficiaryAddress;
auctionEndTime = block.timestamp + biddingTime;
}
function bid() external payable {
if (block.timestamp > auctionEndTime)
revert AuctionAlreadyEnded();
if (msg.value <= highestBid)
revert BidNotHighEnough(highestBid);
if (highestBid != 0) {
pendingReturns[highestBidder] += highestBid;
}
highestBidder = msg.sender;
highestBid = msg.value;
emit HighestBidIncreased(msg.sender, msg.value);
}
function withdraw() external returns (bool) {
uint amount = pendingReturns[msg.sender];
if (amount > 0) {
pendingReturns[msg.sender] = 0;
if (!payable(msg.sender).send(amount)) {
pendingReturns[msg.sender] = amount;
return false;
}
}
return true;
}
function auctionEnd() external {
if (block.timestamp < auctionEndTime)
revert AuctionNotYetEnded();
if (ended)
revert AuctionEndAlreadyCalled();
ended = true;
emit AuctionEnded(highestBidder, highestBid);
beneficiary.transfer(highestBid);
}
}
यह एक साधारण नीलामी अनुबंध है जिसे बोली लगाने की अवधि के दौरान बोलियाँ प्राप्त करने के लिए डिज़ाइन किया गया है। यदि highestBid बढ़ता है, तो पिछले उच्चतम बोली लगाने वाले को अपना पैसा वापस मिल जाता है; एक बार बोली लगाने की अवधि समाप्त हो जाने पर, beneficiary अपना पैसा प्राप्त करने के लिए अनुबंध को कॉल करता है।
इस तरह के अनुबंध के लिए यूनिट परीक्षण उन विभिन्न कार्यों को कवर करेंगे जिन्हें उपयोगकर्ता अनुबंध के साथ बातचीत करते समय कॉल कर सकता है। एक उदाहरण एक यूनिट परीक्षण होगा जो यह जाँचता है कि क्या कोई उपयोगकर्ता नीलामी जारी रहने के दौरान बोली लगा सकता है (अर्थात, bid() पर कॉल सफल होते हैं) या वह जो यह जाँचता है कि क्या कोई उपयोगकर्ता वर्तमान highestBid से अधिक बोली लगा सकता है।
अनुबंध के परिचालन वर्कफ़्लो को समझने से यूनिट परीक्षण लिखने में भी मदद मिलती है जो यह जाँचते हैं कि क्या निष्पादन आवश्यकताओं को पूरा करता है। उदाहरण के लिए, नीलामी अनुबंध निर्दिष्ट करता है कि नीलामी समाप्त होने पर उपयोगकर्ता बोली नहीं लगा सकते हैं (अर्थात, जब auctionEndTime, block.timestamp से कम हो)। इस प्रकार, एक डेवलपर एक यूनिट परीक्षण चला सकता है जो यह जाँचता है कि नीलामी समाप्त होने पर (अर्थात, जब auctionEndTime > block.timestamp) bid() फ़ंक्शन पर कॉल सफल होते हैं या विफल होते हैं।
2. अनुबंध निष्पादन से संबंधित सभी मान्यताओं का मूल्यांकन करें
अनुबंध के निष्पादन के बारे में किसी भी धारणा का दस्तावेजीकरण करना और उन मान्यताओं की वैधता को सत्यापित करने के लिए यूनिट परीक्षण लिखना महत्वपूर्ण है। अप्रत्याशित निष्पादन के खिलाफ सुरक्षा प्रदान करने के अलावा, दावों (assertions) का परीक्षण आपको उन ऑपरेशनों के बारे में सोचने के लिए मजबूर करता है जो स्मार्ट अनुबंध के सुरक्षा मॉडल को तोड़ सकते हैं। एक उपयोगी टिप "हैप्पी यूजर टेस्ट" से आगे जाना और नकारात्मक परीक्षण लिखना है जो यह जाँचते हैं कि क्या कोई फ़ंक्शन गलत इनपुट के लिए विफल रहता है।
कई यूनिट परीक्षण फ्रेमवर्क आपको दावे (assertions) बनाने की अनुमति देते हैं—सरल कथन जो बताते हैं कि एक अनुबंध क्या कर सकता है और क्या नहीं कर सकता है—और यह देखने के लिए परीक्षण चलाते हैं कि क्या वे दावे निष्पादन के तहत बने रहते हैं। पहले वर्णित नीलामी अनुबंध पर काम करने वाला एक डेवलपर नकारात्मक परीक्षण चलाने से पहले इसके व्यवहार के बारे में निम्नलिखित दावे कर सकता है:
-
जब नीलामी समाप्त हो जाती है या शुरू नहीं होती है तो उपयोगकर्ता बोली नहीं लगा सकते हैं।
-
यदि कोई बोली स्वीकार्य सीमा से कम है तो नीलामी अनुबंध वापस (revert) हो जाता है।
-
जो उपयोगकर्ता बोली जीतने में विफल रहते हैं, उन्हें उनके फंड वापस कर दिए जाते हैं
नोट: मान्यताओं का परीक्षण करने का एक अन्य तरीका ऐसे परीक्षण लिखना है जो अनुबंध में फ़ंक्शन संशोधक (function modifiers) (एक नए टैब में खुलता है) को ट्रिगर करते हैं, विशेष रूप से require, assert, और if…else कथन।
3. कोड कवरेज को मापें
कोड कवरेज (एक नए टैब में खुलता है) एक परीक्षण मीट्रिक है जो परीक्षणों के दौरान निष्पादित आपके कोड में शाखाओं, पंक्तियों और कथनों की संख्या को ट्रैक करता है। अप्रशिक्षित कमजोरियों के जोखिम को कम करने के लिए परीक्षणों में अच्छा कोड कवरेज होना चाहिए। पर्याप्त कवरेज के बिना, आप गलत तरीके से मान सकते हैं कि आपका अनुबंध सुरक्षित है क्योंकि सभी परीक्षण पास हो जाते हैं, जबकि अप्रशिक्षित कोड पथों में कमजोरियां अभी भी मौजूद हैं। हालाँकि, उच्च कोड कवरेज रिकॉर्ड करना यह आश्वासन देता है कि स्मार्ट अनुबंध में सभी कथनों/कार्यों का शुद्धता के लिए पर्याप्त रूप से परीक्षण किया गया था।
4. अच्छी तरह से विकसित परीक्षण फ्रेमवर्क का उपयोग करें
आपके स्मार्ट अनुबंधों के लिए यूनिट परीक्षण चलाने में उपयोग किए जाने वाले उपकरणों की गुणवत्ता महत्वपूर्ण है। एक आदर्श परीक्षण फ्रेमवर्क वह है जिसे नियमित रूप से बनाए रखा जाता है; उपयोगी सुविधाएँ प्रदान करता है (जैसे, लॉगिंग और रिपोर्टिंग क्षमताएँ); और अन्य डेवलपर्स द्वारा बड़े पैमाने पर उपयोग और जांचा गया होना चाहिए।
Solidity स्मार्ट अनुबंधों के लिए यूनिट परीक्षण फ्रेमवर्क विभिन्न भाषाओं (ज्यादातर JavaScript, Python, और Rust) में आते हैं। विभिन्न परीक्षण फ्रेमवर्क के साथ यूनिट परीक्षण चलाना कैसे शुरू करें, इस बारे में जानकारी के लिए नीचे दिए गए कुछ गाइड देखें:
- Brownie के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Foundry के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Waffle के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Remix के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Ape के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Hardhat के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
- Wake के साथ यूनिट परीक्षण चलाना (एक नए टैब में खुलता है)
एकीकरण परीक्षण (Integration testing)
जबकि यूनिट परीक्षण अनुबंध कार्यों को अलग-थलग करके डीबग करता है, एकीकरण परीक्षण (integration tests) समग्र रूप से एक स्मार्ट अनुबंध के घटकों का मूल्यांकन करते हैं। एकीकरण परीक्षण क्रॉस-अनुबंध कॉल या एक ही स्मार्ट अनुबंध में विभिन्न कार्यों के बीच बातचीत से उत्पन्न होने वाले मुद्दों का पता लगा सकता है। उदाहरण के लिए, एकीकरण परीक्षण यह जाँचने में मदद कर सकते हैं कि क्या विरासत (inheritance) (एक नए टैब में खुलता है) और निर्भरता इंजेक्शन (dependency injection) जैसी चीजें ठीक से काम करती हैं।
यदि आपका अनुबंध एक मॉड्यूलर आर्किटेक्चर को अपनाता है या निष्पादन के दौरान अन्य ऑनचेन अनुबंधों के साथ इंटरफेस करता है, तो एकीकरण परीक्षण उपयोगी है। एकीकरण परीक्षण चलाने का एक तरीका एक विशिष्ट ऊंचाई पर है (Forge (एक नए टैब में खुलता है) या Hardhat (एक नए टैब में खुलता है) जैसे टूल का उपयोग करके) और आपके अनुबंध और तैनात अनुबंधों के बीच बातचीत का अनुकरण करना है।
फ़ोर्क किया गया ब्लॉकचेन मेननेट के समान व्यवहार करेगा और इसमें संबंधित स्थितियों और शेष राशि वाले खाते होंगे। लेकिन यह केवल एक सैंडबॉक्स्ड स्थानीय विकास वातावरण के रूप में कार्य करता है, जिसका अर्थ है कि आपको उदाहरण के लिए, लेन-देन के लिए वास्तविक ETH की आवश्यकता नहीं होगी, न ही आपके परिवर्तन वास्तविक इथेरियम प्रोटोकॉल को प्रभावित करेंगे।
संपत्ति-आधारित परीक्षण (Property-based testing)
संपत्ति-आधारित परीक्षण यह जाँचने की प्रक्रिया है कि एक स्मार्ट अनुबंध कुछ परिभाषित संपत्ति (property) को संतुष्ट करता है। संपत्तियां अनुबंध के व्यवहार के बारे में तथ्यों का दावा करती हैं जिनके विभिन्न परिदृश्यों में सत्य रहने की उम्मीद है—एक स्मार्ट अनुबंध संपत्ति का एक उदाहरण हो सकता है "अनुबंध में अंकगणितीय संचालन कभी भी ओवरफ़्लो या अंडरफ़्लो नहीं होते हैं।"
स्थैतिक विश्लेषण (Static analysis) और गतिशील विश्लेषण (dynamic analysis) संपत्ति-आधारित परीक्षण को निष्पादित करने के लिए दो सामान्य तकनीकें हैं, और दोनों यह सत्यापित कर सकते हैं कि किसी प्रोग्राम (इस मामले में एक स्मार्ट अनुबंध) का कोड कुछ पूर्वनिर्धारित संपत्ति को संतुष्ट करता है। कुछ संपत्ति-आधारित परीक्षण उपकरण अपेक्षित अनुबंध संपत्तियों के बारे में पूर्वनिर्धारित नियमों के साथ आते हैं और उन नियमों के विरुद्ध कोड की जाँच करते हैं, जबकि अन्य आपको स्मार्ट अनुबंध के लिए कस्टम संपत्तियां बनाने की अनुमति देते हैं।
स्थैतिक विश्लेषण
एक स्थैतिक विश्लेषक (static analyzer) एक स्मार्ट अनुबंध के स्रोत कोड को इनपुट के रूप में लेता है और यह घोषित करते हुए परिणाम आउटपुट करता है कि कोई अनुबंध किसी संपत्ति को संतुष्ट करता है या नहीं। गतिशील विश्लेषण के विपरीत, स्थैतिक विश्लेषण में शुद्धता के लिए इसका विश्लेषण करने के लिए अनुबंध को निष्पादित करना शामिल नहीं है। इसके बजाय स्थैतिक विश्लेषण उन सभी संभावित रास्तों के बारे में तर्क देता है जो एक स्मार्ट अनुबंध निष्पादन के दौरान ले सकता है (अर्थात, स्रोत कोड की संरचना की जांच करके यह निर्धारित करने के लिए कि रनटाइम पर अनुबंध के संचालन के लिए इसका क्या अर्थ होगा)।
अनुबंधों पर स्थैतिक विश्लेषण चलाने के लिए लिंटिंग (Linting) (एक नए टैब में खुलता है) और स्थैतिक परीक्षण (एक नए टैब में खुलता है) सामान्य तरीके हैं। दोनों के लिए अनुबंध के निष्पादन के निम्न-स्तरीय अभ्यावेदन का विश्लेषण करने की आवश्यकता होती है जैसे कि कंपाइलर द्वारा आउटपुट एब्सट्रैक्ट सिंटैक्स ट्री (abstract syntax trees) (एक नए टैब में खुलता है) और कंट्रोल फ्लो ग्राफ (control flow graphs) (एक नए टैब में खुलता है)।
ज्यादातर मामलों में, स्थैतिक विश्लेषण सुरक्षा मुद्दों का पता लगाने के लिए उपयोगी होता है जैसे कि असुरक्षित निर्माणों का उपयोग, सिंटैक्स त्रुटियां, या अनुबंध कोड में कोडिंग मानकों का उल्लंघन। हालाँकि, स्थैतिक विश्लेषकों को आम तौर पर गहरी कमजोरियों का पता लगाने में अस्वस्थ माना जाता है, और वे अत्यधिक गलत सकारात्मक (false positives) उत्पन्न कर सकते हैं।
गतिशील विश्लेषण
गतिशील विश्लेषण स्मार्ट अनुबंध कार्यों के लिए प्रतीकात्मक इनपुट (जैसे, प्रतीकात्मक निष्पादन (एक नए टैब में खुलता है) में) या ठोस इनपुट (जैसे, फ़ज़िंग (एक नए टैब में खुलता है) में) उत्पन्न करता है ताकि यह देखा जा सके कि कोई निष्पादन ट्रेस विशिष्ट संपत्तियों का उल्लंघन करता है या नहीं। संपत्ति-आधारित परीक्षण का यह रूप यूनिट परीक्षणों से इस मायने में भिन्न है कि परीक्षण मामले कई परिदृश्यों को कवर करते हैं और एक प्रोग्राम परीक्षण मामलों के निर्माण को संभालता है।
फ़ज़िंग (Fuzzing) (एक नए टैब में खुलता है) स्मार्ट अनुबंधों में मनमानी संपत्तियों को सत्यापित करने के लिए एक गतिशील विश्लेषण तकनीक का एक उदाहरण है। एक फ़ज़र एक परिभाषित इनपुट मान के यादृच्छिक या विकृत विविधताओं के साथ एक लक्ष्य अनुबंध में कार्यों का आह्वान करता है। यदि स्मार्ट अनुबंध एक त्रुटि स्थिति में प्रवेश करता है (उदाहरण के लिए, जहां एक दावा विफल हो जाता है), तो समस्या को चिह्नित किया जाता है और कमजोर पथ की ओर निष्पादन को चलाने वाले इनपुट एक रिपोर्ट में प्रस्तुत किए जाते हैं।
फ़ज़िंग एक स्मार्ट अनुबंध के इनपुट सत्यापन तंत्र का मूल्यांकन करने के लिए उपयोगी है क्योंकि अप्रत्याशित इनपुट के अनुचित संचालन के परिणामस्वरूप अनपेक्षित निष्पादन हो सकता है और खतरनाक प्रभाव पैदा हो सकते हैं। संपत्ति-आधारित परीक्षण का यह रूप कई कारणों से आदर्श हो सकता है:
-
कई परिदृश्यों को कवर करने के लिए परीक्षण मामले लिखना मुश्किल है। एक संपत्ति परीक्षण के लिए केवल यह आवश्यक है कि आप एक व्यवहार और व्यवहार का परीक्षण करने के लिए डेटा की एक श्रृंखला को परिभाषित करें—प्रोग्राम स्वचालित रूप से परिभाषित संपत्ति के आधार पर परीक्षण मामले उत्पन्न करता है।
-
आपका परीक्षण सूट प्रोग्राम के भीतर सभी संभावित रास्तों को पर्याप्त रूप से कवर नहीं कर सकता है। 100% कवरेज के साथ भी, एज केसेस (edge cases) से चूकना संभव है।
-
यूनिट परीक्षण साबित करते हैं कि एक अनुबंध नमूना डेटा के लिए सही ढंग से निष्पादित होता है, लेकिन क्या अनुबंध नमूने के बाहर के इनपुट के लिए सही ढंग से निष्पादित होता है, यह अज्ञात रहता है। संपत्ति परीक्षण दावा विफलताओं का कारण बनने वाले निष्पादन निशान खोजने के लिए दिए गए इनपुट मान के कई रूपों के साथ एक लक्ष्य अनुबंध निष्पादित करते हैं। इस प्रकार, एक संपत्ति परीक्षण अधिक गारंटी प्रदान करता है कि एक अनुबंध इनपुट डेटा के व्यापक वर्ग के लिए सही ढंग से निष्पादित होता है।
स्मार्ट अनुबंधों के लिए संपत्ति-आधारित परीक्षण चलाने के लिए दिशानिर्देश
संपत्ति-आधारित परीक्षण चलाना आमतौर पर एक संपत्ति (जैसे, पूर्णांक ओवरफ़्लो (एक नए टैब में खुलता है) की अनुपस्थिति) या संपत्तियों के संग्रह को परिभाषित करने से शुरू होता है जिसे आप एक स्मार्ट अनुबंध में सत्यापित करना चाहते हैं। संपत्ति परीक्षण लिखते समय आपको मानों की एक श्रृंखला को परिभाषित करने की भी आवश्यकता हो सकती है जिसके भीतर प्रोग्राम लेन-देन इनपुट के लिए डेटा उत्पन्न कर सकता है।
एक बार ठीक से कॉन्फ़िगर हो जाने पर, संपत्ति परीक्षण उपकरण यादृच्छिक रूप से उत्पन्न इनपुट के साथ आपके स्मार्ट अनुबंध कार्यों को निष्पादित करेगा। यदि कोई दावा उल्लंघन है, तो आपको ठोस इनपुट डेटा के साथ एक रिपोर्ट मिलनी चाहिए जो मूल्यांकन के तहत संपत्ति का उल्लंघन करती है। विभिन्न उपकरणों के साथ संपत्ति-आधारित परीक्षण चलाना शुरू करने के लिए नीचे दिए गए कुछ गाइड देखें:
- स्लिथर के साथ स्मार्ट अनुबंधों का स्थैतिक विश्लेषण (एक नए टैब में खुलता है)
- Wake के साथ स्मार्ट अनुबंधों का स्थैतिक विश्लेषण (एक नए टैब में खुलता है)
- Brownie के साथ संपत्ति-आधारित परीक्षण (एक नए टैब में खुलता है)
- Foundry के साथ अनुबंधों की फ़ज़िंग (एक नए टैब में खुलता है)
- एकिड्ना के साथ अनुबंधों की फ़ज़िंग (एक नए टैब में खुलता है)
- Wake के साथ अनुबंधों की फ़ज़िंग (एक नए टैब में खुलता है)
- मैन्टिकोर के साथ स्मार्ट अनुबंधों का प्रतीकात्मक निष्पादन (एक नए टैब में खुलता है)
- Mythril के साथ स्मार्ट अनुबंधों का प्रतीकात्मक निष्पादन (एक नए टैब में खुलता है)
स्मार्ट अनुबंधों के लिए मैनुअल परीक्षण
स्मार्ट अनुबंधों का मैनुअल परीक्षण अक्सर स्वचालित परीक्षण चलाने के बाद विकास चक्र में बाद में आता है। परीक्षण का यह रूप स्मार्ट अनुबंध का एक पूरी तरह से एकीकृत उत्पाद के रूप में मूल्यांकन करता है ताकि यह देखा जा सके कि यह तकनीकी आवश्यकताओं में निर्दिष्ट अनुसार प्रदर्शन करता है या नहीं।
स्थानीय ब्लॉकचेन पर अनुबंधों का परीक्षण
जबकि स्थानीय विकास वातावरण में किया गया स्वचालित परीक्षण उपयोगी डिबगिंग जानकारी प्रदान कर सकता है, आप जानना चाहेंगे कि आपका स्मार्ट अनुबंध उत्पादन वातावरण में कैसा व्यवहार करता है। हालाँकि, मुख्य इथेरियम चेन पर तैनात करने पर गैस शुल्क लगता है—यह उल्लेख करने की आवश्यकता नहीं है कि यदि आपके स्मार्ट अनुबंध में अभी भी बग हैं तो आप या आपके उपयोगकर्ता वास्तविक धन खो सकते हैं।
स्थानीय ब्लॉकचेन (जिसे विकास नेटवर्क के रूप में भी जाना जाता है) पर अपने अनुबंध का परीक्षण करना मेननेट पर परीक्षण करने का एक अनुशंसित विकल्प है। एक स्थानीय ब्लॉकचेन आपके कंप्यूटर पर स्थानीय रूप से चलने वाले इथेरियम ब्लॉकचेन की एक प्रति है जो इथेरियम की निष्पादन परत के व्यवहार का अनुकरण करती है। इस प्रकार, आप महत्वपूर्ण ओवरहेड के बिना अनुबंध के साथ बातचीत करने के लिए लेन-देन को प्रोग्राम कर सकते हैं।
स्थानीय ब्लॉकचेन पर अनुबंध चलाना मैनुअल एकीकरण परीक्षण के रूप में उपयोगी हो सकता है। स्मार्ट अनुबंध अत्यधिक संयोज्य होते हैं, जो आपको मौजूदा प्रोटोकॉल के साथ एकीकृत करने की अनुमति देते हैं—लेकिन आपको अभी भी यह सुनिश्चित करने की आवश्यकता होगी कि इस तरह के जटिल ऑनचेन इंटरैक्शन सही परिणाम उत्पन्न करते हैं।
विकास नेटवर्क के बारे में अधिक जानकारी।
टेस्टनेट पर अनुबंधों का परीक्षण
एक परीक्षण नेटवर्क या टेस्टनेट बिल्कुल इथेरियम मेननेट की तरह काम करता है, सिवाय इसके कि यह बिना किसी वास्तविक दुनिया के मूल्य वाले ईथर (ETH) का उपयोग करता है। अपने अनुबंध को टेस्टनेट पर तैनात करने का अर्थ है कि कोई भी धन को जोखिम में डाले बिना इसके साथ बातचीत कर सकता है (जैसे, dapp के फ्रंटएंड के माध्यम से)।
मैनुअल परीक्षण का यह रूप उपयोगकर्ता के दृष्टिकोण से आपके एप्लिकेशन के एंड-टू-एंड प्रवाह का मूल्यांकन करने के लिए उपयोगी है। यहाँ, बीटा परीक्षक परीक्षण रन भी कर सकते हैं और अनुबंध के व्यावसायिक लॉजिक और समग्र कार्यक्षमता के साथ किसी भी समस्या की रिपोर्ट कर सकते हैं।
स्थानीय ब्लॉकचेन पर परीक्षण के बाद टेस्टनेट पर तैनात करना आदर्श है क्योंकि पूर्व इथेरियम वर्चुअल मशीन के व्यवहार के करीब है। इसलिए, कई इथेरियम-नेटिव परियोजनाओं के लिए वास्तविक दुनिया की स्थितियों के तहत स्मार्ट अनुबंध संचालन का मूल्यांकन करने के लिए टेस्टनेट पर dapps तैनात करना आम बात है।
इथेरियम टेस्टनेट के बारे में अधिक जानकारी।
परीक्षण बनाम औपचारिक सत्यापन
जबकि परीक्षण यह पुष्टि करने में मदद करता है कि एक अनुबंध कुछ डेटा इनपुट के लिए अपेक्षित परिणाम देता है, यह परीक्षणों के दौरान उपयोग नहीं किए गए इनपुट के लिए निर्णायक रूप से इसे साबित नहीं कर सकता है। इसलिए, एक स्मार्ट अनुबंध का परीक्षण "कार्यात्मक शुद्धता" की गारंटी नहीं दे सकता है (अर्थात, यह नहीं दिखा सकता है कि एक प्रोग्राम इनपुट मानों के सभी सेटों के लिए आवश्यकतानुसार व्यवहार करता है)।
औपचारिक सत्यापन यह जाँच कर सॉफ़्टवेयर की शुद्धता का आकलन करने का एक दृष्टिकोण है कि क्या प्रोग्राम का औपचारिक मॉडल औपचारिक विनिर्देश से मेल खाता है। एक औपचारिक मॉडल एक प्रोग्राम का एक अमूर्त गणितीय प्रतिनिधित्व है, जबकि एक औपचारिक विनिर्देश एक प्रोग्राम के गुणों (अर्थात, प्रोग्राम के निष्पादन के बारे में तार्किक दावे) को परिभाषित करता है।
क्योंकि संपत्तियां गणितीय शब्दों में लिखी जाती हैं, इसलिए यह सत्यापित करना संभव हो जाता है कि सिस्टम का एक औपचारिक (गणितीय) मॉडल अनुमान के तार्किक नियमों का उपयोग करके एक विनिर्देश को संतुष्ट करता है। इस प्रकार, औपचारिक सत्यापन उपकरणों को सिस्टम की शुद्धता का 'गणितीय प्रमाण' उत्पन्न करने के लिए कहा जाता है।
परीक्षण के विपरीत, औपचारिक सत्यापन का उपयोग यह सत्यापित करने के लिए किया जा सकता है कि एक स्मार्ट अनुबंध निष्पादन नमूना डेटा के साथ इसे निष्पादित करने की आवश्यकता के बिना सभी निष्पादन (अर्थात, इसमें कोई बग नहीं है) के लिए एक औपचारिक विनिर्देश को संतुष्ट करता है। यह न केवल दर्जनों यूनिट परीक्षण चलाने में लगने वाले समय को कम करता है, बल्कि यह छिपी हुई कमजोरियों को पकड़ने में भी अधिक प्रभावी है। कहा जा रहा है, औपचारिक सत्यापन तकनीकें उनके कार्यान्वयन की कठिनाई और उपयोगिता के आधार पर एक स्पेक्ट्रम पर स्थित हैं।
स्मार्ट अनुबंधों के लिए औपचारिक सत्यापन के बारे में अधिक जानकारी।
परीक्षण बनाम ऑडिट और बग बाउंटी
जैसा कि उल्लेख किया गया है, कठोर परीक्षण शायद ही कभी किसी अनुबंध में बग की अनुपस्थिति की गारंटी दे सकता है; औपचारिक सत्यापन दृष्टिकोण शुद्धता का मजबूत आश्वासन प्रदान कर सकते हैं लेकिन वर्तमान में उपयोग करना मुश्किल है और इसमें काफी लागत आती है।
फिर भी, आप एक स्वतंत्र कोड समीक्षा प्राप्त करके अनुबंध की कमजोरियों को पकड़ने की संभावना को और बढ़ा सकते हैं। स्मार्ट अनुबंध ऑडिट (एक नए टैब में खुलता है) और बग बाउंटी (एक नए टैब में खुलता है) दूसरों से आपके अनुबंधों का विश्लेषण करवाने के दो तरीके हैं।
ऑडिट उन ऑडिटरों द्वारा किए जाते हैं जो स्मार्ट अनुबंधों में सुरक्षा खामियों और खराब विकास प्रथाओं के मामलों को खोजने में अनुभवी होते हैं। एक ऑडिट में आमतौर पर परीक्षण (और संभवतः औपचारिक सत्यापन) के साथ-साथ संपूर्ण कोडबेस की मैन्युअल समीक्षा शामिल होगी।
इसके विपरीत, एक बग बाउंटी प्रोग्राम में आमतौर पर किसी व्यक्ति (आमतौर पर व्हाइटहैट हैकर्स (एक नए टैब में खुलता है) के रूप में वर्णित) को वित्तीय पुरस्कार देना शामिल होता है जो एक स्मार्ट अनुबंध में भेद्यता का पता लगाता है और इसे डेवलपर्स को बताता है। बग बाउंटी ऑडिट के समान हैं क्योंकि इसमें दूसरों को स्मार्ट अनुबंधों में दोष खोजने में मदद करने के लिए कहना शामिल है।
मुख्य अंतर यह है कि बग बाउंटी प्रोग्राम व्यापक डेवलपर/हैकर समुदाय के लिए खुले हैं और अद्वितीय कौशल और अनुभव वाले एथिकल हैकर्स और स्वतंत्र सुरक्षा पेशेवरों के एक व्यापक वर्ग को आकर्षित करते हैं। यह स्मार्ट अनुबंध ऑडिट पर एक फायदा हो सकता है जो मुख्य रूप से उन टीमों पर निर्भर करते हैं जिनके पास सीमित या संकीर्ण विशेषज्ञता हो सकती है।
परीक्षण उपकरण और लाइब्रेरी
यूनिट परीक्षण उपकरण
-
solidity-coverage (एक नए टैब में खुलता है) - Solidity में लिखे गए स्मार्ट अनुबंधों के लिए कोड कवरेज टूल।
-
Waffle (एक नए टैब में खुलता है) - उन्नत स्मार्ट अनुबंध विकास और परीक्षण के लिए फ्रेमवर्क (ethers.js पर आधारित)।
-
Remix Tests (एक नए टैब में खुलता है) - Solidity स्मार्ट अनुबंधों के परीक्षण के लिए टूल। Remix IDE "Solidity Unit Testing" प्लगइन के नीचे काम करता है जिसका उपयोग अनुबंध के लिए परीक्षण मामले लिखने और चलाने के लिए किया जाता है।
-
OpenZeppelin Test Helpers (एक नए टैब में खुलता है) - इथेरियम स्मार्ट अनुबंध परीक्षण के लिए दावा (Assertion) लाइब्रेरी। सुनिश्चित करें कि आपके अनुबंध अपेक्षानुसार व्यवहार करते हैं!
-
Brownie यूनिट परीक्षण फ्रेमवर्क (एक नए टैब में खुलता है) - Brownie Pytest का उपयोग करता है, जो एक सुविधा संपन्न परीक्षण फ्रेमवर्क है जो आपको न्यूनतम कोड के साथ छोटे परीक्षण लिखने देता है, बड़ी परियोजनाओं के लिए अच्छी तरह से स्केल करता है, और अत्यधिक विस्तार योग्य है।
-
Foundry Tests (एक नए टैब में खुलता है) - Foundry Forge प्रदान करता है, जो एक तेज़ और लचीला इथेरियम परीक्षण फ्रेमवर्क है जो सरल यूनिट परीक्षण, गैस अनुकूलन जाँच और अनुबंध फ़ज़िंग निष्पादित करने में सक्षम है।
-
Hardhat Tests (एक नए टैब में खुलता है) - ethers.js, Mocha, और Chai पर आधारित स्मार्ट अनुबंधों के परीक्षण के लिए फ्रेमवर्क।
-
ApeWorx (एक नए टैब में खुलता है) - इथेरियम वर्चुअल मशीन को लक्षित करने वाले स्मार्ट अनुबंधों के लिए Python-आधारित विकास और परीक्षण फ्रेमवर्क।
-
Wake (एक नए टैब में खुलता है) - मजबूत डिबगिंग क्षमताओं और क्रॉस-चेन परीक्षण समर्थन के साथ यूनिट परीक्षण और फ़ज़िंग के लिए Python-आधारित फ्रेमवर्क, सर्वोत्तम उपयोगकर्ता अनुभव और प्रदर्शन के लिए pytest और Anvil का उपयोग करता है।
संपत्ति-आधारित परीक्षण उपकरण
स्थैतिक विश्लेषण उपकरण
-
स्लिथर (एक नए टैब में खुलता है) - कमजोरियों को खोजने, कोड की समझ बढ़ाने और स्मार्ट अनुबंधों के लिए कस्टम विश्लेषण लिखने के लिए Python-आधारित Solidity स्थैतिक विश्लेषण फ्रेमवर्क।
-
Ethlint (एक नए टैब में खुलता है) - Solidity स्मार्ट अनुबंध प्रोग्रामिंग भाषा के लिए शैली और सुरक्षा सर्वोत्तम प्रथाओं को लागू करने के लिए लिंटर।
-
Cyfrin Aderyn (एक नए टैब में खुलता है) - विशेष रूप से Web3 स्मार्ट अनुबंध सुरक्षा और विकास के लिए डिज़ाइन किया गया Rust-आधारित स्थैतिक विश्लेषक।
-
Wake (एक नए टैब में खुलता है) - भेद्यता और कोड गुणवत्ता डिटेक्टरों के साथ Python-आधारित स्थैतिक विश्लेषण फ्रेमवर्क, कोड से उपयोगी जानकारी निकालने के लिए प्रिंटर और कस्टम सबमॉड्यूल लिखने के लिए समर्थन।
-
Slippy (एक नए टैब में खुलता है) - Solidity के लिए एक सरल और शक्तिशाली लिंटर।
गतिशील विश्लेषण उपकरण
-
एकिड्ना (एक नए टैब में खुलता है) - संपत्ति-आधारित परीक्षण के माध्यम से स्मार्ट अनुबंधों में कमजोरियों का पता लगाने के लिए तेज़ अनुबंध फ़ज़र।
-
Diligence Fuzzing (एक नए टैब में खुलता है) - स्मार्ट अनुबंध कोड में संपत्ति के उल्लंघन का पता लगाने के लिए उपयोगी स्वचालित फ़ज़िंग टूल।
-
मैन्टिकोर (एक नए टैब में खुलता है) - EVM बाइटकोड का विश्लेषण करने के लिए गतिशील प्रतीकात्मक निष्पादन फ्रेमवर्क।
-
Mythril (एक नए टैब में खुलता है) - टेंट विश्लेषण, कॉन्कोलिक विश्लेषण और नियंत्रण प्रवाह जाँच का उपयोग करके अनुबंध कमजोरियों का पता लगाने के लिए EVM बाइटकोड मूल्यांकन उपकरण।
-
Diligence Scribble (एक नए टैब में खुलता है) - Scribble एक विनिर्देश भाषा और रनटाइम सत्यापन उपकरण है जो आपको स्मार्ट अनुबंधों को उन संपत्तियों के साथ एनोटेट करने की अनुमति देता है जो आपको Diligence Fuzzing या MythX जैसे उपकरणों के साथ अनुबंधों का स्वचालित रूप से परीक्षण करने की अनुमति देते हैं।
संबंधित ट्यूटोरियल
- विभिन्न परीक्षण उत्पादों का अवलोकन और तुलना _
- स्मार्ट अनुबंधों का परीक्षण करने के लिए एकिड्ना का उपयोग कैसे करें
- स्मार्ट अनुबंध बग खोजने के लिए मैन्टिकोर का उपयोग कैसे करें
- स्मार्ट अनुबंध बग खोजने के लिए स्लिथर का उपयोग कैसे करें
- परीक्षण के लिए Solidity अनुबंधों को मॉक कैसे करें
- Foundry का उपयोग करके Solidity में यूनिट परीक्षण कैसे चलाएं (एक नए टैब में खुलता है)
आगे की पढ़ाई
- इथेरियम स्मार्ट अनुबंधों के परीक्षण के लिए एक गहन मार्गदर्शिका (एक नए टैब में खुलता है)
- इथेरियम स्मार्ट अनुबंधों का परीक्षण कैसे करें (एक नए टैब में खुलता है)
- डेवलपर्स के लिए MolochDAO की यूनिट परीक्षण मार्गदर्शिका (एक नए टैब में खुलता है)
- रॉकस्टार की तरह स्मार्ट अनुबंधों का परीक्षण कैसे करें (एक नए टैब में खुलता है)
ट्यूटोरियल: इथेरियम पर स्मार्ट अनुबंध परीक्षण
- स्थानीय, मल्टी-क्लाइंट टेस्टनेट पर dApp कैसे विकसित और परीक्षण करें – स्थानीय टेस्टनेट पर स्मार्ट अनुबंध तैनात करने और परीक्षण करने का वॉकथ्रू।
- परीक्षण के लिए Solidity स्मार्ट अनुबंधों को मॉक कैसे करें – मॉक डेटा का उपयोग करने और यूनिट परीक्षण लागू करने के तरीके पर मध्यवर्ती ट्यूटोरियल।
- स्मार्ट अनुबंधों का परीक्षण करने के लिए एकिड्ना का उपयोग कैसे करें – फ़ज़िंग और स्मार्ट अनुबंध परीक्षण के लिए उन्नत दृष्टिकोण।