
ΠΡ Π₯Π°Π±Ρ!
ΠΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° Bitcoin, ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ, ΠΏΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΠ΅Π½Π·ΡΡ, ΡΠ΅ ΡΠΎΠ³Π»Π°ΡΡΠ²Π°Π°Ρ Π·Π° Π·Π±ΠΈΡ Π½Π° UTXOs: ΠΊΠΎΠ»ΠΊΡ ΠΌΠΎΠ½Π΅ΡΠΈ ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΡΡΠΎΡΠ΅ΡΠ΅, Π½Π° ΠΊΠΎΠ³ΠΎ ΡΠΎΡΠ½ΠΎ ΠΈ ΠΏΠΎΠ΄ ΠΊΠΎΠΈ ΡΡΠ»ΠΎΠ²ΠΈ. Π‘Π΅ΡΠΎΡ UTXO Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΠΎΡ ΡΠ΅Ρ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π·Π° ΡΠ°Π·ΠΎΠ» Π·Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ, Π±Π΅Π· ΠΊΠΎΡ ΡΠ°Π·ΠΎΠ»ΠΎΡ Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ° ΠΏΠΎΡΠ²ΡΠ΄ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΠ° Π½Π° Π΄ΠΎΡΠ΄ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈΡΠ΅ ΡΡΠΎ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠ°Ρ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΠ³Π»Π΅Π΄, ΡΠ΅ ΠΏΡΠ°Π²Π°Ρ ΠΎΠ±ΠΈΠ΄ΠΈ Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅Π½ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π·Π°ΡΡΠ²Π°Π½Π°ΡΠ° Π·Π°ΡΡΠ°ΠΏΠ΅Π½ΠΎΡΡ Π½Π° ΠΎΠ²ΠΎΡ ΡΠ΅Ρ, Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π±Π΅Π· Π³ΡΠ±Π΅ΡΠ΅ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΈ. ΠΠΎΠ»ΠΊΡ Π΅ ΠΏΠΎΠΌΠ°Π» ΠΎΠ±Π΅ΠΌΠΎΡ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΡΠΎΠ»ΠΊΡ ΡΠ΅ ΠΏΠΎΠΌΠ°Π»ΠΈ Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΠΏΡΠΎΡΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π½Π° ΡΠ°Π·ΠΎΠ»ΠΎΡ Π·Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΠ°, ΡΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ Π΅Π²ΡΠΈΠ½ΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΎΠ» Π·Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΠ°, ΡΡΠΎ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ° ΠΏΡΠΎΡΠΈΡΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ ΡΠΎ ΡΠΎΠ° Π΄Π° ΡΠ° Π·Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°.
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ ΡΠ΅ ΠΎΠ±ΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° Rust Π½Π° Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π΅ΡΠ½ΠΈΠΎΡ ΠΏΡΠ΅Π΄Π»ΠΎΠ³ ΠΎΠ΄ ΠΊΠΎΠ°Π²ΡΠΎΡ , - , ΡΡΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ Π½Π° Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΠΏΡΠΎΡΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π·Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΡΠΊΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ.
Π¨ΡΠΎ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ?
ΠΠ΄Π΅Π½ ΠΎΠ΄ ΡΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° ΠΠΈΡΠΊΠΎΠΈΠ½ Π΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎΡΡ. ΠΠ΄Π΅ΡΠ°ΡΠ° Π·Π° βΠ²Π°ΡΠ° ΡΠΎΠΏΡΡΠ²Π΅Π½Π° Π±Π°Π½ΠΊΠ°β Π±Π°ΡΠ° ΠΎΠ΄ ΡΡΠ΅ΡΠ½ΠΈΡΠΈΡΠ΅ Π²ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΄Π° Π²ΠΎΠ΄Π°Ρ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π·Π° ΡΠΈΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅. ΠΠΎ Bitcoin, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ»ΠΈΠ²ΠΈΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° ΡΠ΅ ΠΈΠ·ΡΠ°Π·ΡΠ²Π°Π°Ρ ΠΊΠ°ΠΊΠΎ Π·Π±ΠΈΡ Π½Π° Π½Π΅ΠΏΠΎΡΡΠΎΡΠ΅Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ - UTXO-ΡΠ΅Ρ. ΠΠ°ΠΊΠΎ ΠΎΠ²Π° Π½Π΅ Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΡΠ΅, ΡΠΎΠ° Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΏΡΠ΅ΡΡΡΠ°Π²Π°ΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΡΠ΅ΠΊΠΎΡ βΠΏΠ°ΡΠΈΡΠ½ΠΈΠΊβ ΠΈΠΌΠ° βΠ±Π°Π»Π°Π½Ρβ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡΠ΅Π±Π΅Π½ Π·Π°ΠΏΠΈΡ, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄ΠΎΠ΄Π°Π²Π° ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡ (Π½Π° ΠΏΡ. ).
ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈΡΠ΅ (ΠΎΠ½Π° ΡΡΠΎ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½) ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½Π°ΡΠ° ΡΠΎΡΡΠΎΡΠ±Π° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ. ΠΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π½Π° Π±ΠΈΡΠΊΠΎΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π·Π°ΡΠ°ΡΠ° ΠΎΠΊΠΎΠ»Ρ 200 GB ΠΏΡΠΎΡΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π° Π΄Π° ΡΠ°ΡΡΠ΅. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠΌΠ°Π»Π°, ΠΎΠ΄ ΡΠ΅Π΄ΠΎΡ Π½Π° 4 GB, ΠΈ Π³ΠΎ Π·Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ°ΠΌΠΎ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΠΏΠΎΡΠ΅Π΄ΡΠ²Π° ΠΌΠΎΠ½Π΅ΡΠΈ. ΠΠ±Π΅ΠΌΠΎΡ Π½Π° ΠΎΠ²ΠΈΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π° ΡΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½ΠΎ ΡΠΎ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ±Π°Π²Π½ΠΎ ΡΠ΅ΠΌΠΏΠΎ, Π° ΠΏΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ Π΄ΡΡΠΈ ΠΈ ΠΈΠΌΠ° ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡΠ° Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π° (Π²ΠΈΠ΄ΠΈ CDPV).
ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ (SPV) ΡΡΠ³ΡΠ²Π°Π°Ρ ΡΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π·Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π΄Π° Π½Π΅ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΡΠΎΡΡΠΎΡΠ±Π° (UTXO-ΡΠ΅Ρ) ΠΎΡΠ²Π΅Π½ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΈ.
UTXO ΠΈ UTXO-ΡΠ΅Ρ
UTXO (Unspent Transaction Output) Π΅ ΠΈΠ·Π»Π΅Π·ΠΎΡ Π½Π° Π½Π΅ΠΏΠΎΡΡΠΎΡΠ΅Π½Π°ΡΠ° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°, ΠΊΡΠ°ΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΊΠΎΡ Π‘Π°ΡΠΎΡΠΈ ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ Π²ΠΎ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈΡΠ΅. ΠΠ΅ΠΏΠΎΡΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΈΠ·Π»Π΅Π·ΠΈ ΡΡΠ°Π½ΡΠ²Π°Π°Ρ Π²Π»Π΅Π·ΠΎΠ²ΠΈ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΠΈ Π½Π° ΡΠΎΡ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΡΡΠΎΡΠ°Ρ (ΡΡΠΎΡΠ°Ρ) ΠΈ ΡΠ΅ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π°Ρ ΠΎΠ΄ UTXO-ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ.
ΠΠΎΠ²ΠΈΡΠ΅ UTXO ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Π°Ρ ΡΠΎ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ:
- coinbase ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π±Π΅Π· Π²Π»Π΅Π·ΠΎΠ²ΠΈ: ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π½ΠΎΠ²ΠΈ UTXO ΠΊΠΎΠ³Π° ΡΡΠ΄Π°ΡΠΈΡΠ΅ ΠΈΠ·Π΄Π°Π²Π°Π°Ρ ΠΌΠΎΠ½Π΅ΡΠΈ
- ΡΠ΅Π΄ΠΎΠ²Π½ΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ: ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π½ΠΎΠ²ΠΈ UTXO Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΡΠ΅Ρ Π½Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ UTXO
ΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ UTXO:

ΠΠ°ΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ Π³ΠΎ Π±ΡΠΎΡΠ°Ρ Π±ΡΠΎΡΠΎΡ Π½Π° ΠΌΠΎΠ½Π΅ΡΠΈ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΡΡΠΎΡΠ΅ΡΠ΅ (Π±Π°Π»Π°Π½Ρ) Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠ·Π½ΠΎΡΠΎΡ Π½Π° UTXO ΡΡΠΎ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π·Π° ΠΎΠ²ΠΎΡ ΠΏΠ°ΡΠΈΡΠ½ΠΈΠΊ Π·Π° ΡΡΠΎΡΠ΅ΡΠ΅.
Π‘Π΅ΠΊΠΎΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΡΠΊΠΈ ΡΠ°Π·ΠΎΠ», Π·Π° Π΄Π° ΡΠΏΡΠ΅ΡΠΈ ΠΎΠ±ΠΈΠ΄ΠΈ Π·Π° Π΄Π²ΠΎΡΠ½ΠΎ ΡΡΠΎΡΠ΅ΡΠ΅, ΠΌΠΎΡΠ° Π΄Π° Π³ΠΎ Π½Π°Π΄Π³Π»Π΅Π΄ΡΠ²Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ Π‘ΠΈΡΠ΅ UTXO ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΠΊΠΎΡ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΡΠ° Π±Π»ΠΎΠΊ.
ΠΠ°Π·ΠΎΠ»ΠΎΡ ΠΌΠΎΡΠ° Π΄Π° ΠΈΠΌΠ° Π»ΠΎΠ³ΠΈΠΊΠ°:
- ΠΠΎΠΏΠΎΠ»Π½ΡΠ²Π°ΡΠ° Π½Π° UTXO-ΡΠ΅Ρ
- ΠΡΠΈΡΠ΅ΡΠ΅ ΠΎΠ΄ UTXO-ΡΠ΅Ρ
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΠΈΡΡΡΡΠ²ΠΎ Π½Π° Π΅Π΄Π΅Π½ UTXO Π²ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅Ρ
ΠΠΎΡΡΠΎΡΠ°Ρ Π½Π°ΡΠΈΠ½ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»Π°Ρ Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, ΠΏΡΠΈΡΠΎΠ° Π·Π°Π΄ΡΠΆΡΠ²Π°ΡΡΠΈ ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π·Π° Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ Π΄ΠΎΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅ΡΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ .
ΠΠ°ΡΠ΅ΡΠΈΠΈ Π·Π° UTXO
ΠΠ΄Π΅ΡΠ°ΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π±Π°ΡΠ΅ΡΠΈΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ UTXO .
UTXO-ΡΠ΅ΡΠΎΡ Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ Π²ΠΎ Π»Π΅Ρ, Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΏΡΠ΅Π·Π΅ΠΌΠ°ΡΠ΅ Π±Π»ΠΎΠΊ (IBD), Π·Π°ΡΡΠ²Π°Π½ ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΠΈ ΡΡΠ°ΡΠ½ΠΎ, Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π° ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π° ΠΏΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈΡΠ΅ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΡ Π½ΠΎΠ² ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½ Π±Π»ΠΎΠΊ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°. ΠΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π±Π°ΡΠ° ΠΏΡΠ΅Π·Π΅ΠΌΠ°ΡΠ΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ 200 GB Π±Π»ΠΎΠΊ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΄ΠΈΠ³ΠΈΡΠ°Π»Π½ΠΈ ΠΏΠΎΡΠΏΠΈΡΠΈ. ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ Π·Π°Π²ΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° IBD, Π²ΠΎ ΠΊΡΠ°ΡΠ½Π° Π»ΠΈΠ½ΠΈΡΠ° Π΅ Π΄Π΅ΠΊΠ° UTXO-ΡΠ΅ΡΠΎΡ ΡΠ΅ Π·Π°ΡΠ°ΡΠ° ΠΎΠΊΠΎΠ»Ρ 4 GB.
ΠΠ΅ΡΡΡΠΎΠ°, ΠΊΠ°Ρ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΈΡΠ΅, ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠ΅Π½Π·ΡΡ Π·Π° ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° ΡΠ΅ ΡΠ²Π΅Π΄ΡΠ²Π°Π°Ρ Π½Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ Π΄ΠΎΠΊΠ°Π·ΠΈ, Π° ΡΠΎΠ²Π°ΡΠΎΡ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ»ΠΈΠ²ΠΈΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π° Π½Π° ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈΠΊΠΎΡ Π½Π° ΡΠΈΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°, ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π΄ΠΎΠΊΠ°Π· Π·Π° Π½ΠΈΠ²Π½ΠΎΡΠΎ ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅ ΠΈ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΎΡΡ.
ΠΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π° ΠΏΡΠ΅ΡΡΡΠ°Π²Π° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ. ΠΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° Π·Π°ΡΡΠ²Π°Π½Π°ΡΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²Π° ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°
, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π»ΠΈΠ½Π΅Π°ΡΠ½ΠΎ ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π° Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡΠ° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΠΌΠΈΠΎΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ
, ΠΊΠ°Π΄Π΅ ΡΡΠΎ n Π΅ ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡΠ° Π½Π° Π·Π°ΡΡΠ²Π°Π½ΠΎΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π΄ΠΎΠΊΠ°Π· Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π²ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠΎΡ (Π΄ΠΎΠΊΠ°Π· Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅) ΠΈ Π΄Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ΄ΠΈ ΠΎΠ²ΠΎΡ Π΄ΠΎΠΊΠ°Π·.
ΠΠ°ΡΠ΅ΡΠΈΡΠ°ΡΠ° ΡΠ΅ Π²ΠΈΠΊΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅Π½ Π°ΠΊΠΎ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΈ Π΄Π° ΠΎΡΡΡΡΠ°Π½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ²Π° Π±Π°ΡΠ΅ΡΠΈΡΠ° Π±ΠΈ Π±ΠΈΠ» . Π’Π°ΠΊΠ²ΠΈΠΎΡ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ ΠΈΠΌΠ° ΠΏΠΎΡΡΠΎΡΠ°Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½Π° ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΠ°, Π½ΠΎ Π±Π°ΡΠ° ΠΏΡΠΈΡΡΡΡΠ²ΠΎ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΡΠ°ΡΠ½Π° (Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ²ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅). ΠΠ²Π° Π±Π°ΡΠ°ΡΠ΅ ΡΠ° Π½Π΅Π³ΠΈΡΠ° ΠΏΡΠΈΠΌΠ΅Π½Π»ΠΈΠ²ΠΎΡΡΠ° Π½Π° ΡΠ°ΠΊΠΎΠ² Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ Π·Π° ΠΌΡΠ΅ΠΆΠΈ Π±Π΅Π· Π΄ΠΎΠ²Π΅ΡΠ±Π° ΠΊΠ°ΠΊΠΎ Bitcoin, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΈΡΡΠ΅ΠΊΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°ΡΠ½ΠΎΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π° Π½Π°ΠΏΠ°ΡΠ°ΡΠΈΡΠ΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π°Ρ Π»Π°ΠΆΠ΅Π½ Π΄ΠΎΠΊΠ°Π· Π·Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅ΡΠΎ Π½Π° UTXO, ΠΈΠ·ΠΌΠ°ΠΌΡΠ²Π°ΡΡΠΈ Π³ΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅ ΡΠΎ UTXO-ΡΠ΅Ρ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΡΠ°ΠΊΠΎΠ² Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ.
Π£ΡΡΠ΅Π΅ΠΊΡΠΎ
ΠΠΈΠ·Π°ΡΠ½ΠΎΡ Utreexo ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΎΠ΄ Thaddeus Dryja ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅Π½ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ Π±Π΅Π· Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ²ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅.
Utreexo Π΅ ΡΡΠΌΠ° ΠΎΠ΄ ΡΠΎΠ²ΡΡΠ΅Π½ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΠΈ Π΅ ΡΠ°Π·Π²ΠΎΡ Π½Π° ΠΈΠ΄Π΅ΠΈΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½ΠΈ Π²ΠΎ , Π΄ΠΎΠ΄Π°Π²Π°ΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΠΎΠ³ΠΈΡΠΊΠ° ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ°
ΠΠ°ΡΠ΅ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π»ΠΈΠΈ ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄Π΅Π½ΠΈ Π²ΠΎ ΡΡΠΌΠ° ΠΎΠ΄ ΠΈΠ΄Π΅Π°Π»Π½ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΈ Π΄ΡΠ²ΡΠ°. ΠΡΠ²ΡΠ°ΡΠ° ΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΠΎ Π²ΠΈΡΠΈΠ½Π°. ΠΠ²Π°Π° ΠΏΡΠ΅ΡΡΡΠ°Π²Π° Π΅ ΠΈΠ·Π±ΡΠ°Π½Π° ΠΊΠ°ΠΊΠΎ Π½Π°ΡΠ²ΠΈΠ·ΡΠ΅Π»Π½Π° ΠΈ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΎ Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π΄ΡΠ²ΡΠ°ΡΠ° Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ Π½Π° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ°.
ΠΠ²ΡΠΎΡΠΎΡ Π·Π°Π±Π΅Π»Π΅ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΠΎ ΠΎΠ³Π»Π΅Π΄ Π½Π° ΡΠΎΠ° ΡΡΠΎ ΡΠΈΡΠ΅ Π΄ΡΠ²ΡΠ° Π²ΠΎ ΡΡΠΌΠ°ΡΠ° ΡΠ΅ ΠΈΠ΄Π΅Π°Π»Π½ΠΈ, Π½ΠΈΠ²Π½Π°ΡΠ° Π²ΠΈΡΠΈΠ½Π° ΡΠ΅ ΠΈΠ·ΡΠ°Π·ΡΠ²Π° ΠΊΠ°ΠΊΠΎ ΡΠΈΠ»Π° ΠΎΠ΄ Π΄Π²Π°, ΠΈΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΈΡΠΎΠ΄Π΅Π½ Π±ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²ΠΈ ΠΊΠ°ΠΊΠΎ Π·Π±ΠΈΡ Π½Π° ΡΠΈΠ»ΠΈ ΠΎΠ΄ Π΄Π²Π°. Π‘ΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ Π½Π° ΡΠΎΠ°, ΡΠ΅ΠΊΠΎΡ ΡΠ΅Ρ Π½Π° Π»ΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π³ΡΡΠΏΠΈΡΠ° Π²ΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈ Π΄ΡΠ²ΡΠ°, ΠΈ Π²ΠΎ ΡΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ, Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ΡΠΎ Π½ΠΎΠ² Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π±Π°ΡΠ° Π·Π½Π°Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½ΠΈΡΠ΅ Π΄ΡΠ²ΡΠ°.
Π’Π°ΠΊΠ°, ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½Π°ΡΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²Π° Π½Π° Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ Utreexo Π΅ Π»ΠΈΡΡΠ° Π½Π° ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ ΡΠ°Π·Π»ΠΈ (ΠΊΠΎΡΠ΅Π½ Merkle), Π° Π½Π΅ ΡΠ΅Π»Π°ΡΠ° ΡΡΠΌΠ° ΠΎΠ΄ Π΄ΡΠ²ΡΠ°.
ΠΠ° ΡΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²ΠΈΠΌΠ΅ Π»ΠΈΡΡΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΊΠ°ΠΊΠΎ Vec<Option<Hash>>. ΠΠ·Π±ΠΎΡΠ΅Π½ ΡΠΈΠΏ Option<Hash> ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΠΎΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°, ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π²ΠΎ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ Π½Π΅ΠΌΠ° Π΄ΡΠ²ΠΎ ΡΠΎ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½Π° Π²ΠΈΡΠΈΠ½Π°.
/// SHA-256 Ρ
Π΅Ρ
#[derive(Copy, Clone, Hash, Eq, PartialEq)]
pub struct Hash(pub [u8; 32]);
#[derive(Debug, Clone)]
pub struct Utreexo {
pub roots: Vec<Option<Hash>>,
}
impl Utreexo {
pub fn new(capacity: usize) -> Self {
Utreexo {
roots: vec![None; capacity],
}
}
}ΠΠΎΠ΄Π°Π²Π°ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ
ΠΡΠ²ΠΎ, Π΄Π° ΡΠ° ΠΎΠΏΠΈΡΠ΅ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° parent(), ΠΊΠΎΡ Π³ΠΎ ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π²Π° ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΠΎΡ ΡΠ°Π·ΠΎΠ» Π·Π° Π΄Π²Π° Π΄Π°Π΄Π΅Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡΠ° ΡΠΎΠ΄ΠΈΡΠ΅Π»().
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Merkle Π΄ΡΠ²ΡΠ°, ΡΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ Π΄Π²Π°ΡΠ° ΡΠ°Π·Π»ΠΈ Π΅ Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΎΠ» ΡΡΠΎ Π³ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° Ρ Π°ΡΠΎΡ Π½Π° ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡΠ°ΡΠ° Π½Π° Ρ Π°ΡΠΎΠ²ΠΈΡΠ΅ Π½Π° Π΄Π΅ΡΡΠΊΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ:
fn hash(bytes: &[u8]) -> Hash {
let mut sha = Sha256::new();
sha.input(bytes);
let res = sha.result();
let mut res_bytes = [0u8; 32];
res_bytes.copy_from_slice(res.as_slice());
Hash(res_bytes)
}
fn parent(left: &Hash, right: &Hash) -> Hash {
let concat = left
.0
.into_iter()
.chain(right.0.into_iter())
.map(|b| *b)
.collect::<Vec<_>>();
hash(&concat[..])
}ΠΠ²ΡΠΎΡΠΎΡ Π·Π°Π±Π΅Π»Π΅ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° Π·Π° Π΄Π° ΡΠ΅ ΡΠΏΡΠ΅ΡΠ°Ρ Π½Π°ΠΏΠ°Π΄ΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir ΠΈ Sebastien Zimmer Π²ΠΎ
, ΠΏΠΎΠΊΡΠ°Ρ Π΄Π²Π°ΡΠ° Ρ
Π°ΡΠΈ, Π½Π° ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡΠ°ΡΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΈ Π²ΠΈΡΠΈΠ½Π°ΡΠ° Π²ΠΎ Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΎΡΡΠ° Π½Π° Π΄ΡΠ²ΠΎΡΠΎ.
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π²ΠΎ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ»Π΅Π΄ΠΈΡΠ΅ ΠΊΠΎΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π½Π° ΠΊΠΎΡΠ΅Π½ΠΎΡ ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°Π°Ρ. Π‘Π»Π΅Π΄Π΅ΡΡΠΈ ΡΠ° ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π½Π° ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠ΅ΠΊΠΎΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΡΡΠΎ Π³ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅, ΠΏΠΎΠ΄ΠΎΡΠ½Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ°ΡΠ΅ Π΄ΠΎΠΊΠ°Π· Π·Π° ΠΏΡΠΈΡΡΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΎΠ²ΠΈΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ.
Π‘Π»Π΅Π΄Π΅ΡΠ΅ Π³ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π³ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅
ΠΠ° Π΄Π° Π³ΠΈ ΡΠ»Π΅Π΄ΠΈΠΌΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π°ΡΠ΄Π΅ Π΄Π° ΡΠ° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Update, ΠΊΠΎΡ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅.
#[derive(Debug)]
pub struct Update<'a> {
pub utreexo: &'a mut Utreexo,
// ProofStep Ρ
ΡΠ°Π½ΠΈΡ "ΡΠΎΡΠ΅Π΄Π°" ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
pub updated: HashMap<Hash, ProofStep>,
}ΠΠ° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅:
- ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΊΠΎΡΠΏΠΈ ΡΠΎ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ
new_rootsΠΈ ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΈ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΡΠ΅ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΡΠ°ΠΌΡ, ΠΏΠΎ Π΅Π΄Π΅Π½ Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΡΠΏΠ°:
ΠΠΎΠ΄
let mut new_roots = Vec::new();
for root in self.roots.iter() {
let mut vec = Vec::<Hash>::new();
if let Some(hash) = root {
vec.push(*hash);
}
new_roots.push(vec);
}- ΠΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π³ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π°Ρ (Π½ΠΈΠ·Π°
insertions) Π΄ΠΎ ΠΏΡΠ²Π°ΡΠ° ΠΊΠΎΠ»ΠΈΡΠΊΠ°new_roots[0]:

