Utreexo: сТимаСм мноТСство UTXO Bitcoin

Utreexo: сТимаСм мноТСство UTXO Bitcoin

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

Π’ сСти Bitcoin всС ΡƒΠ·Π»Ρ‹ Π² Ρ…ΠΎΠ΄Π΅ консСнсуса ΡΠΎΠ³Π»Π°ΡˆΠ°ΡŽΡ‚ΡΡ Π½Π°Π΄ мноТСством UTXO: сколько ΠΌΠΎΠ½Π΅Ρ‚ доступно для Ρ‚Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ UTXO β€” это минимально Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для ΡƒΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π° Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠ·Π΅Π» Π½Π΅ смоТСт ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ Π² валидности приходящих Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ Π±Π»ΠΎΠΊΠΎΠ², ΠΈΡ… содСрТащих.

Π’ связи с этим ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ всячСски ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ΅ прСдставлСниС этого мноТСства, ΡΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ бСзопасности. Π§Π΅ΠΌ мСньшС объСм Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π΅ΠΌ Π½ΠΈΠΆΠ΅ трСбования ΠΊ дисковому пространству ΡƒΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ запуск ΡƒΠ·Π»Π°-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π° Π΄Π΅ΡˆΡ‘Π²Ρ‹ΠΌ, позволяСт Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ ΡΠ΅Ρ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌ самым ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ сСти.

Π’ этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ ΠΌΡ‹ Π·Π°ΠΏΠΈΠ»ΠΈΠΌ Rust-ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ прСдлоТСния ΠΎΡ‚ соавтора Lightning Network Paper, Thaddeus Dryja β€” Utreexo: a dynamic hash-based accumulator optimized for the Bitcoin UTXO set, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ трСбования ΠΊ дисковому пространству для ΡƒΠ·Π»ΠΎΠ²-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π’ Ρ‡Ρ‘ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°?

Одной ΠΈΠ· Π²Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π° Π±Ρ‹Π»Π° Π΅Π³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ. ИдСя «ΡΠ°ΠΌ сСбС Π±Π°Π½ΠΊ» Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ участников сСти вСсти ΡƒΡ‡Ρ‘Ρ‚ всСх доступных для использования срСдств. Π’ Bitcoin доступныС срСдства Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ мноТСства нСрастрачСнных Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ² β€” UTXO-set. Π₯отя это ΠΈ Π½Π΅ особо ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ прСдставлСниС, ΠΎΠ½ΠΎ являСтся Π²Ρ‹Π³ΠΎΠ΄Π½Ρ‹ΠΌ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с прСдставлСниСм, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ «ΠΊΠΎΡˆΠ΅Π»ΡŒΠΊΠ°» Π΅ΡΡ‚ΡŒ «Π±Π°Π»Π°Π½Ρ» Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ записи, Π° Ρ‚Π°ΠΊΠΆΠ΅ добавляСт приватности (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, обСспСчиваСт Ρ€Π°Π±ΠΎΡ‚Ρƒ CoinJoin).

Π’Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ зовётся Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ΠΎΠΌ) ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС систСмы. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Bitcoin Π² настоящСС врСмя Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ порядка 200 Π“Π± дискового пространства, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ расти. Однако состояниС систСмы Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС, порядка 4 Π“Π±, ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΊΡ‚ владСния ΠΌΠΎΠ½Π΅Ρ‚ ΠΊΠ΅ΠΌ-Π»ΠΈΠ±ΠΎ Π² настоящСС врСмя. ОбъСм этих Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊ ΠΆΠ΅ со-Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ увСличиваСтся, Π½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с мСньшСй ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ (см. ΠšΠ”ΠŸΠ’).

Π›Ρ‘Π³ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ (SPV) ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ бСзопасности Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ минимального состояния (UTXO-set), ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

UTXO ΠΈ UTXO-set

UTXO (Unspent Transaction Output) β€” нСрастрачСнный Π²Ρ‹Ρ…ΠΎΠ΄ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, конСчная Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Ρ‚ΠΎΡˆΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² транзакциях. НСрастрачСнныС Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹ становятся Π²Ρ…ΠΎΠ΄Π°ΠΌΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈ этом тратятся (spend) ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· UTXO-set.

НовыС UTXO всСгда ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ транзакциями:

  • coinbase-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π²Ρ…ΠΎΠ΄ΠΎΠ²: ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ UTXO Π² Ρ…ΠΎΠ΄Π΅ эмиссии ΠΌΠΎΠ½Π΅Ρ‚ ΠΌΠ°ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ
  • ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ: ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ UTXO, тратя ΠΏΡ€ΠΈ этом Π½Π΅ΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… UTXO

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с UTXO:
Utreexo: сТимаСм мноТСство UTXO Bitcoin

