सॉलिडिटी ट्यूटोरियल: बिगिनर्स के लिए सॉलिडिटी प्रोग्रामिंग का एक परिचय

सॉलिडिटी ट्यूटोरियल

एथेरिस ब्लॉकचेन पर घनत्व डीएपी (विकेंद्रीकृत अनुप्रयोग) विकसित करने के लिए एक वस्तु-उन्मुख, उच्च-स्तरीय भाषा है.

ब्लॉकचेन कंप्यूटर का एक सहकर्मी से सहकर्मी नेटवर्क है, जिसे नोड कहा जाता है, जो नेटवर्क में सभी डेटा और कोड को साझा करते हैं.

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

अब आपके पास ब्लॉकचैन पर सभी डेटा और कोड की एक प्रति है। अब केंद्रीय सर्वरों की कोई आवश्यकता नहीं है.

एथेरियम क्या है?

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

जबकि बिटकॉइन ब्लॉकचेन का उपयोग डिजिटल मुद्रा (बिटकॉइन) के स्वामित्व को ट्रैक करने के लिए किया जाता है, एथेरियम ब्लॉकचेन विकेंद्रीकृत अनुप्रयोगों के कोड को चलाने पर केंद्रित है.

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

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

मूल बातें से शुरू

संलयन का कोड अनुबंधों में संलग्न है.

Ethereum blockchain हमें ब्लॉकचेन पर Ethereum Virtual Machine (EVM) के साथ कोड निष्पादित करने की अनुमति देता है, जिसे स्मार्ट अनुबंध कहा जाता है.

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

स्मार्ट संपर्कों को एक प्रोग्रामिंग भाषा में लिखा जाता है जिसे सॉलिडिटी कहा जाता है, जो जावास्क्रिप्ट और सी के मिश्रण की तरह दिखता है.

रीमिक्स आईडीई

रीमिक्स ऑनलाइन टूल है जो आपको सॉलिडिटी स्मार्ट कॉन्ट्रैक्ट लिखने की अनुमति देता है, फिर उन्हें तैनात करें और चलाएं.

बस जाना है https://remix.ethereum.org आपके ब्राउज़र से और हम कोडिंग शुरू कर सकते हैं.

जैसा कि आप देख सकते हैं, आप सॉलिडिटी और वाइपर के बीच चयन कर सकते हैं। दोनों स्मार्ट कॉन्ट्रैक्ट लिखने के लिए भाषाएं हैं, व्यर्थ अजगर की तरह है और सॉलिडिटी जावास्क्रिप्ट की तरह है.

दोनों ईवीएम बाईटेकोड, थोवा जैसे जावास्क्रिप्ट और टाइपस्क्रिप्ट को संकलित कर सकते हैं। हम सॉलिडिटी चुन रहे हैं.

बाईं ओर फ़ाइल एक्सप्लोरर है। डिफ़ॉल्ट रूप से, दो .sol फाइलें होती हैं, बस मूल सिंटैक्स को प्रदर्शित करने के लिए (ballot.sol स्मार्ट कॉन्ट्रैक्ट है, ballot_test.sol उस स्मार्ट कॉन्ट्रैक्ट के परीक्षण के लिए स्क्रिप्ट है).

आपको बस उस प्लस बटन पर क्लिक करने की आवश्यकता है और हम अपना पहला स्मार्ट अनुबंध कोड करना शुरू कर सकते हैं.

सभी सॉलिडिटी सोर्स कोड की शुरुआत “वर्जन प्राग्मा” से होनी चाहिए – इस कोड को सॉलिडिटी कंपाइलर के वर्जन का उपयोग करना चाहिए। यह भावी संकलक संस्करणों के साथ समस्याओं को रोकने के लिए संभावित रूप से उन परिवर्तनों को पेश करने से है जो आपके कोड को तोड़ देंगे.

यह इस तरह दिख रहा है:

प्रैग्म सॉलिडिटी ^ 0.4.25;

(0.4.25 से ऊपर के सॉलिडिटी संस्करण के लिए)

या

