Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ื”ื™ื™ ื”ื‘ืจ!

ื‘ืจืฉืช ื”ื‘ื™ื˜ืงื•ื™ืŸ, ื›ืœ ื”ืฆืžืชื™ื, ื‘ืืžืฆืขื•ืช ืงื•ื ืฆื ื–ื•ืก, ืžืกื›ื™ืžื™ื ืขืœ ืงื‘ื•ืฆื” ืฉืœ UTXOs: ื›ืžื” ืžื˜ื‘ืขื•ืช ื–ืžื™ื ื™ื ืœื”ื•ืฆืื”, ืœืžื™ ื‘ื“ื™ื•ืง ื•ื‘ืื™ืœื• ืชื ืื™ื. ืขืจื›ืช UTXO ื”ื™ื ืงื‘ื•ืฆืช ื”ื ืชื•ื ื™ื ื”ืžื™ื ื™ืžืœื™ืช ื”ื ื“ืจืฉืช ืœืฆื•ืžืช ืื™ืžื•ืช, ืฉื‘ืœืขื“ื™ื” ื”ืฆื•ืžืช ืœื ื™ื•ื›ืœ ืœืืžืช ืืช ืชืงืคื•ืชืŸ ืฉืœ ืขืกืงืื•ืช ื ื›ื ืกื•ืช ื•ื”ื‘ืœื•ืงื™ื ื”ืžื›ื™ืœื™ื ืื•ืชืŸ.

ื‘ื”ืงืฉืจ ื–ื”, ื ืขืฉื™ื ื ื™ืกื™ื•ื ื•ืช ื‘ื›ืœ ื“ืจืš ืืคืฉืจื™ืช ืœืฆืžืฆื ืืช ื”ื™ื™ืฆื•ื’ ื”ืžืื•ื—ืกืŸ ืฉืœ ืกื˜ ื–ื”, ืœื“ื—ื•ืก ืื•ืชื• ืžื‘ืœื™ ืœืื‘ื“ ืขืจื‘ื•ื™ื•ืช ืื‘ื˜ื—ื”. ื›ื›ืœ ืฉื ืคื— ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ืงื˜ืŸ ื™ื•ืชืจ, ื›ืš ื“ืจื™ืฉื•ืช ืฉื˜ื— ื”ื“ื™ืกืง ืฉืœ ืฆื•ืžืช ื”ืื™ืžื•ืช ื ืžื•ื›ื•ืช ื™ื•ืชืจ, ืžื” ืฉื”ื•ืคืš ืืช ื”ืฉืงืช ืฆื•ืžืช ื”ืื™ืžื•ืช ืœื–ื•ืœื”, ืžืืคืฉืจืช ืœื”ืจื—ื™ื‘ ืืช ื”ืจืฉืช ื•ื‘ื›ืš ืœื”ื’ื‘ื™ืจ ืืช ื™ืฆื™ื‘ื•ืช ื”ืจืฉืช.

ื‘ืคื•ืกื˜ ื–ื” ื ืคืจืกื ืื‘ ื˜ื™ืคื•ืก ืฉืœ Rust ืฉืœ ื”ืฆืขื” ืื—ืจื•ื ื” ืฉืœ ืžื—ื‘ืจ ืฉื•ืชืฃ ื ื™ื™ืจ ืจืฉืช ื‘ืจืง, ืชืื“ืื•ืก ื“ืจื™ื™ื” - Utreexo: ืžืฆื‘ืจ ื“ื™ื ืžื™ ืžื‘ื•ืกืก hash ื”ืžื•ืชืื ืœืกื˜ ื”ื‘ื™ื˜ืงื•ื™ืŸ UTXO, ื”ืžืืคืฉืจ ืฆืžืฆื•ื ื“ืจื™ืฉื•ืช ืฉื˜ื— ื”ื“ื™ืกืง ืขื‘ื•ืจ ืฆืžืชื™ ืื™ืžื•ืช.

ืžื” ื”ื‘ืขื™ื”?

ืื—ืช ื”ื‘ืขื™ื•ืช ื”ืžืชืžืฉื›ื•ืช ืฉืœ ื‘ื™ื˜ืงื•ื™ืŸ ื”ื™ื™ืชื” ื™ื›ื•ืœืช ื”ื”ืจื—ื‘ื” ืฉืœื•. ื”ืจืขื™ื•ืŸ ืฉืœ "ื‘ื ืง ืžืฉืœืš" ืžื—ื™ื™ื‘ ืืช ืžืฉืชืชืคื™ ื”ืจืฉืช ืœืฉืžื•ืจ ืชื™ืขื•ื“ ืฉืœ ื›ืœ ื”ื›ืกืคื™ื ื”ื–ืžื™ื ื™ื ืœืฉื™ืžื•ืฉ. ื‘ื‘ื™ื˜ืงื•ื™ืŸ, ื”ื›ืกืคื™ื ื”ื–ืžื™ื ื™ื ืžืชื‘ื˜ืื™ื ื›ืกื˜ ืฉืœ ืชืคื•ืงื•ืช ืฉืœื ื”ื•ืฆืื• - ืกื˜ UTXO. ืืžื ื ื–ื” ืœื ื™ื™ืฆื•ื’ ืื™ื ื˜ื•ืื™ื˜ื™ื‘ื™ ื‘ืžื™ื•ื—ื“, ืื‘ืœ ื”ื•ื ืžื•ืขื™ืœ ืžื‘ื—ื™ื ืช ื‘ื™ืฆื•ืขื™ ื”ื™ื™ืฉื•ื ืขืœ ืคื ื™ ื™ื™ืฆื•ื’ ืฉื‘ื• ืœื›ืœ "ืืจื ืง" ื™ืฉ "ื™ืชืจื”" ื›ืขืจืš ื ืคืจื“, ื•ื’ื ืžื•ืกื™ืฃ ืคืจื˜ื™ื•ืช (ืœืžืฉืœ. ืžื˜ื‘ืขื•ืช).