КошСльки ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ количСство доступных для Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΌΠΎΠ½Π΅Ρ‚ (баланс) исходя ΠΈΠ· суммы UTXO, доступных этому ΠΊΠΎΡˆΠ΅Π»ΡŒΠΊΡƒ для Ρ‚Ρ€Π°Ρ‚Ρ‹.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π»-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, для прСдотвращСния ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ‚Ρ€Π°Ρ‚Ρ‹ (double spend), Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ всСх UTXO ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

Π£ ΡƒΠ·Π»Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠ°:

  • ДобавлСния Π² UTXO-set
  • УдалСния ΠΈΠ· UTXO-set
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ взятого UTXO Π² мноТСствС

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ способы ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ трСбования ΠΊ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ мноТСствС, сохранив ΠΏΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ сущСствованиС элСмСнта Π² мноТСствС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ криптографичСских аккумуляторов.

Аккумуляторы для UTXO

ИдСя примСнСния аккумуляторов для хранСния мноТСства UTXO ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Ρ€Π°Π½Π΅Π΅.

UTXO-set строится Π½Π° Π»Π΅Ρ‚Ρƒ, Π²ΠΎ врСмя Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π±Π»ΠΎΠΊΠΎΠ² (IBD, initial block download), хранится Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡŠΡ‘ΠΌΠ΅ ΠΈ постоянно, ΠΏΡ€ΠΈ этом Π΅Π³ΠΎ содСрТимоС измСняСтся послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° сСти. Π”Π°Π½Π½Ρ‹ΠΉ процСсс Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 200 Π“Π± Π΄Π°Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сотСн ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… подписСй. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ процСсс IBD Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½, Π² сухом остаткС UTXO-set Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 4 Π“Π±.

Однако, ΠΏΡ€ΠΈ использовании аккумуляторов, ΠΏΡ€Π°Π²ΠΈΠ»Π° консСнсуса ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ срСдств сводятся ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ криптографичСских Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π², Π° брСмя отслСТивания доступных срСдств пСрСкладываСтся Π½Π° ΠΏΠ»Π΅Ρ‡ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° этих срСдств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° ΠΈΡ… наличия ΠΈ владСния ΠΈΠΌΠΈ.

Аккумулятором ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС мноТСства. Π Π°Π·ΠΌΠ΅Ρ€ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ прСдставлСния, ΠΏΡ€ΠΈ этом, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ постоянным Utreexo: сТимаСм мноТСство UTXO Bitcoin, Π»ΠΈΠ±ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ сублинСйно ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мощности мноТСства ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° самого элСмСнта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Utreexo: сТимаСм мноТСство UTXO Bitcoin, Π³Π΄Π΅ n β€” ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ мноТСства.

ΠŸΡ€ΠΈ этом аккумулятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнта Π² мноТСство (inclusion proof) ΠΈ Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ эффСктивно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ.

Аккумулятор называСтся динамичСским Ссли позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты ΠΈΠ· мноТСства.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ аккумулятора ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ RSA-аккумулятор, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Boneh, Bunz, Fisch Π² Π΄Π΅ΠΊΠ°Π±Ρ€Π΅ 2018 Π³ΠΎΠ΄Π°. Π’Π°ΠΊΠΎΠΉ аккумулятор ΠΈΠΌΠ΅Π΅Ρ‚ постоянный Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ прСдставлСния, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия ΠΎΠ±Ρ‰Π΅Π³ΠΎ сСкрСта (trusted setup). Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ сводит Π½Π° Π½Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ аккумулятора для trustless-сСтСй Ρ‚ΠΈΠΏΠ° Bitcoin, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сСкрСта ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°Π»ΡŒΡˆΠΈΠ²Ρ‹Π΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° сущСствования UTXO, обманывая ΡƒΠ·Π»Ρ‹ с UTXO-set Π½Π° Π±Π°Π·Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ аккумулятора.

Utreexo

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ Thaddeus Dryja конструкция Utreexo позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ динамичСский аккумулятор Π±Π΅Π· trusted-setup.

Utreexo прСдставляСт собою лСс ΠΈΠ· ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π”Π΅Ρ€Π΅Π²ΡŒΠ΅Π² ΠœΠ΅Ρ€ΠΊΠ»Π° ΠΈ являСтся Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅ΠΉ, прСдставлСнных Π² Efficient asynchronous accumulators for distributed pki, добавляя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты ΠΈΠ· мноТСства.

