ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ!
Π ΡΠ΅ΡΠΈ Bitcoin Π²ΡΠ΅ ΡΠ·Π»Ρ Π² Ρ ΠΎΠ΄Π΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠ° ΡΠΎΠ³Π»Π°ΡΠ°ΡΡΡΡ Π½Π°Π΄ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ UTXO: ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΎΠ½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π΄Π»Ρ ΡΡΠ°ΡΡ, ΠΊΠΎΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ . ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ UTXO β ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΡΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠ° Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ , Π±Π΅Π· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ·Π΅Π» Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΡΡΡΡ Π² Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ Π±Π»ΠΎΠΊΠΎΠ², ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ .
Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π²ΡΡΡΠ΅ΡΠΊΠΈ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°, ΡΠΆΠ°ΡΡ Π΅Π³ΠΎ Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΠΈ Π³Π°ΡΠ°Π½ΡΠΈΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. Π§Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ΅ΠΌ Π½ΠΈΠΆΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠΌΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ ΡΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠ°, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΡΠΊ ΡΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠ° Π΄Π΅ΡΡΠ²ΡΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅ΡΡ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΡΠ΅ΡΠΈ.
Π ΡΡΠΎΠΉ Π·Π°ΠΌΠ΅ΡΠΊΠ΅ ΠΌΡ Π·Π°ΠΏΠΈΠ»ΠΈΠΌ Rust-ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΡ ΡΠΎΠ°Π²ΡΠΎΡΠ°
Π ΡΡΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°?
ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅ΡΠ½ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΠΈΡΠΊΠΎΠΈΠ½Π° Π±ΡΠ»Π° Π΅Π³ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ. ΠΠ΄Π΅Ρ «ΡΠ°ΠΌ ΡΠ΅Π±Π΅ Π±Π°Π½ΠΊ» ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ΅ΡΠΈ Π²Π΅ΡΡΠΈ ΡΡΡΡ Π²ΡΠ΅Ρ
Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π΄ΡΡΠ². Π Bitcoin Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π²ΡΡΠ°ΠΆΠ°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π½Π΅ΡΠ°ΡΡΡΠ°ΡΠ΅Π½Π½ΡΡ
Π²ΡΡ
ΠΎΠ΄ΠΎΠ² β UTXO-set. Π₯ΠΎΡΡ ΡΡΠΎ ΠΈ Π½Π΅ ΠΎΡΠΎΠ±ΠΎ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ³ΠΎΠ΄Π½ΡΠΌ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ «ΠΊΠΎΡΠ΅Π»ΡΠΊΠ°» Π΅ΡΡΡ «Π±Π°Π»Π°Π½Ρ» Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ
ΠΠ°ΠΆΠ½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ (ΡΠΎ, ΡΡΠΎ Π·ΠΎΠ²ΡΡΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΎΠΌ) ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΡΠΎΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Bitcoin Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎΡΡΠ΄ΠΊΠ° 200 ΠΠ± Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ°ΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, ΠΏΠΎΡΡΠ΄ΠΊΠ° 4 ΠΠ±, ΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΡ Π²Π»Π°Π΄Π΅Π½ΠΈΡ ΠΌΠΎΠ½Π΅Ρ ΠΊΠ΅ΠΌ-Π»ΠΈΠ±ΠΎ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ. ΠΠ±ΡΠ΅ΠΌ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΡΠΎ-Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, Π½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Ρ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡ ΠΊ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ (ΡΠΌ. ΠΠΠΠ).
ΠΡΠ³ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ (SPV) ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (UTXO-set), ΠΊΡΠΎΠΌΠ΅ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ.
UTXO ΠΈ UTXO-set
UTXO (Unspent Transaction Output) β Π½Π΅ΡΠ°ΡΡΡΠ°ΡΠ΅Π½Π½ΡΠΉ Π²ΡΡ ΠΎΠ΄ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° ΠΏΡΡΠ΅ΡΠ΅ΡΡΠ²ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΠΎΡΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡ . ΠΠ΅ΡΠ°ΡΡΡΠ°ΡΠ΅Π½Π½ΡΠ΅ Π²ΡΡ ΠΎΠ΄Ρ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π²Ρ ΠΎΠ΄Π°ΠΌΠΈ Π½ΠΎΠ²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΠ°ΡΡΡΡΡ (spend) ΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ ΠΈΠ· UTXO-set.
ΠΠΎΠ²ΡΠ΅ UTXO Π²ΡΠ΅Π³Π΄Π° ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ:
- coinbase-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π±Π΅Π· Π²Ρ ΠΎΠ΄ΠΎΠ²: ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ UTXO Π² Ρ ΠΎΠ΄Π΅ ΡΠΌΠΈΡΡΠΈΠΈ ΠΌΠΎΠ½Π΅Ρ ΠΌΠ°ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
- ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ: ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ UTXO, ΡΡΠ°ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ UTXO
ΠΡΠΎΡΠ΅ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ UTXO:
ΠΠΎΡΠ΅Π»ΡΠΊΠΈ ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π΄Π»Ρ ΡΡΠ°ΡΡ ΠΌΠΎΠ½Π΅Ρ (Π±Π°Π»Π°Π½Ρ) ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΡΠΌΠΌΡ UTXO, Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΠΎΠΌΡ ΠΊΠΎΡΠ΅Π»ΡΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡ.
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π»-Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ, Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΏΡΡΠΎΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡΡΠ°ΡΡ (double spend), Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π½Π°Π±ΠΎΡ Π²ΡΠ΅Ρ UTXO ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.
Π£ ΡΠ·Π»Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈΠΊΠ°:
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π² UTXO-set
- Π£Π΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ· UTXO-set
- ΠΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π°Π»ΠΈΡΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²Π·ΡΡΠΎΠ³ΠΎ UTXO Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Ρ
ΡΠ°Π½ΠΈΠΌΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅, ΡΠΎΡ
ΡΠ°Π½ΠΈΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
ΠΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΡ Π΄Π»Ρ UTXO
ΠΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠ² Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° UTXO
UTXO-set ΡΡΡΠΎΠΈΡΡΡ Π½Π° Π»Π΅ΡΡ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ΅ΠΏΠΎΡΠΊΠΈ Π±Π»ΠΎΠΊΠΎΠ² (IBD, initial block download), Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡΡΠΌΠ΅ ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΡΠ΅ΡΠΈ. ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 200 ΠΠ± Π΄Π°Π½Π½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΠ΅Π½ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΠΈΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ΠΉ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠ΅ΡΡ IBD Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½, Π² ΡΡΡ ΠΎΠΌ ΠΎΡΡΠ°ΡΠΊΠ΅ UTXO-set Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΎΠΊΠΎΠ»ΠΎ 4 ΠΠ±.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠ², ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ΅Π΄ΡΡΠ² ΡΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ², Π° Π±ΡΠ΅ΠΌΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΠ΅Π΄ΡΡΠ² ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΠΏΠ»Π΅ΡΠΈ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΡΡΠΈΡ ΡΡΠ΅Π΄ΡΡΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° ΠΈΡ Π½Π°Π»ΠΈΡΠΈΡ ΠΈ Π²Π»Π°Π΄Π΅Π½ΠΈΡ ΠΈΠΌΠΈ.
ΠΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. Π Π°Π·ΠΌΠ΅Ρ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΏΡΠΈ ΡΡΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ , Π»ΠΈΠ±ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΡΠ±Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ , Π³Π΄Π΅ n β ΠΌΠΎΡΠ½ΠΎΡΡΡ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°.
ΠΡΠΈ ΡΡΠΎΠΌ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ (inclusion proof) ΠΈ Π΄Π°Π²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ.
ΠΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°.
ΠΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ°ΠΊΠΎΠ³ΠΎ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ»ΡΠΆΠΈΡΡ
Utreexo
ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ Thaddeus Dryja ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Utreexo ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π±Π΅Π· trusted-setup.
Utreexo ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΡ Π»Π΅Ρ ΠΈΠ· ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ
Π΄Π²ΠΎΠΈΡΠ½ΡΡ
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ°
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ Π»Π΅ΡΠ° ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π². ΠΠ΅ΡΠ΅Π²ΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ ΠΏΠΎ Π²ΡΡΠΎΡΠ΅. ΠΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½ΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² Π² Ρ ΠΎΠ΄Π΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ.
ΠΠ²ΡΠΎΡ Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ Π»Π΅ΡΠ° ΠΈΠ΄Π΅Π°Π»ΡΠ½Ρ, ΠΈΡ Π²ΡΡΠΎΡΠ° Π²ΡΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΡΠ΅ΠΏΠ΅Π½ΡΡ Π΄Π²ΠΎΠΉΠΊΠΈ, ΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΠΎΠ΅ Π½Π°ΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΠΌΠΌΡ ΡΡΠ΅ΠΏΠ΅Π½Π΅ΠΉ Π΄Π²ΠΎΠΉΠΊΠΈ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π»ΡΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ Π»ΠΈΡΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡΠ½ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π², Π° Π²ΠΎ Π²ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΠ΅Π±ΡΠ΅Ρ Π·Π½Π°Π½ΠΈΡ Π»ΠΈΡΡ ΠΎ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΡΠ·Π»Π°Ρ Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π².
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° Utreexo β ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΡΠ·Π»ΠΎΠ² (Merkle root), Π° Π½Π΅ Π²Π΅ΡΡ Π»Π΅Ρ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΡΠ΅Π»ΠΈΠΊΠΎΠΌ.
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΡΠ½Π΅Π²ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ°ΠΊ 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()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ·Π½Π°ΡΡ ΡΠ·Π΅Π»-ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π΄Π»Ρ Π΄Π²ΡΡ
Π·Π°Π΄Π°Π½Π½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΡ parent()
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π΅ΡΠ΅Π²ΡΡ ΠΠ΅ΡΠΊΠ»Π°, ΡΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡΡ ΡΠ·Π»ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ·Π΅Π», Ρ ΡΠ°Π½ΡΡΠΈΠΉ Ρ Π΅Ρ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ Ρ Π΅ΡΠ΅ΠΉ ΡΠ·Π»ΠΎΠ²-ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ²:
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);
- ΠΡΠΎΠ²Π΅ΡΡΠΈ «ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅» (coalescing) Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠΎΡΠ·ΠΈΠ½Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ:
- ΠΠ»Ρ Π²ΡΠ΅Ρ
ΠΊΠΎΡΠ·ΠΈΠ½, Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°:
- ΠΠ΅ΡΡΠΌ Π΄Π²Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Ρ ΠΊΠΎΠ½ΡΠ° ΠΊΠΎΡΠ·ΠΈΠ½Ρ, Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΈΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΎΠ±Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΡΠ·ΠΈΠ½Ρ
- ΠΠ»Ρ Π²ΡΠ΅Ρ
ΠΊΠΎΡΠ·ΠΈΠ½, Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°:
ΠΠΎΠ΄
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
) Π±ΡΠ΄Π΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΏΡΡΡ ΠΠ΅ΡΠΊΠ»Π° (Merkle Path), ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· ΡΠ΅ΠΏΠΎΡΠΊΠΈ 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
}
}
ΠΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (inclusion 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
}
}
ΠΠ°Π³Π»ΡΠ΄Π½ΠΎ:
ΠΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π΄Π»Ρ A
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
ΠΠ»Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ°ΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π΄Π°Π½Π½ΠΎΠ΅ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΠ½ΡΠΌ.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
- ΠΠ°ΠΊ ΠΈ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅ΠΌ Π½Π°Π±ΠΎΡ ΠΏΡΡΡΡΡ ΠΊΠΎΡΠ·ΠΈΠ½, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π΄Π΅ΡΠ΅Π²ΡΡΠΌ ΠΠ΅ΡΠΊΠ»Π° Ρ Π²ΡΡΠΎΡΠΎΠΉ ΡΠ°Π²Π½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΊΠΎΡΠ·ΠΈΠ½Ρ
- ΠΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΠΊΠΎΡΠ·ΠΈΠ½Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΡΠ°Π³ΠΎΠ² ΠΏΡΡΠΈ ΠΠ΅ΡΠΊΠ»Π°; ΠΈΠ½Π΄Π΅ΠΊΡ ΠΊΠΎΡΠ·ΠΈΠ½Ρ ΡΠ°Π²Π΅Π½ Π½ΠΎΠΌΠ΅ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ°Π³Π°
- Π£Π΄Π°Π»ΡΠ΅ΠΌ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΏΡΡΡ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°
- ΠΠ°ΠΊ ΠΈ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ, Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡ ΠΏΠΎΠΏΠ°ΡΠ½ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΠΊΠΎΡΠ·ΠΈΠ½ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΡΠ·ΠΈΠ½Ρ
ΠΠΎΠ΄
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;
}
}
ΠΡΠΎΡΠ΅ΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° «Π»:
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΡΡ ΡΠ΅ΡΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ, ΡΠ·Π»Ρ ΠΌΠΎΠ³ΡΡ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ UTXO, ΡΠΎΡ ΡΠ°Π½ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ UTXO-set. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°ΠΌΠΈ.
ΠΠ°Π·ΠΎΠ²ΡΠΌ ΡΠ·Π΅Π»-Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ UTXO ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌ (compact-state node), Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ Π±Π΅Π· Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° β ΠΏΠΎΠ»Π½ΡΠΌ (full node). Π‘ΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠ·Π»ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΈΡ Π² Π΅Π΄ΠΈΠ½ΡΡ ΡΠ΅ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠ΅ ΡΠ·Π»Ρ ΡΡΠ΅Π±ΡΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ UTXO, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ°ΡΡΡΡΡ Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡ , Π° ΠΏΠΎΠ»Π½ΡΠ΅ ΡΠ·Π»Ρ β Π½Π΅Ρ. ΠΡΠ»ΠΈ Π²ΡΠ΅ ΡΠ·Π»Ρ ΡΠ΅ΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΡΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Utreexo, ΡΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠ΅ ΡΠ·Π»Ρ ΠΎΡΡΠ°Π½ΡΡΡΡ ΠΏΠΎΠ·Π°Π΄ΠΈ ΠΈ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΡΠΈ Bitcoin.
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ ΡΠ·Π»ΠΎΠ² Π² ΡΠ΅ΡΡ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ Π²Π²Π΅ΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ·Π»ΠΎΠ² β ΠΌΠΎΡΡΡ. Π£Π·Π΅Π»-ΠΌΠΎΡΡ β ΡΡΠΎ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ·Π΅Π», ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΠΌΡ Ρ ΡΠ°Π½ΠΈΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Utreexo ΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ UTXO ΠΈΠ· UTXO-set. ΠΠΎΡΡΡ Π²ΡΡΠΈΡΠ»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ Ρ Π΅ΡΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ ΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ Π±Π»ΠΎΠΊΠΎΠ² Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° ΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ² Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠ°ΠΊΠΈΠ΅ ΡΠ·Π»Ρ. ΠΠΎΡΡΡ ΠΆΠ΅ΡΡΠ²ΡΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΡΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ: ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Ρ ΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Ρ Π΅ΡΠ΅ΠΉ, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Ρ Π΅ΡΠ΅ΠΉ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ ΡΠ·Π»ΠΎΠ², Π³Π΄Π΅ n β ΠΌΠΎΡΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° UTXO.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ΅ΡΠΈ
ΠΠΎΡΡΡ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠ΅ ΡΠ·Π»Ρ Π² ΡΠ΅ΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΠ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ·Π»ΠΎΠ². ΠΠΎΠ»Π½ΡΠ΅ ΡΠ·Π»Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½ΡΡΠ΅, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ Π±Π»ΠΎΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ. Π£Π·Π»Ρ-ΠΌΠΎΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΡ ΠΏΠΎΠ»Π½ΡΠ΅ ΡΠ·Π»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Ρ ΡΠ°Π½ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° Utreexo ΠΈ Π½Π°Π±ΠΎΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ² Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ UTXO Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠ·Π΅Π» Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π°ΡΠΈΡΠΈΡΡΠ΅Ρ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ, ΠΏΡΠΈΠΊΠΈΠ΄ΡΠ²Π°ΡΡΡ ΠΏΠΎΠ»Π½ΡΠΌ ΡΠ·Π»ΠΎΠΌ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΡΡ ΡΠ·Π»ΠΎΠ² ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌ ΡΠ·Π»ΠΎΠΌ β Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ . Π₯ΠΎΡΡ ΠΌΠΎΡΡΡ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΎΠ±Π΅ ΡΠ΅ΡΠΈ Π²ΠΌΠ΅ΡΡΠ΅, Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ: ΠΎΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΏΠΎΠ»Π½ΡΡ ΡΠ·Π»ΠΎΠ² ΠΊ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌ ΡΠ·Π»Π°ΠΌ. ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΎΡΠΌΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ, Π° Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π΄Π»Ρ UTXO Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ ΡΠ·Π»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ±ΡΠΎΡΠ΅Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ ΡΠ·Π΅Π» ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΡΠ»Π°ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²ΡΠ΅ΠΌ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°ΠΌ ΡΠ΅ΡΠΈ Π±Π΅Π· ΡΡΠ°ΡΡΠΈΡ ΡΠ·Π»ΠΎΠ²-ΠΌΠΎΡΡΠΎΠ².
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Utreexo ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° ΡΠ·ΡΠΊΠ΅ Rust. Π Π°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΡΠ΅ΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ·Π»Ρ Π½Π° Π±Π°Π·Π΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ°. ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΡ ΡΠ»ΠΎΠ² Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π²ΠΈΡΠΈΡ Π»ΠΎΠ³Π°ΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° UTXO, ΡΡΠΎ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠΌΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΡΠ·Π»ΠΎΠ². ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠ°ΡΠΈΠΊ ΡΠ·Π»ΠΎΠ² Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ², Π½ΠΎ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ² (ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²) ΠΈ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΌΠΎΡΡ ΡΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΡΠ°ΡΠΈΠΊ Π² ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΡ ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ .
Π‘ΡΡΠ»ΠΊΠΈ:
GitHub ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° Utreexo Π½Π° Rust Thaddeus Dryja βUtreexo: a dynamic hash-based accumulator optimized for the Bitcoin UTXO set ΠΠ½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΈΠ· ΡΡΠ°ΡΡΠΈ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com