तैनाती से पहले स्मार्ट अनुबंध का पता कैसे निर्धारित करें: क्रिप्टो एक्सचेंज के लिए CREATE2 का उपयोग करना

ब्लॉकचेन का विषय न केवल सभी प्रकार के प्रचार का स्रोत बनता है, बल्कि तकनीकी दृष्टिकोण से बहुत मूल्यवान विचारों का भी स्रोत बनता है। इसलिए, इसने धूप वाले शहर के निवासियों को नजरअंदाज नहीं किया। लोग पारंपरिक सूचना सुरक्षा में अपनी विशेषज्ञता को ब्लॉकचेन सिस्टम में स्थानांतरित करने की कोशिश कर रहे हैं, अध्ययन कर रहे हैं। अब तक, यह सही है: रोस्टेलकॉम-सोलर के विकासों में से एक ब्लॉकचेन-आधारित सॉफ़्टवेयर की सुरक्षा की जांच कर सकता है। और साथ ही, ब्लॉकचेन समुदाय की व्यावहारिक समस्याओं को हल करने पर कुछ विचार उठते हैं। इन लाइफ हैक्स में से एक - CREATE2 का उपयोग करके तैनाती से पहले एक स्मार्ट अनुबंध का पता कैसे निर्धारित करें - आज मैं कट के तहत आपके साथ साझा करना चाहता हूं।

तैनाती से पहले स्मार्ट अनुबंध का पता कैसे निर्धारित करें: क्रिप्टो एक्सचेंज के लिए CREATE2 का उपयोग करना
CREATE2 ऑपकोड को इस वर्ष 28 फरवरी को कॉन्स्टेंटिनोपल हार्ड फोर्क में जोड़ा गया था। जैसा कि ईआईपी में कहा गया है, यह ऑपकोड मुख्य रूप से राज्य चैनलों के लिए पेश किया गया था। हालाँकि, हमने इसका उपयोग एक अलग समस्या को हल करने के लिए किया।

ऐसे उपयोगकर्ता हैं जिनके पास एक्सचेंज पर शेष राशि है। हमें प्रत्येक उपयोगकर्ता को एक एथेरियम पता प्रदान करना होगा, जिस पर कोई भी टोकन भेज सकता है, जिससे उनके खाते की भरपाई हो सके। आइए इन पतों को "वॉलेट" कहें। जब टोकन वॉलेट में आते हैं, तो हमें उन्हें एक ही वॉलेट (हॉटवॉलेट) में भेजना होगा।

निम्नलिखित अनुभागों में, मैं CREATE2 के बिना इस समस्या को हल करने के विकल्पों का विश्लेषण करूंगा और आपको बताऊंगा कि हमने उन्हें क्यों छोड़ दिया। यदि आप केवल अंतिम परिणाम में रुचि रखते हैं, तो आप इसे "अंतिम समाधान" अनुभाग में पा सकते हैं।

एथेरियम पते

सबसे सरल समाधान नए उपयोगकर्ताओं के लिए नए एथेरियम पते उत्पन्न करना है। ये पते वॉलेट होंगे. वॉलेट से हॉटवॉलेट में टोकन स्थानांतरित करने के लिए, आपको फ़ंक्शन को कॉल करके लेनदेन पर हस्ताक्षर करना होगा स्थानांतरण () बैकएंड से वॉलेट की निजी कुंजी के साथ।

इस दृष्टिकोण के निम्नलिखित फायदे हैं:

  • यह बस है
  • वॉलेट से हॉटवॉलेट में टोकन स्थानांतरित करने की लागत फ़ंक्शन कॉल की लागत के बराबर है स्थानांतरण ()

हालाँकि, हमने इस दृष्टिकोण के विरुद्ध निर्णय लिया क्योंकि इसमें एक बड़ी खामी है: आपको निजी कुंजियाँ कहीं संग्रहीत करने की आवश्यकता है। न केवल वे खो सकते हैं, बल्कि आपको इन कुंजियों तक पहुंच का सावधानीपूर्वक प्रबंधन करने की भी आवश्यकता है। यदि उनमें से कम से कम एक से समझौता किया जाता है, तो किसी विशेष उपयोगकर्ता के टोकन हॉट वॉलेट तक नहीं पहुंचेंगे।

तैनाती से पहले स्मार्ट अनुबंध का पता कैसे निर्धारित करें: क्रिप्टो एक्सचेंज के लिए CREATE2 का उपयोग करना

प्रत्येक उपयोगकर्ता के लिए एक अलग स्मार्ट अनुबंध बनाएं

प्रत्येक उपयोगकर्ता के लिए एक अलग स्मार्ट अनुबंध तैनात करने से आप सर्वर पर वॉलेट के लिए निजी कुंजी संग्रहीत करने से बच सकते हैं। टोकन को हॉटवॉलेट में स्थानांतरित करने के लिए एक्सचेंज इस स्मार्ट अनुबंध को कॉल करेगा।

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

ऑपकोड क्रिएट2

पिछली विधि की समस्या को ठीक करने के लिए, हमने CREATE2 ऑपकोड का उपयोग करने का निर्णय लिया। CREATE2 आपको उस पते को पूर्व-निर्धारित करने की अनुमति देता है जहां स्मार्ट अनुबंध तैनात किया जाएगा। पते की गणना निम्न सूत्र का उपयोग करके की जाती है:

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