ΠΠΎΠ΄
new_roots[0].extend_from_slice(insertions);- Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ΅ Π³ΠΈ ΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ ΠΏΡΠ²Π°ΡΠ° ΠΊΠΎΡΠ½ΠΈΡΠ° ΡΠΎ ΠΎΡΡΠ°Π½Π°ΡΠΈΡΠ΅:
- ΠΠ° ΡΠΈΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠΊΠΈ ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ Π΅Π΄Π½Π° ΡΡΠ°Π²ΠΊΠ°:
- ΠΠ΅ΠΌΠ΅ΡΠ΅ Π΄Π²Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΡΠΏΠ°ΡΠ°, ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°ΡΡΠ΅ Π³ΠΎ Π½ΠΈΠ²Π½ΠΈΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π», ΠΎΡΡΡΡΠ°Π½Π΅ΡΠ΅ Π³ΠΈ Π΄Π²Π°ΡΠ° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ
- ΠΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π³ΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°Π½ΠΈΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π» Π²ΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ»ΠΈΡΠΊΠ°
- ΠΠ° ΡΠΈΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠΊΠΈ ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ Π΅Π΄Π½Π° ΡΡΠ°Π²ΠΊΠ°:

ΠΠΎΠ΄
for i in 0..new_roots.len() {
while new_roots[i].len() > 1 {
// ΠΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π΄Π²Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΈΡ
let a = new_roots[i][new_roots[i].len() - 2];
let b = new_roots[i][new_roots[i].len() - 1];
new_roots[i].pop();
new_roots[i].pop();
let hash = self.parent(&a, &b);
// ΠΠ°ΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΠ·ΠΈΠ½ Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
if new_roots.len() <= i + 1 {
new_roots.push(vec![]);
}
// ΠΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΡΠ·ΠΈΠ½Ρ
new_roots[i + 1].push(hash);
// ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ;
// ΡΡΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
updated.insert(a, ProofStep { hash: b, is_left: false });
updated.insert(b, ProofStep {hash: a, is_left: true });
}
}- ΠΡΠ΅ΠΌΠ΅ΡΡΠ΅ΡΠ΅ Π³ΠΈ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΊΠΎΡΠΏΠΈΡΠ΅ Π²ΠΎ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°ΡΠ° Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΡΠΊΠ° Π½ΠΈΠ·Π°
ΠΠΎΠ΄
for (i, bucket) in new_roots.into_iter().enumerate() {
// ΠΠ°ΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
if self.roots.len() <= i {
self.roots.push(None);
}
if bucket.is_empty() {
self.roots[i] = None;
} else {
self.roots[i] = Some(bucket[0]);
}
}Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π΄ΠΎΠΊΠ°Π· Π·Π° Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ
ΠΠΎΠΊΠ°Π· Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅Π»ΠΈΡΠ°ΡΠ° Π²ΠΎ Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ° (Proof) ΡΠ΅ ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΠΊΠΎ ΠΠ΅ΡΠΊΠ» ΠΠ°ΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠ° ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΡΠΈΠ½ΡΠΈΡ ProofStep. ΠΠΊΠΎ ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π½Π΅ Π²ΠΎΠ΄ΠΈ Π½ΠΈΠΊΠ°Π΄Π΅, ΡΠΎΠ³Π°Ρ Π΄ΠΎΠΊΠ°Π·ΠΎΡ Π΅ Π½Π΅ΡΠΎΡΠ΅Π½.
/// ΠΠ΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΡΠ°Π³ Π½Π° ΠΏΡΡΠΈ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΠ΅ΡΠΊΠ»Π°.
#[derive(Debug, Copy, Clone)]
pub struct ProofStep {
pub hash: Hash,
pub is_left: bool,
}
/// ΠΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ ΠΏΡΡΡ ΠΊ Π½Π΅ΠΌΡ.
#[derive(Debug, Clone)]
pub struct Proof {
pub steps: Vec<ProofStep>,
pub leaf: Hash,
}ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ ΠΏΡΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ (ΡΡΡΡΠΊΡΡΡΠ° Update), ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ°. ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, ΡΠ° ΠΏΠΎΠΌΠΈΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠ°Π±Π΅Π»Π°ΡΠ° ΡΠΎ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΈ Π³ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΠΎΡ ΡΠ΅ΠΊΠΎΡ Π½Π° ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π½Π° ΠΠ΅ΡΠΊΠ», ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΠΏΠΎΡΠ»ΡΠΆΠΈ ΠΊΠ°ΠΊΠΎ Π΄ΠΎΠΊΠ°Π·:
ΠΠΎΠ΄
impl<'a> Update<'a> {
pub fn prove(&self, leaf: &Hash) -> Proof {
let mut proof = Proof {
steps: vec![],
leaf: *leaf,
};
let mut item = *leaf;
while let Some(s) = self.updated.get(&item) {
proof.steps.push(*s);
item = parent(&item, &s);
}
proof
}
}ΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π΄ΠΎΠΊΠ°Π·

ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΄ΠΎΠΊΠ°Π· Π·Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ
ΠΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° Π΄ΠΎΠΊΠ°Π· Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΡΠ΅ ΡΠ²Π΅Π΄ΡΠ²Π° Π½Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° ΠΠ΅ΡΠΊΠ» Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΠΊΠΎΡΠ΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ:
pub fn verify(&self, proof: &Proof) -> bool {
let n = proof.steps.len();
if n >= self.roots.len() {
return false;
}
let expected = self.roots[n];
if let Some(expected) = expected {
let mut current_parent = proof.leaf;
for s in proof.steps.iter() {
current_parent = if s.is_left {
parent(&s.hash, ¤t_parent)
} else {
parent(¤t_parent, &s.hash)
};
}
current_parent == expected
} else {
false
}
}ΠΠΈΠ·ΡΠ΅Π»Π½ΠΎ:
ΠΡΠΎΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΄ΠΎΠΊΠ°Π·ΠΎΡ Π·Π° Π

ΠΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΈ
ΠΠ° Π΄Π° ΠΎΡΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅Π»ΠΈΡΠ° ΠΎΠ΄ Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ°, ΠΌΠΎΡΠ° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΡΠ΅ Π²Π°Π»ΠΈΠ΄Π΅Π½ Π΄ΠΎΠΊΠ°Π· Π΄Π΅ΠΊΠ° ΡΠ΅Π»ΠΈΡΠ°ΡΠ° Π΅ ΡΠ°ΠΌΡ. ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ Π΄ΠΎΠΊΠ°Π·ΠΎΡ, ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°Π°Ρ Π½ΠΎΠ²ΠΈ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π½Π° Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ Π·Π° ΠΊΠΎΠΈ Π΄Π°Π΄Π΅Π½ΠΈΠΎΡ Π΄ΠΎΠΊΠ°Π· ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π²ΠΈΡΡΠΈΠ½ΠΈΡ.
ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΠ²Π°:
- ΠΠ°ΠΊΠΎ ΠΈ ΡΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ΡΠΎ, ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π·Π±ΠΈΡ Π½Π° ΠΏΡΠ°Π·Π½ΠΈ ΠΊΠΎΡΠΏΠΈ ΡΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° Π΄ΡΠ²ΡΠ°ΡΠ° ΠΠ΅ΡΠΊΠ» ΡΠΎ Π²ΠΈΡΠΈΠ½Π° Π΅Π΄Π½Π°ΠΊΠ²Π° Π½Π° ΠΌΠΎΡΠ½ΠΎΡΡΠ° Π½Π° Π΄Π²Π° ΠΎΠ΄ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΡ Π½Π° ΠΊΠΎΡΠ½ΠΈΡΠ°ΡΠ°
- ΠΠΌΠ΅ΡΠ½ΡΠ²Π°ΠΌΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΡΠΈΡΠ΅ Π½Π° ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° ΠΠ΅ΡΠΊΠ»Π΅ Π²ΠΎ ΠΊΠΎΡΠΏΠΈΡΠ΅; ΠΈΠ½Π΄Π΅ΠΊΡΠΎΡ Π½Π° ΠΊΠΎΡΠ½ΠΈΡΠ°ΡΠ° Π΅ Π΅Π΄Π½Π°ΠΊΠΎΠ² Π½Π° Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ
- ΠΠΎ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΠΎΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π΄ΠΎ ΠΊΠΎΡ Π²ΠΎΠ΄ΠΈ ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° ΠΎΠ΄ Π΄ΠΎΠΊΠ°Π·ΠΎΡ
- ΠΠ°ΠΊΠΎ ΠΈ ΠΏΡΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ΡΠΎ, Π½ΠΈΠ΅ Π³ΠΈ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΊΠΎΡΠ΅Π²ΠΈ Π²ΠΎ ΠΏΠ°ΡΠΎΠ²ΠΈ ΠΈ ΠΏΡΠ΅ΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ²Π°ΡΠ΅ΡΠΎ Π²ΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΡΠΏΠ°
ΠΠΎΠ΄
fn delete(&self, proof: &Proof, new_roots: &mut Vec<Vec<Hash>>) -> Result<(), ()> {
if self.roots.len() < proof.steps.len() || self.roots.get(proof.steps.len()).is_none() {
return Err(());
}
let mut height = 0;
let mut hash = proof.leaf;
let mut s;
loop {
if height < new_roots.len() {
let (index, ok) = self.find_root(&hash, &new_roots[height]);
if ok {
// Remove hash from new_roots
new_roots[height].remove(index);
loop {
if height >= proof.steps.len() {
if !self.roots[height]
.and_then(|h| Some(h == hash))
.unwrap_or(false)
{
return Err(());
}
return Ok(());
}
s = proof.steps[height];
hash = self.parent(&hash, &s);
height += 1;
}
}
}
if height >= proof.steps.len() {
return Err(());
}
while height > new_roots.len() {
new_roots.push(vec![]);
}
s = proof.steps[height];
new_roots[height].push(s.hash);
hash = self.parent(&hash, &s);
height += 1;
}
}ΠΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΎΡ βΠβ:

ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°
ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΎΡ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ, ΡΠ°Π·Π»ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π°Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° DB Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ UTXO Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΓ¨ ΡΡΡΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° Π³ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π°Ρ UTXO-ΡΠ΅ΡΠΎΡ. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠ΅ ΠΏΠΎΡΠ°Π²ΡΠ²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π΄ΠΎΠΊΠ°Π·ΠΈ.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΡΠΊΠΈΠΎΡ ΡΠ°Π·ΠΎΠ» ΡΡΠΎ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ UTXO ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ (ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ ΡΠ°Π·ΠΎΠ») ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ Π±Π΅Π· Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ Π΅ Π·Π°Π²ΡΡΠΈ (ΡΠ΅Π»ΠΎΡΠ΅Π½ ΡΠ°Π·ΠΎΠ»). ΠΠΎΡΡΠΎΠ΅ΡΠ΅ΡΠΎ Π½Π° Π΄Π²Π΅ ΠΊΠ»Π°ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π·Π° Π½ΠΈΠ²Π½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ Π±Π°ΡΠ°Π°Ρ Π΄ΠΎΠΊΠ°Π· Π·Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅ΡΠΎ Π½Π° UTXO, ΠΊΠΎΠΈ ΡΠ΅ ΡΡΠΎΡΠ°Ρ Π²ΠΎ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ΅Π»ΠΎΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ Π½Π΅. ΠΠΊΠΎ ΡΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠ½ΠΈ ΡΠ°Π·Π»ΠΈ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°Ρ ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ ΠΈ Π½Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠ°Π½ Π½Π°ΡΠΈΠ½ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Utreexo, ΡΠΎΠ³Π°Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ΅ ΠΎΡΡΠ°Π½Π°Ρ Π·Π°Π΄ ΡΠ΅Π±Π΅ ΠΈ Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΠΈΡΠΊΠΎΠΈΠ½.
ΠΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ Π²ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ°, ΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π΄Π° ΡΠ΅ Π²ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈ - ΠΌΠΎΡΡΠΎΠ²ΠΈ. ΠΠΎΡΡΠΎΠ²ΠΈΠΎΡ ΡΠ°Π·ΠΎΠ» Π΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠ΅Π½ ΡΠ°Π·ΠΎΠ» ΠΊΠΎΡ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ° ΡΠΊΠ»Π°Π΄ΠΈΡΠ° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ° Utreexo ΠΈ Π΄ΠΎΠΊΠ°Π· Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π‘ΠΈΡΠ΅ UTXO ΠΎΠ΄ UTXO-ΡΠ΅Ρ. ΠΠΎΡΡΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°Π°Ρ Π½ΠΎΠ²ΠΈ Ρ
Π°ΡΠΈ ΠΈ Π³ΠΈ Π°ΠΆΡΡΠΈΡΠ°Π°Ρ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ ΠΈ Π΄ΠΎΠΊΠ°Π·ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΠΏΡΠΈΡΡΠΈΠ³Π½ΡΠ²Π°Π°Ρ Π½ΠΎΠ²ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ. ΠΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ΡΠΎ ΠΈ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ ΠΈ Π΄ΠΎΠΊΠ°Π·ΠΈΡΠ΅ Π½Π΅ Π½Π°ΠΌΠ΅ΡΠ½ΡΠ²Π°Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΎΠ²Π½ΠΎ ΠΎΠΏΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ. ΠΠΎΡΡΠΎΠ²ΠΈΡΠ΅ Π³ΠΎ ΠΆΡΡΠ²ΡΠ²Π°Π°Ρ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ: ΡΡΠ΅Π±Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π°Ρ
Ρ
Π°ΡΠΈ, Π²ΠΎ ΡΠΏΠΎΡΠ΅Π΄Π±Π° ΡΠΎ
Ρ
Π°ΡΠΎΠ²ΠΈ Π·Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ n Π΅ ΠΌΠΎΡΠ½ΠΎΡΡΠ° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ UTXO.
ΠΡΠ΅ΠΆΠ½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°

