paint-brush
EIP-712 का उपयोग करके एथेरियम गैस रहित मेटाट्रांज़ैक्शनद्वारा@thebojda
1,816 रीडिंग
1,816 रीडिंग

EIP-712 का उपयोग करके एथेरियम गैस रहित मेटाट्रांज़ैक्शन

द्वारा Laszlo Fazekas12m2023/10/17
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

मेटाट्रांसएक्शन के मामले में, उपयोगकर्ता लेनदेन का वर्णन करने वाली एक संरचना बनाता है, और फिर अपनी निजी कुंजी के साथ डिजिटल रूप से हस्ताक्षर करता है। यह किसी के लिए चेक लिखने के समान है। डिजिटल रूप से हस्ताक्षरित लेनदेन को फिर रिले नोड पर भेजा जाता है, जो इसे एक स्मार्ट अनुबंध में जमा करता है। अनुबंध हस्ताक्षर को सत्यापित करता है, और यदि यह वैध है, तो लेनदेन निष्पादित करता है। रिले नोड अनुबंध के निष्पादन के लिए भुगतान करता है।
featured image - EIP-712 का उपयोग करके एथेरियम गैस रहित मेटाट्रांज़ैक्शन
Laszlo Fazekas HackerNoon profile picture
0-item


मैंने हाल ही में कर्मा मनी के बारे में एक लेख लिखा है, जो एक अद्वितीय ईआरसी-20 टोकन पर आधारित एक वैकल्पिक मुद्रा प्रणाली है। मैंने कर्मा मनी की कल्पना एक बंद प्रणाली के रूप में की, जहां उपयोगकर्ता कर्मा के साथ लेनदेन शुल्क का भुगतान भी कर सकते हैं। अपना स्वयं का ब्लॉकचेन बनाना इसे वास्तविकता बनाने का एक तरीका होगा, लेकिन यह एक चुनौतीपूर्ण कार्य है। ब्लॉकचेन की सुरक्षा और विश्वसनीयता सुनिश्चित करने के लिए, हमें आवश्यक बुनियादी ढाँचा और एक पर्याप्त बड़ा समुदाय स्थापित करने की आवश्यकता होगी। मौजूदा ब्लॉकचेन का उपयोग करना बहुत आसान होगा। ग्नोसिस या पॉलीगॉन जैसी श्रृंखलाएं हैं, जो एथेरियम के साथ पूरी तरह से संगत हैं और उनमें लेनदेन शुल्क बहुत कम है। इन श्रृंखलाओं पर ERC20 लेनदेन का शुल्क आम तौर पर 1 सेंट से कम है। समस्या यह है कि इस शुल्क का भुगतान श्रृंखला की अपनी क्रिप्टोकरेंसी में किया जाना चाहिए, जो उपयोगकर्ताओं के लिए श्रृंखला के उपयोग को जटिल बना सकता है। सौभाग्य से, एक ब्रिजिंग समाधान, ईआईपी-712 धातु लेनदेन मौजूद है।


मेटाट्रांसएक्शन के मामले में, उपयोगकर्ता लेनदेन का वर्णन करने वाली एक संरचना बनाता है, और फिर अपनी निजी कुंजी के साथ डिजिटल रूप से हस्ताक्षर करता है। यह किसी के लिए चेक लिखने के समान है। डिजिटल रूप से हस्ताक्षरित लेनदेन को फिर रिले नोड पर भेजा जाता है, जो इसे एक स्मार्ट अनुबंध में जमा करता है। अनुबंध हस्ताक्षर को सत्यापित करता है, और यदि यह वैध है, तो लेनदेन निष्पादित करता है। रिले नोड अनुबंध के निष्पादन के लिए भुगतान करता है।


उदाहरण के लिए, कर्म लेनदेन में, उपयोगकर्ता लेनदेन की राशि (उदाहरण के लिए, 10 कर्म डॉलर), एथेरियम पता प्रदान करता है जहां वे राशि भेजना चाहते हैं, और एक लेनदेन शुल्क (कर्म डॉलर में) जो वे देने को तैयार हैं लेन-देन के लिए. यह संरचना डिजिटल रूप से हस्ताक्षरित है और रिले नोड को भेजी जाती है। यदि नोड को लेनदेन शुल्क स्वीकार्य लगता है, तो यह डिजिटल रूप से हस्ताक्षरित संरचना को कर्म अनुबंध में जमा करता है, जो हस्ताक्षर को सत्यापित करता है और लेनदेन को निष्पादित करता है। चूंकि लेनदेन शुल्क का भुगतान रिले नोड द्वारा ब्लॉकचेन की मूल मुद्रा में किया जाता है, इसलिए उपयोगकर्ता को ऐसा प्रतीत होता है मानो वे अपने स्वयं के ब्लॉकचेन की आवश्यकता के बिना लेनदेन के लिए कर्म डॉलर के साथ भुगतान कर रहे हैं।