प्रगाढ़ता >= 0.5.0 < 0.6.0;

(0.5.0 और 0.6.0 के बीच सॉलिडिटी संस्करण के लिए)

फिर आप आरक्षित शब्द लिखकर अपना अनुबंध बनाएँ अनुबंध और आपकी .sol फ़ाइल का नाम (यह फ़ाइल के नाम से मेल खाता अनुबंध के लिए महत्वपूर्ण है, हम चर्चा करेंगे कि बाद में क्यों)। हमारे मामले में,

अनुबंध MyFirstContract {

}

इसे संकलित करें। आपको बस बाईं ओर उस संकलन टैब पर नेविगेट करना होगा और बड़े संकलन बटन पर क्लिक करना होगा। यदि कोड में कुछ गड़बड़ है तो आपको त्रुटियां और चेतावनियाँ दिखाई देंगी (सॉलिडिटी के साथ दयालु बनें, यह अभी भी “युवा भाषा” है).

हमारे वर्तमान अनुबंध के साथ सब कुछ ठीक है क्योंकि हमने वास्तव में कुछ भी नहीं किया है.

अब मैं सिर्फ आपको कुछ दिखाने के उद्देश्य से त्रुटि उत्पन्न करूँगा। आप मैन्युअल रूप से उस ड्रॉप डाउन मेनू से कंपाइलर का चयन कर सकते हैं.

उदाहरण के लिए 0.4.26 संस्करण चुनें। अब, इसे फिर से संकलित करें। अब आपको एक ‘कंपाइलर लोड नहीं हुआ’ त्रुटि दिखाई देगी.

ऐसा इसलिए है क्योंकि हमने 0.5.0 से ऊपर के संकलक संस्करणों के साथ काम करने के लिए व्यावहारिक रूप से निर्दिष्ट किया है। बस संकलक संस्करण को फिर से बदलें, और त्रुटि दूर हो जाएगी.

ठीक है, अब कोड दें!

हम सरल world हैलो वर्ल्ड ’कोड के साथ शुरुआत करेंगे और सिंटैक्स से अधिक परिचित होने के लिए केवल फ़ंक्शंस प्राप्त करेंगे और सेट करेंगे.

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

सबसे पहले, उदाहरण के लिए संदेश नामक राज्य चर को परिभाषित करें और इसका प्रकार स्ट्रिंग होगा.

हमारा प्राप्त फ़ंक्शन हमारे चर संदेश का मान लौटाएगा, और सेट फ़ंक्शन हमारे चर संदेश के लिए एक नया मान प्रदान करेगा.

फ़ंक्शन कैसे टाइप करें?

पहला, आरक्षित शब्द समारोह फिर विशेष फ़ंक्शन और मापदंडों का नाम और उसके बाद .

फ़ंक्शन myFunction () रिटर्न (बूल) {

सच लौटना;

}

कार्य हो सकते हैं जनता या निजी. यदि कोई फ़ंक्शन सार्वजनिक है, तो उसे अनुबंध के बाहर बुलाया जा सकता है। यदि कोई फ़ंक्शन निजी है तो इसका एक सीमित दायरा है, और इसे केवल अपने वर्तमान अनुबंध (उदाहरण के लिए कुछ अन्य फ़ंक्शन से) कहा जा सकता है.

यहाँ सभी फंक्शन विजिबिलिटी स्पेशलिस्ट्स की सूची दी गई है:

  • जनता: बाहरी रूप से और आंतरिक रूप से दिखाई देता है (भंडारण / राज्य चर के लिए एक गेट्टर फ़ंक्शन बनाता है)
  • निजी: केवल वर्तमान अनुबंध में दिखाई देता है
  • बाहरी: केवल बाह्य रूप से दिखाई देता है (केवल कार्यों के लिए) – अर्थात केवल संदेश-कहा जा सकता है (इसके माध्यम से)
  • अंदर का: केवल आंतरिक रूप से दिखाई देता है