ΠΠΎΡΡΠΎΠ²ΠΈΡΠ΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°Π°Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ Π²ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΡΠΎΡΡΠ²Π΅ΡΠΎΡ Π½Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ. Π¦Π΅Π»ΠΎΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡΠ°Π½ΠΎ, Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°ΡΡΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΌΠ΅ΡΡ ΡΠ΅Π±Π΅. ΠΠΎΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ΅ ΠΏΠΎΠ»Π½ΠΈ ΡΠ°Π·Π»ΠΈ ΠΊΠΎΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ Π³ΠΈ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π° Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ° Utreexo ΠΈ Π·Π±ΠΈΡ Π½Π° Π΄ΠΎΠΊΠ°Π·ΠΈ Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π·Π° Π‘ΠΈΡΠ΅ UTXO Π·Π°ΡΠ΅Π³Π°. ΠΠ°Π·ΠΎΠ»ΠΎΡ Π½Π° ΠΌΠΎΡΡΠΎΡ Π½Π΅ ΡΠ΅ ΡΠ΅ΠΊΠ»Π°ΠΌΠΈΡΠ° ΡΠ΅Π±Π΅ΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ°ΠΊΠΎΠ², ΠΏΡΠ΅ΠΏΡΠ°Π²Π°ΡΡΠΈ ΡΠ΅ Π΄Π΅ΠΊΠ° Π΅ ΡΠ΅Π»ΠΎΡΠ΅Π½ ΡΠ°Π·ΠΎΠ» Π·Π° ΡΠΈΡΠ΅ ΠΏΠΎΠ»Π½ΠΈ ΡΠ°Π·Π»ΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ ΡΠ°Π·ΠΎΠ» Π·Π° ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ. ΠΠ°ΠΊΠΎ ΠΌΠΎΡΡΠΎΠ²ΠΈΡΠ΅ Π³ΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°Π°Ρ Π΄Π²Π΅ΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ Π·Π°Π΅Π΄Π½ΠΎ, ΡΠΈΠ΅ Π²ΡΡΡΠ½ΠΎΡΡ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΏΠΎΠ²ΡΠ·Π°Ρ ΡΠ°ΠΌΠΎ Π²ΠΎ Π΅Π΄Π½Π° Π½Π°ΡΠΎΠΊΠ°: ΠΎΠ΄ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»Π½ΠΈ ΡΠ°Π·Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ. ΠΠ²Π° Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΎΡΠΌΠ°ΡΠΎΡ Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π½Π΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°, Π° UTXO Π΄ΠΎΠΊΠ°Π·ΠΈΡΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ»Π°Ρ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΡΠ΅ΠΊΠΎΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ ΡΠ°Π·ΠΎΠ» ΠΌΠΎΠΆΠ΅ Π½Π° ΡΠ»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π΄Π° Π΅ΠΌΠΈΡΡΠ²Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π΄ΠΎ ΡΠΈΡΠ΅ ΡΡΠ΅ΡΠ½ΠΈΡΠΈ Π²ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π±Π΅Π· ΡΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΡΠ°Π·Π»ΠΈ Π½Π° ΠΌΠΎΡΡ.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π²ΠΌΠ΅ Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ° Utreexo ΠΈ Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΠΎΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π²ΠΎ Rust. ΠΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΊΠΎΡΠ° ΡΠ΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Π±Π°ΡΠ΅ΡΠΈΠΈ. ΠΡΠ΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°ΡΠ°ΡΠ° Π΅ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΊΠΎΡΠ° Π»ΠΎΠ³Π°ΡΠΈΡΠ°ΠΌΡΠΊΠΈ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ ΠΌΠΎΡΠ½ΠΎΡΡΠ° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ UTXO, ΡΡΠΎ Π²ΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΌΠ΅ΡΠ° Π³ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π° Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΠΏΡΠΎΡΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ ΠΈ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΠΎΡ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ Π½Π° ΡΠ°Π·Π»ΠΈ Π·Π° ΠΏΡΠ΅Π½ΠΎΡ Π½Π° Π΄ΠΎΠΊΠ°Π·ΠΈ, Π½ΠΎ ΡΠ΅Ρ Π½ΠΈΠΊΠΈΡΠ΅ Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΠΊΠ°Π·ΠΈ (ΠΊΠΎΠ³Π° Π΅Π΄Π΅Π½ Π΄ΠΎΠΊΠ°Π· Π΄ΠΎΠΊΠ°ΠΆΡΠ²Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ) ΠΈ ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠΆΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°ΡΠΎΡ Π²ΠΎ ΠΏΡΠΈΡΠ°ΡΠ»ΠΈΠ²ΠΈ Π³ΡΠ°Π½ΠΈΡΠΈ.
ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈ:
- -
ΠΠ·Π²ΠΎΡ: www.habr.com
