ΠΠ°ΠΊΠ²ΠΈ ΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅ Π½Π° Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈΡΠ΅ ΡΠ²ΠΎΠΏΠΎΠ²Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ, ΠΊΠ°ΠΊΠ²ΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅ Π΅ ΡΠ»ΡΡΠΈΠ»ΠΎ ΠΏΡΠΈ Ρ Π°ΡΠ΄ΡΠΎΡΠ°ΠΊΠ° Constantinople ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΡΠΌΠ°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠ»Π°ΡΠΈΠΌ Π·Π° Π³Π°Π·Π°.
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ ΠΏΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ.
ΠΡΠΎΠ²ΠΈΠ΄Π΅Π½ΠΈΠ΅ΡΠΎ Π±Π΅ΡΠ΅ Π±Π»Π°Π³ΠΎΡΠΊΠ»ΠΎΠ½Π½ΠΎ, Π½Π°ΠΏΡΡΠ½Π°Ρ
ICO, Π±Π΅Π· Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΌ ΠΏΡΡΠ²Π°ΡΠ° Π½Π΅ΠΎΠ±ΡΠ°ΡΠΈΠΌΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π½ΠΎ ΡΠΊΠΎΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π°Ρ
Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ±ΠΈΡΠΆΠ°.
ΠΠ·β ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠ½ΠΎ Π½Π΅ ΡΡΠΌ ΠΠΎΠΌΡΠ΅ΡΠΎ ΠΠΈΠ±Π°Π»ΡΡΠΈΡ, ΠΈ Π΅Π΄ΠΈΠ½ ΡΡΡΠΎΠ³ ΠΏΠΎΠ³Π»Π΅Π΄ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½, Π·Π° Π΄Π° ΠΏΡΠ΅Π΄Π°ΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΠΏΠ°ΡΠΎΠ»ΠΈ. Π’Π°ΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΠΈ ΡΠ΅Π» ΠΊΠ°ΡΠΎ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡ Π±Π΅ΡΠ΅ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ° Π³ΠΎΡΠ΅ΡΠΈΡ Π·ΡΠ± Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ ΠΎΡ Π²Π°ΠΆΠ½ΠΈΡΠ΅ Π·Π° ΠΌΠ΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°.
ΠΠ΅ ΡΠ²ΠΎΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅, Π½Π΅ ΡΠ²ΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ
Π‘ΡΡΠΎΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π°ΠΊΡΠΈΠ²ΠΈ ΠΈ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΠΌ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎΡΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΠΈ Π°ΠΊΡΠΈΠ²ΠΈ ΠΏΡΠΈ Π½Π°Ρ, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°.
ΠΠΎΠΆΠ΅Ρ Π΄Π° ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΡΠ° Π½Π° ΡΡΠ΄ΠΈΡ Π² ΡΠΏΠΎΡΠΈ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΡΠ΄Π΅Π»ΠΊΠΈ Ρ ΠΏΠΎΡΡΡΠ΅ΠΉΠ»ΠΈ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ Π΄Π²Π° ΠΎΡ ΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°: Π½Π° ΠΊΡΠΏΡΠ²Π°ΡΠ°, ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ° ΠΈ Π΅ΡΠΊΡΠΎΡ.
ΠΠ±Π°ΡΠ΅, Π°ΠΊΠΎ ΡΡΠ°ΡΡΠ½ΠΈΠΊ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π°ΡΠ°ΠΊΡΠ²Π° Π΅ΡΠΊΡΠΎΡ, ΡΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΆΠ΅Π»Π°Π½ΠΈΡΠ΅ Π΄Π²Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ°.
ΠΡΠΎΠΌΠ°ΡΠ½ΠΈΡΡ ΡΠ²ΠΎΠΏ Π΅ ΡΡ Π΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π³Π°ΡΠ°Π½ΡΡΡ Π΅ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΄ΠΎΠΏΡΡΠΊΠ° ΡΠ°ΠΌΠΎ ΡΠ΅ΡΡΠ½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
ΠΠ°ΠΊΡΠΎ Π² Π·Π°Π³Π°Π΄ΠΊΠ°ΡΠ° Π·Π° Π²ΡΠ»ΠΊΠ°, ΠΊΠΎΠ·Π°ΡΠ° ΠΈ Π·Π΅Π»Π΅, ΠΌΠΎΠΆΠ΅Ρ Π΄Π° Π΄Π΅ΠΉΡΡΠ²Π°Ρ ΡΠ°ΠΌΠΎ ΠΏΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈ Π½ΠΎΡΠΈΡ Π·Π°Π³ΡΠ±ΠΈ, Π°ΠΊΠΎ ΠΎΡΠΊΠ»ΠΎΠ½ΡΠ²Π°Ρ ΠΎΡ Π½Π΅Π³ΠΎ.
Π‘Π°ΠΌΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π°Π»ΡΠ½ΠΈ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈ, ΡΠ΅Π΄ΡΡ ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΎΡ Ρ Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΠΊΠΎΠ»ΠΈΠ·ΠΈΡ, ΡΠ΅ Π΄ΠΎΡΠΈ Π½ΡΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° Π·Π°ΠΏΠΎΡΠ²Π°Ρ.
Π‘ΡΡΠΏΠΊΠ° ΠΏΡΡΠ²Π°: Π·Π°Π³Π°Π΄ΠΊΠ°
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΠ»ΠΈΡΠ° Π΅Π΄Π½Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π° ΡΡΡΡΠΈΠ½ ΠΈΡΠΊΠ° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π½Π° ΠΠΎΠ± Π±ΠΈΡΠΊΠΎΠΉΠ½ Π² Π·Π°ΠΌΡΠ½Π° Π½Π° ΠΊΡΠΏΡΠΈΠ½Π° βΠΊΡΠΈΠΏΡΠΎΡΠ°Π½ΠΈβ.
- Π’Ρ Π·Π°Π³Π°Π΄ΡΠ²Π° Π½ΡΠΊΠ°ΠΊΠ²Π° Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΠΉΠ½Π°
- ΠΠΎΠ»ΡΡΠ°Π²Π° ΠΎΡ Π½Π΅Π³ΠΎ Ρ Π΅Ρ
- ΠΡΠ΅Π²Π΅ΠΆΠ΄Π° Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈΡΠ΅ Π½Π° ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠ°ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΠΎΠ±, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΉΠΊΠΈ ΡΠ°ΠΉΠ½Π°ΡΠ° (Ρ Π΅ΡΡΡ ΠΎΡ Π½Π΅Ρ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΡΠ°Π²Π΅Π½ Π½Π° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ Π² Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ°)
- Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΠΎΠ± Π½Π΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π΄ΠΎ Π²Π΅ΡΠ΅ΡΡΠ°, ΠΠ»ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠ²ΠΎΠΈΡΠ΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ.
Π‘ΡΡΠΏΠΊΠ° Π²ΡΠΎΡΠ°: ΠΏΡΠΈΠΌΠ°ΠΌΠΊΠ°
Π ΠΈΠ³ΡΠ°ΡΠ° Π²Π»ΠΈΠ·Π° ΠΠΎΠ± ΠΈ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° βΠΊΡΠΈΠΏΡΠΎΠ΅Π²ΡΠΎβ Π½Π° ΡΠ²ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΊΠ°, ΡΠ΅:
- ΠΠ»ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ βΠΊΡΠΈΠΏΡΠΎΡΠ΅Π½ΠΈΡΠ΅β, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΉΠΊΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎ ΡΠΈΡΠ»ΠΎ
- ΠΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΠΎΡ ΠΎΠ±ΡΠ΄ ΠΠΎΠ±, ΠΏΡΠΈ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΠΠ»ΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΡΠ½Π΅ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°
Π‘ΡΡΠΏΠΊΠ° ΡΡΠ΅ΡΠ°: ΠΎΡΠ³Π°Π΄ΠΊΠ° Π² ΠΏΡΠΈΠΌΠ°ΠΌΠΊΠ°ΡΠ°
ΠΠ»ΠΈΡΠ° ΠΈΠ΄Π²Π° Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΠ°ΡΠΈ ΠΈ Π²Π·ΠΈΠΌΠ° ΠΏΠ°ΡΠΈΡΠ΅ ΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ° Π½Π° ΠΠΎΠ±, ΠΊΠ°ΡΠΎ ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ²ΠΎΡΡΠ° ΡΠ°ΠΉΠ½Π°.
ΠΠ°Π²ΡΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ°: Π·Π°Π³Π°Π΄ΠΊΠ°ΡΠ° Π΅ ΡΠ°Π·Π³Π°Π΄Π°Π½Π°
ΠΠΎΠ± Π²ΠΈΠΆΠ΄Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° ΠΈ ΡΡΡ ΡΠΎΠΊΠΎΠ»ΡΠΊΠΈ ΠΏΠΎΠ³Π»Π΅Π΄ ΠΈΠ·Π²Π»ΠΈΡΠ° ΠΎΡ Π½Π΅Ρ ΡΠ°ΠΉΠ½Π°ΡΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° ΠΎΡ ΠΠ»ΠΈΡΠ° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ°. Π’Π°Π·ΠΈ ΡΠ°ΠΉΠ½Π° ΡΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π·Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ.
ΠΠΎΠ³Π°ΡΠΎ Π½Π΅ΡΠΎ Π½Π΅ Π²ΡΡΠ²ΠΈ ΠΏΠΎ ΠΏΠ»Π°Π½
ΠΠΊΠΎ ΠΠ»ΠΈΡΠ° ΠΈΠ·Π²Π΅Π΄Π½ΡΠΆ ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΡΠΌΡΡΡΠ½Π°, ΠΠΎΠ± Π²Π·ΠΈΠΌΠ° ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ°Π½ΠΈ Π·Π° ΠΎΠ±ΡΠ΄.
ΠΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, ΠΠ»ΠΈΡΠ° ΡΠ΅ Π²ΡΡΠ½Π΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ Π²Π΅ΡΠ΅ΡΡΠ°, Π°ΠΊΠΎ ΠΏΡΠ΅Π΄Π°ΡΠ΅Π»ΡΠΊΠΈΡΡ ΠΠΎΠ± ΡΠ΅ΡΠΈ Π΄Π° Π·Π°Π΄ΡΡΠΆΠΈ ΠΏΠ°ΡΠΈΡΠ΅ Π΄ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π°.
ΠΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° ΠΏΡΠ΅Π΄ ΡΠ΅ΠΊΡΡ, Π½Π° Π₯Π°Π±ΡΠ° ΠΈΠΌΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΈ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ .
Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠΌΠ°ΡΡΠΈΡΠ΅ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π° Π½ΠΈ ΠΏΡΠ΅Π΄ΠΏΠ°Π·ΠΈ ΠΎΡ Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½Π°ΡΠ° ΠΠ»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ Π²Π·ΠΈΠΌΠ° ΠΏΠ°ΡΠΈΡΠ΅ Π½Π° ΠΠΎΠ± Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ, Π° ΡΠ°ΠΉΠΌΠ°ΡΡΡΡ ΠΈΠ·ΡΠΈΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈ Π²ΠΌΡΠΊΠ²Π° hex Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°.
Π£ΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°Π³ΡΠ±ΡΡ ΠΏΠ°ΡΠΈΡΠ΅ ΡΠΈ, ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°Ρ Π²ΡΡΡΠ°Π½Π΅ΡΠΎ.
ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΈΡΠ΅Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ°, ΠΊΠ°ΡΠΎ Π²Π°Π»Π΅Π½ΠΎΠΊ ΡΡ Π΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΡΠΈΡΡΠ΅ΠΌΠΈ ΡΠ°ΠΌΠΎ ΠΌΠ°Π»ΠΊΠΎ:
- ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° Π·Π° ΡΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΈ Ρ ΠΏΠΎΠ½Π΅ Π΅Π΄Π½ΠΎ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅
- Π Π΄Π²Π°ΡΠ° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π΅Π΄Π½Π°ΠΊΠ²ΠΈ Ρ Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ (Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΠΉΠ½Π°ΡΠ°)
- Π’Π°ΠΉΠΌΠ»ΠΎΠΊΠΎΠ²Π΅ΡΠ΅.
ΠΠ° ΠΏΡΡΠ² ΠΏΠΎΠ³Π»Π΅Π΄, Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ "ΡΠ±ΠΎΠ³ΠΎΠΌ" Π½Π° Π±ΠΎΡΡΠ°ΡΠ°, Π½Π°ΡΠ°ΡΠ° ΡΡΠ΅ΡΠ° Π±Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°, Π½ΠΎ Π½Π΅ ΡΡΠΊ.
ΠΡΠΈ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° Π½Π° Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈΡ ΡΠ²ΠΎΠΏ Π½Π΅ Π±Π»Π΅ΡΡΡΡ Ρ Π»ΠΈΠΊΠ²ΠΈΠ΄Π½ΠΎΡΡ. Π Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ΅ΠΏΠ΅Π½ Π·Π°ΡΠΎΡΠΎ Π² Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°ΡΠ° Π΄Π²ΠΎΠΉΠΊΠ° BTC-USD ΡΠΈΠ°ΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π½Π΅ Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡΠ°Π½Π°.
Π£ΡΠΏΠ΅Ρ
ΡΡ Π½Π° USDT ΡΠΎΠ΄ΠΈ ΡΡΠ»Π° Π²ΡΠ»Π½Π° ΠΎΡ ΡΡΠ°Π±ΠΈΠ»Π½ΠΈ ΠΌΠΎΠ½Π΅ΡΠΈ Π² ERC20 ΡΠΎΡΠΌΠ°Ρ Π½Π° Π²ΡΡΠΊΠ°ΠΊΡΠ² Π²ΠΊΡΡ, ΠΎΡ Π½Π°ΠΉ-ΠΊΠ°ΡΡΠΎΠ΄ΠΈΠ°Π»Π½ΠΈΡ USDC Π΄ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ½ΠΈΡ DAI.
ΠΠ°ΡΠΎΠ²Π° Π·Π° ΡΠ»Π΅ΡΠ½Π΅Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ Π·Π° ΡΠΎΠ²Π°, ΡΠ΅ ΠΠ»ΠΈΡΠ° ΠΏΡΠΎΠ΄Π°Π²Π° Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ Π½Π° ΠΠΎΠ± Π² Π·Π°ΠΌΡΠ½Π° Π½Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ERC20 ΡΠΎΠΊΠ΅Π½ΠΈ, ΠΈ ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌΠ΅ Π½Π° ΠΊΡΡΠΌΠ΅ΡΠ° Π½Π° ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅, Π±Π»Π°Π³ΠΎ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
Π‘ΠΊΠΎΡΠΎΡΡ
ΠΠΈΡΠΊΠΎΠΉΠ½ ΠΈ Ethereum ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Π½Π΅ ΡΠ° ΡΠ°ΠΊ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡΡΠ·ΠΈ, Π° ΡΠ΅Π³Π° ΡΠ°ΠΊ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π½ΠΈ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΌΠ΅ ΠΏΡΡΠ²ΠΎ Π΅Π΄ΠΈΠ½ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΡ, ΠΏΠΎΡΠ»Π΅ Π²ΡΠΎΡΠΈ.
ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π΅, Π·Π°ΡΠΎΡΠΎ ΠΏΡΡΠ²ΠΎ ΠΏΠ°ΡΠΈΡΠ΅ Π²Π½Π°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΡΡ, ΠΊΠΎΠΉΡΠΎ Π·Π½Π°Π΅ ΡΠ°ΠΉΠ½Π°ΡΠ°, Π° ΠΎΠΏΠΎΠ½Π΅Π½ΡΡΡ ΡΠ°ΠΊΠ° ΡΠΈΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π΅Π΄Π²Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° ΡΠ²ΠΎΡΡΠ° ΡΠ°ΡΡ.
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π½ΠΈΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ»Π°ΡΠΈΠ»Π΅Π½ Π°ΠΊΡΠΈΠ², ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π° ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΠΊΡΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΡΡΠ΅ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ, Π° ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π²Π΅ΡΠ΅ Π½Π΅ Π΅ Π»Π΅ΡΠ½Π°.
ΠΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»Π½ΠΎΡΡ
ΠΡΠ΅ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½ ΠΎΡΡΠ°Π²Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ Π² Π΄Π²Π΅ΡΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΈΡΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π» ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Ρ Π΅ΡΠΎΠ²Π΅ Π² ΡΠΌΠ°ΡΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΡΠ΅ Π΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠΎΠΈΠ·Π»ΡΠ·Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΠΎΠ·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΡΡΡΠΎΠ²ΠΈ Π΄ΠΎ Π΄Π°Π½ΡΡΠ½ΠΈ.
ΠΠΎΠ³Π°ΡΠΎ Π±ΠΎΡΡΠ°ΡΠ° Π·Π½Π°Π΅ Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ Π΄Π΅Π»Π° β ΡΠΎΠ²Π° Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ, Π° ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ Π·Π½Π°Π΅ β ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ Π²Π΄Π²ΠΎΠΉΠ½Π°.
Usability
Π‘ΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎΡΡΡΠ° Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΠΈΠ·ΠΎΠ±ΡΠΎ, ΠΈ Π½Π° Π΅ΡΠΈΡΠ° Π² ΡΠ°ΡΡΠ½ΠΎΡΡ. ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ°Ρ ΠΏΡΠΎΠ΄Π°Π²Π°ΡΡΡ ΠΈ ΠΊΡΠΏΡΠ²Π°ΡΡΡ.
ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΡΡΠΎ: ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π²Π΅Π΄Π΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ Π½Π° p2sh Π°Π΄ΡΠ΅Ρ. Π‘ Π΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΠ΅Π΄Π΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ ΠΎΡ GitHub Π·Π° ΡΠ²ΠΎΠΏ:
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ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ΅ΠΊΡΠ΅Ρ ΠΈ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΡ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΏΡΠ΅Π²ΠΎΠ΄
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΠΎΡΡΡΠ΅ΠΉΠ»ΠΈ ΠΈ ΠΊΡΠΈΠΏΡΠΎΠ±ΠΎΡΡΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ approve ΡΠΎΠΊΠ΅Π½ΠΈ, ΠΈ Π½Π΅ Π±Π΅Π· ΠΏΡΠΈΡΠΈΠ½Π°.
Π‘Π°ΠΌΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠ΅ΡΡΠΎ Π³ΡΠ΅ΡΠ°Ρ ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π°Ρ ΡΠΎΠΊΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠΎΠΊΠ΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΡΠ΅Π·Π²Π°Ρ. ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π² Etherscan ΡΠ° ΠΏΡΠ»Π½ΠΈ ΡΡΡ ΡΡΠ΅Π½Π°Π½ΠΈΡ Π½Π° Π½Π΅ΡΠ°ΡΡΠ½ΠΈ.
Π Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΏΠ»Π°ΡΠΈ ΡΠ°ΠΊΡΠ° Π² ETH, Π·Π°ΡΠΎΠ²Π° ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°Ρ Π½Π°Π»ΠΈΡΠ½ΠΎ 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 ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ 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 ΠΊΠΎΠ΄ = MyContract.deploy({
data: BYTECODE,
arguments: contructorArgs
}).encodeABI();
const factory = new web3.eth.Contract(FACTORY_ABI, factoryAddress);
tx = factory.methods.create2(ΠΊΠΎΠ΄, salt);
ΠΠΎΡΠ°Π΄ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π°ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π² solidity, Π³Π°Π·ΡΡ Π·Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π·Π°ΡΠ°Π΄ΠΈ Π½ΡΠΊΠΎΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈ Π½Π° Π΅ΡΠΈΡΠ°.
ΠΡΠΎΠ±Π΅Π½ΠΎ Π΅ ΠΏΡΠΈΡΡΠ½ΠΎ, ΡΠ΅ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ Π³Π°Π·, ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΡ ΠΏΠ°Π΄Π° Ρ Π²ΡΡΡΠ΅ΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ°, Π±Π΅Π· Π΄Π° ΡΡΠΎΠ±ΡΠ°Π²Π°, ΡΠ΅ Π³Π°Π·ΡΡ Π½Π΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½, ΠΊΠ°ΠΊΡΠΎ Π±ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°.
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈ Π½Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΈ, Π±Π΅Π· Π΄Π° Π³ΠΈ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ, ΠΈ Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π³ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°, Π½ΠΈΠΊΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΡ.
ΠΠΎΡΠΎΠ½ Π²ΠΎΡΠΎΠ½Ρ ΠΎΠΊΠΎ Π½Π΅ ΠΈΠ·Π²Π°ΠΆΠ΄Π°.
Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ ΠΈΡΡΠΈΠ½ΡΠΊΠΈΡΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ» Π΄ΠΎΠ±ΡΠΈ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΠΈ Π·Π° Π±ΠΎΡΠ±Π° Ρ Π²ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΡΡΠ΅Π· ΠΏΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΈ, Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΠΏΡΡΠ½ ΠΎΡ ΡΠ°ΠΊΠΈΠ²Π° Π΄Π΅ΡΡΠΊΠΈ Ρ ΠΈΡΡΠΎΡΡΠΈ, ΠΈ ΡΠ»Π΅Π΄ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΡΠΎΠΉ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π²ΠΈΠ΄ΠΈ Ρ Π΅ΡΠ°.
ΠΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°ΠΊΠ°, ΡΠ΅ Ρ Π΅ΡΡΡ Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΊΡΠΈΡ?
Π‘Π°ΠΌΠΈΡΡ ΡΠ²ΠΎΠΏ ΠΏΡΠ΅Π½Π°ΡΡΠΌΠ΅ Π² ΠΎΡΠ»Π°ΠΉΠ½: ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄ ΠΊΡΠΌ ΡΠ²ΠΎΠΏ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ°ΡΡΠ½ΠΈΡΡ ΠΊΠ»ΡΡ ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ°ΠΉΠ½ΠΎ.
Π‘ΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°.Π‘ΡΠ·Π΄Π°Π²Π°Ρ ΡΠ΅ Π΄Π²Π° "ΠΌΡΠ»ΡΠΈΡΠΈΠ³", ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΎΡ ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ±.
ΠΠ° Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π΅ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π² ΠΎΡΠ»Π°ΠΉΠ½ Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² ΡΡΠ°Π³Π΅Π΄ΠΈΡ, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΡΠ°ΡΠΈΡ Π΄ΠΎΠ±ΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ.
ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ± ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°Ρ ΡΡΠ΅Π΄ΡΡΠ²Π°.
- ΠΠ»ΠΈΡΠ° ΠΈΠ·ΠΌΠΈΡΠ»Ρ ΡΠ°ΠΉΠ½Π° ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΠΎΠ± Ρ Π΅ΡΠ° Π½Π° ΡΠ°ΠΉΠ½Π°ΡΠ° ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΠ²ΠΎΠΏΠ°.
- ΠΠΎΠ± ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΠ»ΠΈΡΠ° ΠΏΠΎΠ΄ΠΏΠΈΡΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΡΠΎΠΊΠ΅Π½ΠΈ Π½Π° ΡΠ²ΠΎΠΏ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Ρ ΠΈΠ·ΠΌΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π΅Ρ.
- ΠΠ»ΠΈΡΠ° ΡΡΠΎΠ±ΡΠ°Π²Π° Π½Π° ΠΠΎΠ± ΡΠ°ΠΉΠ½Π°ΡΠ°.
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΡΡΡΠΏΠ²Π° Ρ Π°ΡΠΌΠΎΠ½ΠΈΡ: ΠΈ ΠΠ»ΠΈΡΠ°, ΠΈ ΠΠΎΠ± ΠΌΠΎΠ³Π°Ρ ΠΏΠΎ Π²ΡΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Π·Π°Π²ΡΡΡΠ°Ρ ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°. Π ΡΠ°ΠΊΠ°Π²Π° Π΄ΡΡΠΆΠ΅Π»ΡΠ±Π½Π° ΠΎΠ±ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΏΠ°ΡΠΈ Π½Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΈΡΠ΅ Π°Π΄ΡΠ΅ΡΠΈ.
ΠΠ° Π²ΡΠ½ΡΠ΅Π½ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π» ΡΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°, ΡΡΠΊΠ°Ρ ΠΏΠ°ΡΠΈΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π»ΠΈ ΠΏΡΠ΅Π· ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Ρ ΠΌΡΠ»ΡΠΈΠΏΠΎΠ΄ΠΏΠΈΡ 2 ΠΎΡ 2.
Π ΡΠ°ΠΊΠ°Π²Π° ΡΡ Π΅ΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ Π΄Π° ΠΏΡΠ°Π²ΡΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΌΠΈΡΠ»Ρ Π²Π΅ΡΠ΅ ΡΠ»Π΅Π΄ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΡ.
Level 2.
Π©ΠΎΠΌ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΏΠ°ΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π°Π΄ΡΠ΅Ρ ΠΈ Π΄Π° Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½Π°ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π½ΠΈΡΠΎ Π½Π΅ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΏΠ°ΡΠΈ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π°Π΄ΡΠ΅ΡΠ° ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΠ΅ ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Π·Π° ΠΎΠ±ΠΌΠ΅Π½, Π½ΠΎ Π°ΠΊΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅Ρ Π΄Π° ΡΡΠ±ΠΈΡΠ°Ρ ΡΠ²ΠΎΠΏ, Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠΏΡΠ΅Ρ.
Π‘Π΅Π³Π° ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ± ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΡ ΡΡΡ Π½Π°ΠΏΡΠ»Π½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Ρ ΡΡΠ΅Π΄Π½Π°ΡΠ° ΡΠ΅Π½Π°, ΠΎΠ±ΠΌΠ΅Π½ΡΠΉΠΊΠΈ ΠΏΠΎ ΡΠ°ΡΠΎΡΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°, ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΠ²ΡΡΠΆΠ°Ρ ΠΌΠ°ΡΠΊΠ΅ΡΠΌΠ΅ΠΉΠΊΠ΅ΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π° Π»ΠΈΠΊΠ²ΠΈΠ΄Π½ΠΎΡΡΡΠ°.
Π‘ΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°.
- ΠΡΠΎΠ΄Π°Π²Π°ΡΠ° ΠΈΠ·ΠΌΠΈΡΠ»Ρ ΡΠ°ΠΉΠ½Π° ΠΈ Π΄Π°Π²Π° Π½Π° ΠΊΡΠΏΡΠ²Π°ΡΠ° Ρ Π΅ΡΠ° Π½Π° ΡΠ°ΠΉΠ½Π°ΡΠ° ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ Π½Π° p2sh Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΠ²ΠΎΠΏΠ°, Π° ΠΎΡΡΠ°ΡΡΠΊΡΡ ΡΠ΅ Π²ΡΡΡΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ°.
- ΠΠ»ΠΈΠ΅Π½ΡΡΡ ΠΏΡΠ΅Π΄Π°Π²Π° ΠΏΠΎΠ΄ΠΏΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΡΠΎΠΊΠ΅Π½ΠΈ ΠΈ Π²ΡΡΡΠ°Π½Π΅ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ.
- ΠΡΠΎΠ΄Π°Π²Π°ΡΡΡ ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ°ΠΉΠ½Π°
- ΠΡΡΠΎΡΠΈΡΡΠ° ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡ Ρ Π½ΠΎΠ²Π° ΡΠ°ΠΉΠ½Π°, ΠΊΠ°ΡΠΎ ΠΊΡΠΌ ΡΠ²ΠΎΠΏΠ° ΠΈ Π²ΡΡΡΠ°Π½Π΅ΡΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΎΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎ Π·Π°ΠΊΡΠΏΠ΅Π½ΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΊΡΠΏΡΠ²Π°ΡΠ° ΠΈ Π²Π΅ΡΠ΅ ΠΏΠ»Π°ΡΠ΅Π½ΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ°
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²ΠΈΡΠΎΠΊΠΎΡΠΊΠΎΡΠΎΡΡΠ½Π° p2p ΡΡΡΠ³ΠΎΠ²ΠΈΡ, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ»Π΅Π΄ΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΈ Π΄Π° Π·Π°ΡΠ²ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΉΠΊΠΈ Π½Π°ΡΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ΄Π°ΡΠΈΠΌ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΊΠ°Π½Π°Π»ΠΈ Π±Π΅Π·ΡΠΌΡΡΡΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ»Π΅ΡΠ½ΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ°.
ΠΠΎ Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ΅ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
