सरकार कहती है कि हम मंदी के दौर में नहीं हैं, लेकिन साथ ही, हम आसमान छूती महंगाई, ब्याज दर में बढ़ोतरी और अर्थव्यवस्था के लगभग हर क्षेत्र में छंटनी के बारे में सुनते हैं।
क्रिप्टो और ट्रेडफाई के सबसे गंभीर रूप से प्रभावित होने के बावजूद, कई कंपनियां अभी भी अपने टोकन, प्रोटोकॉल और डेफी उत्पादों का निर्माण कर रही हैं। क्या आप उनमें से एक हैं?
आज, मैं डेटा प्रकारों पर बोलूंगा, और रुकिए। मुझे एक बहुत जरूरी बात कहनी है। आप मुझे MIT के एक 60+ वर्षीय प्रोफेसर के रूप में देख सकते हैं जो छात्रों को उन विषयों के बारे में व्याख्यान देते हैं जो अब मायने नहीं रखते। लेकिन यह सच नहीं है।
डेटा प्रकार अभी भी महत्वपूर्ण हैं, और उनकी उपेक्षा करने से गंभीर परिणाम सामने आते हैं। मैं संक्षेप में सभी संभावित मुद्दों के माध्यम से जाने और उन्हें संबोधित करने की कोशिश करूंगा ताकि आपको यह न लगे कि इस लेख को पढ़ने में आपके द्वारा खर्च किया गया 8 मिनट बर्बाद हो गया है।
जावास्क्रिप्ट और पायथन जैसी आधुनिक भाषाएँ चर के प्रकार को निर्धारित करने के लिए "डक टाइपिंग" का उपयोग कर रही हैं। यदि हम इस प्रकार के सूत्र a = 2 + 2
को एक चर के लिए निर्दिष्ट करते हैं, तो भाषा दुभाषिया जानता है कि यह संख्याओं के साथ काम कर रहा है, और यह इस शाब्दिक पर गणितीय कार्य करेगा।
बत्तख टाइपिंग को इस वाक्य द्वारा समझाया जा सकता है: "यदि यह बत्तख की तरह चलता है और यह बत्तख की तरह बोलता है, तो यह बत्तख होना चाहिए"। जब आप इसके अर्थ को करीब से देखते हैं - यह सही समझ में आता है। यदि शाब्दिक में अक्षर और संख्याएँ हैं, तो यह एक स्ट्रिंग होनी चाहिए, और यह स्पष्ट है। लेकिन क्या होगा अगर इसमें नंबर हैं?
क्या यह एक boolean
, integer
, decimal
, float
या date
। ज्यादातर मामलों में, आपका भाषा दुभाषिया प्रकारों को सही तरीके से हैंडल करेगा। समस्या तब शुरू होती है जब आपके प्रोग्राम को बड़ी संख्या में (यहां तक कि सरल) समीकरणों को चलाने की आवश्यकता होती है।
"अगर यह एक बत्तख की तरह चलता है और यह एक बत्तख की तरह कांपता है, तो यह एक बत्तख होना चाहिए", है ना? वास्तव में ऐसा नहीं है।
अगले पैराग्राफ में, मैं एथेरियम के सामान्य संप्रदायों - wei
और gwei
का जिक्र कर रहा हूं। मैं आपको संक्षेप में उनसे मिलवाता हूं ताकि हम आम भाषा बोल सकें।
सबसे छोटा मूल्यवर्ग 1 वेई है, और 1 ईथर 1,000,000,000,000,000,000 वेई (18 शून्य) के बराबर है । मैं दोहराता हूँ - 18 शून्य। इतनी बड़ी संख्या के बारे में अपने दिमाग को लपेटना कठिन है, लेकिन वे बहुत फर्क करते हैं और बहुत मायने रखते हैं।
अगला आम संप्रदाय 1 जीवीई है। 1 ईथर 1,000,000,000 gwei (9 शून्य) के बराबर है । Gwei मनुष्यों के लिए अधिक सहने योग्य है - अंत में, हर कोई करोड़पति बनना चाहता है, है ना? (पलक पलक)
आइए इसे जोड़ते हैं - 1 ईथर बराबर:
तकनीकी नोट: एथेरियम की दो परतें हैं - निष्पादन परत और सर्वसम्मति परत। निष्पादन परत ईथर मूल्यों का प्रतिनिधित्व करने के लिए वीई का उपयोग कर रही है, और आम सहमति परत जीवीई का उपयोग कर रही है। यदि आप एक ब्लॉकचेन डेवलपर हैं, तो आपको दोनों के साथ बातचीत करना सीखना होगा।
मैं स्टेकफिश में एक सॉफ्टवेयर इंजीनियर हूं। मैं अपने डेफी उत्पादों के पैलेट के निर्माण के लिए जिम्मेदार हूं, और सबसे हालिया लोगों में से एक एथेरियम के लिए हमारा टिप और एमईवी पूल है।
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 वी कम हैं। यह कुल मिलाकर 60,697 wei
है (7 वी गुना 8671 सत्यापनकर्ता)। मैं बाद में सही संख्या दिखाऊंगा।
घाटे के खरगोश के छेद को और नीचे ले जाना - आइए दिए गए सत्यापनकर्ता के प्रति पुरस्कारों की कुल राशि की गणना करें। ध्यान रखें कि उपयोगकर्ता को वैलिडेटर शुरू करने के लिए 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 ईथर के बराबर है, लेकिन यह मान भी सटीक नहीं है। इस समय, हमने कुल मिलाकर 199,443 wei
(23 वी गुना 8671 सत्यापनकर्ता) के लिए गलत गणना की। जैसा कि आप देख सकते हैं, संख्याओं की गणना करने का यह तरीका स्थायी नहीं है।
उपरोक्त कोड के साथ दो समस्याएं हैं:
2^53 - 1
के बराबर होता है। इसका मतलब है कि यह 9007199254740991 wei
(0.009 ईथर) तक संभाल सकता है
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
अब, पायथन और जावास्क्रिप्ट द्वारा लौटाए गए मान सटीक हैं। अपने आप जांचें!
इस प्रकार के नुकसान मामूली हैं, और उन्हें आसानी से याद किया जा सकता है। अक्सर, हम उनके बारे में तब पता लगाते हैं जब वे समय के साथ मिश्रित होते हैं और महत्वपूर्ण संख्या में बढ़ते हैं।
इस तरह की स्थितियां न केवल डेवलपर्स के लिए बल्कि वित्त या कानूनी जैसे अन्य विभागों के लिए भी हमेशा सिरदर्द देती हैं। आपको हमेशा अपने फ़ार्मुलों का परीक्षण करना चाहिए, और ऐसा करने के लिए कभी भी अच्छी गोल संख्याओं का उपयोग नहीं करना चाहिए!
अगर आप मुझे ट्विटर पर फॉलो करते हैं तो यह मेरे लिए दुनिया का मतलब होगा। मैं अपनी गतिविधियों को सॉफ्टवेयर इंजीनियरिंग और ब्लॉकचैन पर केंद्रित कर रहा हूं। मैं अपने अधिकांश काम को ओपन सोर्स कर रहा हूं, इसलिए आप मेरे गिटहब को जांचना चाहेंगे।