सिद्धांत के बाद, आइए अभ्यास पर एक नज़र डालें।


EIP-712 मानक परिभाषित करता है कि मानकीकृत तरीके से संरचित डेटा पैकेज पर हस्ताक्षर कैसे करें। मेटामास्क इन संरचित डेटा को उपयोगकर्ता के लिए पढ़ने योग्य प्रारूप में प्रदर्शित करता है। एक EIP-712 अनुरूप संरचना, जैसा कि मेटामास्क पर दिखाया गया है ( इस URL पर परीक्षण किया जा सकता है ) इस तरह दिखती है:


EIP-712 अनुरूप संरचना


उपरोक्त लेनदेन निम्नलिखित सरल कोड का उपयोग करके उत्पन्न किया गया था:


 async function main() { if (!window.ethereum || !window.ethereum.isMetaMask) { console.log("Please install MetaMask") return } const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); const chainId = await window.ethereum.request({ method: 'eth_chainId' }); const eip712domain_type_definition = { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ] } const karma_request_domain = { "name": "Karma Request", "version": "1", "chainId": chainId, "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" } document.getElementById('transfer_request')?.addEventListener("click", async function () { const transfer_request = { "types": { ...eip712domain_type_definition, "TransferRequest": [ { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" } ] }, "primaryType": "TransferRequest", "domain": karma_request_domain, "message": { "to": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", "amount": 1234 } } let signature = await window.ethereum.request({ "method": "eth_signTypedData_v4", "params": [ accounts[0], transfer_request ] }) alert("Signature: " + signature) }) } main()


Eip712domain_type_definition एक सामान्य संरचना का विवरण है, जिसमें मेटाडेटा शामिल है। नाम फ़ील्ड संरचना का नाम है, संस्करण फ़ील्ड संरचना का परिभाषा संस्करण है, और चेनआईडी और सत्यापन अनुबंध फ़ील्ड निर्धारित करते हैं कि संदेश किस अनुबंध के लिए है। यह सुनिश्चित करने के लिए कि हस्ताक्षरित लेनदेन केवल लक्ष्य अनुबंध पर निष्पादित किया गया है, निष्पादन अनुबंध इस मेटाडेटा को सत्यापित करता है।


कर्मा_रेक्वेस्ट_डोमेन में EIP712डोमेन संरचना द्वारा परिभाषित मेटाडेटा का विशिष्ट मान शामिल है।


वास्तविक संरचना जो हम हस्ताक्षर के लिए मेटामास्क को भेजते हैं, वह ट्रांसफर_रेक्वेस्ट वैरिएबल में निहित है। टाइप ब्लॉक में टाइप परिभाषाएँ होती हैं। यहां, पहला तत्व अनिवार्य EIP712Domain परिभाषा है, जो मेटाडेटा का वर्णन करता है। इसके बाद वास्तविक संरचना परिभाषा आती है, जो इस मामले में ट्रांसफर रिक्वेस्ट है। यह वह संरचना है जो उपयोगकर्ता के लिए मेटामास्क में दिखाई देगी। डोमेन ब्लॉक में मेटाडेटा का विशिष्ट मान होता है, जबकि संदेश में वह विशिष्ट संरचना होती है जिस पर हम उपयोगकर्ता के साथ हस्ताक्षर करना चाहते हैं।


जब कर्म धन की बात आती है, तो मेटाट्रांसएक्शन को एक साथ कैसे रखा जाता है और स्मार्ट अनुबंध में भेजा जाता है इसका एक उदाहरण इस तरह दिखता है:


 const types = { "TransferRequest": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "fee", "type": "uint256" }, { "name": "nonce", "type": "uint256" } ] } let nonce = await contract.connect(MINER).getNonce(ALICE.address) const message = { "from": ALICE.address, "to": JOHN.address, "amount": 10, "fee": 1, "nonce": nonce } const signature = await ALICE.signTypedData(karma_request_domain, types, message) await contract.connect(MINER).metaTransfer(ALICE.address, JOHN.address, 10, 1, nonce, signature) assert.equal(await contract.balanceOf(ALICE.address), ethers.toBigInt(11))