ื—ืฉื•ื‘ ืœื”ื‘ื—ื™ืŸ ื‘ื™ืŸ ื”ื™ืกื˜ื•ืจื™ื™ืช ื”ืขืกืงืื•ืช (ืžื” ืฉื ืงืจื ื‘ืœื•ืงืฆ'ื™ื™ืŸ) ืœื‘ื™ืŸ ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืžืขืจื›ืช. ื”ื™ืกื˜ื•ืจื™ื™ืช ืขืกืงืื•ืช ื”ื‘ื™ื˜ืงื•ื™ืŸ ืชื•ืคืกืช ื›ื™ื•ื ื›-200 ื’'ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืฉื˜ื— ื“ื™ืกืง, ื•ืžืžืฉื™ื›ื” ืœื’ื“ื•ืœ. ืขื ื–ืืช, ืžืฆื‘ ื”ืžืขืจื›ืช ืงื˜ืŸ ื‘ื”ืจื‘ื”, ื‘ืกื“ืจ ื’ื•ื“ืœ ืฉืœ 4 ื’'ื™ื’ื”-ื‘ื™ื™ื˜, ื•ืœื•ืงื— ื‘ื—ืฉื‘ื•ืŸ ืจืง ืืช ื”ืขื•ื‘ื“ื” ืฉืœืžื™ืฉื”ื• ื™ืฉ ื›ืจื’ืข ืžื˜ื‘ืขื•ืช. ื’ื ื ืคื— ื”ื ืชื•ื ื™ื ื”ืœืœื• ื’ื“ืœ ืขื ื”ื–ืžืŸ, ืืš ื‘ืงืฆื‘ ื”ืจื‘ื” ื™ื•ืชืจ ืื™ื˜ื™ ื•ืœืขื™ืชื™ื ืืฃ ื ื•ื˜ื” ืœืจื“ืช (ืจืื” CDPV).

ืœืงื•ื—ื•ืช ืงืœื™ื (SPVs) ืžื—ืœื™ืคื™ื ืขืจื‘ื•ื™ื•ืช ืื‘ื˜ื—ื” ืขื‘ื•ืจ ื”ื™ื›ื•ืœืช ืœืื—ืกืŸ ืฉื•ื ืžืฆื‘ ืžื™ื ื™ืžื•ื (ืกื˜ UTXO) ืžืœื‘ื“ ืžืคืชื—ื•ืช ืคืจื˜ื™ื™ื.

UTXO ื•-UTXO-ืกื˜

UTXO (Unspent Transaction Output) ื”ื•ื ืคืœื˜ ื”ืขืกืงื” ืฉืœื ื”ื•ืฆืื”, ื ืงื•ื“ืช ื”ืกื™ื•ื ืฉืœ ื”ืžืกืข ืฉืœ ื›ืœ ืกืื˜ื•ืฉื™ ื”ืžื•ืขื‘ืจ ื‘ืขืกืงืื•ืช. ืคืœื˜ื™ื ืฉืœื ื”ื•ืฆืื• ื”ื•ืคื›ื™ื ืœืชืฉื•ืžื•ืช ืฉืœ ืขืกืงืื•ืช ื—ื“ืฉื•ืช ื•ื‘ื›ืš ืžื•ืฆื™ืื•ืช (ืžื‘ื–ื‘ื–ื•ืช) ื•ืžื•ืกืจื•ืช ืž-UTXO-ืกื˜.

UTXOs ื—ื“ืฉื™ื ื ื•ืฆืจื™ื ืชืžื™ื“ ืขืœ ื™ื“ื™ ืขืกืงืื•ืช:

  • ืขืกืงืื•ืช ื‘ืกื™ืก ืžื˜ื‘ืขื•ืช ืœืœื ืชืฉื•ืžื•ืช: ืฆื•ืจ UTXOs ื—ื“ืฉื™ื ื›ืืฉืจ ื›ื•ืจื™ื ืžื ืคื™ืงื™ื ืžื˜ื‘ืขื•ืช
  • ืขืกืงืื•ืช ืจื’ื™ืœื•ืช: ืฆื•ืจ UTXOs ื—ื“ืฉื™ื ืชื•ืš ื”ื•ืฆืืช ืงื‘ื•ืฆื” ืžืกื•ื™ืžืช ืฉืœ UTXOs ืงื™ื™ืžื™ื

ืชื”ืœื™ืš ื”ืขื‘ื•ื“ื” ืขื UTXO:
Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ืืจื ืงื™ื ืกื•ืคืจื™ื ืืช ืžืกืคืจ ื”ืžื˜ื‘ืขื•ืช ื”ื–ืžื™ื ื™ื ืœื”ื•ืฆืื” (ื™ืชืจื”) ื‘ื”ืชื‘ืกืก ืขืœ ื›ืžื•ืช ื”-UTXO ื”ื–ืžื™ื ื” ืœืืจื ืง ื”ื–ื” ืœื”ื•ืฆืื”.

ื›ืœ ืฆื•ืžืช ืžืืžืช, ื›ื“ื™ ืœืžื ื•ืข ื ื™ืกื™ื•ื ื•ืช ื”ื•ืฆืื” ื›ืคื•ืœื™ื, ื—ื™ื™ื‘ ืœืคืงื— ืขืœ ื”ืกื˜ ื›ืœ UTXO ื‘ืขืช ื‘ื“ื™ืงื” ื›ืœ ืขืกืงืื•ืช ื›ืœ ืœึทื—ืกื•ึนื.

ื”ืฆื•ืžืช ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื‘ืขืœ ื”ื™ื’ื™ื•ืŸ:

  • ืชื•ืกืคื•ืช ืœืกื˜ UTXO
  • ืžื—ื™ืงื•ืช ืž-UTXO-set
  • ื‘ื“ื™ืงืช ื ื•ื›ื—ื•ืช ืฉืœ UTXO ื‘ื•ื“ื“ ื‘ืกื˜

ื™ืฉื ืŸ ื“ืจื›ื™ื ืœืฆืžืฆื ืืช ื”ื“ืจื™ืฉื•ืช ืœืžื™ื“ืข ืžืื•ื—ืกืŸ ืขืœ ืกื˜, ืชื•ืš ืฉืžื™ืจื” ืขืœ ื”ื™ื›ื•ืœืช ืœื”ื•ืกื™ืฃ ื•ืœื”ืกื™ืจ ืืœืžื ื˜ื™ื, ืœื‘ื“ื•ืง ื•ืœื”ื•ื›ื™ื— ืืช ืงื™ื•ืžื• ืฉืœ ืืœืžื ื˜ ื‘ืกื˜ ื‘ืืžืฆืขื•ืช ืžืฆื‘ืจื™ื ืงืจื™ืคื˜ื•ื’ืจืคื™ื™ื.

ืกื•ืœืœื•ืช ืขื‘ื•ืจ UTXO

ื”ืจืขื™ื•ืŸ ืฉืœ ืฉื™ืžื•ืฉ ื‘ืกื•ืœืœื•ืช ืœืื—ืกื•ืŸ UTXO ืžืจื•ื‘ื™ื ืžื“ื•ื‘ืจ ืžื•ืงื“ื ื™ื•ืชืจ.

ืขืจื›ืช ื”-UTXO ื ื‘ื ื™ืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”, ื‘ืžื”ืœืš ื”ื•ืจื“ืช ื”ื‘ืœื•ืง ื”ืจืืฉื•ื ื™ (IBD), ืžืื•ื—ืกื ืช ื‘ืžืœื•ืื” ื•ืœืชืžื™ื“, ื‘ืขื•ื“ ืฉืชื›ื•ืœืชื” ืžืฉืชื ื” ืœืื—ืจ ืขื™ื‘ื•ื“ ืขืกืงืื•ืช ืžื›ืœ ื‘ืœื•ืง ื—ื“ืฉ ื•ื ื›ื•ืŸ ืฉืœ ื”ืจืฉืช. ืชื”ืœื™ืš ื–ื” ื“ื•ืจืฉ ื”ื•ืจื“ื” ืฉืœ ื›-200 GB ืฉืœ ื ืชื•ื ื™ ื‘ืœื•ืง ื•ืื™ืžื•ืช ืฉืœ ืžืื•ืช ืžื™ืœื™ื•ื ื™ ื—ืชื™ืžื•ืช ื“ื™ื’ื™ื˜ืœื™ื•ืช. ืœืื—ืจ ื”ืฉืœืžืช ืชื”ืœื™ืš ื”-IBD, ื”ืฉื•ืจื” ื”ืชื—ืชื•ื ื” ื”ื™ื ืฉื”-UTXO-ืกื˜ ื™ืชืคื•ืก ื›-4 GB.

ืขื ื–ืืช, ืขื ืžืฆื‘ืจื™ื, ื›ืœืœื™ ื”ืงื•ื ืฆื ื–ื•ืก ืœื›ืกืคื™ื ืžืฆื˜ืžืฆืžื™ื ืœืื™ืžื•ืช ื•ื”ืคืงืช ื”ื•ื›ื—ื•ืช ืงืจื™ืคื˜ื•ื’ืจืคื™ื•ืช, ื•ื ื˜ืœ ื”ืžืขืงื‘ ืื—ืจ ื›ืกืคื™ื ื–ืžื™ื ื™ื ืžื•ืขื‘ืจ ืœื‘ืขืœื™ื ืฉืœ ืื•ืชื ื›ืกืคื™ื, ืืฉืจ ืžืกืคืง ื”ื•ื›ื—ื” ืœืงื™ื•ืžื ื•ื‘ืขืœื•ืชื.

ืžืฆื‘ืจ ื™ื›ื•ืœ ืœื”ื™ืงืจื ื™ื™ืฆื•ื’ ืงื•ืžืคืงื˜ื™ ืฉืœ ืงื‘ื•ืฆื”. ื’ื•ื“ืœ ื”ื™ื™ืฆื•ื’ ื”ืžืื•ื—ืกืŸ ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืงื‘ื•ืข Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื, ืื• ืœื”ื’ื“ื™ืœ ื‘ืื•ืคืŸ ืชืช-ืœื™ื ื™ืืจื™ ื‘ื™ื—ืก ืœืงืจื“ื™ื ืœื™ื•ืช ืฉืœ ื”ืกื˜ ื•ื’ื•ื“ืœ ื”ืืœืžื ื˜ ืขืฆืžื•, ืœืžืฉืœ Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื, ื›ืืฉืจ n ื”ื•ื ื”ืงืจื“ื™ื ืœื™ื•ืช ืฉืœ ื”ืงื‘ื•ืฆื” ื”ืžืื•ื—ืกื ืช.

ื‘ืžืงืจื” ื–ื”, ื”ืžืฆื‘ืจ ืฆืจื™ืš ืœืืคืฉืจ ื”ืคืงืช ื”ื•ื›ื—ื” ืœื”ื›ืœืœืช ืจื›ื™ื‘ ื‘ืงื‘ื•ืฆื” (ื”ื•ื›ื—ืช ื”ื›ืœืœื”) ื•ืœืืคืฉืจ ืœืืžืช ื”ื•ื›ื—ื” ื–ื• ื‘ื™ืขื™ืœื•ืช.

ื”ืกื•ืœืœื” ื ืงืจืืช ื“ื™ื ืžื™ if ืžืืคืฉืจ ืœืš ืœื”ื•ืกื™ืฃ ืืœืžื ื˜ื™ื ื•ืœื”ืกื™ืจ ืืœืžื ื˜ื™ื ืžืงื‘ื•ืฆื”.

ื“ื•ื’ืžื” ืœืกื•ืœืœื” ื›ื–ื• ืชื”ื™ื” ืžืฆื‘ืจ RSA ืฉื”ื•ืฆืข ืขืœ ื™ื“ื™ Boneh, Bunz, Fisch ื‘ื“ืฆืžื‘ืจ 2018. ืœืฆื‘ืจ ื›ื–ื” ื™ืฉ ื’ื•ื“ืœ ืงื‘ื•ืข ืฉืœ ื™ื™ืฆื•ื’ ืžืื•ื—ืกืŸ, ืื‘ืœ ื“ื•ืจืฉ ื ื•ื›ื—ื•ืช ืกื•ื“ ืžืฉื•ืชืฃ (ื”ืชืงื ื” ืžื”ื™ืžื ื”). ื“ืจื™ืฉื” ื–ื• ืฉื•ืœืœืช ืืช ืชื—ื•ืœืชื• ืฉืœ ืžืฆื‘ืจ ื›ื–ื” ืขื‘ื•ืจ ืจืฉืชื•ืช ื—ืกืจื•ืช ืืžื•ืŸ ื›ืžื• ื‘ื™ื˜ืงื•ื™ืŸ, ืฉื›ืŸ ื“ืœื™ืคืช ื ืชื•ื ื™ื ื‘ืžื”ืœืš ื™ืฆื™ืจืช ืกื•ื“ ื™ื›ื•ืœื” ืœืืคืฉืจ ืœืชื•ืงืคื™ื ืœื™ืฆื•ืจ ื”ื•ื›ื—ื” ื›ื•ื–ื‘ืช ืœืงื™ื•ืžื• ืฉืœ UTXO, ืœื”ื•ื ื•ืช ืฆืžืชื™ื ืขื ืขืจื›ืช UTXO ื”ืžื‘ื•ืกืกืช ืขืœ ืžืฆื‘ืจ ื›ื–ื”.

ืื•ื˜ืจื™ืงืกื•

ืขื™ืฆื•ื‘ Utreexo ืฉื”ื•ืฆืข ืขืœ ื™ื“ื™ Thaddeus Dryja ืžืืคืฉืจ ืœื™ืฆื•ืจ ื“ื™ื ืžื™ ืฆื•ื‘ืจ ะฑะตะท ื”ื’ื“ืจื” ืžื”ื™ืžื ื”.

Utreexo ื”ื•ื ื™ืขืจ ืฉืœ ื‘ื™ื ืืจื™ ืžื•ืฉืœื ืžืจืงืœ ื˜ืจื™ืก ื•ื”ื•ื ืคื™ืชื•ื— ืฉืœ ื”ืจืขื™ื•ื ื•ืช ื”ืžื•ืฆื’ื™ื ื‘ ืžืฆื‘ืจื™ื ืืกื™ื ื›ืจื•ื ื™ื™ื ื™ืขื™ืœื™ื ืขื‘ื•ืจ pki ืžื‘ื•ื–ืจ, ื”ื•ืกืคืช ื”ื™ื›ื•ืœืช ืœื”ืกื™ืจ ืืœืžื ื˜ื™ื ืžืงื‘ื•ืฆื”.

ืžื‘ื ื” ืœื•ื’ื™ ืฉืœ ื”ืกื•ืœืœื”

ืชืื™ ื”ืกื•ืœืœื” ืžืกื•ื“ืจื™ื ื‘ื™ืขืจ ืฉืœ ืขืฆื™ื ื‘ื™ื ืืจื™ื™ื ืื™ื“ื™ืืœื™ื™ื. ืขืฆื™ื ืžืกื•ื“ืจื™ื ืœืคื™ ื’ื•ื‘ื”. ื™ื™ืฆื•ื’ ื–ื” ื ื‘ื—ืจ ื›ื—ื–ื•ืชื™ ื‘ื™ื•ืชืจ ื•ืžืืคืฉืจ ืœื“ืžื™ื™ืŸ ืืช ืžื™ื–ื•ื’ ื”ืขืฆื™ื ื‘ืžื”ืœืš ืคืขื•ืœื•ืช ืขืœ ื”ืกื•ืœืœื”.

ื”ืžื—ื‘ืจ ืžืฆื™ื™ืŸ ื›ื™ ืžืื—ืจ ืฉื›ืœ ื”ืขืฆื™ื ื‘ื™ืขืจ ื”ื ืื™ื“ื™ืืœื™ื™ื, ื’ื•ื‘ื”ื ืžืชื‘ื˜ื ื‘ื—ื–ืงืช ืฉืชื™ื™ื, ื›ืคื™ ืฉื ื™ืชืŸ ืœื™ื™ืฆื’ ื›ืœ ืžืกืคืจ ื˜ื‘ืขื™ ื›ืกื›ื•ื ืฉืœ ื—ื–ืงื•ืช ืฉืชื™ื™ื. ื‘ื”ืชืื, ื ื™ืชืŸ ืœืงื‘ืฅ ื›ืœ ืงื‘ื•ืฆื” ืฉืœ ืขืœื™ื ืœืขืฆื™ื ื‘ื™ื ืืจื™ื™ื, ื•ื‘ื›ืœ ื”ืžืงืจื™ื, ื”ื•ืกืคืช ืืœืžื ื˜ ื—ื“ืฉ ื“ื•ืจืฉืช ื™ื“ืข ืจืง ืขืœ ืฆืžืชื™ ื”ืฉื•ืจืฉ ืฉืœ ืขืฆื™ื ืžืื•ื—ืกื ื™ื.

ืœืคื™ื›ืš, ื”ื™ื™ืฆื•ื’ ื”ืžืื•ื—ืกืŸ ืฉืœ ืžืฆื‘ืจ Utreexo ื”ื•ื ืจืฉื™ืžื” ืฉืœ ืฆืžืชื™ ืฉื•ืจืฉ (ืฉื•ืจืฉ ืžืจืงืœ), ื•ืœื ื›ืœ ื™ืขืจ ื”ืขืฆื™ื.

ื‘ื•ืื• ื ืฆื™ื’ ืืช ืจืฉื™ืžืช ืจื›ื™ื‘ื™ ื”ืฉื•ืจืฉ ื› 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()

ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžืฉืชืžืฉื™ื ื‘ืขืฆื™ ืžืจืงืœ, ื”ืื‘ ืฉืœ ื›ืœ ืื—ื“ ืžืฉื ื™ ื”ืฆืžืชื™ื ื”ื•ื ืฆื•ืžืช ืื—ื“ ื”ืžืื—ืกืŸ ืืช ื”-hash ืฉืœ ืฉืจืฉื•ืจ ื”ื’ื™ื‘ื•ื‘ื™ื ืฉืœ ื”ืฆืžืชื™ื ื”ืฆืืฆืื™ื:

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[..])
}

