स्मार्ट कॉन्ट्रैक्ट के लिए यूनिट टेस्ट कैसे लिखें, इसके लिए एक सरल गाइड

http://upstate.agency/smart-contracts

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

पिछले दो महीनों में हम एक वित्तीय सेवा कंपनी के साथ मिलकर काम करने के लिए बेहद भाग्यशाली रहे हैं जो एक नियामक अनुपालन तरीके से प्रतिभूतियों के टोकन के लिए एक अभिनव मंच विकसित कर रहा है। उनका जल्द ही जारी किया जाने वाला मंच ब्लॉकचेन को अरबों डॉलर की प्रतिभूतियों को बदलने की क्षमता का परिचय देगा।

उनके लॉन्च के समर्थन में, हमने उनकी इंजीनियरिंग टीम के साथ मिलकर काम किया और व्यापक परीक्षण कवरेज को लागू किया और हमारी बग खोज प्रक्रिया के खिलाफ क्रियान्वित किया। अनुभव से हम कुछ महत्वपूर्ण विचारों के साथ-साथ कुछ युक्तियों और चालों के साथ चले गए जब आप अपने स्मार्ट कॉन्ट्रैक्ट के लिए यूनिट टेस्ट विकसित करते समय उपयोग कर सकते हैं।

व्यावसायिक तर्क की स्वस्थ समझ प्राप्त करें

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

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

अपने यूनिट परीक्षणों का नक्शा तैयार करें

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

ऐसा करने के लिए हम अपनी यूनिट परीक्षणों को एक साथ समूहित करते हैं ताकि वे अनुबंधों में संबंधित कार्यों के लिए मैप किए जा सकें। टोकन अनुबंध में buyTokens (_amount) फ़ंक्शन से जुड़े एकल उपयोग के मामले के लिए एक उदाहरण कल्पना है:

// जब अनुबंध सक्रिय हो
   // जब अनुबंध को रोका नहीं गया है
      // जब पेशकश की अवधि शुरू हो गई है
         // जब पेशकश की अवधि समाप्त नहीं हुई है
            // यह सच लौटना चाहिए

इसके विपरीत, यहाँ एक और युक्ति buyTokens (_amount) फ़ंक्शन से जुड़ा है जब पेशकश अवधि समाप्त हो गई है:

// जब अनुबंध सक्रिय हो
   // जब अनुबंध को रोका नहीं गया है
      // जब पेशकश की अवधि शुरू हो गई है
         // जब पेशकश की अवधि समाप्त हो गई है
             // इसे वापस करना चाहिए

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

पहले संशोधक को संबोधित करें, फिर अपनी आवश्यकता के माध्यम से काम करें और यदि क्रमिक रूप से बयान करें

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

उदाहरण के लिए, निम्नलिखित की तरह एक समारोह के लिए, हम पहले atStage (Stages.AuctionStarted) और मान्य () संशोधक से जुड़े उपयोग के मामलों को संबोधित करना चाहते हैं और अगर और उसके बाद आने वाले बयानों का पालन करना चाहते हैं:

/// @dev currentAskingPrice पर बोली प्रदान करने वाले पहले व्यक्ति को लाभार्थी के एनएफटी से सम्मानित किया जाता है
/// @dev यदि कोई बोलीदाता NFT पर हावी हो जाता है, तो वे नीलामी जीत लेंगे और उनका ओवरएज फ़ंक्शन वापस कर दिया जाएगा
processBid ()
जनता
देय
atStage (Stages.AuctionStarted) // यहाँ पहले शुरू करें
मान्यबिड () // इन उपयोग के मामलों को संबोधित करें दूसरा
रिटर्न (uint) // फिर `if`,` और` और `पता` कथनों का पालन करें
{
  बोली = msg.value;
  बोली लगाने वाला = msg.sender;
  
  getCurrentAskingPrice ();
  अगर (बोली> currentAskingPrice)
  {
    overage = bid.sub (currentAskingPrice);
    bidder.transfer (उपरिभार);
    बिड = currentAskingPrice;
    स्टेज = स्टेजेज।
    payBeneficiary ();
    sendToBidder ();
  }
  और यदि (बोली == currentAskingPrice)
  {
    स्टेज = स्टेजेज।
    payBeneficiary ();
    sendToBidder ();
  }
  अन्य
  {
    रिवर्ट ("बोली करंट से कम है। क्राइसिस");
  }
}