ЛогичСская структура аккумулятора

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ аккумулятора располоТСны Π² Π²ΠΈΠ΄Π΅ лСса ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². Π”Π΅Ρ€Π΅Π²ΡŒΡ упорядочСны ΠΏΠΎ высотС. Π”Π°Π½Π½ΠΎΠ΅ прСдставлСниС Π²Ρ‹Π±Ρ€Π°Π½ΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ наглядноС ΠΈ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слияниС Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π² Ρ…ΠΎΠ΄Π΅ провСдСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ аккумулятором.

Автор Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Π΄Π΅Ρ€Π΅Π²ΡŒΡ лСса ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹, ΠΈΡ… высота выраТаСтся ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π²ΠΎΠΉΠΊΠΈ, Ρ€Π°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ любоС Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ число ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ суммы стСпСнСй Π΄Π²ΠΎΠΉΠΊΠΈ. БоотвСтствСнно, любой Π½Π°Π±ΠΎΡ€ листов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сгруппирован Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π², Π° Π²ΠΎ всСх случаях, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ знания лишь ΠΎ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… ΡƒΠ·Π»Π°Ρ… Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π².

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ΅ прСдставлСниС аккумулятора 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 Π²
Second preimage attacks on dithered hash functions, ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄Π²ΡƒΡ… Ρ…Π΅ΡˆΠ΅ΠΉ слСдуСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Π΅Ρ‰Ρ‘ ΠΈ высоту Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅Ρ€Π΅Π²Π°.

Π’ Ρ…ΠΎΠ΄Π΅ добавлСния элСмСнтов Π² аккумулятор, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Π΅ элСмСнты ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. БлСдуя ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ измСнСния ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… элСмСнтов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ добавляСмого элСмСнта, ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ наличия этих элСмСнтов.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ…ΠΎΠ΄Π΅ добавлСния

Для отслСТивания ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, объявим структуру 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]:

Utreexo: сТимаСм мноТСство UTXO Bitcoin

Код

new_roots[0].extend_from_slice(insertions);

  • ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ «ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅» (coalescing) Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ элСмСнтов с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ:
    • Для всСх ΠΊΠΎΡ€Π·ΠΈΠ½, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта:
      1. Π‘Π΅Ρ€Ρ‘ΠΌ Π΄Π²Π° элСмСнта с ΠΊΠΎΠ½Ρ†Π° ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹, вычисляСм ΠΈΡ… родитСля, удаляСм ΠΎΠ±Π° элСмСнта
      2. ДобавляСм вычислСнного родитСля Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ

Utreexo: сТимаСм мноТСство UTXO Bitcoin

Код

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
    }
}

ΠŸΡ€ΠΎΡ†Π΅ΡΡ создания Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°

Utreexo: сТимаСм мноТСство UTXO Bitcoin

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° для элСмСнта

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнта (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, &current_parent)
            } else {
                parent(&current_parent, &s.hash)
            };
        }

        current_parent == expected
    } else {
        false
    }
}

Наглядно:

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° для A

Utreexo: сТимаСм мноТСство UTXO Bitcoin

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов

Для удалСния элСмСнта ΠΈΠ· аккумулятора трСбуСтся ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ элСмСнт Ρ‚Π°ΠΌ находится. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Π΅ элСмСнты аккумулятора, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½ΠΎΠ΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅Ρ€Π½Ρ‹ΠΌ.

Алгоритм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

  1. Как ΠΈ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Π½Π°Π±ΠΎΡ€ пустых ΠΊΠΎΡ€Π·ΠΈΠ½, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌ ΠœΠ΅Ρ€ΠΊΠ»Π° с высотой Ρ€Π°Π²Π½ΠΎΠΉ стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ ΠΎΡ‚ индСкса ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹
  2. ВставляСм Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ элСмСнты ΠΈΠ· шагов ΠΏΡƒΡ‚ΠΈ ΠœΠ΅Ρ€ΠΊΠ»Π°; индСкс ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ Ρ€Π°Π²Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ шага
  3. УдаляСм ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΡƒΡ‚ΡŒ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°
  4. Как ΠΈ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ, вычисляСм Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Π΅ элСмСнты, обьСдиняя ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎ элСмСнты ΠΈΠ· ΠΊΠΎΡ€Π·ΠΈΠ½ ΠΈ пСрСмСщая Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ объСдинСния Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ

Код

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;
    }
}

ΠŸΡ€ΠΎΡ†Π΅ΡΡ удалСния элСмСнта «Π»:
Utreexo: сТимаСм мноТСство UTXO Bitcoin

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ аккумулятор, ΡƒΠ·Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ использования Π‘Π” для хранСния всСх UTXO, сохраняя ΠΏΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ UTXO-set. Однако Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°ΠΌΠΈ.