ื”ืžื—ื‘ืจ ืžืฆื™ื™ืŸ ืฉื›ื“ื™ ืœืžื ื•ืข ืืช ื”ื”ืชืงืคื•ืช ืฉืชื•ืืจื• ืขืœ ื™ื“ื™ ืฉืืจืœ ื‘ื•ื™ืœื”, ืคื™ื™ืจ ืืœืŸ ืคื•ืงื”, ืขื“ื™ ืฉืžื™ืจ ื•ืกื‘ืกื˜ื™ืืŸ ืฆื™ืžืจ ื‘
ื”ืชืงืคื•ืช ืงื“ื-ืชืžื•ื ื” ืฉื ื™ื•ืช ืขืœ ืคื•ื ืงืฆื™ื•ืช hash ืžืฉื•ืžืจื•ืช, ื‘ื ื•ืกืฃ ืœืฉื ื™ ื”ื’ื™ื‘ื•ื‘ื™ื, ื™ืฉ ืœื”ื•ืกื™ืฃ ืœืฉืจืฉื•ืจ ื’ื ืืช ื”ื’ื•ื‘ื” ื‘ืชื•ืš ื”ืขืฅ.

ื›ืืฉืจ ืืชื” ืžื•ืกื™ืฃ ืืœืžื ื˜ื™ื ืœืฆื•ื‘ืจ, ืขืœื™ืš ืœืขืงื•ื‘ ืื—ืจ ืจื›ื™ื‘ื™ ื”ืฉื•ืจืฉ ืฉื”ืฉืชื ื•. ืขืœ ื™ื“ื™ ื‘ื™ืฆื•ืข ื”ื ืชื™ื‘ ืฉืœ ืฉื™ื ื•ื™ ืจื›ื™ื‘ื™ ื”ืฉื•ืจืฉ ืขื‘ื•ืจ ื›ืœ ืืœืžื ื˜ ืฉืชื•ืกื™ืฃ, ืชื•ื›ืœ ืœื‘ื ื•ืช ืžืื•ื—ืจ ื™ื•ืชืจ ื”ื•ื›ื—ื” ืœื ื•ื›ื—ื•ืชื ืฉืœ ืืœืžื ื˜ื™ื ืืœื•.

