வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது: கிரிப்டோ பரிமாற்றத்திற்கு CREATE2 ஐப் பயன்படுத்துதல்

பிளாக்செயினின் தலைப்பு எல்லாவிதமான ஹைப்களின் ஆதாரமாக இருப்பதை நிறுத்தாது, ஆனால் தொழில்நுட்பக் கண்ணோட்டத்தில் மிகவும் மதிப்புமிக்க கருத்துக்கள். எனவே, இது சன்னி நகரத்தின் குடியிருப்பாளர்களைத் தவிர்க்கவில்லை. மக்கள் உன்னிப்பாகப் பார்க்கிறார்கள், படிக்கிறார்கள், பாரம்பரிய தகவல் பாதுகாப்பில் தங்கள் நிபுணத்துவத்தை பிளாக்செயின் அமைப்புகளுக்கு மாற்ற முயற்சிக்கின்றனர். இதுவரை, இது கவனிக்கத்தக்கது: Rostelecom-Solar இன் வளர்ச்சிகளில் ஒன்று பிளாக்செயின் அடிப்படையிலான மென்பொருளின் பாதுகாப்பை சரிபார்க்க முடியும். மேலும், பிளாக்செயின் சமூகத்தின் பயன்பாட்டு சிக்கல்களைத் தீர்ப்பதில் சில எண்ணங்கள் எழுகின்றன. இந்த லைஃப் ஹேக்குகளில் ஒன்று - CREATE2 ஐப் பயன்படுத்தி வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது - இன்று நான் உங்களுடன் பகிர்ந்து கொள்ள விரும்புகிறேன்.

வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது: கிரிப்டோ பரிமாற்றத்திற்கு CREATE2 ஐப் பயன்படுத்துதல்
இந்த ஆண்டு பிப்ரவரி 2 அன்று கான்ஸ்டான்டினோபிள் ஹார்ட் ஃபோர்க்கில் CREATE28 ஆப்கோட் சேர்க்கப்பட்டது. EIP இல் கூறப்பட்டுள்ளபடி, இந்த ஆப்கோட் முதன்மையாக மாநில சேனல்களுக்காக அறிமுகப்படுத்தப்பட்டது. இருப்பினும், வேறு ஒரு சிக்கலைத் தீர்க்க அதைப் பயன்படுத்தினோம்.

பரிமாற்றத்தில் இருப்புகளைக் கொண்ட பயனர்கள் உள்ளனர். ஒவ்வொரு பயனருக்கும் டோக்கன்களை அனுப்பக்கூடிய Ethereum முகவரியை நாங்கள் வழங்க வேண்டும், அதன் மூலம் அவர்களின் கணக்கை நிரப்பலாம். இந்த முகவரிகளை "பணப்பைகள்" என்று அழைப்போம். பணப்பையில் டோக்கன்கள் வரும்போது, ​​நாம் அவற்றை ஒரே வாலட்டுக்கு (ஹாட்வாலட்) அனுப்ப வேண்டும்.

பின்வரும் பிரிவுகளில், CREATE2 இல்லாமல் இந்தச் சிக்கலைத் தீர்ப்பதற்கான விருப்பங்களை நான் பகுப்பாய்வு செய்து, அவற்றை ஏன் கைவிட்டோம் என்பதைச் சொல்கிறேன். நீங்கள் இறுதி முடிவில் மட்டுமே ஆர்வமாக இருந்தால், அதை "இறுதி தீர்வு" பிரிவில் காணலாம்.

Ethereum முகவரிகள்

புதிய பயனர்களுக்கு புதிய Ethereum முகவரிகளை உருவாக்குவதே எளிய தீர்வாகும். இந்த முகவரிகள் பணப்பைகளாக இருக்கும். டோக்கன்களை வாலட்டிலிருந்து ஹாட்வாலெட்டுக்கு மாற்ற, செயல்பாட்டை அழைப்பதன் மூலம் பரிவர்த்தனையில் கையொப்பமிட வேண்டும் பரிமாற்றம்() பின்தளத்தில் இருந்து பணப்பையின் தனிப்பட்ட விசையுடன்.

