सावधानी - GAS! या हमने गैर-कार्बोनेटेड स्मार्ट अनुबंध कैसे किया


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


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


हमें ऐसी जिंदगी कैसे मिली?


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


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


स्मार्ट अनुबंध क्या है?


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


एक तकनीकी दृष्टिकोण से (जो हमें अधिक रुचि देता है), एक स्मार्ट अनुबंध एक एल्गोरिथ्म (कोड) है जिसे किसी एक सर्वर या कंप्यूटर पर नहीं बल्कि ब्लॉकचेन नेटवर्क में कई (या सभी) नोड्स पर निष्पादित किया जाता है, अर्थात। विकेंद्रीकरण।


यह कैसे काम करता है?


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


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


स्मार्ट कॉन्ट्रैक्ट वेव्स


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


उपयोग परिदृश्यों का विश्लेषण करने के बाद, हमें पता चला कि कार्यों की 2 बड़ी श्रेणियां हैं जो आमतौर पर स्मार्ट अनुबंधों का उपयोग करके हल की जाती हैं:


  1. मल्टीसिग, परमाणु स्वैप या एस्क्रो जैसे सरल और सीधे कार्य।
  2. उपयोगकर्ता तर्क के साथ डीएपी, पूर्ण विकसित विकेंद्रीकृत अनुप्रयोग। अधिक सटीक होने के लिए, यह विकेंद्रीकृत अनुप्रयोगों के लिए एक बैकएंड है। सबसे हड़ताली उदाहरण क्रिप्टोकरंसी या बैंकर हैं।

एक तीसरा, सबसे लोकप्रिय प्रकार का अनुबंध भी है - टोकन। Ethereum नेटवर्क पर, उदाहरण के लिए, काम करने वाले अधिकांश अनुबंध ERC20 मानक टोकन हैं। लहरों में, टोकन बनाने के लिए स्मार्ट अनुबंध करने की आवश्यकता नहीं है, जैसा कि वे स्वयं ब्लॉकचेन का हिस्सा हैं, और एक टोकन जारी करने की क्षमता (विकेंद्रीकृत विनिमय (DEX) पर तुरंत व्यापार करने की क्षमता के साथ) यह एक प्रकार के मुद्दे (निर्गम लेनदेन) के एक लेनदेन को भेजने के लिए पर्याप्त है।


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


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


आइये खाते हैं स्मार्ट


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


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

अनुबंधों के कार्यान्वयन और लेखन के तकनीकी विवरण के लिए आगे बढ़ने से पहले, हम वेव्स ब्लॉकचैन की कुछ विशेषताओं को रेखांकित करते हैं जो आगे की समझ के लिए महत्वपूर्ण होंगे:


  1. वेव्स ब्लॉकचैन में वर्तमान में 13 विभिन्न प्रकार के लेनदेन हैं।


  1. वेव्स ब्लॉकचैन में, इनपुट्स और आउटपुट नहीं (जैसे बिटकॉइन में), लेकिन अकाउंट्स (जैसे, उदाहरण के लिए, Nxt में)। एक विशिष्ट खाते की ओर से लेनदेन किया जाता है।
  2. डिफ़ॉल्ट रूप से, लेन-देन की शुद्धता ब्लॉकचैन की वर्तमान स्थिति और हस्ताक्षर की वैधता द्वारा निर्धारित की जाती है, जिसमें लेनदेन भेजा जाता है। लेनदेन का JSON प्रतिनिधित्व काफी सरल दिखता है:


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


स्मार्ट खाते के मामले में, अनुबंध प्रत्येक _ आउटगोइंग लेनदेन के लिए एक सत्यापन नियम है।