ืขืงื•ื‘ ืื—ืจ ืฉื™ื ื•ื™ื™ื ืชื•ืš ื›ื“ื™ ื”ื•ืกืคืชื

ื›ื“ื™ ืœืขืงื•ื‘ ืื—ืจ ื”ืฉื™ื ื•ื™ื™ื ืฉื‘ื•ืฆืขื•, ื‘ื•ืื• ื ื›ืจื™ื– ืขืœ ื”ืžื‘ื ื” 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 ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ืงื•ื“

new_roots[0].extend_from_slice(insertions);

  • ืื’ื“ ืืช ื”ืคืจื™ื˜ื™ื ืฉื ื•ืกืคื• ืœืกืœ ื”ืจืืฉื•ืŸ ืขื ื”ืฉืืจ:
    • ืœื›ืœ ื”ืขื’ืœื•ืช ืขื ื™ื•ืชืจ ืžืคืจื™ื˜ ืื—ื“:
      1. ืงื— ืฉื ื™ ืืœืžื ื˜ื™ื ืžืงืฆื” ื”ืกืœ, ื—ืฉื‘ ืืช ื”ื”ื•ืจื” ืฉืœื”ื, ื”ืกืจ ืืช ืฉื ื™ ื”ืืœืžื ื˜ื™ื
      2. ื”ื•ืกืฃ ืืช ื”ืื‘ ื”ืžื—ื•ืฉื‘ ืœืขื’ืœื” ื”ื‘ืื”

Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ืงื•ื“

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