परीक्षण के लिए जब आपके अनुबंधों को वापस करना चाहिए, तो हमने OpenZeppelin के एसरवर्ट हेल्पर को बेहद मददगार पाया। आप इसे इस तरह से उपयोग कर सकते हैं:

asitRevert (tokenInstance.buy ({से: निवेशक, मूल्य: 500})) का इंतजार करें;

ओवरलोडिंग का कार्य और निम्न-स्तरीय कॉल की आवश्यकता

जैसा कि आप अपनी इकाई परीक्षणों को विकसित करना जारी रखते हैं, इसकी संभावना है कि आप डेवलपर टूल से जुड़े कमियों का सामना कर रहे हैं जिसका आप उपयोग कर रहे हैं। इसका कारण यह है कि स्मार्ट कॉन्ट्रैक्ट डेवलपमेंट स्पेस अभी भी बहुत नया है और परिणामस्वरूप डेवलपर के कई उपकरण अभी भी अपरिपक्व हैं।

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

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

data = encodeCall ("buyTokens", [’uint '], [100]); // 100 `_amount` तर्क का मूल्य है
अनुबंधइन्स्टांस.संक्रमणशीलता ({डेटा, से: निवेशक, मूल्य: 500})

ट्रूफ़ल समुदाय इस मुद्दे से अवगत है और इसे आगामी रिलीज़ में संबोधित किया जाएगा। हालाँकि, जब आप स्मार्ट कॉन्ट्रैक्ट्स और उनके संबंधित यूनिट टेस्ट विकसित कर रहे हैं, तो इस तरह के quirky परिदृश्य असामान्य नहीं हैं। समय-समय पर आपके द्वारा हल किए गए समाधानों के साथ आपको चालाक (अभी तक बेहद सावधान) रहना होगा।

आंतरिक कार्यों का परीक्षण कैसे करें

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

  1. आप एक अन्य अनुबंध बना सकते हैं जो आंतरिक फ़ंक्शन का परीक्षण करने के लिए आपके द्वारा अनुबंधित अनुबंध को विरासत में मिला है
  2. या आप आंतरिक फ़ंक्शन को कॉल करने वाले अनुबंध में अन्य कार्यों के भीतर से एक आंतरिक फ़ंक्शन के तर्क का परीक्षण कर सकते हैं

किसी भी दृष्टिकोण से काम पूरा हो जाएगा, हालांकि कुछ तर्क दे सकते हैं कि अनुबंध में अन्य कार्यों के भीतर से एक आंतरिक फ़ंक्शन के तर्क का परीक्षण करना अधिक सहज है।

आसान Ganache युक्तियाँ और चालें

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

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

ganache-cli -a 40 // जहाँ `a` ध्वज 40 परीक्षण खातों के साथ Ganache शुरू करने को दर्शाता है

इसके अतिरिक्त, हम अपने परीक्षणों के लिए आवश्यक ईटीएच के साथ शुरू करने के लिए उन खातों की शेष राशि निर्धारित कर सकते हैं। डिफ़ॉल्ट रूप से Truffle 100 ETH पर शेष सेट करता है। हम अपनी विशिष्ट आवश्यकताओं के आधार पर उस मूल्य को आसानी से बढ़ा या घटा सकते हैं:

ganache -e 10000` // जहां `ई` ध्वज दर्शाता है कि प्रत्येक खाते को डिफ़ॉल्ट रूप से कितना ईटीएच शुरू करना चाहिए

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

यह सब एक साथ बांधना

स्मार्ट कॉन्ट्रैक्ट स्पेस में यूनिट परीक्षण मूल रूप से वेब और मोबाइल एप्लिकेशन दुनिया में यूनिट टेस्टिंग के समान है। सबसे बड़ा अंतर यह है कि आज स्मार्ट कॉन्ट्रैक्ट अपरिवर्तनीय हैं और आमतौर पर समय के साथ उन पर पुनरावृति के सरल तरीके नहीं पेश करते हैं [1]। इसलिए, अच्छी इकाई परीक्षणों को विकसित करना महत्वपूर्ण है, स्मार्ट अनुबंध अपरिवर्तनीयता और यह तथ्य कि वे अक्सर बड़ी रकम के प्रबंधन के लिए जिम्मेदार होते हैं। अपने स्मार्ट कॉन्ट्रैक्ट्स को आश्वस्त करने का एकमात्र तरीका सुरक्षित है और विश्वसनीय है कि उनका सावधानीपूर्वक परीक्षण किया जाए।

बड़े पैमाने पर स्मार्ट कॉन्ट्रैक्ट को अपनाने के लिए यह महत्वपूर्ण है कि हमारा समुदाय अंतरिक्ष को आगे बढ़ाने के लिए एक साथ काम करे और डेवलपर्स के लिए सार्वजनिक ब्लॉकचेन के शीर्ष पर जटिल एप्लिकेशन लिखना आसान बना सके।

हमें उम्मीद है कि हमारे अनुभवों से सीखे गए ये परीक्षण यूनिट परीक्षण के लिए सहायक हैं और सुरक्षित और विश्वसनीय स्मार्ट अनुबंध बनाने के आपके प्रयासों का समर्थन करते हैं। यदि आपके पास अतिरिक्त प्रश्न या विचार हैं, तो आप हमारी टीम - [email protected] के साथ आगे चर्चा करना चाहते हैं, तो इस तक पहुंचने में संकोच न करें।

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

[१] ज़ेपेलिन टीम ने हाल ही में ज़ेपेलिनओएस को लॉन्च किया है जो अपग्रेड करने योग्य मानक पुस्तकालयों का ऑन-चेन सेट प्रदान करता है और प्रॉक्सी पैटर्न का उपयोग करके अपने स्मार्ट कॉन्ट्रैक्ट को अपग्रेड करना संभव बनाता है।

, स्मार्ट कॉन्ट्रैक्ट विकास के साथ हमारे काम के साथ अद्यतित रहने के लिए, हमें माध्यम और ट्विटर पर फॉलो करें।

यह सभी देखें

मैं एसईओ प्रक्रिया का उपयोग करके आपकी वेबसाइट को कैसे अनुकूलित करूं? बहुत सारी प्रोग्रामिंग लैंग्वेज हैं। हम कितने में से एक का चयन करते हैं और इसे मास्टर करते हैं?कुछ डेवलपर्स इतनी तेजी से नई तकनीक क्यों सीख रहे हैं? मैं तेजी से कैसे सीख सकता था?मैं ऑनलाइन दिन में कम से कम $ 1 कैसे बना सकता हूं? आपको 4-5 प्रोग्रामिंग लैंग्वेज (मूल बातें नहीं, लेकिन वास्तव में अच्छी होने के नाते) सीखने के लिए कितना समय (न्यूनतम) चाहिए? मैं एक सॉफ्टवेयर के साथ मौजूदा वेबसाइट से HTML, सीएसएस और जेएस सामग्री कैसे निकाल सकता हूं? यदि आप जावास्क्रिप्ट, सीएसएस और jQuery को जानते हैं तो रिएक्ट सीखना कितना मुश्किल है? लोग प्रोग्रामिंग का इतना ज्ञान कैसे सीखते हैं?