, जहां:

  • पता - स्मार्ट अनुबंध का पता जो CREATE2 को कॉल करेगा
  • नमक - यादृच्छिक मूल्य
  • init_code - परिनियोजन के लिए स्मार्ट अनुबंध बाइटकोड

यह सुनिश्चित करता है कि जो पता हम उपयोगकर्ता को प्रदान करते हैं उसमें वास्तव में वांछित बाइटकोड शामिल है। इसके अलावा, इस स्मार्ट अनुबंध को जब भी हमें आवश्यकता हो तब तैनात किया जा सकता है। उदाहरण के लिए, जब कोई उपयोगकर्ता पहली बार अपने वॉलेट का उपयोग करने का निर्णय लेता है।
तैनाती से पहले स्मार्ट अनुबंध का पता कैसे निर्धारित करें: क्रिप्टो एक्सचेंज के लिए CREATE2 का उपयोग करना
इसके अलावा, आप स्मार्ट अनुबंध पते को संग्रहीत करने के बजाय हर बार उसकी गणना कर सकते हैं क्योंकि:

  • पता सूत्र में स्थिर है, क्योंकि यह हमारे वॉलेट कारखाने का पता है
  • नमक — user_id हैश
  • init_code यह स्थिर है क्योंकि हम एक ही वॉलेट का उपयोग करते हैं

और अधिक सुधार

पिछले समाधान में अभी भी एक खामी है: आपको स्मार्ट अनुबंध को तैनात करने के लिए भुगतान करना होगा। हालाँकि, आप इससे छुटकारा पा सकते हैं। ऐसा करने के लिए आप फ़ंक्शन को कॉल कर सकते हैं स्थानांतरण ()और फिर आत्म विनाश() वॉलेट कंस्ट्रक्टर में। और फिर स्मार्ट अनुबंध को तैनात करने के लिए गैस वापस कर दी जाएगी।

आम धारणा के विपरीत, आप CREATE2 ऑपकोड के साथ एक ही पते पर कई बार एक स्मार्ट अनुबंध तैनात कर सकते हैं। ऐसा इसलिए है क्योंकि CREATE2 जाँच करता है कि लक्ष्य पते का नॉन शून्य है (इसे कंस्ट्रक्टर की शुरुआत में "1" मान दिया गया है)। इस मामले में, फ़ंक्शन आत्म विनाश() हर बार गैर पते को रीसेट करता है। इसलिए यदि आप उन्हीं तर्कों के साथ CREATE2 को दोबारा कॉल करते हैं, तो नॉन चेक पास हो जाएगा।

कृपया ध्यान दें कि यह समाधान एथेरियम एड्रेस विकल्प के समान है, लेकिन निजी कुंजी संग्रहीत करने की आवश्यकता के बिना। वॉलेट से हॉटवॉलेट में पैसे ट्रांसफर करने की लागत लगभग किसी फ़ंक्शन को कॉल करने की लागत के बराबर है स्थानांतरण (), चूँकि हम स्मार्ट अनुबंध परिनियोजन के लिए भुगतान नहीं करते हैं।

अंतिम निर्णय

तैनाती से पहले स्मार्ट अनुबंध का पता कैसे निर्धारित करें: क्रिप्टो एक्सचेंज के लिए CREATE2 का उपयोग करना

मूल रूप से तैयार किया गया:

  • नमक प्राप्त करने का कार्य user_id
  • एक स्मार्ट अनुबंध जो उचित नमक (यानी वॉलेट फैक्ट्री) के साथ CREATE2 ऑपकोड को कॉल करेगा
  • निम्नलिखित कंस्ट्रक्टर के साथ अनुबंध के अनुरूप वॉलेट बाइटकोड:

constructor () {
    address hotWallet = 0x…;
    address token = 0x…;
    token.transfer (hotWallet, token.balanceOf (address (this)));
    selfdestruct (address (0));
}


प्रत्येक नए उपयोगकर्ता के लिए हम गणना द्वारा उसका वॉलेट पता दिखाते हैं

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


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

जब किसी वॉलेट पते पर पर्याप्त संख्या में टोकन जमा हो जाते हैं, तो हम उन सभी को एक ही बार में हॉटवॉलेट में स्थानांतरित कर सकते हैं। ऐसा करने के लिए, बैकएंड स्मार्ट कॉन्ट्रैक्ट फ़ैक्टरी फ़ंक्शन को कॉल करता है, जो निम्नलिखित क्रियाएं करता है:

function deployWallet (соль uint256) {
    bytes memory walletBytecode =…;
    // invoke CREATE2 with wallet bytecode and salt
}


इस प्रकार, वॉलेट स्मार्ट कॉन्ट्रैक्ट कंस्ट्रक्टर को कहा जाता है, जो अपने सभी टोकन को हॉटवॉलेट पते पर स्थानांतरित करता है और फिर स्वयं-नष्ट हो जाता है।

पूरा कोड पाया जा सकता है यहां. कृपया ध्यान दें कि यह हमारा उत्पादन कोड नहीं है, क्योंकि हमने वॉलेट बाइटकोड को अनुकूलित करने का निर्णय लिया और इसे ऑपकोड में लिखा।

लेखक पावेल कोंड्राटेनकोव, एथेरियम विशेषज्ञ

स्रोत: www.habr.com

एक टिप्पणी जोड़ें