EIP-1271: स्मार्ट अनुबंध हस्ताक्षरों पर हस्ताक्षर करना और उन्हें सत्यापित करना
EIP-1271 (opens in a new tab) मानक स्मार्ट अनुबंधों को हस्ताक्षरों को सत्यापित करने की अनुमति देता है।
इस ट्यूटोरियल में, हम डिजिटल हस्ताक्षर, EIP-1271 की पृष्ठभूमि और Safe (opens in a new tab) (पहले ग्नोसिस Safe) द्वारा उपयोग किए गए EIP-1271 के विशिष्ट कार्यान्वयन का अवलोकन देते हैं। कुल मिलाकर, यह आपके अपने अनुबंधों में EIP-1271 को लागू करने के लिए एक शुरुआती बिंदु के रूप में काम कर सकता है।
हस्ताक्षर क्या है?
इस संदर्भ में, एक हस्ताक्षर (अधिक सटीक रूप से, एक "डिजिटल हस्ताक्षर") एक संदेश है और साथ ही एक प्रकार का सबूत है कि संदेश एक विशिष्ट व्यक्ति/प्रेषक/पते से आया है।
उदाहरण के लिए, एक डिजिटल हस्ताक्षर इस तरह दिख सकता है:
- संदेश: “मैं अपनी एथेरियम वॉलेट से इस वेबसाइट में लॉग इन करना चाहता हूं।”
- हस्ताक्षरकर्ता: मेरा पता
0x000…है - सबूत: यहां कुछ सबूत है कि मैंने,
0x000…, वास्तव में यह पूरा संदेश बनाया है (यह आमतौर पर कुछ क्रिप्टोग्राफिक होता है)।
यह ध्यान रखना महत्वपूर्ण है कि एक डिजिटल हस्ताक्षर में "संदेश" और "हस्ताक्षर" दोनों शामिल हैं।
क्यों? उदाहरण के लिए, यदि आपने मुझे हस्ताक्षर करने के लिए एक अनुबंध दिया, और फिर मैंने हस्ताक्षर पृष्ठ को काट दिया और आपको अनुबंध के बाकी हिस्सों के बिना केवल मेरे हस्ताक्षर वापस दे दिए, तो अनुबंध मान्य नहीं होगा।
उसी तरह, एक डिजिटल हस्ताक्षर का एक संबंधित संदेश के बिना कोई मतलब नहीं है!
EIP-1271 क्यों मौजूद है?
एथेरियम-आधारित ब्लॉकचेन पर उपयोग के लिए एक डिजिटल हस्ताक्षर बनाने के लिए, आपको आम तौर पर एक गुप्त निजी चाबी की आवश्यकता होती है जिसे कोई और नहीं जानता है। यही वह है जो आपके हस्ताक्षर को आपका बनाता है (गुप्त चाबी के ज्ञान के बिना कोई भी समान हस्ताक्षर नहीं बना सकता है)।
आपके एथेरियम खाते (यानी, आपके बाहरी स्वामित्व वाले खाते/EOA) के साथ एक निजी चाबी जुड़ी हुई है, और यह वह निजी चाबी है जिसका आमतौर पर उपयोग तब किया जाता है जब कोई वेबसाइट या डैप आपसे हस्ताक्षर मांगता है (उदाहरण के लिए, "एथेरियम से लॉग इन करें" के लिए)।
एक ऐप आपके द्वारा ethers.js जैसी किसी थर्ड-पार्टी लाइब्रेरी का उपयोग करके बनाए गए हस्ताक्षर को सत्यापित कर सकता है (opens in a new tab) आपकी निजी चाबी को जाने बिना (opens in a new tab) और विश्वास कर सकता है कि हस्ताक्षर आपने ही बनाया था।
वास्तव में, क्योंकि EOA डिजिटल हस्ताक्षर सार्वजनिक-चाबी क्रिप्टोग्राफ़ी का उपयोग करते हैं, उन्हें ऑफ-चेन उत्पन्न और सत्यापित किया जा सकता है! गैसलेस डाओ वोटिंग इसी तरह काम करती है — ऑन-चेन वोट जमा करने के बजाय, क्रिप्टोग्राफिक लाइब्रेरी का उपयोग करके डिजिटल हस्ताक्षर ऑफ-चेन बनाए और सत्यापित किए जा सकते हैं।
जबकि EOA खातों में एक निजी चाबी होती है, स्मार्ट अनुबंध खातों में किसी भी प्रकार की निजी या गुप्त चाबी नहीं होती है (इसलिए "एथेरियम से लॉग इन करें", आदि मूल रूप से स्मार्ट अनुबंध खातों के साथ काम नहीं कर सकते हैं)।
समस्या जिसे EIP-1271 हल करना चाहता है: हम कैसे बता सकते हैं कि एक स्मार्ट अनुबंध हस्ताक्षर मान्य है यदि स्मार्ट अनुबंध में कोई "रहस्य" नहीं है जिसे वह हस्ताक्षर में शामिल कर सकता है?
EIP-1271 कैसे काम करता है?
स्मार्ट अनुबंधों में निजी चाबियाँ नहीं होती हैं जिनका उपयोग संदेशों पर हस्ताक्षर करने के लिए किया जा सकता है। तो हम कैसे बता सकते हैं कि कोई हस्ताक्षर प्रामाणिक है?
खैर, एक विचार यह है कि हम स्मार्ट अनुबंध से पूछ सकते हैं कि क्या कोई हस्ताक्षर प्रामाणिक है!
EIP-1271 जो करता है वह इस विचार को मानकीकृत करता है कि किसी दिए गए हस्ताक्षर के मान्य होने पर एक स्मार्ट अनुबंध से "पूछना"।
EIP-1271 को लागू करने वाले एक अनुबंध में isValidSignature नामक एक फ़ंक्शन होना चाहिए जो एक संदेश और एक हस्ताक्षर लेता है। अनुबंध तब कुछ सत्यापन तर्क चला सकता है (विनिर्देश यहां कुछ भी विशिष्ट लागू नहीं करता है) और फिर एक मान लौटाता है जो इंगित करता है कि हस्ताक्षर मान्य है या नहीं।
यदि isValidSignature एक मान्य परिणाम लौटाता है, तो यह लगभग अनुबंध कह रहा है "हाँ, मैं इस हस्ताक्षर + संदेश को मंजूरी देता हूँ!"
इंटरफ़ेस
यहाँ EIP-1271 विनिर्देश में सटीक इंटरफ़ेस है (हम नीचे _hash पैरामीटर के बारे में बात करेंगे, लेकिन अभी के लिए, इसे सत्यापित किए जा रहे संदेश के रूप में सोचें):
1pragma solidity ^0.5.0;23contract ERC1271 {45 // bytes4(keccak256("isValidSignature(bytes32,bytes)")6 bytes4 constant internal MAGICVALUE = 0x1626ba7e;78 /**9 * @dev प्रदान किए गए हस्ताक्षर प्रदान किए गए हैश के लिए मान्य है या नहीं, यह वापस करना चाहिए10 * @param _hash हस्ताक्षर किए जाने वाले डेटा का हैश11 * @param _signature _hash से संबद्ध हस्ताक्षर बाइट ऐरे12 *13 * फ़ंक्शन पास होने पर बाइट्स4 मैजिक मान 0x1626ba7e वापस करना होगा।14 * स्टेट को संशोधित नहीं करना चाहिए (solc < 0.5 के लिए STATICCALL का उपयोग करना, solc > 0.5 के लिए व्यू मॉडिफ़ायर)15 * बाहरी कॉलों की अनुमति देनी चाहिए16 */17 function isValidSignature(18 bytes32 _hash,19 bytes memory _signature)20 public21 view22 returns (bytes4 magicValue);23}सभी दिखाएँउदाहरण EIP-1271 कार्यान्वयन: सेफ़
अनुबंध isValidSignature को कई तरीकों से लागू कर सकते हैं - विनिर्देश केवल सटीक कार्यान्वयन के बारे में बहुत कुछ नहीं कहता है।
एक उल्लेखनीय अनुबंध जो EIP-1271 को लागू करता है, वह है Safe (पहले ग्नोसिस Safe)।
सेफ के कोड में, isValidSignature लागू किया गया है (opens in a new tab) ताकि हस्ताक्षरों को दो तरीकों (opens in a new tab) से बनाया और सत्यापित किया जा सके:
- ऑन-चेन संदेश
- निर्माण: एक सेफ़ का मालिक एक संदेश पर "हस्ताक्षर" करने के लिए एक नया सेफ़ लेनदेन बनाता है, संदेश को लेनदेन में डेटा के रूप में पास करता है। एक बार जब पर्याप्त मालिक मल्टीसिग थ्रेसहोल्ड तक पहुंचने के लिए लेनदेन पर हस्ताक्षर कर देते हैं, तो लेनदेन प्रसारित और चलाया जाता है। लेनदेन में, एक सेफ़ फ़ंक्शन होता है जो संदेश को "अनुमोदित" संदेशों की सूची में जोड़ता है।
- सत्यापन: सेफ़ अनुबंध पर
isValidSignatureको कॉल करें, और सत्यापित करने के लिए संदेश को संदेश पैरामीटर के रूप में पास करें और हस्ताक्षर पैरामीटर के लिए एक खाली मान (opens in a new tab) (यानी,0x)। सेफ़ देखेगा कि हस्ताक्षर पैरामीटर खाली है और हस्ताक्षर को क्रिप्टोग्राफ़िक रूप से सत्यापित करने के बजाय, यह बस आगे बढ़ेगा और जांच करेगा कि संदेश "अनुमोदित" संदेशों की सूची में है या नहीं।
- ऑफ-चेन संदेश:
- निर्माण: एक सेफ़ का मालिक ऑफ-चेन एक संदेश बनाता है, फिर अन्य सेफ़ मालिकों से प्रत्येक व्यक्तिगत रूप से संदेश पर हस्ताक्षर करवाता है जब तक कि मल्टीसिग अनुमोदन थ्रेसहोल्ड को पार करने के लिए पर्याप्त हस्ताक्षर न हो जाएं।
- सत्यापन:
isValidSignatureको कॉल करें। संदेश पैरामीटर में, सत्यापित किए जाने वाले संदेश को पास करें। हस्ताक्षर पैरामीटर में, प्रत्येक सेफ़ मालिक के अलग-अलग हस्ताक्षरों को एक साथ, एक के बाद एक जोड़कर पास करें। सेफ़ यह जांच करेगा कि थ्रेसहोल्ड को पूरा करने के लिए पर्याप्त हस्ताक्षर हैं और प्रत्येक हस्ताक्षर मान्य है। यदि ऐसा है, तो यह सफल हस्ताक्षर सत्यापन का संकेत देने वाला एक मान लौटाएगा।
_hash पैरामीटर वास्तव में क्या है? पूरा संदेश क्यों नहीं पास करें?
आपने शायद देखा होगा कि EIP-1271 इंटरफ़ेस (opens in a new tab) में isValidSignature फ़ंक्शन संदेश को ही नहीं, बल्कि _hash पैरामीटर को लेता है। इसका मतलब यह है कि isValidSignature को पूर्ण मनमानी-लंबाई वाले संदेश को पास करने के बजाय, हम संदेश का 32-बाइट हैश (आमतौर पर keccak256) पास करते हैं।
कॉलडेटा का प्रत्येक बाइट - यानी, स्मार्ट अनुबंध फ़ंक्शन को दिया गया फ़ंक्शन पैरामीटर डेटा - 16 गैस (4 गैस यदि शून्य बाइट) (opens in a new tab) की लागत आती है, इसलिए यदि संदेश लंबा है तो इससे बहुत सारी गैस बच सकती है।
पिछले EIP-1271 विनिर्देश
जंगल में EIP-1271 विनिर्देश हैं जिनमें isValidSignature फ़ंक्शन होता है जिसमें bytes प्रकार का पहला पैरामीटर (निश्चित-लंबाई bytes32 के बजाय मनमानी-लंबाई) और पैरामीटर का नाम message होता है। यह EIP-1271 मानक का पुराना संस्करण (opens in a new tab) है।
मेरे अपने अनुबंधों में EIP-1271 को कैसे लागू किया जाना चाहिए?
यहां विनिर्देश बहुत खुला है। सेफ कार्यान्वयन में कुछ अच्छे विचार हैं:
- आप अनुबंध के "मालिक" से EOA हस्ताक्षरों को मान्य मान सकते हैं।
- आप स्वीकृत संदेशों की एक सूची संग्रहीत कर सकते हैं और केवल उन्हें ही मान्य मान सकते हैं।
अंत में, यह अनुबंध डिवेलपर के रूप में आप पर निर्भर है!
निष्कर्ष
EIP-1271 (opens in a new tab) एक बहुमुखी मानक है जो स्मार्ट अनुबंधों को हस्ताक्षरों को सत्यापित करने की अनुमति देता है। यह स्मार्ट अनुबंधों को EOA की तरह अधिक कार्य करने के लिए द्वार खोलता है - उदाहरण के लिए स्मार्ट अनुबंधों के साथ काम करने के लिए "एथेरियम से लॉग इन करें" के लिए एक तरीका प्रदान करना - और इसे कई तरीकों से लागू किया जा सकता है (सेफ में विचार करने के लिए एक गैर-तुच्छ, दिलचस्प कार्यान्वयन है)।
पेज का अंतिम अपडेट: 16 जनवरी 2026