ΠΠ°ΠΊΠ²ΠΎ Π΅ Π»ΠΎΡΠΎΡΠΎ Π² Π°ΡΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ²ΠΎΠΏΠΎΠ²Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ, ΠΊΠ°ΠΊΠ²ΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ Π² Ρ Π°ΡΠ΄ΡΠΎΡΠΊΠ° Constantinople ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΡΠΌΠ°ΠΌΠ΅ Ρ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΠ»Π°ΡΠΈΠΌ Π·Π° Π³Π°Π·Π°.
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ ΠΏΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡΡΠ°.
ΠΡΠΎΠ²ΠΈΠ΄Π΅Π½ΠΈΠ΅ΡΠΎ Π±Π΅ΡΠ΅ Π±Π»Π°Π³ΠΎΡΠΊΠ»ΠΎΠ½Π½ΠΎ, Π½Π°ΠΏΡΡΠ½Π°Ρ
ICO, Π±Π΅Π· Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΌ ΠΏΡΡΠ²Π°ΡΠ° Π½Π΅ΠΎΠ±ΡΠ°ΡΠΈΠΌΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π½ΠΎ ΡΠΊΠΎΡΠΎ ΡΠ΅ ΠΎΠ·ΠΎΠ²Π°Ρ
Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ±ΠΎΡΡΠ°.
ΠΠ· ΡΡΠΌ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠ½ΠΎ Π½Π΅ ΠΠΎΠΌΡΠ΅ΡΠΎ ΠΠΈΠ±Π°Π»ΡΡΠΈΡ, ΠΈ Π΅Π΄ΠΈΠ½ ΡΡΡΠΎΠ³ ΠΏΠΎΠ³Π»Π΅Π΄ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½, Π·Π° Π΄Π° Π΄Π°ΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΠΏΠ°ΡΠΎΠ»ΠΈ. ΠΠ°ΡΠΎΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΠΈ ΡΠ΅Π» ΠΊΠ°ΡΠΎ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡ Π±Π΅ΡΠ΅ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ° Π³ΠΎΡΠ΅ΡΠ°ΡΠ° ΡΡΡΠ΅Π»Π° Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΏΠΎ-Π΄Π°Π»Π΅ΡΠ΅ ΠΎΡ ΡΠΊΡΠΏΠΈΡΠ΅ ΠΌΠΈ ΠΈΠ½ΡΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ.
ΠΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅, Π½Π΅ ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ
Π‘ΡΡΠΎΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π°ΠΊΡΠΈΠ²ΠΈ ΠΈ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΠΌ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎΡΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΠΈ Π°ΠΊΡΠΈΠ²ΠΈ ΠΏΡΠΈ Π½Π°Ρ, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°.
ΠΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΠΉΡΡΠ²Π°ΡΠ΅ ΠΊΠ°ΡΠΎ ΡΡΠ΄ΠΈΡ Π² ΡΠΏΠΎΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠ΄Π΅Π»ΠΊΠΈ Ρ ΠΏΠΎΡΡΡΠ΅ΠΉΠ»ΠΈ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ Π΄Π²Π° ΠΎΡ ΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°: Π½Π° ΠΊΡΠΏΡΠ²Π°ΡΠ°, ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ° ΠΈ Π΅ΡΠΊΡΠΎΡ.
ΠΠΎ, Π°ΠΊΠΎ ΡΡΠ°ΡΡΠ½ΠΈΠΊΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π°ΡΠ°ΠΊΡΠ²Π° Π΅ΡΠΊΡΠΎΡ, ΡΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈΡΠΊΠ°Π½ΠΈΡΠ΅ Π΄Π²Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ°.
ΠΡΠΎΠΌΠ΅Π½ ΡΠ²ΠΎΠΏ Π΅ ΡΡ Π΅ΠΌΠ° Π½Π° ΠΎΠ±ΠΌΠ΅Π½, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π³Π°ΡΠ°Π½ΡΡΡ Π΅ ΡΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΄ΠΎΠΏΡΡΠΊΠ° ΡΠ°ΠΌΠΎ ΡΠ΅ΡΡΠ½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
ΠΠ°ΠΊΡΠΎ Π² Π·Π°Π³Π°Π΄ΠΊΠ°ΡΠ° Π·Π° Π²ΡΠ»ΠΊΠ°, ΠΊΠΎΠ·Π°ΡΠ° ΠΈ ΠΊΠ°ΠΏΡΡΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄Π΅ΠΉΡΡΠ²Π°ΡΠ΅ ΡΠ°ΠΌΠΎ ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈ ΠΏΠΎΠ½Π΅ΡΠ΅ΡΠ΅ Π·Π°Π³ΡΠ±ΠΈ, Π°ΠΊΠΎ ΠΎΡΡΡΡΠΏΠΈΡΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ.
Π‘Π°ΠΌΠΎ ΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π»Π°ΠΊΠΎΠΌΠΈΡΠ΅ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈ, ΡΠ΅Π΄Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Ρ Π΅Ρ-ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΠΊΠΎΠ»ΠΈΠ·ΠΈΡ, ΡΠ΅ Π΄ΠΎΡΠΈ Π½Π΅ ΡΠΈ Π·Π°ΡΠ»ΡΠΆΠ°Π²Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ²Π°Ρ.
Π‘ΡΡΠΏΠΊΠ° ΠΏΡΡΠ²Π°: Π·Π°Π³Π°Π΄ΠΊΠ°ΡΠ°
ΠΠ΅ΠΊΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΠ»ΠΈΡΠ° Π΅Π΄Π½Π° ΡΡΡΠ°Ρ ΠΎΡΠ½Π° ΡΡΡΠΈΠ½ ΠΈΡΠΊΠ° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ Π½Π° ΠΠΎΠ± ΡΡΠ΅ΡΡ ΡΠ΅ΠΏΠ° "ΠΊΡΠΈΠΏΡΠΎΡΠ°Π½ΠΈ".
- Π’Ρ Π·Π°Π³Π°Π΄Π²Π° Π½ΡΠΊΠ°ΠΊΠ²Π° Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΠΉΠ½Π°
- ΠΠΎΠ»ΡΡΠ°Π²Π° ΠΎΡ Π½Π΅Π³ΠΎ Ρ Π΅Ρ
- ΠΡΠ΅Π²Π΅ΠΆΠ΄Π° Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈΡΠ΅ Π½Π° ΡΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΠΏΠ°ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΠΎΠ±, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΉΠΊΠΈ ΡΠ°ΠΉΠ½Π°ΡΠ° (Ρ Π΅Ρ Π½Π° Π½Π΅Ρ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ²ΠΏΠ°Π΄Π° Ρ ΡΠΊΠ°Π·Π°Π½ΠΎΡΠΎ Π² Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ°)
- Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΠΎΠ± Π½Π΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π·Π° Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈΡΠ΅ ΡΠΈ Π²Π΅ΡΠ΅ΡΡΠ°, ΠΠ»ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ Π²Π·Π΅ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
Π‘ΡΡΠΏΠΊΠ° Π²ΡΠΎΡΠ°: ΠΏΡΠΈΠΌΠ°ΠΌΠΊΠ°ΡΠ°
Π ΠΈΠ³ΡΠ°ΡΠ° Π²Π»ΠΈΠ·Π° ΠΠΎΠ± ΠΈ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° "ΠΊΡΠΈΠΏΡΠΎΠ΅Π²ΡΠΎ" Π½Π° ΡΠ²ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΠΏΠΎ ΡΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½, ΡΠ΅:
- ΠΠ»ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ "ΠΊΡΠΈΠΏΡΠΎΡΠ°Π½ΠΈΡΠ΅", ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΉΠΊΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎ ΡΠΈΡΠ»ΠΎ
- ΠΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΠΎΡ ΠΎΠ±ΡΠ΄ ΠΠΎΠ±, ΠΏΡΠΈ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π° ΠΠ»ΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΡΠ½Π΅ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°
Π‘ΡΡΠΏΠΊΠ° ΡΡΠ΅ΡΠ°: ΠΎΡΠ³ΠΎΠ²ΠΎΡΡΡ Π² ΠΏΡΠΈΠΌΠ°ΠΌΠΊΠ°ΡΠ°
ΠΠ»ΠΈΡΠ°ΡΠ° ΠΈΠ΄Π²Π° Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΠ°ΡΠΈ ΠΈ Π²Π·ΠΈΠΌΠ° ΠΏΠ°ΡΠΈΡΠ΅ ΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ° Π½Π° ΠΠΎΠ±, ΡΠ°Π·ΠΊΡΠΈΠ²Π°ΠΉΠΊΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ²ΠΎΡΡΠ° ΡΠ°ΠΉΠ½Π°.
ΠΠ°Π²ΡΡΡΠΈΡΠ΅Π»Π½Π° ΡΡΡΠΏΠΊΠ°: Π·Π°Π³Π°Π΄ΠΊΠ°ΡΠ° Π΅ ΡΠ°Π·Π³Π°Π΄Π°Π½Π°
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° Π²ΠΈΠΆΠ΄Π° ΠΠΎΠ± ΠΈ Ρ ΠΎΡΠ»ΠΈΠ½ΠΎ ΠΎΠΊΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΎΡ Π½Π΅Ρ ΡΠ°ΠΉΠ½Π°ΡΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° ΠΎΡ ΠΠ»ΠΈΡΠ°ΡΠ° Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ°. Π’Π°Π·ΠΈ ΡΠ°ΠΉΠ½Π° ΡΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π·Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ Π²Π΅ΡΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ.
ΠΠΎΠ³Π°ΡΠΎ Π½Π΅ΡΠΎ Π²ΡΡΠ²ΠΈ Π½Π° Π·Π»Π΅
ΠΠΊΠΎ ΠΠ»ΠΈΡΠ°ΡΠ° ΠΈΠ·Π²Π΅Π΄Π½ΡΠΆ ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΡΠΌΡΡΡΠ½Π°, ΠΠΎΠ± ΠΎΠ±ΡΠ΄Π²Π° ΠΈ Π²Π·ΠΈΠΌΠ° ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ°Π½ΠΈ.
ΠΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, ΠΠ»ΠΈΡΠ°ΡΠ° Π²Π΅ΡΠ΅ΡΡΠ° Π²ΡΡΡΠ° Π±ΠΈΡΠΊΠΎΠΉΠ½Π°, Π°ΠΊΠΎ Π²Π΅ΡΠΎΠ»ΠΎΠΌΠ½ΠΈΡΡ ΠΠΎΠ± ΡΠ΅ΡΠΈ Π΄Π° Π·Π°Π΄ΡΡΠΆΠΈ ΠΏΠ°ΡΠΈΡΠ΅ Π΄ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π°.
ΠΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ ΡΠ΅ΠΊΡΡ, Π½Π° Π₯Π°Π±ΡΠ° ΠΈΠΌΠ° Π·Π° Π²Π°Ρ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΈ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ .
Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠΌΠ°ΡΡΠΈΡΠ΅ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π° Π½ΠΈ Π·Π°ΡΡΡΠ°Ρ ΠΎΠ²Π° ΠΎΡ Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½Π°ΡΠ° ΠΠ»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ Π²Π·ΠΈΠΌΠ° ΠΏΠ°ΡΠΈΡΠ΅ Π½Π° ΠΠΎΠ± Π² Π½Π°ΠΉ-ΠΊΡΡΠ½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡΡΡ ΠΈΠ·ΡΠΈΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠΎΠΉ Ρ ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈ ΠΏΡΡΡΡΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π° hex Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°.
Π£ΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°Π³ΡΠ±ΡΡ ΠΏΠ°ΡΠΈΡΠ΅ ΡΠΈ, ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°Ρ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΈΡΠ΅Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ° ΡΡ Π΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Π»Π½ΠΈΡΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ:
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠΌΠ°ΡΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ Ρ ΠΏΠΎΠ½Π΅ Π΅Π΄Π½ΠΎ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅
- Π Π΄Π²Π°ΡΠ° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° Ρ Π΅ΡΠΈΡΠ°Π½Π΅ (Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΠΉΠ½Π°ΡΠ°)
- Π’Π°ΠΉΠΌΠ»ΠΎΠΊΠΎΠ²Π΅.
ΠΠ° ΠΏΡΡΠ² ΠΏΠΎΠ³Π»Π΅Π΄, Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Π±ΠΎΡΡΠ°ΡΠ° "ΡΠ±ΠΎΠ³ΠΎΠΌ, Π½Π°ΡΠ°ΡΠ° ΡΡΠ΅ΡΠ° Π±Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°", Π½ΠΎ Π½Π΅ ΡΠ°ΠΊΠ° Π»Π΅ΡΠ½ΠΎ.
ΠΡΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ²ΠΎΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°, ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° Π½Π° Π°ΡΠΎΠΌΠ΅Π½ ΡΠ²ΠΎΠΏ Π½Π΅ Π±Π»Π΅ΡΡΡΡ Ρ Π»ΠΈΠΊΠ²ΠΈΠ΄Π½ΠΎΡΡ. ΠΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΡΠΎΠ²Π° Π΅, Π·Π°ΡΠΎΡΠΎ Π² Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°ΡΠ° Π΄Π²ΠΎΠΉΠΊΠ° BTC-USD, ΡΠΈΠ°ΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π½Π΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡΠ°Π½Π°.
Π£ΡΠΏΠ΅Ρ
ΡΡ Π½Π° USDT Ρ
Π²ΡΡΠ»ΠΈ ΡΡΠ»Π° Π²ΡΠ»Π½Π° ΠΎΡ ΡΡΠ°Π±ΠΈΠ»Π½ΠΈ ΠΌΠΎΠ½Π΅ΡΠΈ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ ERC20 Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²ΠΊΡΡ, ΠΎΡ Π½Π°ΠΉ-ΠΊΠΎΡΡΠΎΠ΄ΠΈΠ°Π»Π½ΠΈΡ USDC Π΄ΠΎ Π½Π°ΠΉ-Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ½ΠΈΡ DAI.
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π·Π° ΠΏΡΠΎΡΡΠΎΡΠ° ΡΠ΅ ΡΠ°Π·ΡΡΠΆΠ΄Π°Π²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΡΡΠΊ, ΡΠ΅ ΠΠ»ΠΈΡΠ°ΡΠ° ΠΏΡΠΎΠ΄Π°Π²Π° Π½Π° ΠΠΎΠ± Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ Π·Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ERC20 ΡΠΎΠΊΠ΅Π½ΠΈ ΠΈ ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌΠ΅ Π½Π° ΠΊΡΡΠΌΠ΅ΡΠ° Π½Π° ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
Π‘ΠΊΠΎΡΠΎΡΡ
ΠΠΈΡΠΊΠΎΠΉΠ½ ΠΈ Ethereum ΠΏΠΎΠΎΡΠ΄Π΅Π»Π½ΠΎ Π½Π΅ ΡΠ° ΠΏΡΠ΅ΠΊΠ°Π»Π΅Π½ΠΎ Π±ΡΡΠ·ΠΈ, Π° ΡΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΌΠ΅ ΠΏΡΡΠ²ΠΎ Π΅Π΄ΠΈΠ½ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΡ, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠΎΡΠΈ.
ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΡΡΠ²ΠΎ ΠΏΠ°ΡΠΈΡΠ΅ Π²Π½Π°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΡΡ, ΠΊΠΎΠΉΡΠΎ Π·Π½Π°Π΅ ΡΠ°ΠΉΠ½Π°ΡΠ°, Π° ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊΡΡ ΡΠ°ΠΊΠ° ΡΠΈΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ ΡΠ°ΠΌΠΎ ΡΠΎΠ³Π°Π²Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ ΡΠ²ΠΎΡΡΠ° ΡΠ°ΡΡ.
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ° Ρ Π΄ΠΎΡΡΠ° Π²ΠΎΠ»Π°ΡΠΈΠ»Π½Π° Π°ΠΊΡΠΈΠ², ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΠΊΡΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ, Π° ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π²Π΅ΡΠ΅ Π΅ ΡΡΡΠ΄Π½ΠΎ.
ΠΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»Π½ΠΎΡΡ
ΠΡΡΠΊΠ° ΡΠ°Π·ΠΌΡΠ½Π° ΠΎΡΡΠ°Π²Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ Π½Π° Π΄Π²Π΅ΡΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΈ. ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»Π΅Π½ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π» ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΅Π΄Π½Π°ΠΊΠ²ΠΈ Ρ Π΅ΡΠΎΠ²Π΅ Π² ΡΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΈΡΠ΅ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΠΈΠ·Π²ΠΎΠ΄, ΡΠ΅ Π΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΎΡ ΠΊΡΡΡΠΎΠ²ΠΈ Π΄ΠΎ Π΄Π°Π½ΡΡΠ½ΠΈ.
ΠΠΎΠ³Π°ΡΠΎ Π±ΠΎΡΡΠ°ΡΠ° Π·Π½Π°Π΅ Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ Π΄Π΅Π»Π° β ΡΠΎΠ²Π° Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ Π·Π½Π°Π΅ Π·Π° ΡΡΡ β Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠ΅ ΡΠ΄Π²ΠΎΡΡ.
Π£Π΄ΠΎΠ±ΡΡΠ²ΠΎ
Π‘ΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎΡΡΡΠ° Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΠΈΠ·ΠΎΠ±ΡΠΎ ΠΈ Π½Π° Π΅ΡΠΈΡΠ° Π² ΡΠ°ΡΡΠ½ΠΎΡΡ. ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ°Ρ ΠΏΡΠΎΠ΄Π°Π²Π°ΡΡΡ ΠΈ ΠΊΡΠΏΡΠ²Π°ΡΡΡ.
ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΡΡΠΎ: ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π²Π΅Π΄Π΅ Π±ΠΈΡΠΊΠΎΠΉΠ½ Π½Π° 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, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΈ Π΄Π²Π°ΠΌΠ°ΡΠ° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°Ρ ΡΠ΅Π·Π΅ΡΠ²ΠΈ ΠΏΡΠ΅Π΄ΠΈ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°, Π° ΡΠΎΠ²Π° ΠΌΠ°Π»ΠΊΠΎ Ρ ΠΎΡΠ° ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΏΡΠ°Π²ΡΡ.
ΠΠ°Π·Π³ΠΎΠ»Π΄Π΅Ρ
ΠΡΡΠ²ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠ΅Π»Ρ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠΉ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ°Π΄Π° ΠΎΡ ΠΈΠ·ΠΎΠ±ΠΈΠ»ΠΈΠ΅ Π½Π° Π³Π°Π· ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΈΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΆΠ΅Π»Π°Π΅ΡΠΈ.
ΠΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°Π½ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ
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 ++ Π°Π΄ΡΠ΅Ρ ++ ΡΠΎΠ» ++ keccak256(init_code))[12:]
ΠΡΠ΄Π΅
- Π°Π΄ΡΠ΅Ρ β Π°Π΄ΡΠ΅Ρ Π½Π° ΡΠ°Π±ΡΠΈΡΠ½ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ
- ΡΠΎΠ» β Π½ΡΠΊΠ°ΠΊΠ²ΠΎ ΡΠΈΡΠ»ΠΎ, ΡΠΈΠΉΡΠΎ ΡΠΌΠΈΡΡΠ» ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π΅ΠΏΠΈΠ·ΠΎΠ΄
- 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 Π³Π°Π·Π° Π·Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΡΠ°Π΄ΠΈ Π½ΡΠΊΠΎΠΈ Π½ΡΠ°Π½ΡΠΈ Π½Π° Π΅ΡΠΈΡΠ°.
ΠΡΠΎΠ±Π΅Π½ΠΎ ΠΌΠΈΠ»ΠΎ Π΅, ΡΠ΅ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ Π³Π°Π· ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΡ ΠΏΠ°Π΄Π° Ρ Π²ΡΡΡΠ΅ΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ°, Π±Π΅Π· Π΄Π° ΡΡΠΎΠ±ΡΠ°Π²Π°, ΡΠ΅ Π³Π°Π·ΡΡ Π΅ ΡΠ²ΡΡΡΠΈΠ», ΠΊΠ°ΠΊΠ²ΠΎΡΠΎ Π±ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°.
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΈ, Π±Π΅Π· Π΄Π° Π³ΠΈ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ, ΠΈ Π½ΠΈΠΊΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΡ, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°.
ΠΠΎΡΠΎΠ½ Π²ΠΎΡΠΎΠ½ΡΠ΅ ΠΎΠΊΠΎ Π½Π΅ Π²ΡΠΊΠ»ΡΠ΅Ρ
Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ ΠΈΡΡΠΈΠ½ΡΠΊΠΈΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠΎΠ·ΠΈ, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» Π΄ΠΎΠ±ΡΠΈ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΠΈ Π·Π° Π±ΠΎΡΠ±Π° Ρ Π²ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΡΡΠ΅Π· ΠΏΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΈ, Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΠΏΡΡΠ½ ΠΎΡ ΡΠ°ΠΊΠΈΠ²Π° Π΄Π΅ΡΡΠΊΠΈ ΡΡΠΈΠΊΠΎΠ²Π΅, ΠΈ ΡΠ»Π΅Π΄ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°, Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π²ΠΈΠ΄ΠΈ Ρ Π΅ΡΠ°.
ΠΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°ΠΊΠ°, ΡΠ΅ Ρ Π΅ΡΡΡ Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΊΡΠΈΡ?
Π‘Π°ΠΌΠΈΡΡ ΡΠ²ΠΎΠΏ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠΌΠ΅ Π² ΠΎΡΡΠ΅ΠΉΠ½: ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ Π·Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° ΡΠ²ΠΎΠΏ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ°ΠΉΠ½ΠΎ ΡΠ°Π·ΠΊΡΠΈΠ²Π°Ρ ΡΠ΅ΠΊΡΠ΅Ρ.
Π‘ΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°Π‘ΡΠ·Π΄Π°Π²Π°Ρ ΡΠ΅ Π΄Π²Π° "ΠΌΡΠ»ΡΠΈΡΠΈΠ³Π°", ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΎΡ ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ±.
ΠΠ° Π΄Π° Π½Π΅ ΡΡΠ°Π½Π΅ ΡΡΠ°Π³Π΅Π΄ΠΈΡ ΠΏΡΠΈ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π½Π° Π½ΡΠΊΠΎΠΉ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² ΠΎΡΠ»Π°ΠΉΠ½, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ°ΡΠΈΡ Π΄ΠΎΠ±ΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ.
ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ± ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ Π²Π½Π°ΡΡΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠΈ
- ΠΠ»ΠΈΡΠ° ΠΈΠ·ΠΌΠΈΡΠ»Ρ ΡΠ΅ΠΊΡΠ΅Ρ ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΠΎΠ± Ρ Π΅Ρ Π½Π° ΡΠ΅ΠΊΡΠ΅Ρa ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Π±ΠΈΡΠΊΠΎΠΉΠ½ΠΈ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΠ²ΠΎΠΏΠ°.
- ΠΠΎΠ± ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΠ»ΠΈΡΠ° ΠΏΠΎΠ΄ΠΏΠΈΡ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΡΠΎΠΊΠ΅Π½ΠΈΡΠ΅ Π½Π° ΡΠ²ΠΎΠΏ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Ρ ΠΈΠ·ΠΌΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π΅Ρ.
- ΠΠ»ΠΈΡΠ° ΡΡΠΎΠ±ΡΠ°Π²Π° Π½Π° ΠΠΎΠ± ΡΠ°ΠΉΠ½ΠΈΡ ΡΠ΅ΠΊΡΠ΅Ρ.
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΡΡΡΠΏΠ²Π° Ρ Π°ΡΠΌΠΎΠ½ΠΈΡ: ΠΈ ΠΠ»ΠΈΡΠ°, ΠΈ ΠΠΎΠ± ΠΌΠΎΠ³Π°Ρ ΠΏΠΎ Π²ΡΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Π·Π°Π²ΡΡΡΠ°Ρ ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°. Π ΡΠ°ΠΊΠ°Π²Π° ΠΏΡΠΈΡΡΠ΅Π»ΡΠΊΠ° Π°ΡΠΌΠΎΡΡΠ΅ΡΠ° ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, Π·Π° Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΡ ΠΏΠ°ΡΠΈ Π½Π° ΠΊΡΠ°ΠΉΠ½ΠΈ Π°Π΄ΡΠ΅ΡΠΈ.
ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π» ΡΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΡΠΊΠ°Ρ ΠΏΠ°ΡΠΈΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π»ΠΈ ΠΏΡΠ΅Π· ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Ρ ΠΌΡΠ»ΡΠΈΠΏΠΎΠ΄ΠΏΠΈΡ 2 ΠΎΡ 2.
Π ΠΎΡΠ΅, ΡΠ°ΠΊΠ°Π²Π° ΡΡ Π΅ΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ Π΄Π° ΠΏΡΠ°Π²ΡΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΠΊΡΠ΅ΡΡΡ ΡΠ΅ ΠΈΠ·ΠΌΠΈΡΠ»Ρ Π²Π΅ΡΠ΅ ΡΠ»Π΅Π΄ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΡ.
Level 2
Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΏΠ°ΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π°Π΄ΡΠ΅Ρ ΠΈ Π΄Π° Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½Π°ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π½ΠΈΡΠΎ Π½Π΅ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΏΠ°ΡΠΈ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π°Π΄ΡΠ΅ΡΠ° ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΠ΅ ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΡ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Π·Π° ΡΠ°Π·ΠΌΡΠ½Π°, Π½ΠΎ ΠΊΠΎΠ³Π°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅Ρ Π΄Π° ΡΡΠ±ΠΈΡΠ°Ρ ΡΠ²ΠΎΠΏ, ΡΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠΏΡΠ΅Ρ.
Π‘Π΅Π³Π° ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ± ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΡ ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Ρ ΡΡΠ΅Π΄Π½Π°ΡΠ° ΡΠ΅Π½Π°, ΠΎΠ±ΠΌΠ΅Π½ΡΠΉΠΊΠΈ ΠΏΠΎ ΡΠ°ΡΠΎΡΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ²ΡΡΠΆΠ°Ρ ΠΌΠ°ΡΠΊΠ΅ΡΠΌΠ΅ΠΉΠΊΡΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π° Π»ΠΈΠΊΠ²ΠΈΠ΄Π½ΠΎΡΡ.
Π‘ΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°
- ΠΡΠΎΠ΄Π°Π²Π°ΡΡΡ ΠΈΠ·ΠΌΠΈΡΠ»Ρ ΡΠ΅ΠΊΡΠ΅Ρ ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΊΡΠΏΡΠ²Π°ΡΠ° Ρ Π΅Ρ Π½Π° ΡΠ΅ΠΊΡΠ΅Ρa ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ Π½Π° p2sh Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΠ²ΠΎΠΏΠ°, Π° ΠΎΡΡΠ°ΡΡΠΊΡΡ ΡΠ΅ Π²ΡΡΡΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ°.
- ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠΎΠ΄ΠΏΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠΊΠ΅Π½ΠΈ ΠΈ ΠΎΡΡΠ°ΡΡΠΊΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ.
- ΠΡΠΎΠ΄Π°Π²Π°ΡΡΡ ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ°ΠΉΠ½Π°
- ΠΡΡΠΎΡΠΈΡΡΠ° ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡ Ρ Π½ΠΎΠ²Π° ΡΠ°ΠΉΠ½Π°, ΠΊΠ°ΡΠΎ ΠΊΡΠΌ ΡΠ²ΠΎΠΏΠ° ΠΈ ΠΎΡΡΠ°ΡΡΠΊΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΠΈ Π·Π°ΠΊΡΠΏΠ΅Π½ΠΎΡΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Π²Π΅ΡΠ΅ ΠΏΠ»Π°ΡΠ΅Π½ΠΎΡΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠ°.
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²ΠΈΡΠΎΠΊΠΎ ΡΠΊΠΎΡΠΎΡΡΠ½Π° p2p ΡΡΡΠ³ΠΎΠ²ΠΈΡ, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ»Π΅Π΄ΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΈ Π΄Π° Π·Π°ΡΠ²ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°.
ΠΠΎ Ρ Π»Π΅ΠΊΠΎ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ΄Π°ΡΠΈΠΌ Π±Π΅Π·ΡΠΌΡΡΡΠΈΠ΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΊΠ°Π½Π°Π»ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ»Π΅ΡΠ½ΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ°.
ΠΠΎ Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ΅ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