कार्य हो सकते हैं शुद्ध, राय, या देय. यदि कोई फ़ंक्शन ब्लॉकचेन पर कोई डेटा नहीं लिखता है, तो इसे देखने की बहुत सिफारिश की जाती है, क्योंकि दृश्य फ़ंक्शन किसी भी गैस की लागत नहीं लेते हैं.

यहाँ सभी फ़ंक्शन संशोधक की सूची है (राज्य चर, घटनाओं और घटनाओं के तर्क के लिए संशोधक भी है लेकिन यह बाद में बात करेगा):

  • शुद्ध: राज्य के संशोधन या पहुँच को अस्वीकार करता है.
  • राय: राज्य के संशोधन को अस्वीकार करता है.
  • देय: उन्हें एक कॉल के साथ ईथर प्राप्त करने की अनुमति देता है.

यदि फ़ंक्शन कुछ मान देता है, तो आपको उसे निर्दिष्ट शब्द के साथ निर्दिष्ट करना होगा रिटर्न और फिर नियमित ब्रैकेट में यह निर्दिष्ट करने के लिए कि कौन सा प्रकार फ़ंक्शन रिटर्न करता है। हमारे मामले में यह स्ट्रिंग होगा (क्योंकि हम अपने चर संदेश को वापस भेजते हैं जो स्ट्रिंग है)

यदि फ़ंक्शन कोई मान नहीं लौटाता है, तो उसकी कोई आवश्यकता नहीं है रिटर्न बयान.

एक राज्य चर का उपयोग करने के लिए, आपको उपसर्ग की आवश्यकता नहीं है इस. जैसा कि अन्य भाषाओं में आम है.

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

स्पष्ट होने के लिए, आपका कोड ठीक और बिना अंडरस्कोर के काम करेगा, लेकिन यह उनके साथ क्लीनर है.

आप आरक्षित शब्द देखेंगे याद हमारे कोड में। यदि आप हमारे कोड को मेमोरी के बिना लिखते हैं, और 0.5 के तहत कुछ वर्जन पर प्रैग्मेंट सेट करते हैं। यह ठीक काम करेगा, लेकिन जब आप अपने कंपाइलर को 0.5 से ऊपर बदलते हैं। * EVM कंपाइल एरर जनरेट करता है।.

ऐसा क्यों होता है?

खैर, द एथेरम वर्चुअल मशीन में तीन क्षेत्र हैं जहां यह आइटम स्टोर कर सकता है.

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

लगभग सभी प्रकारों के लिए, आप यह निर्दिष्ट नहीं कर सकते कि उन्हें कहाँ संग्रहीत किया जाना चाहिए, क्योंकि वे हर बार उपयोग किए जाने पर कॉपी किए जाते हैं.

लेकिन जब आप एरेज़ या स्ट्रक्चर्स के साथ काम करते हैं, और स्ट्रिंग्स के साथ नवीनतम संस्करणों से भी, कंपाइलर आपको स्टोर क्षेत्र को निर्दिष्ट करने के लिए मजबूर करेगा.

तो, हमारा कोड अब इस तरह दिखता है:

प्रैग्म सॉलिडिटी ^ 0.5.0;

अनुबंध MyFirstContract {

स्ट्रिंग संदेश;

फ़ंक्शन मिलता है () सार्वजनिक दृश्य रिटर्न (स्ट्रिंग मेमोरी) {

वापसी संदेश;

}

समारोह सेट (स्ट्रिंग मेमोरी _message) सार्वजनिक {

संदेश = _message;

}

}

कृपया ध्यान दें कि कुछ सॉलिडिटी डेवलपर्स कोड दृश्यता बनाने के लिए उन दृश्यता निर्दिष्टताओं को अलग-अलग लाइनों में तोड़ते हैं। तो हमारे कार्य को इस तरह लिखा जा सकता है:

फ़ंक्शन मिलता है ()

जनता

राय

रिटर्न (स्ट्रिंग)