ืชื”ืœื™ืš ื™ืฆื™ืจืช ื”ื•ื›ื—ื”

Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ื‘ื“ื™ืงืช ื”ื”ื•ื›ื—ื” ืœืืœืžื ื˜

ื‘ื“ื™ืงืช ื”ื•ื›ื—ืช ื”ื›ืœืœื” ืฉืœ ืืœืžื ื˜ ืžืกืชื›ืžืช ื‘ืžืขืงื‘ ืื—ืจ ื ืชื™ื‘ Merkle ืขื“ ืฉื”ื•ื ืžื•ื‘ื™ืœ ืœืืœืžื ื˜ ืฉื•ืจืฉ ืงื™ื™ื:

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

ื‘ึผึฐื‘ึดื™ืจื•ึผืจ:

ืชื”ืœื™ืš ื‘ื“ื™ืงืช ื”ื”ื•ื›ื—ื” ืขื‘ื•ืจ ื

Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ื”ืกืจืช ืคืจื™ื˜ื™ื

ื›ื“ื™ ืœื”ืกื™ืจ ืชื ืžืกื•ืœืœื”, ืขืœื™ืš ืœืกืคืง ื”ื•ื›ื—ื” ืชืงืคื” ืœื›ืš ืฉื”ืชื ื ืžืฆื ืฉื. ื‘ืืžืฆืขื•ืช ื”ื ืชื•ื ื™ื ืžื”ื”ื•ื›ื—ื”, ื ื™ืชืŸ ืœื—ืฉื‘ ืจื›ื™ื‘ื™ ืฉื•ืจืฉ ื—ื“ืฉื™ื ืฉืœ ื”ืžืฆื‘ืจ ืฉื”ื”ื•ื›ื—ื” ืฉื ื™ืชื ื” ืœื ืชื”ื™ื” ื ื›ื•ื ื” ื™ื•ืชืจ ืขื‘ื•ืจื.

