БлСск ΠΈ Π½ΠΈΡ‰Π΅Ρ‚Π° atomic swaps

Π§Π΅ΠΌ ΠΏΠ»ΠΎΡ…ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ свопы ΠΈ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈΠΌ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π² Ρ…Π°Ρ€Π΄Ρ„ΠΎΡ€ΠΊΠ΅ Constantinople ΠΈ ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‡Π΅ΠΌ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° Π³Π°Π·.

Главная мотивация любого спСциалиста ΠΏΠΎ бСзопасности— ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ отвСтствСнности.

ΠŸΡ€ΠΎΠ²ΠΈΠ΄Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ милостиво, я ΠΏΠΎΠΊΠΈΠ½ΡƒΠ» ICO, Π½Π΅ доТидаясь ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π½ΠΎ вскорС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» сСбя Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆΠΈ.

Π―β€” Ρ€Π΅ΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΠœΠ°Π»ΡŒΡ‡ΠΈΡˆ ΠšΠΈΠ±Π°Π»ΡŒΡ‡ΠΈΡˆ, ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ строгого взгляда достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я сдал всС ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΌΠΎΠ΅ΠΉ Ρ†Π΅Π»ΡŒΡŽ ΠΊΠ°ΠΊ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Π±Ρ‹Π»ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ раскалСнноС ΠΆΠ°Π»ΠΎ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ°Π½Π°Π»ΠΈΠ·Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ дальшС ΠΎΡ‚ Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… ΠΌΠ½Π΅ элСмСнтов инфраструктуры.

НС Ρ‚Π²ΠΎΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ, Π½Π΅ Ρ‚Π²ΠΎΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

ΠœΡ‹ строим систСму ΠΎΠ±ΠΌΠ΅Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ этих Π°ΠΊΡ‚ΠΈΠ²ΠΎΠ² Ρƒ сСбя, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ сдСлки.

МоТно Π²Ρ‹ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Π² качСствС ΡΡƒΠ΄ΡŒΠΈ Π² спорной ситуации ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ сдСлки с кошСльками, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄Π²Π΅ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… подписСй: покупатСля, ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π° ΠΈ эскроу.

Однако, Ссли участник ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π°Ρ‚Π°ΠΊΡƒΠ΅Ρ‚ эскроу, Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ искомыС Π΄Π²Π΅ подписи.

Атомарный своп— схСма ΠΎΠ±ΠΌΠ΅Π½Π°, Π³Π΄Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΎΠΌ выступаСт смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ допускаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чСстноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π‘Π»ΠΎΠ²Π½ΠΎ Π² Π·Π°Π³Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎ Π²ΠΎΠ»ΠΊΠ° ΠΊΠΎΠ·Ρƒ ΠΈ капусту Ρ‚Ρ‹ моТСшь Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ СдинствСнному ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ ΠΈ нСсСшь ΠΏΠΎΡ‚Π΅Ρ€ΠΈ, Ссли ΠΎΡ‚ΡΡ‚ΡƒΠΏΠ°Π΅ΡˆΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ.

Волько вмСсто ΠΏΡ€ΠΎΠΆΠΎΡ€Π»ΠΈΠ²Ρ‹Ρ… ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… порядок обСспСчиваСт Ρ…ΡΡˆ функция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π°ΠΊ слоТно Π½Π°ΠΉΡ‚ΠΈ коллизию, Ρ‡Ρ‚ΠΎ Π½Π΅ стоит ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ.