{{

वापसी का संदेश;

}

यह वास्तव में आपके ऊपर है कि आप अपने कार्यों को कैसे लिखते हैं.

अब हमारे अनुबंध को संकलित करें और उसका परीक्षण करें.

इसे संकलित करने के लिए बस नीचे से चरणों को दोहराएं (संकलित .sol बटन या cmd / ctrl + S कीबोर्ड से और यह अपने आप इसे फिर से जोड़ देगा)

वास्तव में यह देखने के लिए कि यह कैसे काम करता है (यदि संकलन त्रुटियों को उत्पन्न नहीं करता है) तो आपको अपने अनुबंध को नियुक्त करने की आवश्यकता है.

ऐसा करने के लिए, वातावरण से उस तैनाती टैब पर नेविगेट करें, पर्यावरण के लिए JavaScriptVM चुनें और डिप्लॉय बटन दबाएं.

तैनाती के बाद, अब हम अपने अनुबंध से विधियां देख सकते हैं। अभी स्क्रीन के उस हिस्से पर ध्यान दें.

आप देख सकते हैं कि दो बटन हैं (प्राप्त करें) & हमारे दो सार्वजनिक कार्यों के लिए सेट)। यदि उनमें से कोई भी निजी होता तो हम इसे यहां नहीं देखते.

यदि हम बटन पर क्लिक करते हैं तो ईवीएम हमारे प्राप्त फ़ंक्शन को निष्पादित करेगा.

आइए देखें कि यह कैसे काम करता है.

हमें खाली स्ट्रिंग मिली है। महान नहीं, भयानक नहीं। लेकिन क्यों? ठीक है क्योंकि हमने अपने संदेश चर को पहले स्थान पर नहीं रखा है.

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

अभी के लिए, हमारे पास दो सफल लेनदेन हैं। एक कॉन्ट्रैक्ट परिनियोजन है और इसमें हमारा खर्च होता है (लेकिन चिंता मत करो, हम संपादक हैं अब सब कुछ आभासी है) और दूसरा है हमारे कॉल राय समारोह.

ठीक है, अब वापस चलते हैं। अब हम सेट फंक्शन कहेंगे तो क्या होगा?

हमें फ़ंक्शन निष्पादित करने के लिए एक तर्क _message (“हैलो वर्ल्ड” उदाहरण के लिए) और ट्रांसएक्ट बटन को हिट करने की आवश्यकता है। आप टर्मिनल में लेनदेन की सफलता को ट्रैक कर सकते हैं.

अब चलो फिर से कॉल करें। अब यह हमारा संदेश लौटाता है.

आइए हमारे कोड में कुछ सुधार करें। हमने अपना चर संदेश आरंभ नहीं किया था। चलो इसे करते हैं.

अनुबंध MyFirstContract {

स्ट्रिंग संदेश = "नमस्ते दुनिया!";

फ़ंक्शन मिलता है () सार्वजनिक दृश्य रिटर्न (स्ट्रिंग मेमोरी) {

वापसी संदेश;

}

समारोह सेट (स्ट्रिंग मेमोरी _message) सार्वजनिक {

संदेश = _message;

}

}

ध्यान दें कि वह संदेश अब “हैलो वर्ल्ड!” है, और जब हम कॉल करते हैं तो पहली बार फंक्शन मिलता है क्योंकि यह खाली स्ट्रिंग नहीं लौटाता है.

इसका परीक्षण करने के लिए, हमें अपना अनुबंध (cmd / ctrl + S) संकलित करना होगा.

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

बस संपादक से पिछले संस्करण को हटाएं (हमारे वर्चुअल ब्लॉकचैन से नहीं) और फिर से डिप्लॉय बटन को हिट करें। आइए अब हमारे प्राप्त फ़ंक्शन को कॉल करें.

अच्छा लगा! आइए अब कॉल सेट कार्य करें.

और फिर से मिलता है.

ठंडा.

आइए अब हमारे संदेश को एक बनाते हैं स्थिर.

हमारा कोड अब:

प्रैग्म सॉलिडिटी ^ 0.5.0;