और गैस के बारे में क्या?


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


  1. स्क्रिप्ट को 20 से अधिक हस्ताक्षर सत्यापन कार्यों से अधिक तेज़ी से चलना चाहिए, जिसका अर्थ है कि एक स्मार्ट खाते के लिए चेक एक नियमित खाते की तुलना में 20 गुना अधिक धीमा नहीं होगा। स्क्रिप्ट का आकार 8 केबी से अधिक नहीं होना चाहिए।
  2. स्मार्ट अनुबंधों को पूरा करने के लिए खनिक के लिए इसे लाभदायक बनाने के लिए, हमने 0.004 WAVES की राशि में स्मार्ट खातों के लिए एक न्यूनतम अतिरिक्त कमीशन निर्धारित किया है। एक लेनदेन के लिए लहरों के नेटवर्क में न्यूनतम कमीशन 0.001 WAVES है, एक स्मार्ट खाते के मामले में - 0.005 WAVES।

स्मार्ट अनुबंधों के लिए भाषा


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


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


  1. सख्ती से और सांख्यिकीय रूप से टाइप किया जाए। मजबूत टाइपिंग स्वचालित रूप से कई संभावित प्रोग्रामर त्रुटियों को समाप्त करती है।
  2. अपने आप को पैर में गोली मारना कठिन बनाने के लिए एक शक्तिशाली प्रकार की प्रणाली है।
  3. आलसी बनो ताकि आप कीमती प्रोसेसर चक्रों को बर्बाद न करें।
  4. ब्लॉकचैन के साथ काम करने के लिए मानक पुस्तकालय में विशिष्ट कार्य हैं, उदाहरण के लिए, हैश। उसी समय, मानक भाषा पुस्तकालय को अतिभारित नहीं किया जाना चाहिए, क्योंकि हमेशा एक सही तरीका होना चाहिए।
  5. रनटाइम में अपवाद नहीं हैं।

हमारी RIDE भाषा में, हमने इन महत्वपूर्ण विशेषताओं को ध्यान में रखने की कोशिश की, और चूंकि हम स्काला पर बहुत कुछ विकसित करते हैं और कार्यात्मक प्रोग्रामिंग की तरह, कुछ मामलों में भाषा स्काला और एफ # के समान है।


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


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


 match tx { case t:TransferTransaction => t.recepient case t:MassTransferTransaction => t.transfers case _ => throw } 

RIDE कोड के साथ काम करने के तरीके को सीखने में रुचि रखने वाले किसी भी व्यक्ति को श्वेत पत्र की जांच करने के लायक है, जो अनुबंध के साथ काम करने के सभी चरणों का वर्णन करता है: स्क्रिप्टिंग जटिलता और निष्पादन की पार्सिंग, संकलन, deserializing, गणना। पहले दो चरणों - पार्सिंग और संकलन को ऑफ-चेन किया जाता है, केवल बेस 64 में संकलित अनुबंध ब्लॉकचेन में हो जाता है। देशीकरण, जटिलता की गणना और निष्पादन अलग-अलग चरणों में और कई बार किया जाता है:


  1. जब आप लेनदेन प्राप्त करते हैं और इसे UTX में जोड़ते हैं, अन्यथा ऐसी स्थिति होगी जब लेनदेन ब्लॉकचैन नोड द्वारा स्वीकार किया जाता है, उदाहरण के लिए, REST API के माध्यम से, लेकिन ब्लॉक में कभी नहीं आएगा।
  2. जब एक ब्लॉक बनता है, तो खनन नोड लेनदेन को मान्य करता है और स्क्रिप्ट की आवश्यकता होती है।
  3. एक ब्लॉक के गैर-खनन नोड द्वारा प्राप्त होने पर और उसमें लेन-देन की मान्यता शामिल है।

अनुबंधों के साथ काम करने में प्रत्येक अनुकूलन मूल्यवान हो जाता है, क्योंकि यह कई नेटवर्क नोड्स पर कई बार किया जाता है। अब स्मार्ट खातों के जारी होने के बाद वर्कलोड में बढ़ोतरी के बावजूद, वेव्स नोड्स डिजिटल मशीनों पर $ 15 के लिए वर्चुअल मशीनों पर चुपचाप चलते हैं।


परिणाम क्या है?