Π¨Π°Π³ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ: Π·Π°Π³Π°Π΄ΠΊΠ°

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Алиса Π² ΠΎΠ΄Π½ΠΎ прСкрасноС ΡƒΡ‚Ρ€ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π‘ΠΎΠ±Ρƒ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½ Π·Π° Π³ΠΎΡ€ΡΡ‚ΡŒ β€œΠΊΡ€ΠΈΠΏΡ‚ΠΎΡŽΠ°Π½Π΅ΠΉβ€.

  • Она Π·Π°Π³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ большой сСкрСт
  • ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ Π½Π΅Π³ΠΎ Ρ…ΡΡˆ
  • ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Ρ‹ Π½Π° смарт ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π·Π°Π±Ρ€Π°Ρ‚ΡŒ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ дСньги ΠΌΠΎΠΆΠ΅Ρ‚ Π‘ΠΎΠ±, ΠΏΡ€Π΅Π΄ΡŠΡΠ²ΠΈΠ² сСкрСт (Ρ…ΡΡˆ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅)
  • Π’ случаС, Ссли Π‘ΠΎΠ± Π½Π΅ являСтся Π·Π° своими Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Π°ΠΌΠΈ ΠΊ Π²Π΅Ρ‡Π΅Ρ€Ρƒ, Алиса ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ сСбС.

Π¨Π°Π³ Π²Ρ‚ΠΎΡ€ΠΎΠΉ: ΠΏΡ€ΠΈΠΌΠ°Π½ΠΊΠ°

Π’ ΠΈΠ³Ρ€Ρƒ вступаСт Π‘ΠΎΠ± ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚β€œΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ΅Π²Ρ€ΠΎβ€ Π½Π° свой ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‡Ρ‚ΠΎ:

  • Алиса ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ β€œΠΊΡ€ΠΈΠΏΡ‚ΠΎΠΉΠ΅Π½Ρ‹β€ ΠΏΡ€Π΅Π΄ΡŠΡΠ²ΠΈΠ² сСкрСтноС число
  • НС Ρ€Π°Π½Π΅Π΅ ΠΎΠ±Π΅Π΄Π° Π‘ΠΎΠ±, ΠΏΡ€ΠΈ нСявкС Алисы ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚

Π¨Π°Π³ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ: ΠΎΡ‚Π³Π°Π΄ΠΊΠ° Π² ΠΏΡ€ΠΈΠΌΠ°Π½ΠΊΠ΅

Алиса ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π·Π° своими дСньгами ΠΈ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ дСньги с ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π‘ΠΎΠ±Π°, раскрыв ΠΏΡ€ΠΈ этом свой сСкрСт.

Π¨Π°Π³ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ: Π·Π°Π³Π°Π΄ΠΊΠ° Ρ€Π°Π·Π³Π°Π΄Π°Π½Π°

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄ΠΈΡ‚ Π‘ΠΎΠ±, ΠΈ ΠΎΡ€Π»ΠΈΠ½Ρ‹ΠΌ Π²Π·ΠΎΡ€ΠΎΠΌ вычлСняСт ΠΈΠ· Π½Π΅Π΅ сСкрСт, ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Алисой ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ. Π­Ρ‚ΠΎΡ‚ сСкрСт ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ свои Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Ρ‹.

Когда Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ

Если Алиса Π²Π΄Ρ€ΡƒΠ³ оказываСтся Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ смСртна, Π‘ΠΎΠ± Π² ΠΎΠ±Π΅Π΄ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ свои юани.

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Алиса ΠΊ Π²Π΅Ρ‡Π΅Ρ€Ρƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½, Ссли Π²Π΅Ρ€ΠΎΠ»ΠΎΠΌΠ½Ρ‹ΠΉ Π‘ΠΎΠ± Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ дСньги Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½.

Если Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ тСксту, Π½Π° Π₯Π°Π±Ρ€Π΅ для вас Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ ΠΈ наглядноС объяснСниС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… свопов.

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ·Π²Π°Π½Π° Π·Π°ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Ρ‚ΡŒ нас ΠΎΡ‚ Π·Π»ΠΎΠ²Ρ€Π΅Π΄Π½ΠΎΠΉ Алисы, которая Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ дСньги Π‘ΠΎΠ±Π° Π² самый послСдний ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ истСкаСт, ΠΏΠΎΠΊΠ° Ρ‚ΠΎΡ‚ Π΄Ρ€ΠΎΠΆΠ°Ρ‰ΠΈΠΌΠΈ ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ Π²Π±ΠΈΠ²Π°Π΅Ρ‚ hex Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