प्रकार चर लेनदेन की संरचना को परिभाषित करता है। "से" प्रेषक का पता है, जबकि "से" प्राप्तकर्ता का पता है। राशि हस्तांतरित किए जाने वाले टोकन की मात्रा को दर्शाती है। शुल्क टोकन की वह "राशि" है जो हम अपने लेनदेन को निष्पादित करने और श्रृंखला की मूल मुद्रा में लागत को कवर करने के बदले में रिले नोड को प्रदान करते हैं। लेन-देन की विशिष्टता सुनिश्चित करने के लिए "नॉन्स" एक काउंटर के रूप में कार्य करता है। इस फ़ील्ड के बिना, एक लेनदेन को कई बार निष्पादित किया जा सकता है। हालाँकि, नॉन्स के लिए धन्यवाद, एक हस्ताक्षरित लेनदेन केवल एक बार निष्पादित किया जा सकता है।


Ethers.js द्वारा प्रदान किया गया साइनटाइप्डडेटा फ़ंक्शन EIP-712 संरचनाओं पर हस्ताक्षर करना आसान बनाता है। यह पहले प्रस्तुत कोड के समान ही काम करता है लेकिन सरल उपयोग के साथ।


मेटाट्रांसफर मेटा-लेनदेन निष्पादित करने के लिए कर्म अनुबंध की विधि है। आइए देखें कि यह कैसे काम करता है:


 function metaTransfer( address from, address to, uint256 amount, uint256 fee, uint256 nonce, bytes calldata signature ) public virtual returns (bool) { uint256 currentNonce = _useNonce(from, nonce); (address recoveredAddress, ECDSA.RecoverError err) = ECDSA.tryRecover( _hashTypedDataV4( keccak256( abi.encode( TRANSFER_REQUEST_TYPEHASH, from, to, amount, fee, currentNonce ) ) ), signature ); require( err == ECDSA.RecoverError.NoError && recoveredAddress == from, "Signature error" ); _transfer(recoveredAddress, to, amount); _transfer(recoveredAddress, msg.sender, fee); return true; }


हस्ताक्षर को मान्य करने के लिए, हमें पहले संरचना का हैश उत्पन्न करना होगा। ऐसा करने के सटीक चरण EIP-712 मानक में विस्तार से वर्णित हैं, जिसमें एक नमूना स्मार्ट अनुबंध और एक नमूना जावास्क्रिप्ट कोड शामिल है।


संक्षेप में, सार यह है कि हम abi.encode का उपयोग करके TYPEHASH (जो संरचना विवरण का हैश है) को संरचना के क्षेत्रों के साथ जोड़ते हैं। फिर एक keccak256 हैश उत्पन्न करता है। हैश को _hashTypedDataV4 विधि में पास कर दिया गया है, जो कर्म अनुबंध में EIP712 OpenZeppelin अनुबंध से विरासत में मिला है। यह फ़ंक्शन हमारी संरचना में मेटाडेटा जोड़ता है और अंतिम हैश उत्पन्न करता है, जिससे संरचना सत्यापन बहुत सरल और पारदर्शी हो जाता है। सबसे बाहरी फ़ंक्शन ECDSA.tryRecover है, जो हैश और हस्ताक्षर से हस्ताक्षरकर्ता का पता पुनर्प्राप्त करने का प्रयास करता है। यदि यह "से" पैरामीटर के पते से मेल खाता है, तो हस्ताक्षर मान्य है। कोड के अंत में, वास्तविक लेनदेन निष्पादित होता है और लेनदेन करने वाले रिले नोड को शुल्क प्राप्त होता है।


ईआईपी-712 हस्ताक्षर संरचनाओं के लिए एक सामान्य मानक है, जो इसे मेटा-लेन-देन को लागू करने के लिए कई उपयोगों में से एक बनाता है। चूँकि हस्ताक्षर को न केवल स्मार्ट अनुबंधों के साथ मान्य किया जा सकता है, यह गैर-ब्लॉकचेन अनुप्रयोगों में भी बहुत उपयोगी हो सकता है। उदाहरण के लिए, इसका उपयोग सर्वर-साइड प्रमाणीकरण के लिए किया जा सकता है, जहां उपयोगकर्ता अपनी निजी कुंजी से अपनी पहचान करता है। ऐसी प्रणाली आमतौर पर क्रिप्टोकरेंसी से जुड़ी उच्च स्तर की सुरक्षा प्रदान कर सकती है, जो केवल हार्डवेयर कुंजी के साथ वेब एप्लिकेशन का उपयोग करने की संभावना की अनुमति देती है। इसके अलावा, मेटामास्क की मदद से व्यक्तिगत एपीआई कॉल पर भी हस्ताक्षर किए जा सकते हैं।


मुझे उम्मीद है कि EIP-712 मानक का यह संक्षिप्त अवलोकन कई लोगों के लिए प्रेरणादायक रहा है और आप इसे ब्लॉकचेन-आधारित और गैर-ब्लॉकचेन परियोजनाओं दोनों में उपयोग करने में सक्षम होंगे।


हर कोड कर्म मनी के GitHub रेपो पर उपलब्ध है।