ื”ืืœื’ื•ืจื™ืชื ื”ื•ื ื›ื“ืœืงืžืŸ:

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

ืชื”ืœื™ืš ื”ืกืจืช ืจื›ื™ื‘ "A":
Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ืฉื™ืœื•ื‘ ื‘ืจืฉืช ืงื™ื™ืžืช

ื‘ืืžืฆืขื•ืช ื”ืžืฆื‘ืจ ื”ืžื•ืฆืข, ืฆืžืชื™ื ื™ื›ื•ืœื™ื ืœื”ื™ืžื ืข ืžืฉื™ืžื•ืฉ ื‘-DB ื›ื“ื™ ืœืื—ืกืŸ ืืช ื›ืœ ื”-UTXOs ื•ืขื“ื™ื™ืŸ ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœืฉื ื•ืช ืืช ืขืจื›ืช ื”-UTXO. ืขื ื–ืืช, ืžืชืขื•ืจืจืช ื‘ืขื™ื™ืช ื”ืขื‘ื•ื“ื” ืขื ืจืื™ื•ืช.

ื‘ื•ืื• ื ืงืจื ืœืฆื•ืžืช ื”ืื™ืžื•ืช ืฉืžืฉืชืžืฉ ื‘ืฆื•ื‘ืจ UTXO ืงื•ึนืžืคึผึธืงื˜ึดื™ (ืฆื•ืžืช ืžืฆื‘ ืงื•ืžืคืงื˜ื™), ื•ื”ืžืืžืช ืœืœื ืžืฆื‘ืจ ื”ื•ื ืœื”ืฉืœื™ื (ืฆื•ืžืช ืžืœื). ืงื™ื•ืžื ืฉืœ ืฉื ื™ ืžื—ืœืงื•ืช ืฉืœ ืฆืžืชื™ื ื™ื•ืฆืจ ื‘ืขื™ื” ื‘ืฉื™ืœื•ื‘ื ืœืจืฉืช ืื—ืช, ืฉื›ืŸ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื ื“ื•ืจืฉื™ื ื”ื•ื›ื—ื” ืœืงื™ื•ืžื ืฉืœ UTXOs, ื”ืžื•ืฉืงืขื™ื ื‘ื˜ืจื ื–ืงืฆื™ื•ืช, ื‘ืขื•ื“ ืฆืžืชื™ื ืžืœืื™ื ืœื. ืื ื›ืœ ืฆืžืชื™ ื”ืจืฉืช ืœื ื™ืขื‘ืจื• ื‘ืžืงื‘ื™ืœ ื•ื‘ืื•ืคืŸ ืžืชื•ืื ืœืฉื™ืžื•ืฉ ื‘-Utreexo, ืื–ื™ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื ื™ื™ืฉืืจื• ืžืื—ื•ืจ ื•ืœื ื™ื•ื›ืœื• ืœืคืขื•ืœ ื‘ืจืฉืช ื”ื‘ื™ื˜ืงื•ื™ืŸ.

