ERC-20 टोकन के दशमलव: कच्चे बैलेंस से पढ़ने योग्य मात्रा निकालें
कॉन्ट्रैक्ट की बड़ी पूर्णांक संख्या टोकन की छोटी मात्रा बता सकती है। वॉलेट बैलेंस की तुलना से पहले इकाइयां जांचें।
ERC-20 के कच्चे बैलेंस को पढ़ने योग्य टोकन मात्रा में बदलने के लिए पूर्णांक को दस की उस घात से भाग दें जिसका घातांक टोकन के सत्यापित दशमलव स्थानों की संख्या है। ऐसा तभी करें जब मान अभी कच्ची आधार इकाइयों में हो। वॉलेट या एक्सप्लोरर यह रूपांतरण पहले ही कर सकता है।
उदाहरण के लिए, 6 दशमलव स्थानों के साथ कच्चा बैलेंस 1234567 1.234567 टोकन दर्शाता है। वही कच्चा पूर्णांक 18 दशमलव स्थानों के साथ 0.000000000001234567 टोकन है। कोई भी परिणाम डॉलर मूल्य नहीं बताता। ये गणना के काल्पनिक उदाहरण हैं, वॉलेट से पढ़े गए बैलेंस नहीं।
बैलेंस पढ़ते समय दशमलव क्या बदलते हैं
ERC-20 कॉन्ट्रैक्ट की balanceOf विधि पूर्णांक लौटाती है। ERC-20 विनिर्देश में decimals को उपयोगकर्ता को टोकन मात्रा दिखाने का पैमाना बताया गया है। पूर्णांक को टोकन की सबसे छोटी लेखा इकाइयों की गिनती समझें; दशमलव बताते हैं कि स्क्रीन पर दशमलव बिंदु कहां रखा जाए।
गणना इस प्रकार है:
पढ़ने योग्य टोकन मात्रा = कच्चा पूर्णांक भाग (दस की घात, जिसका घातांक दशमलव स्थानों की संख्या है)।
इस लेख में हर कच्चा पूर्णांक दस के आधार में, हजार के विभाजक के बिना लिखा गया है। 0x से शुरू होने वाले हेक्साडेसिमल मान को पहले पूर्णांक में डिकोड करना होगा। उस एन्कोडिंग के अक्षर और अंक दशमलव टोकन मात्रा नहीं हैं जिन्हें बिना बदले इस भाग में रख दिया जाए।
एक ही काल्पनिक पूर्णांक तीन अलग पैमानों पर ऐसा दिखता है:
| कच्चा पूर्णांक | दशमलव स्थान | टोकन मात्रा |
|---|---|---|
1234567 |
6 | 1.234567 |
1234567 |
18 | 0.000000000001234567 |
1234567 |
0 | 1234567 |
0 दशमलव स्थानों पर भाजक 1 है। 6 स्थानों पर एक पूरा टोकन 1000000 कच्ची इकाइयों के बराबर है। 18 पर यह 1000000000000000000 कच्ची इकाइयों के बराबर है। केवल पूर्णांक का आकार नहीं बता सकता कि कौन सा पैमाना लागू होता है।
गणना से पहले पैमाना सत्यापित करें
नेटवर्क और टोकन कॉन्ट्रैक्ट के पूरे पते से शुरू करें। प्रतीक एक लेबल है, अनूठी पहचान नहीं। कौन सा पता टोकन का है और कौन धारक का, यह स्पष्ट न हो तो पहले वॉलेट पते और टोकन कॉन्ट्रैक्ट की गाइड पढ़ें।
कॉन्ट्रैक्ट की पहचान के लिए उस नेटवर्क की परियोजना की आधिकारिक डिप्लॉयमेंट जानकारी इस्तेमाल करें। फिर विश्वसनीय एक्सप्लोरर या कॉन्ट्रैक्ट रीडर से केवल पढ़ने वाले decimals का परिणाम देखें। उसे कॉन्ट्रैक्ट और नेटवर्क के साथ दर्ज करें। किसी दूसरे डिप्लॉयमेंट से पढ़ा मेटाडेटा आपकी होल्डिंग का पैमाना तय नहीं करता।
दशमलव का मान न मिले तो उसकी जगह 18 न भरें। ERC-20 में यह विधि वैकल्पिक है। OpenZeppelin के ERC20 संदर्भ में उसके कार्यान्वयन का डिफॉल्ट 18 बताया गया है, जिसे बदला जा सकता है। कार्यान्वयन का डिफॉल्ट सभी टोकन का नियम नहीं है। वही संदर्भ समझाता है कि दशमलव केवल प्रदर्शन का स्वरूप तय करते हैं; वे कॉन्ट्रैक्ट की पूर्णांक बैलेंस और ट्रांसफर गणना नहीं बदलते।
रीडिंग विफल हो तो अनुपलब्ध स्रोत और उपयोगी मेटाडेटा न देने वाले कॉन्ट्रैक्ट में अंतर करें। उसी डिप्लॉयमेंट के लिए कोई विश्वसनीय स्रोत आजमाएं या उसके कार्यान्वयन के दस्तावेज देखें। पैमाना फिर भी तय न हो तो कच्चा पूर्णांक सुरक्षित रखें और पढ़ने योग्य मात्रा को अनिर्णीत चिह्नित करें। उचित दिखती संख्या सत्यापित रूपांतरण नहीं है।
जांचें कि संख्या पहले से बदली हुई तो नहीं है
सूत्र लगाने से पहले फ़ील्ड का लेबल और स्रोत के दस्तावेज पढ़ें। कॉन्ट्रैक्ट का कच्चा परिणाम, API की सामान्यीकृत मात्रा और वॉलेट का राउंड किया प्रदर्शन एक ही होल्डिंग को अलग तरह से दिखा सकते हैं। दशमलव बिंदु स्वरूप बदले होने का संकेत है, लेकिन उसका न होना कच्चे मान का प्रमाण नहीं: बदली हुई मात्रा ठीक 2 टोकन भी हो सकती है।
6 दशमलव स्थानों वाले काल्पनिक टोकन में कच्चा 2500000 2.5 टोकन बनता है। वॉलेट पहले ही 2.5 टोकन दिखा रहा हो तो उस प्रदर्शित संख्या को 1000000 से भाग देने पर 0.0000025 मिलता है, जो गलत दूसरा रूपांतरण है।
सटीक टोकन मात्रा मिलने के बाद प्रदर्शन के लिए राउंडिंग अलग से करें। 6 दशमलव स्थानों के साथ कच्चा 1 0.000001 टोकन है। 4 दशमलव स्थानों तक सीमित इंटरफ़ेस 0.0000 दिखा सकता है। यह राउंड किया लेबल खाली बैलेंस सिद्ध नहीं करता। अंतर जांचते समय सटीक परिणाम उपलब्ध रखें और स्रोत की सटीकता से अधिक सार्थक अंक न गढ़ें।
स्क्रिप्ट या स्प्रेडशीट के लिए कच्चे पूर्णांक को स्वरूप बदलने तक टेक्स्ट या सटीक पूर्णांक के रूप में रखें। जैसा MDN का सुरक्षित पूर्णांक संदर्भ समझाता है, बड़े पूर्णांक साधारण JavaScript Number में सटीकता खो सकते हैं; भाग देने से खोई सटीकता वापस नहीं आती। ethers v6 के दस्तावेज में formatUnits है, जो दशमलव स्ट्रिंग लौटाता है। सत्यापित दशमलव संख्या स्पष्ट रूप से दें और सुविधा के लिए उसे असटीक संख्या में बदलने के बजाय स्ट्रिंग ही रखें।
टोकन हिलाए बिना दो रीडिंग का मिलान करें
जांच के लिए एक ही होल्डिंग लें। सार्वजनिक कॉन्ट्रैक्ट डेटा पढ़ने के लिए ट्रांसफर, स्वीकृति, रिकवरी फ़्रेज़ या वॉलेट हस्ताक्षर जरूरी नहीं।
- पहचान तय करें। नेटवर्क, धारक का सार्वजनिक पता और सत्यापित टोकन कॉन्ट्रैक्ट दर्ज करें। बैलेंस पढ़ते समय धारक की जगह कॉन्ट्रैक्ट का पता न रखें।
- अवलोकन दर्ज करें। उपलब्ध हो तो समय और ब्लॉक संख्या रखें। एक ही ब्लॉक की रीडिंग बेहतर हैं; अन्यथा अवलोकनों के बीच ट्रांसफर के कारण सटीक मिलान नहीं हो सकता।
- इनपुट को लेबल दें। मूल मान, वह कच्चा है या बदला हुआ, और कॉन्ट्रैक्ट के दशमलव का प्रमाण बचाएं। स्रोत इकाइयां स्पष्ट न करे तो रूपांतरण वहीं रोकें।
- एक बार पैमाना लगाएं। उन्हीं दशमलवों से कच्चा पूर्णांक बदलें और प्रदर्शन की राउंडिंग से पहले सटीक अंक रखें। पहले से टोकन इकाइयों में दी मात्रा को वैसा ही रहने दें।
- एक जैसी इकाइयां तुलना करें। उस टोकन मात्रा को दूसरी स्क्रीन की टोकन मात्रा से तुलनीय सटीकता पर मिलाएं। राउंड किए शून्य के लिए, कच्चा बैलेंस शून्य मानने से पहले अधिक विवरण मांगें।
- बचा अंतर संभालें। पहचान, समय का स्नैपशॉट और इकाइयां मिलने पर भी मात्रा अलग हो तो दोनों रीडिंग और स्रोत दर्ज करें। स्रोत विफल हो तो शून्य भरने के बजाय रीडिंग को अनुपलब्ध लिखें। पोर्टफोलियो अंतर की गाइड स्रोत के गायब जवाब, कीमतों और शामिल पोज़िशन के दायरे को समझाती है।
उपयोगी परिणाम ऐसा रिकॉर्ड है जिसे दूसरा व्यक्ति दोहरा सके: कौन सा कॉन्ट्रैक्ट, किसका बैलेंस, कौन सा अवलोकन, क्या कच्चा मान, कितने दशमलव और कितनी बदली मात्रा। रूपांतरण साबित करने के लिए लेनदेन जरूरी नहीं है।
टोकन मात्रा को मूल्य से अलग रखें
स्वरूप बदलने से इस टोकन की गिनती मिलती है। डॉलर अनुमान के लिए उसी सटीक परिसंपत्ति की, बताई हुई मुद्रा और समय पर कीमत भी चाहिए। दशमलव उस कीमत, ट्रेडिंग तरलता या कॉन्ट्रैक्ट सुरक्षा को साबित नहीं करते। अनजान टोकन भी बिल्कुल सामान्य दशमलव मान लौटा सकता है।
रसीद या रैपर टोकन एक और प्रश्न लाता है: हर टोकन कितनी मूल परिसंपत्ति दर्शाता है? उसका कच्चा बैलेंस बदलने से रसीद या रैपर टोकन की मात्रा मिलती है। मूल परिसंपत्ति के बराबर मात्रा के लिए संबंधित प्रोटोकॉल का रूपांतरण तरीका और इकाइयां चाहिए। टोकन के दशमलव उस विनिमय दर की जगह नहीं ले सकते, और हेल्थ फ़ैक्टर जैसे प्रोटोकॉल अनुपात को अपना दस्तावेजित पैमाना चाहिए।
संख्या फिर भी गलत लगे तो जरूरी अनिश्चितता दर्ज रहने दें। अज्ञात दशमलव पढ़ने योग्य मात्रा को अनिर्णीत छोड़ते हैं। ज्ञात मात्रा लेकिन अज्ञात कीमत मूल्यांकन को अनिर्णीत छोड़ती है। इन कमियों को स्पष्ट रखने से अगली उपयोगी जांच मिलती है, बिना उस होल्डिंग को बदले जिसे आप समझना चाहते हैं।
अक्सर पूछे जाने वाले सवाल
क्या सभी ERC-20 टोकन 18 दशमलव स्थान इस्तेमाल करते हैं?
नहीं। OpenZeppelin के ERC20 कार्यान्वयन में डिफॉल्ट 18 है, लेकिन ERC-20 मानक यह मान अनिवार्य नहीं करता। उसकी decimals विधि भी वैकल्पिक है। कच्चा बैलेंस बदलने से पहले सही कॉन्ट्रैक्ट और नेटवर्क के दशमलव स्थानों की संख्या सत्यापित करें।
क्या वॉलेट में दिख रही मात्रा को टोकन के दशमलव के अनुसार भाग देना चाहिए?
केवल उस मात्रा को बदलना चाहिए जिसके दस्तावेज उसे कच्ची आधार इकाइयों में बताते हैं। वॉलेट पहले ही पढ़ने योग्य टोकन मात्रा दिखा सकता है। बदली हुई मात्रा को दोबारा भाग देने से परिणाम गलत होता है; पहले पढ़े जा रहे फ़ील्ड की इकाइयां पता करें।
क्या स्क्रीन पर शून्य दिखना साबित करता है कि मेरा टोकन बैलेंस खाली है?
नहीं। स्क्रीन छोटी धनात्मक मात्रा को राउंड करके शून्य दिखा सकती है। अधिक सटीक मात्रा देखें या सत्यापित दशमलव के साथ कच्चा बैलेंस जांचें। कच्चे बैलेंस की सफल रीडिंग का शून्य होना और रीडिंग उपलब्ध न होना अलग परिणाम हैं।