இந்த அணுகுமுறை பின்வரும் நன்மைகளைக் கொண்டுள்ளது:

  • அது தான்
  • டோக்கன்களை வாலட்டில் இருந்து ஹாட்வாலெட்டுக்கு மாற்றுவதற்கான செலவு, செயல்பாட்டை அழைப்பதற்கான செலவுக்கு சமம் பரிமாற்றம்()

இருப்பினும், இந்த அணுகுமுறைக்கு எதிராக நாங்கள் முடிவு செய்தோம், ஏனெனில் இது ஒரு பெரிய குறைபாடு உள்ளது: நீங்கள் தனிப்பட்ட விசைகளை எங்காவது சேமிக்க வேண்டும். அவை இழக்கப்படுவது மட்டுமல்லாமல், இந்த விசைகளுக்கான அணுகலை நீங்கள் கவனமாக நிர்வகிக்க வேண்டும். அவற்றில் குறைந்தபட்சம் ஒன்று சமரசம் செய்யப்பட்டால், ஒரு குறிப்பிட்ட பயனரின் டோக்கன்கள் சூடான பணப்பையை அடையாது.

வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது: கிரிப்டோ பரிமாற்றத்திற்கு CREATE2 ஐப் பயன்படுத்துதல்

ஒவ்வொரு பயனருக்கும் தனித்தனி ஸ்மார்ட் ஒப்பந்தத்தை உருவாக்கவும்

ஒவ்வொரு பயனருக்கும் தனித்தனி ஸ்மார்ட் ஒப்பந்தத்தைப் பயன்படுத்துவதன் மூலம், சேவையகத்தில் பணப்பைகளுக்கான தனிப்பட்ட விசைகளைச் சேமிப்பதைத் தவிர்க்கலாம். டோக்கன்களை ஹாட்வாலட்டுக்கு மாற்ற, பரிமாற்றம் இந்த ஸ்மார்ட் ஒப்பந்தத்தை அழைக்கும்.

ஸ்மார்ட் ஒப்பந்தத்தைப் பயன்படுத்தாமல் பயனருக்கு அவரது பணப்பையின் முகவரியைக் காட்ட முடியாது என்பதால், இந்தத் தீர்வையும் நாங்கள் கைவிட்டோம் (இது உண்மையில் சாத்தியம், ஆனால் மற்ற குறைபாடுகளுடன் மிகவும் சிக்கலான வழியில் நாங்கள் இங்கே விவாதிக்க மாட்டோம்). பரிமாற்றத்தில், ஒரு பயனர் தனக்குத் தேவையான பல கணக்குகளை உருவாக்க முடியும், மேலும் ஒவ்வொருவருக்கும் அதன் சொந்த பணப்பை தேவை. பயனர் இந்தக் கணக்கைப் பயன்படுத்துவார் என்பதை உறுதியாகச் சொல்லாமல், ஒப்பந்தத்தைப் பயன்படுத்துவதற்கு நாம் பணத்தைச் செலவிட வேண்டும் என்பதே இதன் பொருள்.

Opcode CREATE2

முந்தைய முறையின் சிக்கலைச் சரிசெய்ய, CREATE2 ஆப்கோடைப் பயன்படுத்த முடிவு செய்தோம். CREATE2 ஆனது ஸ்மார்ட் ஒப்பந்தம் பயன்படுத்தப்படும் முகவரியை முன்கூட்டியே தீர்மானிக்க உங்களை அனுமதிக்கிறது. முகவரி பின்வரும் சூத்திரத்தைப் பயன்படுத்தி கணக்கிடப்படுகிறது:

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


, எங்கே:

  • முகவரி — CREATE2 ஐ அழைக்கும் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரி
  • உப்பு - சீரற்ற மதிப்பு
  • init_code - வரிசைப்படுத்துவதற்கான ஸ்மார்ட் ஒப்பந்த பைட்கோடு

