ERC20 Votes
यह माना जाता है कि आपको ERC20 Snapshot का ज्ञान है, इस विषय की शुरुआत के लिए कृपया ERC20 Snapshot पर हमारा लेख देखें।
ERC20 Votes वास्तव में पोल (poll) आयोजित करने का काम नहीं करता है, यह अभी भी स्नैपशॉट (snapshot) और डेलीगेटेड वोटिंग (delegated voting) क्षमताओं के साथ एक सामान्य ERC20 टोकन है। वोटिंग को आमतौर पर गवर्नेंस कॉन्ट्रैक्ट्स (governance contracts) द्वारा संभाला जाता है।
डेलीगेशन (Delegation) का मतलब है कि एक एड्रेस अपनी वोटिंग पावर (voting power) को किसी अन्य एड्रेस पर अपने टोकन ट्रांसफर किए बिना उसे उधार दे सकता है।
ERC20 Snapshot के विपरीत, यह टोकन बैलेंस (token balances) के स्नैपशॉट नहीं रखता है, बल्कि एड्रेसेस की वोटिंग पावर के स्नैपशॉट रखता है।
इसके कुछ मुख्य कारण (motivations) हैं:
- यह पैसिव शेयरधारकों (passive shareholders) को अपनी वोटिंग पावर डेलीगेट करके गवर्नेंस में भाग लेने की अनुमति देता है।
- छोटे बैलेंस वाले अकाउंट्स बिना गैस (gas) खर्च किए वोट कर सकते हैं, क्योंकि डेलीगेटी (delegatee) उनकी ओर से वोटिंग का उपयोग कर रहा है। यह इकोसिस्टम के स्तर पर गैस बचाता है। यदि सभी प्रतिभागियों ने 5 डेलीगेटीज को डेलीगेट किया है, तो किसी विषय पर वोट होने के लिए संभवतः हजारों की बजाय केवल 5 वोट होते हैं।
- और निश्चित रूप से, डबल वोटिंग (double voting) को रोकने के लिए स्नैपशॉटिंग (चेकपॉइंटिंग) आवश्यक है, ठीक वैसे ही जैसे ERC20 Snapshot करता है।
ERC20 Votes, ERC20, ERC6372, और ERC5805 से इनहेरिट (inherit) करता है। इसका मतलब है कि इसमें ERC20 टोकन की सभी कार्यक्षमताएं हैं और साथ ही नीचे वर्णित अतिरिक्त विशेषताएं भी हैं।
ERC5805 कार्यक्षमता
getVotes(address delegate)
यह फ़ंक्शन किसी अकाउंट का एड्रेस लेता है और उसकी कुल वोटिंग पावर लौटाता है। यह balanceOf(delegate) से अधिक हो सकता है यदि अन्य एड्रेसेस ने अपनी वोटिंग पावर इसे डेलीगेट की हो।
delegate(address delegatee)
यह फ़ंक्शन msg.sender को अपनी वोटिंग पावर डेलीगेटी (delegatee) को डेलीगेट करने की अनुमति देता है और डेलीगेटी msg.sender की ओर से वोट करेगा। ध्यान दें कि टोकन डेलीगेटी को ट्रांसफर नहीं किए जाते हैं, केवल वोटिंग पावर ट्रांसफर होती है। किसी भी समय एक अलग डेलीगेटी या address(0) के साथ फिर से delegate कॉल करके डेलीगेशन को बदला या रद्द किया जा सकता है।
डेलीगेशन पूर्ण रूप से होता है या बिल्कुल नहीं (all or nothing)। वोटिंग पावर के किसी एक हिस्से (fraction) को डेलीगेट करने का कोई विकल्प नहीं है।
यह ध्यान रखना महत्वपूर्ण है कि किसी एड्रेस के वोट गिने जाने से पहले उसे स्वयं को डेलीगेट करना होगा। यह विशेषता गैस एफिशिएंसी (gas efficiency) कारणों से पेश की गई है।
delegates(address account)
यह फ़ंक्शन उस अकाउंट को लौटाता है जिसे तर्क (argument) में दिए गए account ने अपनी वोटिंग पावर डेलीगेट की है।
delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s)
फ़ंक्शन delegateBySig किसी उपयोगकर्ता को गैसलेस ट्रांजेक्शन (gasless transaction) के माध्यम से वोटिंग पावर डेलीगेट करने की अनुमति देता है और कोई अन्य अकाउंट गैस शुल्क (gas fee) का भुगतान करके ट्रांजेक्शन को एग्जीक्यूट (execute) कर सकता है।
एक्सपायरेशन (expiration) वह समय निर्धारित करता है जिसके दौरान डेलीगेशन मान्य होता है, और v, r, और s एलिप्टिक कर्व डिजिटल सिग्नेचर (Elliptic Curve Digital Signature) के घटक हैं।
यह सिग्नेचर EIP 712 प्रारूप में होने की उम्मीद है। आंतरिक रूप से, कॉन्ट्रैक्ट प्रति एड्रेस nonce को बढ़ाता है, जिसका वर्णन आगे किया गया है।
nonces(address account)
रिप्ले हमलों (replay attacks) को रोकने के लिए सिग्नेचर को एक nonce की आवश्यकता होती है, इसलिए nonce का आंतरिक ट्रैकर इस फ़ंक्शन के माध्यम से उजागर किया जाता है। इससे हस्ताक्षरकर्ता (signer) को यह जानने में मदद मिलती है कि उन्हें आगे किस वैल्यू पर हस्ताक्षर करना चाहिए।
getPastVotes(account, timepoint)
जैसा कि हमारे ERC20 Snapshot article में चर्चा की गई है, जब तक अकाउंट बैलेंस का स्नैपशॉट नहीं लिया जाता, तब तक डबल वोटिंग अटैक हो सकता है। यहीं पर एक बैलट कॉन्ट्रैक्ट (ballot contract) पिछले स्नैपशॉट को देखेगा।
ERC20 snapshot के विपरीत, किसी एड्रेस द्वारा snapshot फ़ंक्शन को कॉल करने से स्नैपशॉट ट्रिगर नहीं होता है। एक स्नैपशॉट प्रति अकाउंट तब ट्रिगर होता है जब इनमें से कोई एक घटना होती है:
- मिंटिंग (minting)
- बर्निंग (burning)
- ट्रांसफर (transfer)
- कोई अपने वोट डेलीगेट करता है
हर बार जब इनमें से कोई एक घटना होती है, तो वोटिंग पावर और टाइमस्टैम्प (timestamp) वाला एक स्ट्रक्चर (struct) एक ऐरे (array) में जुड़ जाता है जो उस उपयोगकर्ता की वोटिंग पावर का इतिहास स्टोर करता है।
ERC20 Snapshot की तरह, ERC20 Votes टाइमपॉइंट के बाद सबसे शुरुआती चेकपॉइंट (checkpoint) खोजने के लिए टाइमस्टैम्प पर बाइनरी सर्च (binary search) करेगा। उस टाइमपॉइंट पर मौजूद वोटिंग पावर लौटा दी जाती है।
इसका मतलब यह है कि, ERC20 snapshot के विपरीत, इसमें कोई “ग्लोबल” स्नैपशॉट आईडी नहीं है। यदि आप अतीत के किसी बिंदु को खोजना चाहते हैं, तो आप एक टाइमस्टैम्प या ब्लॉक नंबर चुनते हैं और उसे फ़ंक्शन को “timepoint” के रूप में प्रदान करते हैं।
Events
ERC5805 में दो इवेंट्स (events) हैं जो वही दर्शाते हैं जो उनका नाम बताता है: DelegateChange और DelegateVotesChanged।
ERC5805 एक इंटरफ़ेस है, टोकन नहीं
इस लेख में, हम ERC20 Votes की व्याख्या कर रहे हैं, लेकिन इसका मतलब यह नहीं है कि ERC5805 एक फंजिबल टोकन (fungible token) ही होना चाहिए। यह एक NFT हो सकता है, या यहां तक कि किसी अन्य तरीके से प्रबंधित वोटों का लेखा-जोखा भी हो सकता है, जैसे कि एक सेंट्रलाइज्ड एंटिटी (centralized entity) एड्रेसेस को वोट असाइन करती है, लेकिन यह इस बात का एक अपरिवर्तनीय इतिहास (immutable history) रखना चाहती है कि वोटिंग पावर कैसे वितरित की गई थी।
ERC6372
हमने कुछ हद तक यह मान लिया था कि कॉन्ट्रैक्ट चेकपॉइंट को रिकॉर्ड करने के बहीखाते (bookkeeping) के लिए block.timestamp का उपयोग कर रहा था। हालाँकि, कुछ कॉन्ट्रैक्ट्स block.number या इन ग्लोबल वेरिएबल्स के किसी मोनोटोनिकली इंक्रीजिंग फ़ंक्शन (monotonically increasing function) का उपयोग कर सकते हैं।
ERC6372 एक स्टैण्डर्ड है जो कॉन्ट्रैक्ट्स को यह पूछने की अनुमति देता है कि कॉन्ट्रैक्ट किस प्रकार की “घड़ी” (clock) का उपयोग कर रहा है। इसके दो फ़ंक्शंस हैं:
clock()
यह एक uint48 लौटाता है जो ब्लॉक नंबर या ब्लॉक टाइमस्टैम्प या इनका कोई फ़ंक्शन हो सकता है। uint48 को इसलिए चुना गया क्योंकि इसमें समय के सभी उचित अभ्यावेदन (representations) और ब्लॉक नंबर को मानवता द्वारा दर्ज किए गए इतिहास से बहुत आगे भविष्य तक दर्शाने के लिए पर्याप्त बिट्स (bits) हैं।
CLOCK_MODE()
हाँ, Solidity में स्नेक-केस (snake-case) और पूरी तरह से अपरकेस फ़ंक्शन बहुत ही असामान्य है, लेकिन EIP यही निर्दिष्ट करता है। यह एक स्ट्रिंग लौटाता है जो पाठक को बताता है कि घड़ी किस इकाई (unit) का उपयोग करती है।
- यदि यह एक टाइमस्टैम्प है, तो यह “mode=timestamp” होगा।
- यदि यह एक ब्लॉक नंबर है तो यह
mode=blocknumber&from=defaultहोगा।
इसका मतलब है कि यह केवल block.number वेरिएबल का उपयोग कर रहा है। यदि यह किसी अन्य ब्लॉक से शुरू हो रहा था, तो इसे चेन आईडी (chain id) और उस ब्लॉक नंबर को निर्दिष्ट करना होगा जहां से यह शुरू हो रहा है। उदाहरण के लिए, Avalanche की चेन आईडी 43114 है, इसलिए यदि यह 100वें ब्लॉक से शुरू हो रहा था तो CLOCK_MODE()`` से प्रतिक्रिया mode=blocknumber&from=43114:100` होगी।
EIP 6372 में कोई इवेंट्स नहीं हैं।
अधिक विवरण के लिए, EIP देखें, जो वास्तव में काफी पढ़ने योग्य है। ध्यान दें कि यह EIP अभी फाइनल (finalized) नहीं हुआ है।
ERC20 Snapshot के साथ अंतर का सारांश
समय की धारणा (Notion of time)
- ERC20 Votes में समय की एक स्पष्ट धारणा है
- ERC20 Snapshot इंक्रीमेंटिंग आईडी (incrementing ids) का उपयोग करता है जो एक काउंटर होने के उपोत्पाद (byproduct) के रूप में समय के साथ बढ़ते हैं
क्या रिकॉर्ड किया जाता है
- ERC20 Votes वोटिंग पावर का स्नैपशॉट लेता है
- ERC20 Snapshot बैलेंस का ट्रैक रखता है
चेकपॉइंट्स कब अपडेट किए जाते हैं
- ERC20 Votes जब भी कोई डेलीगेशन या ट्रांसफर होता है तब अपडेट होता है
- ERC20 Snapshot को
_snapshot()के लिए एक स्पष्ट कॉल की आवश्यकता होती है
ERC20 Snapshot का उपयोग करें या Votes का
ERC20 Snapshot या Voting का उपयोग करने का विकल्प ज्यादातर इस बात पर निर्भर करता है कि क्या वोटों को डेलीगेट करने की आवश्यकता है, या अधिक अमूर्त रूप से (abstractly), कोई ऐसा अधिकार जो ERC20 टोकन प्रदान करता है।
अधिक जानें
हमारा एडवांस solidity programming bootcamp और हमारे अन्य blockchain bootcamp प्रोग्राम्स देखें।
मूल रूप से 23 फरवरी, 2023 को प्रकाशित