अब देखते हैं कि हमें लहरों पर क्या मिला। हम अपना पहला कॉन्ट्रैक्ट लिखेंगे, यह एक मानक मल्टीसिग 2-ऑफ -3 कॉन्ट्रैक्ट होगा। एक अनुबंध लिखने के लिए, आप ऑनलाइन आईडीई (भाषा के लिए ट्यूनिंग - एक अलग लेख के लिए एक विषय) का उपयोग कर सकते हैं। एक नया खाली अनुबंध बनाएं (नया → खाली अनुबंध)।


सबसे पहले, हम ऐलिस, बॉब और कूपर की सार्वजनिक कुंजी की घोषणा करेंगे, जो खाते को नियंत्रित करेगा। आपको उनके 3 हस्ताक्षरों में से 2 की आवश्यकता होगी:


 let alicePubKey = base58'B1Yz7fH1bJ2gVDjyJnuyKNTdMFARkKEpV' let bobPubKey = base58'7hghYeWtiekfebgAcuCg9ai2NXbRreNzc' let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8' 

प्रलेखन sigVerify फ़ंक्शन का वर्णन करता है, जो आपको लेनदेन हस्ताक्षर को सत्यापित करने की अनुमति देता है:



फ़ंक्शन के तर्क लेन-देन का निकाय, सत्यापित हस्ताक्षर और सार्वजनिक कुंजी हैं। वैश्विक दायरे में अनुबंध में एक tx वस्तु उपलब्ध है, जिसमें लेनदेन की जानकारी संग्रहीत होती है। इस ऑब्जेक्ट में tx.bodyBytes फ़ील्ड है जिसमें भेजे जाने वाले लेन-देन के बाइट्स शामिल हैं। tx.proofs का एक सरणी भी है, जो हस्ताक्षर संग्रहीत करता है, जो 8 तक हो सकता है। यह ध्यान देने योग्य है कि, वास्तव में, आप न केवल हस्ताक्षर tx.proofs को भेज सकते हैं, लेकिन किसी भी अन्य जानकारी जो अनुबंध द्वारा उपयोग की जा सकती है।


हम यह सुनिश्चित कर सकते हैं कि सभी हस्ताक्षर प्रस्तुत किए गए हैं और वे 3 सरल लाइनों का उपयोग करके सही क्रम में हैं:


 let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey )) then 1 else 0 let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey )) then 1 else 0 let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey )) then 1 else 0 

खैर, अंतिम चरण यह सत्यापित करना होगा कि कम से कम 2 हस्ताक्षर प्रस्तुत किए गए हैं।


 aliceSigned + bobSigned + cooperSigned >= 2 

3 मल्टी-सिग्नेचर कॉन्ट्रैक्ट में से पूरा 2 इस तरह दिखता है:


 #    let alicePubKey = base58'B1Yz7fH1bJ2gVDjyJnuyKNTdMFARkKEpV' let bobPubKey = base58'7hghYeWtiekfebgAcuCg9ai2NXbRreNzc' let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8' #       let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey )) then 1 else 0 let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey )) then 1 else 0 let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey )) then 1 else 0 # ,      2   aliceSigned + bobSigned + cooperSigned >= 2 

कृपया ध्यान दें: कोड में return जैसे कोई कीवर्ड नहीं हैं, क्योंकि निष्पादित अंतिम पंक्ति को स्क्रिप्ट का परिणाम माना जाता है, और इसीलिए इसे हमेशा true या false लौटना चाहिए


