Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя: использованиС CREATE2 для ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆΠΈ

Π’Π΅ΠΌΠ° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° Π½Π΅ пСрСстаСт Π±Ρ‹Ρ‚ΡŒ источником Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ всячСского Ρ…Π°ΠΉΠΏΠ°, Π½ΠΎ ΠΈ вСсьма Ρ†Π΅Π½Π½Ρ‹Ρ… с тСхнологичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΈΠ΄Π΅ΠΉ. ΠŸΠΎΡΠ΅ΠΌΡƒ Π½Π΅ обошла ΠΎΠ½Π° стороной ΠΈ ΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ солнСчного Π³ΠΎΡ€ΠΎΠ΄Π°. ΠŸΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ люди, ΠΈΠ·ΡƒΡ‡Π°ΡŽΡ‚, ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ свою экспСртизу Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ ΠΈΠ½Ρ„ΠΎΠ±Π΅Π·Π΅ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½-систСмы. Пока Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎ: ΠΎΠ΄Π½Π° ΠΈΠ· Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ «РостСлСком-Π‘ΠΎΠ»Π°Ρ€Β» ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ софта Π½Π° Π±Π°Π·Π΅ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°. А ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ мысли ΠΏΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½-сообщСства. Одним ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Π»Π°ΠΉΡ„Ρ…Π°ΠΊΠΎΠ² – ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CREATE2 – сСгодня Ρ…ΠΎΡ‡Ρƒ с Π²Π°ΠΌΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя: использованиС CREATE2 для ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆΠΈ
Опкод CREATE2 Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Ρ…Π°Ρ€Π΄-Ρ„ΠΎΡ€ΠΊΠ΅ ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚ΠΈΠ½ΠΎΠΏΠΎΠ»ΡŒ 28 фСвраля этого Π³ΠΎΠ΄Π°. Как ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² EIP, этот ΠΎΠΏΠΊΠΎΠ΄ Π±Ρ‹Π» Π²Π²Π΅Π΄Π΅Π½ Π² основном для ΠΊΠ°Π½Π°Π»ΠΎΠ² состояний (state channels). Однако, ΠΌΡ‹ использовали Π΅Π³ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

На Π±ΠΈΡ€ΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ с балансами. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ethereum-адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΡ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ смоТСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ‚Π΅ΠΌ самым пополняя свой Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Π΅ΠΌ эти адрСса «кошСльками». Когда Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ приходят Π½Π° кошСльки, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° Π΅Π΄ΠΈΠ½Ρ‹ΠΉ кошСлСк (hotwallet).

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… я Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ Π±Π΅Π· CREATE2 ΠΈ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ Π½ΠΈΡ…. Если Π²Π°ΠΌ интСрСсСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π΅Π³ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Ρ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Β».

Ethereum-адрСса

Π‘Π°ΠΌΠΎΠ΅ простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ethereum-адрСса для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π­Ρ‚ΠΈ адрСса ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ кошСльками. Π§Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈΠ· кошСлька Π² hotwallet, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ transfer() с ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ кошСлька ΠΈΠ· бэкСнда.

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ прСимущСства:

  • это просто
  • ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ пСрСноса Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с кошСлька Π½Π° hotwallet Ρ€Π°Π²Π½Π° Ρ†Π΅Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ transfer()

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ сущСствСнный нСдостаток: Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ. И Π΄Π΅Π»ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ потСряны, Π½ΠΎ Π΅Ρ‰Ρ‘ ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ доступом ΠΊ этим ΠΊΠ»ΡŽΡ‡Π°ΠΌ. Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… скомпромСтирован, Ρ‚ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ достигнут горячСго кошСлька.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя: использованиС CREATE2 для ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆΠΈ

Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ позволяСт Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚ кошСльков Π½Π° сСрвСрС. Π‘ΠΈΡ€ΠΆΠ° Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ этот ΡƒΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² hotwallet.

ΠžΡ‚ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ нСльзя ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ адрСс Π΅Π³ΠΎ кошСлька Π±Π΅Π· развСртывания смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (это Π½Π° самом Π΄Π΅Π»Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ довольно слоТным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ нСдостатками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ здСсь ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ). На Π±ΠΈΡ€ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ², сколько Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ собствСнный кошСлСк. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ дСньги Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись.

Опкод CREATE2

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ способа, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠΊΠΎΠ΄ CREATE2. CREATE2 позволяСт Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. АдрСс рассчитываСтся ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

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


, Π³Π΄Π΅:

  • address β€” адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ CREATE2
  • salt β€” случайноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  • init_code β€” Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° для развСртывания

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ гарантируСтся, Ρ‡Ρ‚ΠΎ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ прСдоставляСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, этот смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой кошСлСк.
Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя: использованиС CREATE2 для ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆΠΈ
Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ:

  • address Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ являСтся постоянным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это адрСс нашСй Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ кошСльков
  • salt β€” Ρ…Π΅Ρˆ user_id
  • init_code являСтся постоянным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ кошСлСк

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ всС Π΅Ρ‰Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ нСдостаток: Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΡƒΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этого. Для этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ transfer(), Π° Π·Π°Ρ‚Π΅ΠΌ selfdestruct() Π² конструкторС кошСлька. И Ρ‚ΠΎΠ³Π΄Π° Π³Π°Π· Π·Π° Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½.

Π’ΠΎΠΏΡ€Π΅ΠΊΠΈ распространСнному Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ адрСсу нСсколько Ρ€Π°Π· с ΠΎΠΏΠΊΠΎΠ΄ΠΎΠΌ CREATE2. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ CREATE2 провСряСт, Ρ‡Ρ‚ΠΎ nonce Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ адрСса Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ (Π΅ΠΌΡƒ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β» Π² Π½Π°Ρ‡Π°Π»Π΅ конструктора). ΠŸΡ€ΠΈ этом функция selfdestruct() ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· сбрасываСт nonce адрСса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π²Ρ‹ снова Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚Π΅ CREATE2 с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° nonce ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ с ethereum-адрСсами, Π½ΠΎ Π±Π΅Π· нСобходимости Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ. Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π΄Π΅Π½Π΅Π³ с кошСлька Π½Π° hotwallet ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½Π° стоимости Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ transfer(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΏΠ»Π°Ρ‚ΠΈΠΌ Π·Π° Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Π˜Ρ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΄ΠΎ дСплоя: использованиС 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:]


Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ адрСс кошСлька, наш бэкэнд Π²ΠΈΠ΄ΠΈΡ‚ событиС Transfer с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ _to, Ρ€Π°Π²Π½Ρ‹ΠΌ адрСсу кошСлька. На этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ баланс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Π±ΠΈΡ€ΠΆΠ΅ Π΄ΠΎ развСртывания кошСлька.

Когда Π½Π° адрСсС кошСлька накапливаСтся достаточноС количСство Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ пСрСвСсти ΠΈΡ… всС сразу Π² hotwallet. Для этого Π±Π΅ΠΊΠ΅Π½Π΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ², которая выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

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


Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вызываСтся конструктор смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° кошСлька, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ всС свои Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° адрСс hotwallet ΠΈ Π·Π°Ρ‚Π΅ΠΌ самоуничтоТаСтся.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π½Π΅ наш ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½-ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ кошСлька ΠΈ записали Π΅Π³ΠΎ Π² ΠΎΠΏΠΊΠΎΠ΄Π°Ρ….

Автор ПавСл ΠšΠΎΠ½Π΄Ρ€Π°Ρ‚Π΅Π½ΠΊΠΎΠ², спСциалист Π² области Ethereum

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com