अनुबंध MyFirstContract {

स्ट्रिंग निरंतर संदेश = "नमस्ते दुनिया!";

फ़ंक्शन मिलता है () सार्वजनिक दृश्य रिटर्न (स्ट्रिंग मेमोरी) {

वापसी संदेश;

}

समारोह सेट (स्ट्रिंग मेमोरी _message) सार्वजनिक {

संदेश = _message;

}

}

जब हम इसे संकलित करने का प्रयास करते हैं, तो हमें अपने सेट फ़ंक्शन में त्रुटि मिलती है। ऐसा इसलिए है क्योंकि कोई स्थिरांक का मान नहीं बदल सकता है.

हम अभी उस स्थिरांक से छुटकारा पा लेंगे.

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

निर्माता () सार्वजनिक {

// कुछ करो…

}

कंस्ट्रक्टर सिर्फ एक और फ़ंक्शन है जिसे स्मार्ट अनुबंध की तैनाती के दौरान कहा जा रहा है। हमारा कोड थोड़ा अलग दिखता है, लेकिन यह समान काम करता है.

प्रैग्म सॉलिडिटी ^ 0.5.0;

अनुबंध MyFirstContract {

स्ट्रिंग संदेश;

निर्माता () सार्वजनिक {

संदेश = "नमस्ते दुनिया!";

}

फ़ंक्शन मिलता है () सार्वजनिक दृश्य रिटर्न (स्ट्रिंग मेमोरी) {

वापसी संदेश;

}

समारोह सेट (स्ट्रिंग मेमोरी _message) सार्वजनिक {

संदेश = _message;

}

}

आप इसे फिर से संकलित कर सकते हैं और यदि आप चाहें तो इसका परीक्षण कर सकते हैं.

अंत में, कोई राज्य चर की दृश्यता बदल सकता है। यदि आप अपना राज्य परिवर्तन करते हैं जनता इसका मतलब है कि कोई अनुबंध के बाहर से अपने मूल्यों का दावा कर सकता है.

सॉलिडिटी प्रत्येक सार्वजनिक राज्य चर के लिए एक ही नाम के साथ एक विधि बनाएगी जिसे एक नियमित कार्य कहा जा सकता है (थोथा जैसे गटर फ़ंक्शन).

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

बड़ा कोड, इसे निष्पादित करने के लिए अधिक गैस की आवश्यकता होती है और हमारे डीएपी को चलाने की लागत बढ़ जाती है.

जब हम स्मार्ट कॉन्ट्रैक्ट विकसित करते हैं, तो हमें होना चाहिए:

  • कुशल – खपत की जाने वाली गैस की दर कम होनी चाहिए
  • ठीक – एक बार जब आप स्मार्ट कॉन्ट्रैक्ट की तैनाती करते हैं तो इसे बदला नहीं जा सकता है और यह सार्वजनिक है 24 / 7h, कोड की हर एक लाइन (एक हैकर जो बग ढूंढता है और आपके डीएपी का शोषण कर सकता है)

आज के लिए हमारा अंतिम कोड इस तरह दिखता है:

प्रैग्म सॉलिडिटी ^ 0.5.0;

अनुबंध MyFirstContract {

स्ट्रिंग सार्वजनिक संदेश;

निर्माता () सार्वजनिक {

संदेश = "नमस्ते दुनिया!";

}

समारोह सेट (स्ट्रिंग मेमोरी _message) सार्वजनिक {

संदेश = _message;

}

}

इसे तैनात करें और इसका परीक्षण करें.

आप उस संदेश का बटन देख सकते हैं। यह बनाया जा रहा है क्योंकि हमारा राज्य चर संदेश सार्वजनिक है.