इसकी तुलना में, आम एथेरियम मल्टी-सिग्नेचर कॉन्ट्रैक्ट बहुत अधिक जटिल है । यहां तक ​​कि अपेक्षाकृत सरल विविधताएं इस तरह दिखती हैं:


  pragma solidity ^0.4.22; contract SimpleMultiSig { uint public nonce; // (only) mutable state uint public threshold; // immutable state mapping (address => bool) isOwner; // immutable state address[] public ownersArr; // immutable state // Note that owners_ must be strictly increasing, in order to prevent duplicates constructor(uint threshold_, address[] owners_) public { require(owners_.length <= 10 && threshold_ <= owners_.length && threshold_ >= 0); address lastAdd = address(0); for (uint i = 0; i < owners_.length; i++) { require(owners_[i] > lastAdd); isOwner[owners_[i]] = true; lastAdd = owners_[i]; } ownersArr = owners_; threshold = threshold_; } // Note that address recovered from signatures must be strictly increasing, in order to prevent duplicates function execute(uint8[] sigV, bytes32[] sigR, bytes32[] sigS, address destination, uint value, bytes data) public { require(sigR.length == threshold); require(sigR.length == sigS.length && sigR.length == sigV.length); // Follows ERC191 signature scheme: https://github.com/ethereum/EIPs/issues/191 bytes32 txHash = keccak256(byte(0x19), byte(0), this, destination, value, data, nonce); address lastAdd = address(0); // cannot have address(0) as an owner for (uint i = 0; i < threshold; i++) { address recovered = ecrecover(txHash, sigV[i], sigR[i], sigS[i]); require(recovered > lastAdd && isOwner[recovered]); lastAdd = recovered; } // If we make it here all signatures are accounted for. // The address.call() syntax is no longer recommended, see: // https://github.com/ethereum/solidity/issues/2884 nonce = nonce + 1; bool success = false; assembly { success := call(gas, destination, value, add(data, 0x20), mload(data), 0, 0) } require(success); } function () payable public {} } 

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


यदि आपके हाथ खुजली हैं, तो लेख के अंत में सबसे महत्वपूर्ण लिंक हैं जिनके साथ गोता शुरू करना है।


भाषा की तुलना में प्रणाली अधिक शक्तिशाली है


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



लेन-देन की तारीख में स्ट्रिंग, संख्या, बूलियन मान, और प्रति कुंजी 32 KB तक बाइट हो सकते हैं। डेटा लेनदेन के साथ काम करने का एक उदाहरण, जो आपको केवल तभी लेनदेन भेजने की अनुमति देता है, जब खाते के कुंजी-मूल्य संग्रहण में पहले से ही कुंजी की संख्या 42 हो:


 let keyName = "key" match (tx) { case tx:DataTransaction => let x = extract(getInteger(tx.sender, keyName)) x == 42 case _ => false } 

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


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


 +------------+-----------------------------------------------+ | Token Name | Owner Publc Key | +------------+-----------------------------------------------+ | "Token #1" | "6iQaHazE9NVAJfAjMpHifDXMfr1euWcy8fmW6rNcdhr" | | "Token #2" | "3tNLxyJnyxLzDkMkqiZmUjRqXe1UuwFeSyQ14GRYnGL" | | "Token #3" | "3wH7rENpbS78uohErXHq77yKzQwRyKBYhzCR9nKU17q" | | "Token #4" | "6iQaHazE9NVAJfAjMpHifDXMfr1euWcy8fmW6rNcdhr" | | "Token #5" | "6iQaHazE9NVAJfAjMpHifDXMfr1euWcy8fmW6rNcdhr" | +------------+-----------------------------------------------+ 

NFT अनुबंध अपने आप में बहुत सरल दिखता है:


 match tx { case dt: DataTransaction => let oldOwner = extract(getString(dt.sender, dt.data[0].key)) let newOwner = getBinary(dt.data, 0) size(dt.data) == 1 && sigVerify(dt.bodyBytes, dt.proofs[0], fromBase58String(oldOwner)) case _ => false } 

आगे क्या है?


लहरों के स्मार्ट कॉन्ट्रैक्ट्स का आगे विकास राइड 4DApps है , जो अन्य खातों पर कॉलिंग कॉन्ट्रैक्ट्स, और ट्यूरिंग-पूर्ण भाषा (या सिस्टम) की अनुमति देगा जो आपको सभी प्रकार के कार्यों को हल करने, अन्य कार्यों को ट्रिगर करने, आदि की अनुमति देगा।


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


खैर, अंत में मैं फिर से एक सूची दूंगा कि वेव्स नेटवर्क पर स्मार्ट कॉन्ट्रैक्ट के साथ काम करना शुरू करने के लिए क्या आवश्यक होगा।


  1. प्रलेखन
  2. कंसोल के साथ आईडीई
  3. सबसे उत्सुक के लिए श्वेत पत्र

Source: https://habr.com/ru/post/hi440702/


All Articles