सरकार कहती है कि हम मंदी के दौर में नहीं हैं, लेकिन साथ ही, हम आसमान छूती महंगाई, ब्याज दर में बढ़ोतरी और अर्थव्यवस्था के लगभग हर क्षेत्र में छंटनी के बारे में सुनते हैं। क्रिप्टो और ट्रेडफाई के सबसे गंभीर रूप से प्रभावित होने के बावजूद, कई कंपनियां अभी भी अपने टोकन, प्रोटोकॉल और डेफी उत्पादों का निर्माण कर रही हैं। क्या आप उनमें से एक हैं? आज, मैं डेटा प्रकारों पर बोलूंगा, और रुकिए। मुझे एक बहुत जरूरी बात कहनी है। आप मुझे MIT के एक 60+ वर्षीय प्रोफेसर के रूप में देख सकते हैं जो छात्रों को उन विषयों के बारे में व्याख्यान देते हैं जो अब मायने नहीं रखते। लेकिन यह सच नहीं है। डेटा प्रकार अभी भी महत्वपूर्ण हैं, और उनकी उपेक्षा करने से गंभीर परिणाम सामने आते हैं। मैं संक्षेप में सभी संभावित मुद्दों के माध्यम से जाने और उन्हें संबोधित करने की कोशिश करूंगा ताकि आपको यह न लगे कि इस लेख को पढ़ने में आपके द्वारा खर्च किया गया 8 मिनट बर्बाद हो गया है। जावास्क्रिप्ट और पायथन जैसी आधुनिक भाषाएँ चर के प्रकार को निर्धारित करने के लिए "डक टाइपिंग" का उपयोग कर रही हैं। यदि हम इस प्रकार के सूत्र को एक चर के लिए निर्दिष्ट करते हैं, तो भाषा दुभाषिया जानता है कि यह संख्याओं के साथ काम कर रहा है, और यह इस शाब्दिक पर गणितीय कार्य करेगा। a = 2 + 2 बत्तख टाइपिंग को इस वाक्य द्वारा समझाया जा सकता है: "यदि यह बत्तख की तरह चलता है और यह बत्तख की तरह बोलता है, तो यह बत्तख होना चाहिए"। जब आप इसके अर्थ को करीब से देखते हैं - यह सही समझ में आता है। यदि शाब्दिक में अक्षर और संख्याएँ हैं, तो यह एक स्ट्रिंग होनी चाहिए, और यह स्पष्ट है। लेकिन क्या होगा अगर इसमें नंबर हैं? क्या यह एक , , , या । ज्यादातर मामलों में, आपका भाषा दुभाषिया प्रकारों को सही तरीके से हैंडल करेगा। समस्या तब शुरू होती है जब आपके प्रोग्राम को बड़ी संख्या में (यहां तक कि सरल) समीकरणों को चलाने की आवश्यकता होती है। boolean integer decimal float date "अगर यह एक बत्तख की तरह चलता है और यह एक बत्तख की तरह कांपता है, तो यह एक बत्तख होना चाहिए", है ना? वास्तव में ऐसा नहीं है। एथेरियम मूल्यवर्ग संक्षेप में अगले पैराग्राफ में, मैं एथेरियम के सामान्य संप्रदायों - और का जिक्र कर रहा हूं। मैं आपको संक्षेप में उनसे मिलवाता हूं ताकि हम आम भाषा बोल सकें। wei gwei सबसे छोटा मूल्यवर्ग है, और (18 शून्य) के बराबर है मैं दोहराता हूँ - 18 शून्य। इतनी बड़ी संख्या के बारे में अपने दिमाग को लपेटना कठिन है, लेकिन वे बहुत फर्क करते हैं और बहुत मायने रखते हैं। 1 वेई 1 ईथर 1,000,000,000,000,000,000 वेई । अगला आम संप्रदाय है। (9 शून्य) के बराबर है Gwei मनुष्यों के लिए अधिक सहने योग्य है - अंत में, हर कोई करोड़पति बनना चाहता है, है ना? (पलक पलक) 1 जीवीई 1 ईथर 1,000,000,000 gwei । आइए इसे जोड़ते हैं - 1 ईथर बराबर: 1,000,000,000 जीवीई (9 शून्य) 1,000,000,000,000,000,000 वेई (18 शून्य) तकनीकी नोट: एथेरियम की दो परतें हैं - निष्पादन परत और सर्वसम्मति परत। निष्पादन परत ईथर मूल्यों का प्रतिनिधित्व करने के लिए वीई का उपयोग कर रही है, और आम सहमति परत जीवीई का उपयोग कर रही है। यदि आप एक ब्लॉकचेन डेवलपर हैं, तो आपको दोनों के साथ बातचीत करना सीखना होगा। वास्तविक दुनिया का उदाहरण: स्टेकफिश टिप और एमईवी पूल मैं में एक सॉफ्टवेयर इंजीनियर हूं। मैं अपने डेफी उत्पादों के पैलेट के निर्माण के लिए जिम्मेदार हूं, और सबसे हालिया लोगों में से एक एथेरियम के लिए हमारा टिप और एमईवी पूल है। स्टेकफिश 15 सितंबर, 2022 से, सभी सत्यापनकर्ता लेन-देन युक्तियों के लिए पात्र हैं और अतिरिक्त पुरस्कार अर्जित करने के लिए MEVs में भाग ले सकते हैं। लेन-देन युक्तियाँ और MEV तब अर्जित किए जाते हैं जब सत्यापनकर्ता एक नया ब्लॉक प्रस्तावित करता है। हमने एक स्मार्ट अनुबंध बनाने का फैसला किया जो सभी पुरस्कारों को एक सामान्य तिजोरी में एकत्रित करता है और उपयोगकर्ता को इससे अपने हिस्से का दावा करने की अनुमति देता है। मैं अपने उत्पाद का विज्ञापन करने की कोशिश नहीं कर रहा हूं, लेकिन मुझे इस लेख का संदर्भ निर्धारित करने की आवश्यकता है। यदि आप इस उत्पाद में अधिक रुचि रखते हैं, तो आप सकते हैं। मैं आपको अपने अनुभव के अलावा कुछ नहीं बेच रहा हूं। यहां और अधिक पढ़ जैसा कि मैंने उल्लेख किया है, हमारे पास एक स्मार्ट अनुबंध है जो वैधकर्ताओं द्वारा अर्जित लेन-देन युक्तियाँ और MEV पुरस्कार प्राप्त करता है। इसका मतलब है कि हमारे स्मार्ट कॉन्ट्रैक्ट में काफी बड़ा बैलेंस है। यह अभी 963+ ईथर ($1.1M) है, और हमारे पास इसमें योगदान देने वाले 8671 सत्यापनकर्ता हैं। एथेरियम निष्पादन और सर्वसम्मति परत के बीच तुल्यकालन के लिए जिम्मेदार महत्वपूर्ण हिस्सा है। यह एक बहुत ही महत्वपूर्ण प्रणाली है जो हमें यह निर्धारित करने की अनुमति देती है कि सत्यापनकर्ता पूल में क्या योगदान दे रहे हैं। ओरेकल ओरेकल पायथन में लिखा गया है, लेकिन इसे जावास्क्रिप्ट में लिखा जा सकता है - समस्या अपरिवर्तित बनी हुई है, और मैं इसे जल्द ही साबित कर दूंगा। आइए कोड में गहराई से गोता लगाएँ! डेटा प्रकार क्यों मायने रखता है स्मार्ट अनुबंध की शेष राशि अब 963,135,554,442,603,402,422 वी (963 ईथर) के बराबर है। यह संख्या न केवल मनुष्यों के लिए बल्कि कंप्यूटरों के लिए भी समझने में कठिन है (भाषा दुभाषिए सटीक होने के लिए)। आइए जावास्क्रिप्ट की जांच करें: const vault_balance = parseInt("963135554442603402422") console.log(vault_balance) // 963135554442603400000 (lost 2422 wei in total) मैंने केवल शेष राशि को से में डाला, और मैं पहले से ही छोटा हूं। हमने अभी तक कोई समीकरण नहीं चलाया। string int 2422 wei इसमें योगदान देने वाले कई सत्यापनकर्ताओं के लिए स्मार्ट कॉन्ट्रैक्ट बैलेंस बहुत अधिक है। अब, आइए गणना करें कि अनुबंध की शेष राशि का औसत सत्यापनकर्ता हिस्सा क्या है: const vault_balance = parseInt("963135554442603402422") const validator_count = 8671 const avg_validator_contribution = vault_balance / validator_count // 111075487768723730 (lost 7 wei per validator) औसत हिस्सा 0.111 ईथर है। लेकिन यह राशि सही नहीं है - हम वास्तव में 7 वी कम हैं। यह कुल मिलाकर है (7 वी गुना 8671 सत्यापनकर्ता)। मैं बाद में सही संख्या दिखाऊंगा। 60,697 wei घाटे के खरगोश के छेद को और नीचे ले जाना - आइए दिए गए सत्यापनकर्ता के प्रति पुरस्कारों की कुल राशि की गणना करें। ध्यान रखें कि उपयोगकर्ता को वैलिडेटर शुरू करने के लिए 32 ईथर जमा करने की आवश्यकता है, इसलिए मैं इसे वैलिडेटर बैलेंस से घटा दूंगा। और मैं एक उदाहरण के रूप में एक यादृच्छिक सत्यापनकर्ता को स्मार्ट अनुबंध में योगदान दूंगा जिसमें 32.779 ईथर का संतुलन है। const vault_balance = parseInt("963135554442603402422") // (lost 2422 wei) const validator_count = 8671 const avg_validator_contribution = vault_balance / validator_count // (lost 7 wei) const initial_deposit = parseInt("32000000000000000000") const validator_balance = parseInt("32779333896000000000") const total_validator_rewards = validator_balance - initial_deposit + avg_validator_contribution // 890409383768723700 (lost 23 wei per validator) इस सत्यापनकर्ता द्वारा अर्जित कुल पुरस्कार 0.8904 ईथर के बराबर है, लेकिन यह मान भी सटीक नहीं है। इस समय, हमने कुल मिलाकर (23 वी गुना 8671 सत्यापनकर्ता) के लिए गलत गणना की। जैसा कि आप देख सकते हैं, संख्याओं की गणना करने का यह तरीका स्थायी नहीं है। 199,443 wei क्या गलत हो जाता है? उपरोक्त कोड के साथ दो समस्याएं हैं: JavaScript में, पूर्णांकों के लिए अधिकतम सुरक्षित मान केवल के बराबर होता है। इसका मतलब है कि यह (0.009 ईथर) तक संभाल सकता है 2^53 - 1 9007199254740991 wei तकनीकी रूप से, हम का उपयोग कर सकते थे लेकिन हमें विभाजन की समस्या होगी। हम "फ्लोटिंग" मूल्यों के साथ समाप्त हो जाएंगे। फ़्लोट्स वित्त में सभी बुराईयों की जड़ हैं क्योंकि वे अनुमानित हैं। इसका मतलब है कि वे सटीकता खो देते हैं। हमें दशमलव का उपयोग करने की आवश्यकता है। (दशमलव और फ्लोट के बीच मुख्य अंतर यह है कि दशमलव सटीक मान संग्रहीत करता है और फ्लोट अनुमानित करता है।) BigInt यदि आपने कभी भी जावास्क्रिप्ट में एथेरियम से संबंधित कोडिंग की है, तो आपने के बारे में सुना होगा। इस लाइब्रेरी में ब्लॉकचेन के साथ इंटरैक्ट करने के लिए सभी आवश्यक सुविधाएं हैं। उपरोक्त समस्या को ठीक करने के लिए, हम नामक टूल में से एक का उपयोग करेंगे जो बहुत बड़ी संख्या का समर्थन करता है और दशमलव को सही तरीके से संभालता है। ethers.js BigNumber हो जाए! const vault_balance = BigNumber.from("963135554442603402422") // no loss const validator_count = BigNumber.from(8671) const avg_validator_contribution = vault_balance.div(validator_count) // no loss // 111075487768723723 const initial_deposit = BigNumber.from("32000000000000000000") const validator_balance = BigNumber.from("32779333896000000000") const total_validator_rewards = validator_balance.sub(initial_deposit).add(avg_validator_contribution) // 890409383768723723 जैसा कि आप देख सकते हैं, अब हम सटीक संख्या के साथ समाप्त हो गए हैं। मुझे कैसे पता चलेगा कि यह वास्तव में सही संख्या है? मैं यह साबित करने के लिए कि मैं सही हूं, पायथन में वही अभ्यास दोहराऊंगा। आइए इसे पायथन में आज़माएं पायथन लंबे पूर्णांक का समर्थन करता है, इसलिए मान अचानक नहीं कटेंगे जैसा कि हमने जावास्क्रिप्ट में देखा है। दुर्भाग्य से, यह अभी भी सभी फ्लोटिंग नंबरों को के रूप में डिफ़ॉल्ट रूप से निर्धारित करता है: float vault_balance = int("963135554442603402422") # no loss validator_count = 8671 avg_validator_contribution = vault_balance / validator_count # 111075487768723728 (5 wei too much) initial_deposit = int("32000000000000000000") validator_balance = int("32779333896000000000") total_validator_rewards = validator_balance - initial_deposit + avg_validator_contribution # 890409383768723712 (lost 11 wei) आश्चर्य है कि वास्तव में यह कहाँ खो गया है? विभाजन ने के बजाय करने के लिए । सही स्निपेट ऐसा दिखाई देगा: decimal float avg_validator_contribution vault_balance = Decimal("963135554442603402422") validator_count = Decimal(8671) avg_validator_contribution = vault_balance / validator_count # 111075487768723723 initial_deposit = Decimal("32000000000000000000") validator_balance = Decimal("32779333896000000000") total_validator_rewards = validator_balance - initial_deposit + avg_validator_contribution # 890409383768723723 अब, पायथन और जावास्क्रिप्ट द्वारा लौटाए गए मान सटीक हैं। अपने आप जांचें! इस प्रकार के नुकसान मामूली हैं, और उन्हें आसानी से याद किया जा सकता है। अक्सर, हम उनके बारे में तब पता लगाते हैं जब वे समय के साथ मिश्रित होते हैं और महत्वपूर्ण संख्या में बढ़ते हैं। इस तरह की स्थितियां न केवल डेवलपर्स के लिए बल्कि वित्त या कानूनी जैसे अन्य विभागों के लिए भी हमेशा सिरदर्द देती हैं। आपको हमेशा अपने फ़ार्मुलों का परीक्षण करना चाहिए, और ऐसा करने के लिए कभी भी अच्छी गोल संख्याओं का उपयोग नहीं करना चाहिए! अगर आप तो यह मेरे लिए दुनिया का मतलब होगा। मैं अपनी गतिविधियों को सॉफ्टवेयर इंजीनियरिंग और ब्लॉकचैन पर केंद्रित कर रहा हूं। मैं अपने अधिकांश काम को ओपन सोर्स कर रहा हूं, इसलिए आप को जांचना चाहेंगे। मुझे ट्विटर पर फॉलो करते हैं मेरे गिटहब