ื›ื“ื™ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ืฉืœ ืฉื™ืœื•ื‘ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื ื‘ืจืฉืช, ืžื•ืฆืข ืœื”ืฆื™ื’ ืžื—ืœืงื” ื ื•ืกืคืช ืฉืœ ืฆืžืชื™ื - ื’ืฉืจื™ื. ืฆื•ืžืช ื’ืฉืจ ื”ื•ื ืฆื•ืžืช ืฉืœื ื”ืžืื—ืกืŸ ื’ื ืืช ืกื•ืœืœืช Utreexo ื•ื”ื•ื›ื—ืช ื”ืคืขืœื” ืขื‘ื•ืจ ื›ืœ UTXO ืžื‘ื™ืช UTXO-set. ื’ืฉืจื™ื ืžื—ืฉื‘ื™ื ื’ื™ื‘ื•ื‘ ื—ื“ืฉื™ื ื•ืžืขื“ื›ื ื™ื ืืช ื”ืžืฆื‘ืจ ื•ื”ื”ื•ื›ื—ื•ืช ืขื ื”ื’ืขืช ื‘ืœื•ืงื™ื ื—ื“ืฉื™ื ืฉืœ ืขืกืงืื•ืช. ืชื—ื–ื•ืงื” ื•ืขื“ื›ื•ืŸ ืฉืœ ื”ืžืฆื‘ืจ ื•ื”ื”ื•ื›ื—ื•ืช ืœื ืžื˜ื™ืœื” ืขื•ืžืก ื—ื™ืฉื•ื‘ื™ ื ื•ืกืฃ ืขืœ ืฆืžืชื™ื ื›ืืœื”. ื’ืฉืจื™ื ืžืงืจื™ื‘ื™ื ืฉื˜ื— ื“ื™ืกืง: ืฆืจื™ืš ืœืฉืžื•ืจ ืขืœ ืกื“ืจ Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื hashes, ืœืขื•ืžืช Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื hashes ืขื‘ื•ืจ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื, ื›ืืฉืจ n ื”ื•ื ื”ืขื•ืฆืžื” ืฉืœ ืขืจื›ืช UTXO.

ืืจื›ื™ื˜ืงื˜ื•ืจืช ืจืฉืช

Utreexo: ื“ื—ื™ืกืช UTXO ื‘ื™ื˜ืงื•ื™ืŸ ืจื‘ื™ื