Участники Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ свои дСньги, максимум, придСтся ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°Ρ…Π­Ρ‚ΠΎ простая, ΠΊΠ°ΠΊ Π²Π°Π»Π΅Π½ΠΎΠΊ, схСма, которая Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ΠΎΠ² всСго Π½ΠΈΡ‡Π΅Π³ΠΎ:

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° смарт ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² с хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ΠΌ
  • Оба Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ сСкрСта)
  • Π’Π°ΠΉΠΌΠ»ΠΎΠΊΠΈ.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π±ΠΈΡ€ΠΆΠ΅ β€œΠΏΡ€ΠΎΡ‰Π°ΠΉ, наша встрСча Π±Ρ‹Π»Π° ΠΎΡˆΠΈΠ±ΠΊΠΎΠΉβ€, Π½ΠΎ Π½Π΅ Ρ‚ΡƒΡ‚-Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ.

ΠŸΡ€ΠΈ всСх своих достоинствах Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° atomic swap Π½Π΅ ΠΏΠΎΡ€Π°ΠΆΠ°ΡŽΡ‚ Π»ΠΈΠΊΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² самой популярной ΠΏΠ°Ρ€Π΅ BTC-USD фиатная Ρ‡Π°ΡΡ‚ΡŒ Π±Ρ‹Π»Π° Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°.
УспСх USDT ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ» Ρ†Π΅Π»ΡƒΡŽ Π²ΠΎΠ»Π½Ρƒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ½Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ERC20 Π½Π° любой вкус, ΠΎΡ‚ ΠΊΠ°ΡΡ‚ΠΎΠ΄ΠΈΠ°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π³ΠΎ USDC Π΄ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΡ‡Π½Π΅ΠΉΡˆΠ΅Π³ΠΎ DAI.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для простоты ΠΌΡ‹ рассуТдаСм Π΄Π°Π»Π΅Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Алиса ΠΏΡ€ΠΎΠ΄Π°Π΅Ρ‚ Π‘ΠΎΠ±Ρƒ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Ρ‹ Π·Π° ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ERC20 Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΈ надССмся Π½Π° ΡƒΠ΄Π°Ρ‡Ρƒ стабилизаторов, Π±Π»Π°Π³ΠΎ Ρƒ нас Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ тСхничСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ

Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ ΠΈ Ethereum ΠΈ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ слишком быстры, Π° Ρ‚ΡƒΡ‚ Π½Π°ΠΌ приходится ΠΆΠ΄Π°Ρ‚ΡŒ сначала ΠΎΠ΄ΠΈΠ½ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚ со всСми подтвСрТдСниями, ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ.

Π­Ρ‚ΠΎ всС ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ сначала дСньги вносит участник, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ извСстСн сСкрСт, Π° ΠΎΠΏΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΆΠ΄Π΅Ρ‚ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ свою Ρ‡Π°ΡΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с вСсьма Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΎΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π·Π° это врСмя курс ΠΌΠΎΠΆΠ΅Ρ‚ вСсьма сущСствСнно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, Π° ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ условия ΡƒΠΆΠ΅ нСпросто.

ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½ оставляСт Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ Π½Π° ΠΎΠ±ΠΎΠΈΡ… Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°Ρ…. Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ…Π΅ΡˆΠΈ Π² смарт ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°Ρ… ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΡΠ²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ сдСлка, ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ произвСсти массу ΡƒΠΌΠΎΠ·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ курсовых Π΄ΠΎ Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ….

Когда ΠΎ Ρ‚Π²ΠΎΠΈΡ… Π΄Π΅Π»Π°Ρ… Π·Π½Π°Π΅Ρ‚ Π±ΠΈΡ€ΠΆΠ° —это ΠΊΡ€Π°ΠΉΠ½Π΅ нСприятно, ΠΊΠΎΠ³Π΄Π° ΠΎΠ± этом Π·Π½Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ β€” это нСприятно Π²Π΄Π²ΠΎΠΉΠ½Π΅.

Usability

КонСк Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈ эфира Π² частности. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊΠΈΠ΅ тСлодвиТСния придСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρƒ ΠΈ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π° всС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто: Π½ΡƒΠΆΠ½ΠΎ просто пСрСвСсти Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½ Π½Π° p2sh адрСс. Π‘ эфиром всС Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ…ΠΈΡ‚Ρ€Π΅Π΅.

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π Π°ΡΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ усрСднСнный ΠΏΠΎ Π³ΠΈΡ‚Ρ…Π°Π±Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для свопа:

contract iERC20 {
    function totalSupply() public view returns (uint256);
    function transfer(address receiver, uint numTokens) public returns (bool);
    function balanceOf(address tokenOwner) public view returns (uint);
    function approve(address delegate, uint numTokens) public returns (bool);
    function allowance(address owner, address delegate) public view returns (uint);
    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool);
}

contract Swapper {

    struct Swap {
        iERC20 token;
        bytes32 hash;
        uint amount;
        uint refundTime;
        bytes32 secret;
    }

    mapping (address => mapping(address => Swap)) swaps;

    function create(iERC20 token, bytes32 hash, address receiver, uint amount, uint refundTime) public {
        require(swaps[msg.sender][receiver].amount == 0); // check is swap with given hash already exists
        require(token.transferFrom(msg.sender, address(this), amount)); // transfer locked tokens to swap contract
        swaps[msg.sender][receiver] = Swap(token, hash, amount, refundTime, 0x00); //create swap
    }
    
    function hashOf(bytes32 secret) public pure returns(bytes32) {
        return sha256(abi.encodePacked(secret));
    }


    function withdraw(address owner, bytes32 secret) public {
        Swap memory swap = swaps[owner][msg.sender];
        require(swap.secret == bytes32(0));
        require(swap.hash == sha256(abi.encodePacked(secret))); // swap exists
        swaps[owner][msg.sender].secret = secret;
        swap.token.transfer(msg.sender, swap.amount);
    }

    function refund(address receiver) public {
        Swap memory swap = swaps[msg.sender][receiver];
        require(now > swap.refundTime);
        delete swaps[msg.sender][receiver];
        swap.token.transfer(msg.sender, swap.amount);
    }
}

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, ΠΎΠ½ΠΈ написаны ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для дСмонстрации. ОсобСнно этот.

  • Π‘ΠΎΠ± Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ approve, Π΄Π°Π² ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ свопа доступ ΠΊ своим Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌ
  • Π‘ΠΎΠ± создаСт своп ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° transferFrom Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ Π½Π° свой адрСс Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ отправитСля
  • Алиса Π² withdraw раскрываСт сСкрСт ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ transfer

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ кошСльков ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ±ΠΈΡ€ΠΆ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ approve Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΈ Π½Π΅ зря.

Π‘Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ часто ΠΎΡˆΠΈΠ±Π°ΡŽΡ‚ΡΡ ΠΈ просто пСрСводят Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, послС Ρ‡Π΅Π³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ просто Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π° Etherscan ΠΏΠΎΠ»Π½Ρ‹ стСнаниями нСсчастных.

А Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ комиссию Π² ETH, Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΎΠ±Π° участника Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΠ°ΡΡ‚ΠΈΡΡŒ ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ сдСлки, Π° этим ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ.

Π“Π°Π·Π³ΠΎΠ»Π΄Π΅Ρ€

Для Π½Π°Ρ‡Π°Π»Π° стоит ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ отправитСля Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ, ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ ΠΈΠ·Π±Ρ‹Ρ‚ΠΊΠ° Π³Π°Π·Π° ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ для всСх ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΡ….

ΠœΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚

contract Swapper {

    struct Swap {
        iERC20 token;
        address receiver;
        uint amount;
        address refundAddress;
        uint refundTime;
    }

    mapping (bytes32 =>  Swap) swaps;

    function create(iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public {
        require(swaps[hash].amount == 0); // use hash once
        require(token.transferFrom(msg.sender, address(this), amount));
        swaps[hash] = Swap(token, receiver, amount, refundAddress, refundTime);
    }


    function withdraw(bytes memory secret) public {
        bytes32 hash = sha256(secret);
        Swap memory swap = swaps[hash];
        require(swap.amount > 0);
        delete swaps[hash];
        swap.token.transfer(swap.receiver, swap.amount);
    }

    function refund(bytes32 hash) public {
        Swap memory swap = swaps[hash];
        require(now > swap.refundTime);
        delete swaps[hash];
        swap.token.transfer(swap.refundAddress, swap.amount);
    }
}

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π½ΠΎ-ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ Π΄ΡƒΠ°Π»ΠΈΠ·ΠΌ ΠΈ EIP 712

Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, адрСс Π² эфирС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠΌ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΡΠΈΡ€Π΅Ρ‡ΡŒ ΠΊΠ»ΡŽΡ‡Π΅ΠΌ.
Π“Π»Π°Π²Π½ΠΎΠ΅ занятиС ΠΊΠ»ΡŽΡ‡Π°β€” ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сообщСния.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС отправитСля Π‘ΠΎΠ±-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ пассы, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² ΠΏΠ΅Ρ€Π΅Π΄ этим подпись Π‘ΠΎΠ±Π°-ΠΊΠ»ΡŽΡ‡Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΡ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΏΠΎΠ½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ комиссию участника, Π½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚, ΠΊΠΎΠΌΡƒ извСстСн ΠΊΠ»ΡŽΡ‡.

Π‘ΠΎΠ±-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚

library EIP712ProxyLibrary {
    function hashCommand(address sender, iERC20 token, Swapper swapper, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public view returns(bytes32);
}

contract ProxyBob {
    address owner;

    constructor(address _owner) public {
        owner = _owner;
    }

    function createSwap(Swapper swapper, iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime, uint8 v, bytes32 r, bytes32 s) public {
        require(owner == ecrecover(EIP712ProxyLibrary.hashCommand(address(this), token, swapper, hash, receiver, amount, refundAddress, refundTime), v, r, s));
        token.approve(address(swapper), amount);
        swapper.create(token, hash, receiver, amount, refundAddress, refundTime);
    }
}

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с подписями слоТных структур Π΄Π°Π½Π½Ρ‹Ρ… Π² Ethereum Π΅ΡΡ‚ΡŒ стандарт EIP 712, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π½Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π±Π»ΠΎΠ³Π΅ кошСлька Metamask

РаздСляй ΠΈ властвуй

Часто сцСнарий Π²Π·Π»ΠΎΠΌΠ° Ethereum ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° выглядит Ρ‚Π°ΠΊ:

  • Участник ΠΊΠ»Π°Π΄Π΅Ρ‚ срСдства Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚
  • ΠŸΠΎΡ‚ΠΎΠΌ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ срСдства
  • Π§Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ
  • Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ дСньги снова ΠΈ снова

Если ΠΌΡ‹ вСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, Ссли Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ являСтся пустой Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚.

Как ΡƒΠΊΡ€Π°ΡΡ‚ΡŒ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ своп с Ρ…ΡΡˆΠ΅ΠΌ 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
Π­Ρ‚ΠΎ sha256 ΠΎΡ‚ 0x0000000000000000000000000000000000000000000000000000000000000000
ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ сСкрСт ΠΈ Π·Π°Π±ΠΈΡ€Π°Π΅ΠΌ свои Ρ‚ΠΎΠΊΠ΅Π½Ρ‹
ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΈ Π·Π°Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‡ΡƒΠΆΠΈΠ΅, всС ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ 0 = 0

Боздавая для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сдСлки ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ EVM.

Но ΠΈ это Π΅Ρ‰Π΅ Π½Π΅ всС: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ каТдая сдСлка ΠΈΠΌΠ΅Π΅Ρ‚ свой адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ с любого кошСлька ΠΈΠ»ΠΈ Π±ΠΈΡ€ΠΆΠΈ.

Π‘Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ ΠΈ create2

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сдСлки Π½Π°ΠΌ приходится ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Ρ‚ Ρ‚ΡƒΠ΄Π° Ρ‚Ρ€ΡƒΠ΄ΠΎΠ²ΠΎΠΉ β€œΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ„Π΅Π½ΠΈΠ½Π³β€. Π’ схСмС β€œΡƒΡ‚Ρ€ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹, Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ Π΄Π΅Π½ΡŒΠ³ΠΈβ€ всСгда Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ отвалится, Π° эфир Π½Π° созданиС ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΡƒΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½.

НСльзя Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚Ρ€ΠΎΠΌ дСньги, Π° Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ Π±Π°ΠΉΡ‚Ρ‹?

Π’ Ρ…Π°Ρ€Π΄Ρ„ΠΎΡ€ΠΊΠ΅ Constantinople Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ EIP 1014 Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ create2, которая создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ адрСсС

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

Π“Π΄Π΅

  • address β€” адрСс ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ
  • salt β€” ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ число, смысл ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сСрии
  • init_code β€” Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструктора.

Π€Π°Π±Ρ€ΠΈΠΊΠ°Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· assembly, поэтому Ρ„Π°Π±Ρ€ΠΈΠΊΠ° выглядит нСсколько ΡƒΡΡ‚Ρ€Π°ΡˆΠ°ΡŽΡ‰Π΅:

contract Factory {
  event Deployed(address addr, uint256 salt);

  function create2(bytes memory code, uint256 salt) public {
    address addr;
    assembly {

      addr := create2(0, add(code, 0x20), mload(code), salt)
    }

    emit Deployed(addr, salt);
  }
}

Код вашСго ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ web3:

const MyContract = new web3.eth.Contract(ABI, {})
const сode = MyContract.deploy({
    data: BYTECODE,
    arguments: contructorArgs  
}).encodeABI();
const factory = new web3.eth.Contract(FACTORY_ABI, factoryAddress);
tx = factory.methods.create2(сode, salt);

Из-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π² solidity Π³Π°Π· для ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ·-Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… тонкостСй эфира.

ОсобСнно ΠΌΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎ Π² случаС Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ Π³Π°Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΠ°Π΄Π°Π΅Ρ‚ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ошибкой, Π½Π΅ сообщая ΠΏΡ€ΠΈ этом, Ρ‡Ρ‚ΠΎ Π³Π°Π·Π° Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ Π½Π΅ создавая ΠΈΡ… Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΈ ΠΏΠΎΠΊΠ° ΠΌΡ‹ ΠΈΡ… Π½Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π² сСти Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ догадаСтся, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.

Π’ΠΎΡ€ΠΎΠ½ Π²ΠΎΡ€ΠΎΠ½Ρƒ Π³Π»Π°Π· Π½Π΅ Π²Ρ‹ΠΊΠ»ΡŽΠ΅Ρ‚

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ настоящСго Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°, особСнно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ инвСстиции Π½Π° Π±ΠΎΡ€ΡŒΠ±Ρƒ с Π²Ρ€Π°Π³Π°ΠΌΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΡ‚ΠΌΡ‹Π²Π°Π½ΠΈΠ΅ΠΌ Π΄Π΅Π½Π΅Π³, Ρ‚Π°ΠΊΠΈΠ΅ дСтскиС хитрости Π½Π΅ остановят, ΠΈ послС создания ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΎΠ½ всС Ρ€Π°Π²Π½ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ Ρ…ΡΡˆ.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…ΡΡˆ Π½Π΅ засвСтился?

Π‘Π°ΠΌ своп ΠΌΡ‹ пСрСносим Π² ΠΎΡ„Ρ‡Π΅ΠΉΠ½: участники ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ подписями для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° своп-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎ раскрываСтся сСкрСт.

Π¨Π°Π³ Π·Π° ΡˆΠ°Π³ΠΎΠΌΠ‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° β€œΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠΈΠ³Π°β€, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ срСдства ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ подписСй Алисы ΠΈ Π‘ΠΎΠ±Π°.

Π”Π°Π±Ρ‹ ΡƒΡ…ΠΎΠ΄ Π² ΠΎΡ„Ρ„Π»Π°ΠΉΠ½ ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· участников Π½Π΅ стал Ρ‚Ρ€Π°Π³Π΅Π΄ΠΈΠ΅ΠΉ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ старый Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚.

Алиса ΠΈ Π‘ΠΎΠ± ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ вносят Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚Ρ‹

  • Алиса Π·Π°Π³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ сСкрСт ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π‘ΠΎΠ±Ρƒ Ρ…ΡΡˆ сСкрСта ΠΈ подпись Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Ρ‹ Π½Π° адрСс свопа
  • Π‘ΠΎΠ± ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ АлисС подпись Π½Π° Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ свопа с Π·Π°Π³Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ…ΡΡˆΠ΅ΠΌ.
  • Алиса сообщаСт Π‘ΠΎΠ±Ρƒ сСкрСт.

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ наступаСт гармония: ΠΈ Алиса ΠΈ Π‘ΠΎΠ± ΠΌΠΎΠ³ΡƒΡ‚ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ сдСлку. Π’ Ρ‚Π°ΠΊΠΎΠΉ друТСствСнной обстановкС ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ подписями ΠΎΡ‚ для Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π΅Π½Π΅Π³ Π½Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ адрСса.

Для стороннСго Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ это выглядит ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ дСньги ΠΏΡ€ΠΎΡˆΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ с ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠΎΠ΄ΠΏΠΈΡΡŒΡŽ 2 ΠΈΠ· 2.

А Π΅Ρ‰Π΅ такая схСма позволяСт ΠΎΠ±Π΅ΠΈΠΌ сторонам Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сСкрСт загадываСтся ΡƒΠΆΠ΅ послС всСх ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ.

Level 2

Π Π°Π· ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ дСньги Π½Π° ΠΎΠ΄ΠΈΠ½ адрСс ΠΈ Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π½Π°ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ дСньги Π½Π° нСсколько адрСсов ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. НС Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ это Π±Ρ‹Π» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π°Π±ΠΎΡ€ для ΠΎΠ±ΠΌΠ΅Π½Π°, Π½ΠΎ Ссли Π½Π°Ρ‡Π°Π» ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ своп, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Алиса ΠΈ Π‘ΠΎΠ± смогут Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ вовсю. НапримСр, автоматичСски Π²Ρ‹ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Ρ†Π΅Π½Ρƒ, обмСнивая ΠΏΠΎ ΡΠ°Ρ‚ΠΎΡˆΠΈ Π² сСкунду, ΠΈΠ»ΠΈ просто Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΌΠ΅ΠΉΠΊΠ΅Ρ€Π° ΠΈ получатСля ликвидности.

Шаг за шагом

  • ΠŸΡ€ΠΎΠ΄Π°Π²Π΅Ρ† Π·Π°Π³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ сСкрСт ΠΈ ΠΎΡ‚Π΄Π°Π΅Ρ‚ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ Ρ…ΡΡˆ сСкрСта ΠΈ подпись Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π³Π΄Π΅ Ρ‡Π°ΡΡ‚ΡŒ срСдств ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° p2sh адрСс свопа, Π° остаток возвращаСтся Π½Π° адрСс ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°
  • ΠŸΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ подпись, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ вывСсти Π½Π° своп Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈ сдачу Π½Π° адрСс получатСля.
  • ΠŸΡ€ΠΎΠ΄Π°Π²Π΅Ρ† раскрываСт сСкрСт
  • Π˜ΡΡ‚ΠΎΡ€ΠΈΡ повторяСтся с Π½ΠΎΠ²Ρ‹ΠΌ сСкрСтом, ΠΏΡ€ΠΈ этом ΠΊ свопу ΠΈ сдачС добавляСтся Π΅Ρ‰Π΅ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π°Π½Π΅Π΅ ΠΊΡƒΠΏΠ»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° адрСс покупатСля ΠΈ ΡƒΠΆΠ΅ ΠΎΠΏΠ»Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° адрСс ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ доступСн высокоскоростная p2p торговля, Π³Π»Π°Π²Π½ΠΎΠ΅ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ сдСлку Π΄ΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°.

Однако, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠ² наши ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ нашим ΠΊΠ°Π½Π°Π»Π°ΠΌ бСссмСртиС, Ρ‡Ρ‚ΠΎ сильно упростит Π½Π°ΠΌ созданиС сСти.

Но ΠΎΠ± этом ΠΌΡ‹ расскаТСм Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сСрии.

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