Назовём ΡƒΠ·Π΅Π»-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ аккумулятор UTXO ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ (compact-state node), Π° Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ Π±Π΅Π· аккумулятора β€” ΠΏΠΎΠ»Π½Ρ‹ΠΌ (full node). БущСствованиС Π΄Π²ΡƒΡ… классов ΡƒΠ·Π»ΠΎΠ² создаёт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡ… Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° сущСствования UTXO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тратятся Π² транзакциях, Π° ΠΏΠΎΠ»Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ β€” Π½Π΅Ρ‚. Если всС ΡƒΠ·Π»Ρ‹ сСти ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ скоординировано Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΡƒΡ‚ Π½Π° использованиС Utreexo, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ останутся ΠΏΠΎΠ·Π°Π΄ΠΈ ΠΈ Π½Π΅ смогут Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² сСти Bitcoin.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² Π² ΡΠ΅Ρ‚ΡŒ, прСдлагаСтся ввСсти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс ΡƒΠ·Π»ΠΎΠ² β€” мосты. Π£Π·Π΅Π»-мост β€” это ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎ всСму ΠΏΡ€ΠΎΡ‡Π΅ΠΌΡƒ Ρ…Ρ€Π°Π½ΠΈΡ‚ аккумулятор Utreexo ΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для всСх UTXO ΠΈΠ· UTXO-set. ΠœΠΎΡΡ‚Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ…Π΅ΡˆΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ аккумулятор ΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ поступлСния Π½ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² с транзакциями. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ аккумулятора ΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π² Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ ΡƒΠ·Π»Ρ‹. ΠœΠΎΡΡ‚Ρ‹ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΡŽΡ‚ дисковым пространством: трСбуСтся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ порядка Utreexo: сТимаСм мноТСство UTXO Bitcoin Ρ…Π΅ΡˆΠ΅ΠΉ, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Utreexo: сТимаСм мноТСство UTXO Bitcoin Ρ…Π΅ΡˆΠ΅ΠΉ для ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ², Π³Π΄Π΅ n β€” ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ мноТСства UTXO.

АрхитСктура сСти

Utreexo: сТимаСм мноТСство UTXO Bitcoin

ΠœΠΎΡΡ‚Ρ‹ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ постСпСнно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π² ΡΠ΅Ρ‚ΡŒ Π±Π΅Π· измСнСния ПО ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡƒΠ·Π»ΠΎΠ². ΠŸΠΎΠ»Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, распространяя Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Π±Π»ΠΎΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π£Π·Π»Ρ‹-мосты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собою ΠΏΠΎΠ»Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ хранят Π΄Π°Π½Π½Ρ‹Π΅ аккумулятора Utreexo ΠΈ Π½Π°Π±ΠΎΡ€ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π² Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для всСх UTXO Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ΠœΠΎΡΡ‚ΠΎΠ²ΠΎΠΉ ΡƒΠ·Π΅Π» Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π°Ρ„ΠΈΡˆΠΈΡ€ΡƒΠ΅Ρ‚ сСбя ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ, ΠΏΡ€ΠΈΠΊΠΈΠ΄Ρ‹Π²Π°ΡΡΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ для всСх ΠΏΠΎΠ»Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ β€” для всСх ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ…. Π₯отя мосты ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ ΠΎΠ±Π΅ сСти вмСстС, Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ трСбуСтся ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ: ΠΎΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΊ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ ΡƒΠ·Π»Π°ΠΌ. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅ трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, Π° Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° для UTXO для ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ, поэтому любой ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π» Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‹Π»Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ всСм участникам сСти Π±Π΅Π· участия ΡƒΠ·Π»ΠΎΠ²-мостов.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ рассмотрСли аккумулятор Utreexo ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° языкС Rust. РассмотрСли Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ сСти, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ·Π»Ρ‹ Π½Π° Π±Π°Π·Π΅ аккумулятора. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… ΡƒΠ»ΠΎΠ² выступаСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ зависит логарифмичСски ΠΎΡ‚ мощности мноТСства UTXO, Ρ‡Ρ‚ΠΎ сильно сниТаСт трСбования ΠΊ дисковому пространству ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° для Ρ‚Π°ΠΊΠΈΡ… ΡƒΠ·Π»ΠΎΠ². НСдостатком выступаСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΡƒΠ·Π»ΠΎΠ² Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π², Π½ΠΎ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π² (ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сущСствованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов) ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹Ρ… ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ….

Бсылки:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com