अगर हम कहते हैं कि, यह हमें एक मूल्य देता है जिसे निर्माणकर्ता के माध्यम से आरम्भ किया जा रहा है (जो कि “नमस्ते दुनिया!”.

अच्छा लगा। आइए अब परीक्षण सेट करें.

सॉलिडिटी कैसे सीखें?

सॉलिडिटी अपने आप में बहुत सरल भाषा है, लेकिन एक अच्छा सॉलिडिटी डेवलपर होने के लिए यह समझने की जरूरत है कि एथेरियम पर सब कुछ कैसे काम करता है.

  • ECMAScript (जावास्क्रिप्ट) के समान सिंटेक्स वाली उच्च स्तरीय प्रोग्रामिंग भाषा.
  • यह ईवीएम बाइटकोड को संकलित करता है, केवल ईवीएम ही समझ सकता है.
  • कम्पाइलर को Solc कहा जाता है.

इस सरल अनुबंध को उदाहरण के रूप में लेते हैं:

प्रैग्म सॉलिडिटी ^ 0.5.0;

अनुबंध उदाहरण {

uint a = 10 + 5;

}

इतना ही आसान। अब इसे संकलित करें। यदि हम टर्मिनल में कॉन्ट्रैक्ट विवरण पर जाते हैं तो हम बहुत सारी जानकारी देख सकते हैं.

इस मामले में, संकलित कोड है:

ये लंबे मूल्य अंतिम अनुबंध के हेक्साडेसिमल प्रतिनिधित्व हैं, जिन्हें बायटेकोड के रूप में भी जाना जाता है। EVM केवल बाइटकोड को समझता है.

लेकिन, अगर कुछ गलत हो जाता है, तो हम उदाहरण के लिए कुछ त्रुटि के साथ फंस जाते हैं, कोई भी बायटेकोड को डिबग नहीं कर सकता है.

ओपकोड

Bytecode के ऊपर की भाषा opcode है। Opcode निम्न स्तर की प्रोग्रामिंग भाषा है। उदाहरण के लिए सॉलिडिटी और ओपोड सी और असेंबली लैंग्वेज की तरह हैं.

इसलिए जब हमें कुछ विफल लेनदेन को डीबग करने की आवश्यकता होती है, तो हम opcode डीबग करते हैं.

एक बात आपको सॉलिडिटी और डीबगिंग के बारे में जानना चाहिए – यह बहुत कठिन है। लेकिन असंभव नहीं है, इसलिए इसमें गोता लगाएँ.

यह हमारे उदाहरण अनुबंध का opcode है:

0 PUSH1 60

02 पुष 1 40

04 MSTORE

05 PUSH1 0f

07 PUSH1 00

09 SSTORE

10 कॉलवैल्यू

11 DUP1

12 ISZERO

१३ पूष १४

15 JUMPI

16 PUSH1 00

18 डीयूपी 1

19 REVERT

20 JUMPDEST

21 पीओपी

22 PUSH1 35

24 DUP1

25 PUSH1 22

27 PUSH1 00

29 CODECOPY

30 PUSH1 00

32 रिटर्न्स

33 अवैध

34 PUSH1 80

36 PUSH1 40

38 MSTORE

39 PUSH1 00

41 DUP1

42 रिपोर्ट

43 अवैध

44 LOG1

45 PUSH6 627a7a723058

52 SHA3

53 चालान

54 PUSH22 c57b7d8745a79baee513ead21a9eb8b075896f8e4c59

77 अवैध

78 DUP10

79 और

80 JUMPI

81 अवैध

82 बैलेंस

83 PUSH29 750029

Opcodes कार्यक्रम के निम्न स्तर के मानव पठनीय निर्देश हैं। सभी ऑपकोड में उनके हेक्साडेसिमल समकक्ष होते हैं, जैसे MSTORE है 0x52.

ईवीएम स्टैक मशीन है। यह LIFO संरचना (लास्ट इन फर्स्ट आउट) पर आधारित है। सरल बनाने के लिए, माइक्रोवेव में ब्रेड के स्लाइस को स्टैक करने की कल्पना करें, जिस लास्ट स्लाइस को आप डालते हैं, वह सबसे पहले आपके द्वारा निकाली गई है।.

सामान्य अंकगणित में, हम अपना समीकरण इस प्रकार लिखते हैं:

10 + 2 * 2

और उत्तर 14 है, क्योंकि हम इसके अलावा गुणा करते हैं.

स्टैक मशीन में, यह LIFO सिद्धांत में काम करता है:

२ २ * १० +

इसका मतलब है, पहले 2 को स्टैक में रखें, उसके बाद दूसरे को 2, उसके बाद गुणन क्रिया के बाद। परिणाम स्टैक के शीर्ष पर 4 बैठा है। अब 4 के शीर्ष पर एक संख्या 10 जोड़ें और अंत में 2 संख्याओं को एक साथ जोड़ें। स्टैक का अंतिम मूल्य 14 हो जाता है.

स्टैक में डेटा डालने के कार्य को PUSH निर्देश कहा जाता है और स्टैक से डेटा निकालने के कार्य को POP निर्देश कहा जाता है। यह स्पष्ट है कि सबसे आम ओपोड हम अपने उदाहरण में देखते हैं, PUSH1 है जिसका अर्थ है स्टैक में 1 बाइट डेटा डालना।.

तो, यह निर्देश:

PUSH1 0x60

स्टैक में “0x60” का 1 बाइट मान डालने का मतलब है। संयोग से, PUSH1 के लिए हेक्साडेसिमल मान “0x60” भी होता है। गैर-अनिवार्य “0x” को हटाकर, हम इस तर्क को “6060” के रूप में बाईटेकोड में लिख सकते हैं.

हमें थोड़ा और आगे जाना है.

PUSH1 0x60 PUSH1 0x40 MSTORE

MSTORE (0x52) 2 इनपुट में लेता है और कोई आउटपुट नहीं देता है। ऊपर के ऑपकोड का मतलब है:

PUSH1 (0x60): स्टैक में 0x60 डालें.

PUSH1 (0x40): स्टैक में 0x40 डालें.

MSTORE (0x52): 0x60 स्मृति स्थान आवंटित करें और 0x40 स्थिति पर जाएँ.

परिणामी बायोटेक है:

6060604052

वास्तव में, हम हमेशा इस मैजिक नंबर “6060604052” को किसी भी सॉलिडे बायोटेक की शुरुआत में देखते हैं क्योंकि इसका स्मार्ट कॉन्ट्रैक्ट बूटस्ट्रैप.

मामले को और जटिल करने के लिए, 0x40 या 0x60 को वास्तविक संख्या 40 या 60 के रूप में व्याख्या नहीं किया जा सकता है। चूंकि वे हेक्साडेसिमल हैं, 40 वास्तव में 64 (16¹ x 4) के बराबर हैं और 60 दशमलव में 96 (16x x 6) के बराबर हैं।.

संक्षेप में, “PUSH1 0x60 PUSH1 0x40 MSTORE” जो कर रहा है वह मेमोरी के 96 बाइट्स को आवंटित कर रहा है और पॉइंटर को 64 वें बाइट की शुरुआत में ले जा रहा है। अब हमारे पास स्क्रैच स्पेस के लिए 64 बाइट्स और अस्थायी मेमोरी स्टोरेज के लिए 32 बाइट्स हैं.

ईवीएम में, डेटा स्टोर करने के लिए 3 स्थान हैं। सबसे पहले, स्टैक में। हमने उपरोक्त उदाहरण के अनुसार, डेटा को स्टोर करने के लिए केवल PUSH opcode का उपयोग किया है.

दूसरे में मेमोरी (RAM) में जहां हम MSTORE opcode का उपयोग करते हैं और अंत में, डिस्क स्टोरेज में जहां हम डेटा स्टोर करने के लिए SSTORE का उपयोग करते हैं। स्टोरेज के लिए डेटा स्टोर करने के लिए आवश्यक गैस सबसे महंगी है और स्टैक करने के लिए डेटा स्टोर करना सबसे सस्ता है.

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

हमने केवल बाइटकोड और कुछ ओपकोड की मूल बातें कवर की हैं.

हमें स्मार्ट अनुबंध लिखना शुरू करने के लिए opcodes को जानने की आवश्यकता नहीं है!

दूसरी ओर, EVM त्रुटि हैंडलिंग अभी भी बहुत ही आदिम है और जब चीजें गलत हो जाती हैं तो opcodes को देखना आसान होता है.

निष्कर्ष

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

तब तक &# 128075;

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