ื’ืฉืจื™ื ืžืืคืฉืจื™ื ืœื”ื•ืกื™ืฃ ื‘ื”ื“ืจื’ื” ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื ืœืจืฉืช ืžื‘ืœื™ ืœืฉื ื•ืช ืืช ื”ืชื•ื›ื ื” ืฉืœ ืฆืžืชื™ื ืงื™ื™ืžื™ื. ืฆืžืชื™ื ืžืœืื™ื ืคื•ืขืœื™ื ื›ื‘ืขื‘ืจ, ื•ืžืคื™ืฆื™ื ื‘ื™ื ื ืœื‘ื™ืŸ ืขืฆืžื ืขืกืงืื•ืช ื•ื—ืกื™ืžื•ืช. ืฆืžืชื™ ื’ืฉืจ ื”ื ืฆืžืชื™ื ืžืœืื™ื ื”ืžืื—ืกื ื™ื ื‘ื ื•ืกืฃ ื ืชื•ื ื™ ืกื•ืœืœื” ืฉืœ Utreexo ื•ืงื‘ื•ืฆื” ืฉืœ ื”ื•ื›ื—ื•ืช ื”ื›ืœืœื” ืขื‘ื•ืจ ื›ืœ UTXO ืœืขืช ืขืชื”. ืฆื•ืžืช ื”ื’ืฉืจ ืื™ื ื• ืžืคืจืกื ืืช ืขืฆืžื• ื›ื›ื–ื”, ื•ืžืชื™ื™ืžืจ ืœื”ื™ื•ืช ืฆื•ืžืช ืžืœื ืขื‘ื•ืจ ื›ืœ ื”ืฆืžืชื™ื ื”ืžืœืื™ื ื•ืฆื•ืžืช ืงื•ืžืคืงื˜ื™ ืขื‘ื•ืจ ื›ืœ ื”ืฆืžืชื™ื ื”ืงื•ืžืคืงื˜ื™ื™ื. ืœืžืจื•ืช ืฉื’ืฉืจื™ื ืžื—ื‘ืจื™ื ืืช ืฉืชื™ ื”ืจืฉืชื•ืช ื™ื—ื“, ื”ื ืœืžืขืฉื” ืฆืจื™ื›ื™ื ืœื—ื‘ืจ ืื•ืชื ืจืง ื‘ื›ื™ื•ื•ืŸ ืื—ื“: ืžืฆืžืชื™ื ืžืœืื™ื ืงื™ื™ืžื™ื ื•ืขื“ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื. ื–ื” ืืคืฉืจื™ ืžื›ื™ื•ื•ืŸ ืฉืื™ืŸ ืฆื•ืจืš ืœืฉื ื•ืช ืืช ืคื•ืจืžื˜ ื”ืขืกืงืื•ืช, ื•ื ื™ืชืŸ ืœื–ืจื•ืง ื”ื•ื›ื—ื•ืช UTXO ืขื‘ื•ืจ ืฆืžืชื™ื ืงื•ืžืคืงื˜ื™ื™ื, ื›ืš ืฉื›ืœ ืฆื•ืžืช ืงื•ืžืคืงื˜ื™ ื™ื›ื•ืœ ื‘ืื•ืคืŸ ื“ื•ืžื” ืœืฉื“ืจ ื˜ืจื ื–ืงืฆื™ื•ืช ืœื›ืœ ืžืฉืชืชืคื™ ื”ืจืฉืช ืœืœื ื”ืฉืชืชืคื•ืช ืฉืœ ืฆืžืชื™ ื’ืฉืจ.

ืžืกืงื ื”

ื”ืกืชื›ืœื ื• ืขืœ ืกื•ืœืœืช Utreexo ื•ื™ื™ืฉืžื ื• ืืช ืื‘ ื”ื˜ื™ืคื•ืก ืฉืœื” ื‘- Rust. ื‘ื“ืงื ื• ืืช ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืจืฉืช ืฉืชืืคืฉืจ ืฉื™ืœื•ื‘ ืฉืœ ืฆืžืชื™ื ืžื‘ื•ืกืกื™ ืกื•ืœืœื”. ื”ื™ืชืจื•ืŸ ืฉืœ ืชืคื™ืกื•ืช ืงื•ืžืคืงื˜ื™ื•ืช ื”ื•ื ื’ื•ื“ืœ ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื, ืฉืชืœื•ื™ ืœื•ื’ืจื™ืชืžื™ืช ื‘ืขื•ืฆืžืช ืกื˜ ื”-UTXOs, ืžื” ืฉืžืคื—ื™ืช ืžืื•ื“ ืืช ื”ื“ืจื™ืฉื•ืช ืœืฉื˜ื— ื“ื™ืกืง ื•ื‘ื™ืฆื•ืขื™ ืื—ืกื•ืŸ ืขื‘ื•ืจ ืฆืžืชื™ื ื›ืืœื”. ื”ื—ื™ืกืจื•ืŸ ื”ื•ื ืชืขื‘ื•ืจืช ื”ืฆื•ืžืช ื”ื ื•ืกืคืช ืœื”ืขื‘ืจืช ื”ื•ื›ื—ื•ืช, ืืš ื˜ื›ื ื™ืงื•ืช ืฆื‘ื™ืจืช ืจืื™ื•ืช (ื›ืืฉืจ ื”ื•ื›ื—ื” ืื—ืช ืžื•ื›ื™ื—ื” ืืช ืงื™ื•ืžื ืฉืœ ืžืกืคืจ ืืœืžื ื˜ื™ื) ื•ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ ื™ื›ื•ืœื•ืช ืœืขื–ื•ืจ ืœืฉืžื•ืจ ืขืœ ืชื ื•ืขื” ื‘ื’ื‘ื•ืœื•ืช ืžืงื•ื‘ืœื™ื.

ืชื–ื›ื•ืจ:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”