स्मार्ट कॉन्ट्रैक्ट टेक्नोलॉजी की शुरुआत के बाद से, सॉलिडिटी स्मार्ट कॉन्ट्रैक्ट डेवलपर्स के लिए पसंद की कोडिंग भाषा रही है।
हालाँकि, यदि आप एक सॉलिडिटी डेवलपर हैं, तो आप पहले से ही जानते हैं कि इसमें कमियां हैं। अन्य खामियों के अलावा, कुछ डेटा प्रकारों के सरल गलत संचालन से प्रमुख सुरक्षा चिंताएँ उत्पन्न हो सकती हैं, और कोई अंतर्निहित अभिगम नियंत्रण नहीं हैं।
फ्लो ब्लॉकचैन, ताल के लिए विकसित एक नई स्मार्ट अनुबंध भाषा, सॉलिडिटी के निरीक्षण से सीखती है और मूल रूप से इसकी कई अंतर्निहित समस्याओं को हल करती है। और अगर आप पहले से सॉलिडिटी जानते हैं, तो इसे सीखना आसान है!
यह लेख ताल स्मार्ट अनुबंध भाषा का परिचय देता है, विवरण देता है कि यह सॉलिडिटी में कैसे सुधार करता है, और फिर कुछ सामान्य स्मार्ट अनुबंध उदाहरणों पर दोनों भाषाओं की एक साथ-साथ तुलना करता है। अंत तक, आपको ताल के साथ सहज होना चाहिए और फ़्लो पर आरंभ करने के लिए तैयार होना चाहिए!
ताल प्रोग्रामिंग भाषा है जो फ्लो ब्लॉकचैन को शक्ति प्रदान करती है, जिसे मूल रूप से बनाया गया था
इन सबका मतलब है कि डिजिटल संपत्ति निर्माण और प्रबंधन के लिए ताल अत्यधिक अनुकूलित है ।
सबसे महत्वपूर्ण नवाचार ताल पेश करता है इसकी
ताल कई तरह से सॉलिडिटी में सुधार करता है। आइए तीन उदाहरण देखें- छोटी कोडिंग गलतियाँ, सुरक्षा और अभिगम नियंत्रण, और अनुबंध परिनियोजन।
सॉलिडिटी के साथ कुछ सबसे बड़े मुद्दे आमतौर पर छोटी-छोटी गलतियों से उत्पन्न होते हैं। उदाहरण के लिए, एक चर को केवल एक डिफ़ॉल्ट मान के साथ प्रारंभ करना-हालांकि कभी-कभी सुविधाजनक होता है-यदि उस चर को नहीं बदला जाता है तो अप्रत्याशित परिणाम हो सकते हैं। और निश्चित-श्रेणी के डेटा प्रकार संभावित अंडरफ्लो या अतिप्रवाह स्थितियों को जन्म दे सकते हैं, जो विनाशकारी होगा यदि वह डेटा प्रकार एक मौद्रिक मूल्य का प्रतिनिधित्व करता है।
कैडेंस में, वैरिएबल वैल्यू को इनिशियलाइज़ेशन पर सेट किया जाना चाहिए, डिफ़ॉल्ट मानों से किसी भी अवांछित परिणाम को हटा देना चाहिए। इसके अतिरिक्त, ताल में पूर्णांकों को स्वचालित रूप से अंडरफ्लो या अतिप्रवाह स्थितियों के लिए जांचा जाता है, जबकि आपको OpenZeppelin की सुरक्षित गणित लाइब्रेरी को इनहेरिट करने की आवश्यकता होगी या सॉलिडिटी के साथ 0.8 से अधिक संस्करण का उपयोग करना होगा।
जब सुरक्षा और अभिगम नियंत्रण की बात आती है, तो सॉलिडिटी के लिए आपको कस्टम संशोधक बनाने या अन्य सुरक्षा-आधारित स्मार्ट अनुबंधों को इनहेरिट करने की आवश्यकता होती है, लेकिन इसके कई कार्य भी होते हैं जो डिफ़ॉल्ट रूप से सार्वजनिक होते हैं।
Cadence के क्षमता-आधारित सुरक्षा मॉडल के साथ, खाते केवल वही कार्य कर सकते हैं जिन तक उनकी पहुंच है। इसका मतलब है कि ताल का अभिगम नियंत्रण मूल रूप से भाषा में ही बनाया गया है। इसके अलावा, ताल में संसाधन वस्तुओं पर परिभाषित विधियों को पुनर्विक्रय हमलों के लिए अतिसंवेदनशील नहीं किया जा सकता है, कुछ सॉलिडिटी डेवलपर्स को अपने तर्क के प्रवाह को बनाते समय गहराई से अवगत होना चाहिए।
जब सॉलिडिटी स्मार्ट कॉन्ट्रैक्ट्स में समस्याएँ पाई जाती हैं, तो डेवलपर्स पूरी तरह से नए कॉन्ट्रैक्ट को लागू किए बिना उन्हें ठीक करने में असमर्थ होते हैं। और फिर भी, कमजोर अनुबंध अभी भी मौजूद है। डेवलपर्स को यह सुनिश्चित करना चाहिए कि उनका उपयोगकर्ता आधार नए अनुबंध में बदल जाए।
ताल में, स्मार्ट अनुबंध उन्नयन क्षमता अंतर्निहित और पारदर्शी है। जब कोड को सुरक्षित और अंतिम घोषित किया जाता है, तो स्मार्ट अनुबंध के मालिक से चाबियों को हटाकर अनुबंध को अपरिवर्तनीय बनाया जा सकता है।
कुल मिलाकर, ताल एक सुरक्षित और अधिक सुरक्षित स्मार्ट अनुबंध भाषा है जो त्रुटि के लिए कम जगह छोड़ती है।
अब आइए सॉलिडिटी और कैडेंस में लिखे गए स्मार्ट कॉन्ट्रैक्ट्स के बीच के अंतरों को विस्तार से देखें। हम एक सरल हैलो वर्ल्ड अनुबंध और फिर एक अधिक जटिल एनएफटी कार्यान्वयन के माध्यम से चलेंगे।
आइए एक सर्वकालिक क्लासिक के साथ शुरुआत करें। हम सभी ने कई भाषाओं में "हैलो वर्ल्ड" लिखा है, इसलिए यह ताल का एक आसान परिचय है।
आइए इसे चरण दर चरण जानते हैं।
सबसे पहले, हमारे पास अनुबंध की परिभाषा है। स्पष्ट अंतर यह है कि ताल अनुबंध में एक अभिगम नियंत्रण संशोधक होता है: इस मामले में, pub. यह संशोधक सुनिश्चित करता है कि फ्लो नेटवर्क में हर कोई अनुबंध तक पहुंच सकता है, सॉलिडिटी अनुबंधों के लिए डिफ़ॉल्ट व्यवहार।
हालाँकि, ताल में, हम एक्सेस कंट्रोल को access(account)
पर भी सेट कर सकते हैं। यह उस अनुबंध को लागू करने वाले खाते तक अनुबंध पहुंच को सीमित करता है। यहां हम पहले से ही फ्लो और एथेरियम के बीच एक बड़ा अंतर देखते हैं। हम केवल फ्लो ब्लॉकचैन में अनुबंधों को तैनात नहीं करते हैं; हम उन्हें अपने खाता भंडारण में तैनात करते हैं। फ्लो ब्लॉकचैन पर, प्रत्येक खाते को भंडारण के साथ आरंभ किया जाता है, जहां संसाधनों और संरचनाओं को संग्रहीत किया जा सकता है। इस भंडारण की अपनी अनुमतियां हैं, जो हमें इस बात पर बेहतर नियंत्रण की अनुमति देती है कि हमारे अनुबंध के तरीकों को कौन निष्पादित कर सकता है।
अगली पंक्ति हमारे अनुबंध के दायरे में आने वाले एक स्ट्रिंग चर को परिभाषित करती है। कैडेंस में अर्धविराम वैकल्पिक हैं, और चर को परिभाषित करने के लिए एक let
कीवर्ड का उपयोग किया जाता है।
ताल में दो प्रकार के चर होते हैं- परिवर्तनशील और अपरिवर्तनीय। let
के साथ बनाए गए चर अपरिवर्तनीय हैं, या अन्यथा स्थिरांक के रूप में जाने जाते हैं; हम उन्हें केवल एक बार सेट कर सकते हैं, और उन्हें अनुबंध के जीवनकाल के लिए नहीं बदला जा सकता है। हम var
कीवर्ड के साथ परिवर्तनशील चर (जिन्हें बदला जा सकता है) को परिभाषित करते हैं।
इस मामले में, हम चर मान को init विधि में सेट करते हैं, क्योंकि ताल सुनिश्चित करता है कि यह विधि प्रत्येक अनुबंध परिनियोजन के लिए केवल एक बार कॉल की जाती है।
सॉलिडिटी के constructor
के समतुल्य ताल init
विधि है। इस विधि को ठीक एक बार कहा जाता है—जिस समय एक अनुबंध तैनात किया जाता है।
इनिट मेथड के अंदर, हम अपने ग्रीटिंग वेरिएबल के लिए वैल्यू सेट करते हैं। जबकि सॉलिडिटी डिफ़ॉल्ट रूप से अनुबंध चर को लिखता है, ताल स्थानीय चर को लिखता है और आपको अनुबंध चर तक पहुंचने के लिए स्वयं-वस्तु का उपयोग करने की आवश्यकता होती है। टाइपो बनाते समय यह निर्णय गलती से अनुबंध चर को लिखने से बचाता है।
हमारे अनुबंध की दूसरी विधि ग्रीटिंग वैरिएबल लौटाती है। कैडेंस और सॉलिडिटी दोनों में, हमें सार्वजनिक होने की विधि के लिए पहुंच की घोषणा करनी होगी, और दोनों भाषाओं में हमें रिटर्न प्रकार को परिभाषित करने की आवश्यकता होती है। इस मामले में, यह एक स्ट्रिंग है।
लेकिन सॉलिडिटी के लिए हमें यहां और अधिक निम्न-स्तर होने की आवश्यकता है। इसके लिए हमें स्पष्ट रूप से यह बताना होगा कि स्ट्रिंग कहाँ स्थित है। यह हमें कार्यों को दृश्य के रूप में भी चिह्नित करता है, ताकि हम गलती से ब्लॉकचेन की स्थिति को संशोधित न करें।
दूसरी ओर, ताल को उस निम्न-स्तरीय नियंत्रण की आवश्यकता नहीं है, क्योंकि यह दृढ़ता से और स्थिर रूप से टाइप किया गया है। प्रोग्राम को ऑन-चेन चलाने से पहले संभावित त्रुटियों को पकड़ा जाता है, जिससे अनावश्यक कीवर्ड को हटाकर पूरी विधि घोषणा को और अधिक पठनीय बना दिया जाता है।
इसके बाद, आइए दोनों भाषाओं के मूल NFT अनुबंध को देखें:
चूंकि इस उदाहरण के लिए दोनों भाषाओं के अलग-अलग दृष्टिकोण हैं, आइए उन्हें अलग-अलग देखें: पहले सॉलिडिटी उदाहरण के माध्यम से चलना, फिर ताल।
सॉलिडिटी में, एनएफटी मूल रूप से आईडी की एक सूची है। आपको स्मार्ट अनुबंध के अंदर इन आईडी का ट्रैक रखना होगा और विशिष्टता सुनिश्चित करने के लिए उन्हें मैन्युअल रूप से बढ़ाना होगा। सॉलिडिटी एनएफटी या उनकी विशिष्टता के बारे में कुछ भी नहीं जानता है। यह केवल उनके मालिकों के लिए मैप की गई आईडी की एक सूची है, सभी अनुबंध के भीतर मैन्युअल रूप से प्रबंधित की जाती हैं। यह त्रुटि के लिए जगह छोड़ देता है यदि आईडी वृद्धि को अनुचित तरीके से संभाला जाता है, जिसके परिणामस्वरूप कई एनएफटी समान आईडी वाले हो सकते हैं।
उदाहरण में, एनएफटी में कोई अतिरिक्त डेटा संलग्न नहीं है, लेकिन आप यूआरआई में एक और मैपिंग आईडी जोड़ सकते हैं। अनुबंध सुनिश्चित करता है कि प्रत्येक नवनिर्मित NFT को स्वामी के पते पर मैप किया जाए।
यह एक साधारण उदाहरण है, बिल्कुल। आमतौर पर, आपको दूरस्थ रूप से सुरक्षित एनएफटी अनुबंध प्राप्त करने के लिए कई इंटरफेस का विस्तार करने की आवश्यकता होगी और मेटाडेटा जैसी सुविधाओं का उपयोग आपके एनएफटी में जाने-माने जेपीजी को जोड़ने के लिए किया जाएगा, लेकिन मूल तंत्र समान हैं।
अब, आइए ताल संस्करण को देखें और यह इस सॉलिडिटी उदाहरण पर कैसे सुधार करता है।
ताल उदाहरण एक संसाधन प्रकार से शुरू होता है जिसे NFT
कहा जाता है। NFT
के सामने @ चिन्ह पर ध्यान दें? यह प्रतीक आवश्यक है, क्योंकि यह सुनिश्चित करता है कि संसाधन प्रकारों का उपयोग और व्यवहार स्पष्ट रहेगा।
हम एक संसाधन से उदाहरण बना सकते हैं, और इसमें एक संरचना की तरह ही विशेषताएँ हो सकती हैं। एक नियमित संरचना से अंतर यह है कि एक संसाधन एक विशेष प्रकार है जो अपने द्वारा संग्रहीत डेटा के अतिरिक्त स्वामित्व को संभालता है।
संसाधन प्रकार NFT
के अंदर, एक id फ़ील्ड है। id
फ़ील्ड एक पूर्णांक है, UInt64
, और यह प्रत्येक NFT संसाधन को दी गई एक अद्वितीय आईडी है। यह id
प्रत्येक एनएफटी संसाधन के लिए अलग होगी, जिसका अर्थ है कि संसाधन को दोहराया या संयोजित नहीं किया जा सकता है। इसके बाद, id
फ़ील्ड को init
फ़ंक्शन का उपयोग करके प्रारंभ किया जाता है।
जिस तरह रस्ट का उधार चेकर सुनिश्चित करता है कि केवल एक फ़ंक्शन एक चर को संशोधित कर सकता है, उसी तरह ताल अपने संसाधनों के लिए भी सुनिश्चित करता है।
जब हम एक नया संसाधन बनाते हैं, तो हमें इसे भंडारण स्थानों के आसपास ले जाना होता है। यदि हम संसाधन को वैसे ही छोड़ देते हैं तो हमारा स्मार्ट अनुबंध ठीक से नहीं चलेगा, इसलिए यह हमें संसाधनों और उनके भंडारण स्थानों के साथ विचार-विमर्श करने के लिए मजबूर करता है। नियंत्रण का यह रूप यह भी सुनिश्चित करता है कि संसाधन कभी न खोएं या गलती से नष्ट न हों; वे एक समय में केवल एक ही स्थान पर हो सकते हैं।
जब हम टकसाल फ़ंक्शन को कॉल करते हैं, तो यह हमारे NFT
संसाधन का एक नया उदाहरण बनाएगा। यह फ़ंक्शन एक प्रकार के NFT
के साथ एक संसाधन देता है और पहले परिभाषित किए गए संसाधन से फ़ील्ड, id
लेता है। create
कीवर्ड ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में नए ऑपरेटर की तरह है, जो एक नया संसाधन बनाता है। <-
, या मूव-ऑपरेटर, यह स्पष्ट करता है कि यह संसाधन हमारे द्वारा कॉल किए जाने के बाद स्रोत पर उपलब्ध नहीं है।
self.account
चर उस खाते को इंगित करेगा जिसका उपयोग हमने अपने अनुबंध के लिए परिनियोजन लक्ष्य के रूप में किया था। जैसा कि हमने पहले सीखा: फ्लो नेटवर्क पर वैश्विक नामस्थान में स्मार्ट अनुबंधों को तैनात नहीं किया जाता है, बल्कि आपके खाते से संबंधित विशेष ऑन-चेन स्टोरेज में तैनात किया जाता है। इसलिए, स्मार्ट अनुबंध जानता है कि उसे किस खाते में तैनात किया गया है और उस जानकारी का अपने तरीकों में उपयोग कर सकता है।
इस उदाहरण में, हम खाते की सेव विधि का उपयोग करते हैं। अंतिम init
फंक्शन में, हम रिसोर्स को save
मेथड्स फर्स्ट आर्गुमेंट में ले जाते हैं और यह बताते हैं कि अकाउंट के अंदर कौन सा पाथ हमारे एनएफटी को स्टोर करना चाहिए।
चूंकि हमारा एनएफटी एक संसाधन है, फ्लो नेटवर्क पर कोई भी इकाई इसे कॉपी नहीं कर सकती है; हमें इसकी विशिष्टता पर स्पष्ट रूप से नज़र रखने की ज़रूरत नहीं है।
ताल स्मार्ट अनुबंध प्रोग्रामिंग भाषाओं पर एक नया कदम है, जो परिसंपत्ति निर्माण और प्रबंधन के लिए अनुकूलित है। यह एक आधुनिक विकल्प है जो चर और संसाधनों के जबरन प्रबंधन, मूलभूत स्तर पर सुरक्षा और अभिगम नियंत्रण, और स्मार्ट अनुबंधों को अपरिवर्तनीय बनाने से पहले उन्हें अपग्रेड करने की क्षमता जैसे साधनों के माध्यम से सॉलिडिटी की कमियों को कम करता है। ताल आपको फ्लो इकोसिस्टम की संभावनाओं के लिए खोलता है, और रस्ट जैसी भाषाओं की कई विशेषताओं को शामिल करता है।
इसलिए, यदि आप एक ऐसे डेवलपर हैं जो मौलिक रूप से सुरक्षित और अधिक सुरक्षित भाषा में स्मार्ट अनुबंध लिखना चाहते हैं, तो ताल एक उत्कृष्ट विकल्प है। अधिक जानने के लिए, Cadence Documentation and Flow Developer Portal देखें।
आपका दिन वाकई बहुत अच्छा हो!