பயனருக்கு நாங்கள் வழங்கும் முகவரியில் உண்மையில் விரும்பிய பைட்கோடு இருப்பதை இது உறுதி செய்கிறது. மேலும், இந்த ஸ்மார்ட் ஒப்பந்தத்தை நமக்குத் தேவைப்படும்போது பயன்படுத்திக்கொள்ளலாம். எடுத்துக்காட்டாக, ஒரு பயனர் தனது பணப்பையை முதல் முறையாக பயன்படுத்த முடிவு செய்யும் போது.
வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது: கிரிப்டோ பரிமாற்றத்திற்கு CREATE2 ஐப் பயன்படுத்துதல்
மேலும், ஸ்மார்ட் ஒப்பந்த முகவரியை சேமிப்பதற்குப் பதிலாக ஒவ்வொரு முறையும் கணக்கிடலாம், ஏனெனில்:

  • முகவரி இது எங்கள் வாலட் தொழிற்சாலையின் முகவரி என்பதால் சூத்திரத்தில் நிலையானது
  • உப்பு — user_id ஹாஷ்
  • init_code ஒரே வாலட்டைப் பயன்படுத்துவதால் நிலையானது

மேலும் மேம்பாடுகள்

முந்தைய தீர்வு இன்னும் ஒரு குறைபாடு உள்ளது: நீங்கள் ஸ்மார்ட் ஒப்பந்தத்தை பயன்படுத்த பணம் செலுத்த வேண்டும். இருப்பினும், நீங்கள் அதிலிருந்து விடுபடலாம். இதைச் செய்ய, நீங்கள் செயல்பாட்டை அழைக்கலாம் பரிமாற்றம்(), பின்னர் தன்னழிவு() பணப்பை கட்டமைப்பாளரில். பின்னர் ஸ்மார்ட் ஒப்பந்தத்தைப் பயன்படுத்துவதற்கான எரிவாயு திரும்பப் பெறப்படும்.

பிரபலமான நம்பிக்கைக்கு மாறாக, CREATE2 opcode மூலம் ஒரே முகவரிக்கு பல முறை ஸ்மார்ட் ஒப்பந்தத்தை வரிசைப்படுத்தலாம். ஏனென்றால், CREATE2 ஆனது இலக்கு முகவரியின் பூஜ்ஜியமாக உள்ளதா என்பதைச் சரிபார்க்கிறது (அதற்கு கட்டமைப்பாளரின் தொடக்கத்தில் மதிப்பு "1" ஒதுக்கப்பட்டுள்ளது). இந்த வழக்கில், செயல்பாடு தன்னழிவு() ஒவ்வொரு முறையும் இல்லாத முகவரியை மீட்டமைக்கிறது. நீங்கள் CREATE2 ஐ மீண்டும் அதே வாதங்களுடன் அழைத்தால், நான்காவது சரிபார்ப்பு கடந்துவிடும்.

இந்த தீர்வு Ethereum முகவரி விருப்பத்தைப் போன்றது என்பதை நினைவில் கொள்ளவும், ஆனால் தனிப்பட்ட விசைகளை சேமிக்க வேண்டிய அவசியமில்லை. பணப்பையிலிருந்து ஹாட்வாலெட்டுக்கு பணத்தை மாற்றுவதற்கான செலவு, ஒரு செயல்பாட்டை அழைப்பதற்கான செலவிற்கு தோராயமாக சமமாக இருக்கும் பரிமாற்றம்(), ஸ்மார்ட் ஒப்பந்த வரிசைப்படுத்தலுக்கு நாங்கள் பணம் செலுத்துவதில்லை.

இறுதி முடிவு

வரிசைப்படுத்துவதற்கு முன் ஸ்மார்ட் ஒப்பந்தத்தின் முகவரியை எவ்வாறு தீர்மானிப்பது: கிரிப்டோ பரிமாற்றத்திற்கு 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
}


இவ்வாறு, வாலட் ஸ்மார்ட் ஒப்பந்தக் கட்டமைப்பாளர் அழைக்கப்படுகிறது, இது அதன் அனைத்து டோக்கன்களையும் ஹாட்வாலெட் முகவரிக்கு மாற்றுகிறது, பின்னர் தன்னைத்தானே அழித்துக் கொள்கிறது.

முழு குறியீட்டையும் காணலாம் இங்கே. வாலட் பைட்கோடை மேம்படுத்த முடிவு செய்து அதை ஆப்கோடுகளில் எழுதியதால், இது எங்கள் தயாரிப்புக் குறியீடு அல்ல என்பதை நினைவில் கொள்ளவும்.

ஆசிரியர் Pavel Kondratenkov, Ethereum நிபுணர்

ஆதாரம்: www.habr.com

கருத்தைச் சேர்