Π§Π΅ΠΌ ΠΏΠ»ΠΎΡ ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΡΠ²ΠΎΠΏΡ ΠΈ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π»Ρ ΠΈΠΌ ΠΏΠΎΠΌΠΎΠ³ΡΡ, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ Π² Ρ Π°ΡΠ΄ΡΠΎΡΠΊΠ΅ 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 Π΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡ
Π Π°Π·Π΄Π΅Π»ΡΠΉ ΠΈ Π²Π»Π°ΡΡΠ²ΡΠΉ
Π§Π°ΡΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π²Π·Π»ΠΎΠΌΠ° Ethereum ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
- Π£ΡΠ°ΡΡΠ½ΠΈΠΊ ΠΊΠ»Π°Π΄Π΅Ρ ΡΡΠ΅Π΄ΡΡΠ²Π° Π½Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ
- ΠΠΎΡΠΎΠΌ Π·Π°Π±ΠΈΡΠ°Π΅Ρ ΡΡΠ΅Π΄ΡΡΠ²Π°
- Π§ΡΠΎ-ΡΠΎ ΠΈΠ΄Π΅Ρ Π½Π΅ ΡΠ°ΠΊ
- ΠΠ»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ Π·Π°Π±ΠΈΡΠ°Π΅Ρ Π΄Π΅Π½ΡΠ³ΠΈ ΡΠ½ΠΎΠ²Π° ΠΈ ΡΠ½ΠΎΠ²Π°
ΠΡΠ»ΠΈ ΠΌΡ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΡΠΎ-ΡΠΎ ΠΈΠ΄Π΅Ρ Π½Π΅ ΡΠ°ΠΊ, Π΅ΡΠ»ΠΈ Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΡΠΎΠΉ Π½Π°Π±ΠΎΡ Π±Π°ΠΉΡ.
ΠΠ°ΠΊ ΡΠΊΡΠ°ΡΡΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ²ΠΎΠΏ Ρ Ρ
ΡΡΠ΅ΠΌ 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
ΠΡΠΎ sha256 ΠΎΡ 0x0000000000000000000000000000000000000000000000000000000000000000
ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΡΠ΅ΠΊΡΠ΅Ρ ΠΈ Π·Π°Π±ΠΈΡΠ°Π΅ΠΌ ΡΠ²ΠΎΠΈ ΡΠΎΠΊΠ΅Π½Ρ
ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΅ΡΠ΅ ΡΠ°Π· ΠΈ Π·Π°Π±ΠΈΡΠ°Π΅ΠΌ ΡΡΠΆΠΈΠ΅, Π²ΡΠ΅ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ ΡΡΠΎ 0 = 0
Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ΄Π΅Π»ΠΊΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ EVM.
ΠΠΎ ΠΈ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅: ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠ΄Π΅Π»ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ Π°Π΄ΡΠ΅Ρ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΡΠΎΠΊΠ΅Π½Ρ Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠΎΡΠ΅Π»ΡΠΊΠ° ΠΈΠ»ΠΈ Π±ΠΈΡΠΆΠΈ.
ΠΡΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ ΠΈ create2
ΠΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ΄Π΅Π»ΠΊΠΈ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ ΠΆΠ΄Π°ΡΡ ΠΏΠΎΠΊΠ° ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Ρ ΡΡΠ΄Π° ΡΡΡΠ΄ΠΎΠ²ΠΎΠΉ βΠΊΡΠΈΠΏΡΠΎΡΠ΅Π½ΠΈΠ½Π³β. Π ΡΡ Π΅ΠΌΠ΅ βΡΡΡΠΎΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ, Π²Π΅ΡΠ΅ΡΠΎΠΌ Π΄Π΅Π½ΡΠ³ΠΈβ Π²ΡΠ΅Π³Π΄Π° Π΅ΡΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΎΡΠ²Π°Π»ΠΈΡΡΡ, Π° ΡΡΠΈΡ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΡΠΆΠ΅ ΠΏΠΎΡΡΠ°ΡΠ΅Π½.
ΠΠ΅Π»ΡΠ·Ρ Π»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΡΡΠΎΠΌ Π΄Π΅Π½ΡΠ³ΠΈ, Π° Π²Π΅ΡΠ΅ΡΠΎΠΌ Π±Π°ΠΉΡΡ?
Π Ρ
Π°ΡΠ΄ΡΠΎΡΠΊΠ΅ Constantinople ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ
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