××× ×××ך!
××× ×× ×××ק×Öž×× × ×¢×¥, ×Ö·××¢ × ×Öž×××, ×××š× ×§×Öž× ×¡×¢× ×¡×ס, ש××××¢× ××××£ ×Ö· ××Ö·× × ×€×× UTXOs: ××× ×€×××¢ ק×Öž×× ×¡ ××¢× ×¢× ×× ×××Š× ×€Ö¿×ַך ×¡×€ÖŒ×¢× ××× ×, ×Š× ×××¢××¢× ×€ÖŒ×× ×§×, ××× ××× ×עך ×××֞ס ×× ×Öž××. ×× UTXO ש××¢×× ××× ×× ××× ×××× ××Ö·× × ×€×× ××Ö·×× ×€×ך××× ×× ×€Ö¿×ַך ×Ö· ×××Ö·××××Ö·××֞ך × ×Öž××¢, ×Öž× ×××֞ס ×× × ×Öž××¢ ×××¢× × ××©× ×§×¢× ×¢× ×Š× ××ַש××¢×××§× ×× ×××××ק××Ö·× ×€×× ×× ×§×Ö·××× × ×ך×Ö·× ××ַקש×Ö·× × ××× ×× ×××ַקס ××× ×××.
××× ××¢× ×Ö·×××× ×, ׀ך×××× ××¢× ×¢× ××¢×××× ××× ××¢×עך ××¢×××¢× ×××¢× ×Š× ×š×¢××׊××š× ×× ×¡××Öž×š× ×€×ַך×ךע××× × ×€×× ××¢× ××Ö·× ×, ×Š× ×§×Öž×׀֌ךעס עס ×Öž× ××××× × ×××עך×××× ×עך×Ö·× ×××. ×עך ק××¢× ×¢×š×¢×š ×× ××Ö·× × ×€×× ×¡××Öž×š× ××Ö·××, ×× × ××עך×קעך ×× ××סק ×€ÖŒ××Ö·×¥ ךעק×××ךע××¢× ×¥ ×€×× ×× ×××Ö·××××Ö·××֞ך × ×Öž××¢, ×××֞ס ×××× ×× ×§×Ö·×עך ×€×× ×Ö· ×××Ö·××××Ö·××֞ך × ×Öž××¢ ××××ק, ×Ö·××Ö·×× ××ך ×Š× ×קס׀֌×Ö·× × ×× × ×¢×¥ ××× ×עך××× ×€×ַך××š×¢×¡×¢×š× ×× ×€×¢×¡×ק××Ö·× ×€×× ×× × ×¢×¥.
××× ××¢× ×€ÖŒ×֞ס××, ××ך ×××¢×× ×€ÖŒ×֞ס×× ×Ö· ך××¡× ×€ÖŒ×š×Öž×××Ö·××××€ÖŒ ×€×× ×Ö· ׀ך×ש ×€×֞ךש××Öž× ×€×× ×Ö· ק×Öž-×××ך
×××֞ס ××× ×× ×€ÖŒ×š×Öž×××¢×?
×××× ×¢×š ×€×× ×× ×××ךעס××ק ׀֌ך×Öž×××¢×ס ×€×× ×××ק×Öž×× ××× ×××× ×¡×§×Ö·××Ö·××××××. ×עך ××¢××Ö·× ×§ ×€×× "×××× ×××××¢× ×¢ ××Ö·× ×§" ך×ק×××××¢×š× × ×¢×¥ ×€ÖŒ×ַך××ס×Ö·×€ÖŒ×Ö·× ×¥ ×Š× ××Ö·××× ×š×¢×§×֞ך×ס ×€×× ×Ö·××¢ ××¢×× ×× ×××Š× ×€Ö¿×ַך × ×׊×. ××× ×××ק×Öž××, ×× ×××Š× ××¢×× ××¢× ×¢× ×××ס××¢×ך××§× ××× ×Ö· ס××× ×€×× ×Ö·× ×¡×€ÖŒ×¢× × ×Ö·×××€ÖŒ××¥ - ×Ö· UTXO-סע×. ××Öž×ש ××֞ס ××× × ××©× ×Ö· ס׀֌ע׊××¢× ×× ×××Ö·×××× ×€×ַך×ךע××× ×, עס ××× ××××××××ק ××× ×עך××× ×¢× ×€×× ×××€ÖŒ××Ö·××¢× ×××ש×Ö·× ×€×֞ךש××¢××× × ×××עך ×Ö· ×€×ַך×ךע××× × ××× ×××֞ס ××¢×עך "×××Ö·××" ××× ×Ö· "×××Öž×" ××× ×Ö· ××Ö·××× ×עך ×€ÖŒ×Öž××׊××¢, ××× ×××× ××ס××£ ׀֌ך××××Ö·×ק××× (××ש×.
עס ××× ××××××ק ×Š× ××ס××××× ×Š××××©× ×× ×עש××××¢ ×€×× ââ×ך×Ö·× ××ַקש×Ö·× × (×××֞ס ××× ×עך××€× ×× ×××֞ק×ש×××) ××× ×× ×§×š×Ö·× × ×©××Ö·× ×€×× ×× ×¡×ס××¢×. ×××ק×Öž×× ×ך×Ö·× ×¡×ַק×××Öž× ×עש××××¢ ×עך××××Ö·× ×ַק××Ö·×€ÖŒ××× ×××¢×× 200 ×××××××× ×€×× ××סק ×€ÖŒ××Ö·×¥, ××× ×××× ×Š× ×××ַקס×. ×Öž×עך, ×× ×¡×ס××¢× ×©××Ö·× ××× ×€×× ×§××¢× ×¢×š×¢×š, ââ××××£ ×× ×¡×ך ×€×× 4 ××××××××, ××× × ×֞ך × ×¢×× ××× ×ש××× ×× ×€×Ö·×§× ×Ö·× ×¢×ע׊עך ×××Š× ×Öž×× × ×§×Öž×× ×¡. ×עך ××Ö·× × ×€×× ×× ××Ö·×× ×× ×§×š×ס×× ×××× ××× ×Š×××, ×Öž×עך ××× ×Ö· ×€×× ×¡××Öž×עך ק×ךס ××× ××¢× ×× ××€××× ×Š× ×€×ַך××× ×¢×š× (××¢× CDPV).
×××× ×§××××Ö·× ×¥ (ס׀֌××ס) ××Ö·× ×× ×××עך×××× ×עך×Ö·× ××× ×€Ö¿×ַך ×× ×€×××ק××× ×Š× ×§×š×Öž× ×§××× ××× ×××× ×©××Ö·× (UTXO-set) ×× ×עךע ××× ×€ÖŒ×š××××Ö·× ×©××ס××¢×.
UTXO ××× UTXO-ש××¢××
UTXO (Unspent Transaction Output) ××× ×× ×Ö·× ×¡×€ÖŒ×¢× × ×ך×Ö·× ×¡×ַק×××Öž× ×š×¢×××××Ö·×, ×עך ס××£ ×€×× × ×€×× ×× × ×¡××¢× ×€×× ××¢×עך ס×Ö·××Öž×©× ×ך×Ö·× ×¡×€×¢×š× ××× ×ך×Ö·× ××ַקש×Ö·× ×. ×× ×¡×€ÖŒ×¢× × ×Ö·×××€ÖŒ××¥ ×××¢×š× ×× ×€ÖŒ××¥ ×€×× × ××Ö·×¢ ×ך×Ö·× ××ַקש×Ö·× × ××× ××¢× ×¢× ×Ö·××× ×€×ך×ך××× (×€×ַך××š×¢× ××¢×) ××× ×Ö·××עק××¢× ×××¢× ×€×× ×× UTXO-סע×.
× ×× UTXOs ××¢× ×¢× ×©××¢× ××ק ××ש××€× ×××š× ×ך×Ö·× ××ַקש×Ö·× ×:
- ק×Öž×× ×¡××ַסע ×ך×Ö·× ××ַקש×Ö·× × ×Öž× ×× ×€ÖŒ××¥: ש×Ö·×€Ö¿× × ××Ö·×¢ UTXOs ×××¢× ×××× ×¢×š× ×ַך××ס××¢×× ×§×Öž×× ×¡
- ךע×××עך ×ך×Ö·× ××ַקש×Ö·× ×: ש×Ö·×€Ö¿× × ××Ö·×¢ UTXOs ×שעת ×¡×€ÖŒ×¢× ××× × ×Ö· ×××עך ××Ö·× × ×€×× ××××ס××× × UTXOs
׀֌ך×֞׊עס ×€×× ×ך××¢×× ××× UTXO:
×××Ö·×××¢×¥ ׊×××× ×× × ××עך ×€×× ×§×Öž×× ×¡ ×× ×××Š× ×€Ö¿×ַך ×¡×€ÖŒ×¢× ××× × (×××Öž×) ×××××š× ××××£ ×× ×¡×××¢ ×€×× ââUTXO ×× ×××Š× ×Š× ××¢× ×××Ö·×× ×€Ö¿×ַך ×¡×€ÖŒ×¢× ××× ×.
××¢×עך ×××Ö·××××Ö·××֞ך × ×Öž××¢, ×Š× ×€×ַך×××Ö·×× ××Öž×€ÖŒ× ×€×ַך××š×¢× ××¢× ×€×š××××, ×××× ××Öž× ×××֞ך ×× ××Ö·× × ×Ö·××¢ UTXO ×××¢× ×שעק ××¢×עך ×ך×Ö·× ××ַקש×Ö·× × ××¢×עך ×××֞ק.
×עך × ×Öž××¢ ×××× ××Öž×× ××Öž××ק:
- ×Ö·××ש×Ö·× × ×Š× UTXO-סע×
- ××××ש×Ö·× × ×€×× UTXO-סע×
- ק×Öž× ×ך×Öž×××š× ××¢× ×××Ö·×××Ö·× ×€×× ×Ö· ×××× UTXO ××× ×Ö· ××Ö·× ×
עס ××¢× ×¢× ×××¢×× ×Š× ×š×¢××׊××š× ×× ×š×¢×§×××ךע××¢× ×¥ ×€Ö¿×ַך ס××Öž×š× ××× ×€Ö¿×֞ך××ַ׊××¢ ×××¢×× ×Ö· ××Ö·× ×, ×שעת ××ך ××Ö·××× ×× ×€×××ק××× ×Š× ××××× ××× ×ַך×Öž×€ÖŒ× ×¢××¢× ×¢××¢××¢× ××, ק×Öž× ×ך×Öž×××š× ××× ××Ö·××××Ö·×× ×× ×¢×§××ס××¢× ×¥ ×€×× ×Ö·× ×¢××¢××¢× × ××× ×Ö· ××Ö·× ×.
××Ö·×עך×× ×€Ö¿×ַך UTXO
×עך ××¢××Ö·× ×§ ×€×× × ××Š× ××Ö·×עך×× ×Š× ×§×š×Öž× ×§×××€× UTXOs
×× UTXO-×¡×¢× ××× ××¢×××× ××××£ ×× ×€×××¢×, ×עש×ַס ×× ×¢×š×©× ×××֞ק ×ך×׀ק××€××¢ (×××), ס××Öž×š× ××× ×€×× ××× ×€ÖŒ×¢×š××Ö·× ×Ö·× ×××, ×שעת ×××Ö·× ××× ××Ö·×× ××××©× × ×Öž× ×€ÖŒ×š×ַסעס×× × ×ך×Ö·× ××ַקש×Ö·× × ×€×× ××¢×עך × ××Ö· ××× ×š××××ק ×××֞ק ×€×× ×× × ×¢×¥. ×עך ׀֌ך×֞׊עס ך×ק×××××¢×š× ××Ö·×× ××Öž×××× × ××¢×¢×š×¢× 200 ×××××××× ×€×× ×××֞ק ××Ö·×× ××× ××עך×Ö·×€×××× × ××× ×עך×עך ×€×× ×××××Ö·× × ×€×× ××××××Ö·× ×¡××× ×Ö·×שעך×. × ×Öž× ×× ××× ×€ÖŒ×š×֞׊עס ××× ××¢×¢× ××ק×, ×× ×× ×Öž ש××š× ××× ×Ö·× ×× UTXO-×¡×¢× ×××¢× ×€×Ö·×š× ×¢××¢× ×××¢×× 4 ××××××××.
×Öž×עך, ××× ×ַק×××××Ö·××××עך×, ×× ×ÖŒ×××× ×€×× ×§×Öž× ×¡×¢× ×¡×ס ×€Ö¿×ַך ××¢×× ××¢× ×¢× ×š××××¡× ×Š× ×× ××עך×Ö·×€×ַק××ש×Ö·× ××× ××ך ×€×× ×§×š××€ÖŒ××Öž×ך×Ö·×€×ק ׀֌ך×Öž××עס, ××× ×× ××ַסע ×€×× ââ×ך×ַק×× × ×× ×××Š× ××¢×× ××× ×©××€××× ×Š× ×× ××Ö·××׊עך ×€×× ×× ××¢××, ×××֞ס ××× ×עך××××Ö·× ×€×× ×××עך עק××ס××¢× ×¥ ××× ×Öž×× ×¢×š×©××€ÖŒ.
×Ö·× ×ַק×××××Ö·××Ö·××֞ך ×§×¢× ×¢× ×××× ×עך××€Ö¿× ×Ö· ס×Öž××× ×€×ַך×ךע××× × ×€×× ×Ö· ס×××. ×× ×ך××ס ×€×× ×× ×¡××Öž×š× ×€×ַך×ךע××× × ×××× ×××× ×§×¢×¡×××עך××ק , ×Öž×עך ×€×ַך××š×¢×¡×¢×š× ×¡××××× ×¢×ַך×× ××× ×š×¢×¡×€ÖŒ×¢×§× ×Š× ×× ×§×ַך××× ×Ö·×××× ×€×× ×× ××Ö·× × ××× ×× ×ך××ס ×€×× ××¢× ×¢××¢××¢× × ×××, ×€Ö¿×ַך ×××ַש׀֌×× , ××× n ××× ×× ×§×ַך××× ×Ö·×××× ×€×× ×× ×¡××Öž×š× ×©××¢××.
××× ××¢× ×€×Ö·×, ×עך ×ַק×××××Ö·××Ö·××֞ך ××Öž× ××Öž×× ×××©×¢× ×¢×š××××× × ×Ö· ×עך××××Ö·× ×€×× ×× ×× ×§×××ש×Ö·× ×€×× ×Ö·× ×¢××¢××¢× × ××× ××¢× ××Ö·× × (×× ×§×××ש×Ö·× ×עך××××Ö·×) ××× ××Ö·×× ×¢×¡ ××¢×××¢× ×Š× ×׀עק×××××× ××ַש××¢×××§× ××¢× ×עך××××Ö·×.
×× ××Ö·××ַך×××¢ ××× ×עך××€× ××× ×Ö·××ש ×××× ×Ö·××Ö·×× ××ך ×Š× ××××× ×¢××¢××¢× ×× ××× ××Ö·×××Ö·×××§× ×¢××¢××¢× ×× ×€×× ×Ö· ××Ö·× ×.
×Ö· ×××ַש׀֌×× ×€×× ×Ö·××Ö· ×Ö· ××Ö·××ַך×××¢ ×××Öž×× ××××
Utreexo
×× Utreexo ×€ÖŒ××Ö·× ×€×ך××¢××××× ×××š× Thaddeus Dryja ×××× ×¢×¡ ××¢×××¢× ×Š× ×©×Ö·×€Ö¿× ××× ×Ö·××ש ××Ö·××ַך×××¢ ×Öž× ×ך×ַס×××-סע××Ö·×€ÖŒ.
Utreexo ××× ×Ö· ×××Ö·×× ×€×× ××× ×¥ ×××× ×¢×š×
××Ö·××¢×š× ××Ö·××ש×ק×Ö·× ×¡×ך×ק××ך
×× ××Ö·××ַך×××¢ סע×× ××¢× ×¢× ×¢×š××× ×××©× ××× ×Ö· ×××Ö·×× ×€×× ×××¢×Ö·× ×××× ×¢×š× ××××עך. ××××עך ××¢× ×¢× ×֞ך××¢×š× ×××× ××××. ××¢× ×€×ַך×ךע××× × ××× ×××ס×עך×××××× ××× ×× ××¢×š×¡× ××××ש×Ö·×××Ö·× ××× ×Ö·××Ö·×× ××ך ×Š× ××××ש×××Ö·×××× ×× ×עך××ש×× × ×€×× ××××עך ×עש×ַס ×ַ׀֌עך××ש×Ö·× × ××××£ ×× ××Ö·××ַך×××¢.
×עך ×××ך ××Ö·××¢×š×§× ×Ö·× ××× × ×Ö·××¢ ××××עך ××× ×× ×××Ö·×× ××¢× ×¢× ×××¢×Ö·×, ×××עך ×××× ××× ×××ס××¢×ך××§× ××× ×Ö· ××Ö·×× ×€×× ×Š××××, ×€ÖŒ×× ×§× ××× ××¢×עך × ×Ö·××ך××¢× × ××עך ×§×¢× ×¢× ×××× ×š×¢×€ÖŒ×š×××¢× ××× ××× ×Ö· ס×Ö·××Ö·×§× ×€×× ××××ת ×€×× ×Š××××. ×ַקק×֞ך××× ×××, ק××× ×¡××× ×€×× ×××¢×עך ×§×¢× ×¢× ×××× ×ך××€ÖŒ× ××× ×××× ×¢×š× ××××עך, ××× ××× ×Ö·××¢ ק×ַסעס, ×Ö·××× × ×Ö· × ××Ö· ×¢××¢××¢× × ×š×ק×××××¢×š× ××××¡× ××××× ×××¢×× ×× ×××Öž×š×Š× × ×Öž××× ×€×× ×¡××Öž×š× ××××עך.
××××, ×× ×¡××Öž×š× ×€×ַך×ךע××× × ×€×× ×× 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()
, ×××֞ס ×× ×¢×š×§×¢× × ×× ×€×Öž×עך × ×Öž××¢ ×€Ö¿×ַך ׊×××× ××¢××¢×× ×¢××¢××¢× ××.
×€×Öž×עך () ×€Ö¿×× ×§×Š××¢
××× × ××ך × ××Š× 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
), ××ך ×§×¢× ×¢× ××Ö·×× ×עך××××Ö·× ×Ö·× ×Ö·× ×¢××¢××¢× × ××× ×Š×××¢××¢×× ×Š× ×× ××Ö·××ַך×××¢. ×Š× ××Öž× ××֞ס, ××ך ×××× ×××š× ×× ××ש ×€×× ×¢× ×עך×× ××¢× ××¢×××× ××× ××××× ××¢×עך שך×× ×Š× Merkle ס ×ך×, ×××֞ס ×××¢× ××¢×š× ×Öž× ××× ×¢× ××× ×עך××××Ö·×:
ק×Öž×עקס
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
}
}
׀֌ך×֞׊עס ×€×× ×§×š×××××× × ×Ö· ×עך××××Ö·×
×שעק ×× ×עך××××Ö·× ×€Ö¿×ַך ×Ö·× ×¢××¢××¢× ×
ק×Öž× ×ך×Öž××ך×× × ×× ×× ×§×××ש×Ö·× ×עך××××Ö·× ×€×× ×Ö·× ×¢××¢××¢× × ××××× ×ַך×Öž×€ÖŒ ×Š× × ×Öž××€×Öž××× ×× 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, ¤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 ×Š× ×§×š×Öž× ×Ö·××¢ UTXOs ×שעת ××ך ×§×¢× ×¢× ××××©× ×× UTXO-ש××¢××. ×Öž×עך, ×× ×€ÖŒ×š×Öž×××¢× ×€×× ×ך××¢×× ××× ××Öž×× ×¢×š××××Ö·×.
××Öž××ך ך××€× ×× ×××Ö·××××Ö·××֞ך × ×Öž××¢ ×××֞ס × ××Š× ×× UTXO ×ַק×××××Ö·××Ö·××֞ך ס×Öž××× (ס×Öž×××-ש××Ö·× × ×Öž××¢), ××× ×× ×××Ö·××××Ö·××֞ך ×Öž× ×Ö· ×ַק×××××Ö·××Ö·××֞ך ××× ×€×Ö·×š×¢× ×××§× (×€×× × ×Öž××¢). ×× ×¢×§××ס××¢× ×¥ ×€×× ×Š×××× ×§×××¡× ×€×× × ×Öž××× ×§×š××××¥ ×Ö· ׀֌ך×Öž×××¢× ×€Ö¿×ַך ×× ××Ö·×ך××××× × ××× ××× ×Ö· ×××× × ×¢×¥, ××××Ö·× ×¡×Öž××× × ×Öž××× ××Ö·×š×€× ×עך××××Ö·× ×€×× ×× ×¢×§××ס××¢× ×¥ ×€×× UTXOs, ×××֞ס ××¢× ×¢× ×€×ך×ך××× ××× ×ך×Ö·× ××ַקש×Ö·× ×, ×שעת ×€×× × ×Öž××× ××Öž× × ××. ×××× ×Ö·××¢ × ×¢×¥ × ×Öž××× ××Öž× × ×× ×¡××××Ö·××××× ××ַס×× ××× ××× ×Ö· ק×Öž××֞ך××Ö·× ××××× ×©××××עך ××ַש××××¢× ×Š× × ××Š× Utreexo, ××¢××Öž×× ×¡×Öž××× × ×Öž××× ×××¢× ×××× ××× ×§×¡ ××× ×עך ××× ×××¢× × ××©× ×§×¢× ×¢× ×Š× ×ַך××¢×× ××××£ ×× ×××ק×Öž×× × ×¢×¥.
×Š× ×¡×Öž××××¢ ×× ×€ÖŒ×š×Öž×××¢× ×€×× ×× ××Ö·×ך××××× × ×¡×Öž××× × ×Öž××× ××× ×× × ×¢×¥, עס ××× ×€×ך××¢××××× ×Š× ××Ö·×§×¢× ×¢× ×Ö·× × ×Öž× ×§××ַס ×€×× × ×Öž××× - ×ך×ק×. × ×ך×ק × ×Öž××¢ ××× ×Ö· ××Ö·× ×¥ × ×Öž××¢ ×××֞ס ×××× ×¡××Öž×š× ×× Utreexo ××Ö·××ַך×××¢ ××× ××Ö·××-××××£ ×עך××××Ö·× ×€Ö¿×ַך ×Ö·××¢ UTXO ×€Ö¿×× UTXO-סע×. ×ך××§× ×š×¢××¢× ×¢× × ××Ö·×¢ ××ַשעס ××× ×עך×××Ö·× ×××§× ×× ×ַק×××××Ö·××Ö·××֞ך ××× ×€ÖŒ×š×Öž××עס ×××¢× × ××Ö· ×××ַקס ×€×× ×ך×Ö·× ××ַקש×Ö·× × ×Öž× ×§×××¢×. ×Öž× ××Ö·××× ××× ×Ö·×€ÖŒ×××××× × ×× ×ַק×××××Ö·××Ö·××֞ך ××× ×€ÖŒ×š×׀ס ××× × ××©× ×Öž× ××Öž× × ×Öž× ×§×Ö·××€ÖŒ×××××ש×Ö·× ×Ö·× ××ַסע ××××£ ×Ö·××Ö· × ×Öž×××. ×ך××§× ×§×š×× ××סק ×€ÖŒ××Ö·×¥: ××Ö·×š×€Ö¿× ×Š× ××Ö·××× ×× ××× ×× ×֞ך××Ö·× ××××š× ××ַשעס, ק×Ö·××€ÖŒ×¢×š× ×Š× ××ַשעס ×€Ö¿×ַך ס×Öž××× × ×Öž×××, ××× n ××× ×× ××Ö·×× ×€×× ×× UTXO ש××¢××.
× ×¢×¥ ×ַךק×Ö·×עק×שעך
×ך××§× ××Ö·×× ×¢×¡ ××¢×××¢× ×Š× ××ס××¢×××××Ö·× ××××× ×¡×Öž××× × ×Öž××× ×Š× ×× × ×¢×¥ ×Öž× ×ש×Ö·× ××× × ×× ×××××××××š× ×€×× ××××ס××× × × ×Öž×××. ××Ö·× ×¥ × ×Öž××× ×ַך××¢×× ××× ×€×š×עך, ××ס×ך××××××× × ×ך×Ö·× ××ַקש×Ö·× × ××× ×××ַקס ׊××××©× ×××. ×ך×ק × ×Öž××× ××¢× ×¢× ×€×× × ×Öž××× ×Ö·× ×Ö·×××©× ×Ö·×× ×§×š×Öž× Utrexo ××Ö·××ַך×××¢ ××Ö·×× ××× ×Ö· ס××× ×€×× ×× ×§×××ש×Ö·× ×€ÖŒ×š×Öž××עס ×€Ö¿×ַך ×Ö·××¢ UTXO ×€Ö¿×ַך ××׊×. ×× ×ך×ק × ×Öž××¢ ××¢××× ××× × ××©× ××× ×Ö·××Ö·, ׀֌ך×××¢× ××× × ×Š× ×××× ×Ö· ×€×× × ×Öž××¢ ×€Ö¿×ַך ×Ö·××¢ ×€×× × ×Öž××× ××× ×Ö· ס×Öž××× × ×Öž××¢ ×€Ö¿×ַך ×Ö·××¢ ס×Öž××× ×Öž× ×¢×¡. ××Öž×ש ×ך××§× ×€×ַך××× ×× ×××××¢ × ×¢××××֞ךקס ׊×××Ö·××¢×, ××× ×€×ק××ש × ×֞ך ××Ö·×š×€Ö¿× ×Š× ×€×ַך××× ×× ××× ××× ×××× ×š××××× ×: ×€×× ××××ס××× × ×€×× × ×Öž××× ×Š× ×¡×Öž××× × ×Öž×××. ××֞ס ××× ××¢×××¢× ××××Ö·× ×× ×ך×Ö·× ×¡×ַק×××Öž× ×€Ö¿×֞ך××Ö·× ××ַךף × ×× ×××× ×ש××× ××ש×, ××× UTXO ׀֌ך×׀ס ×€Ö¿×ַך ס×Öž××× × ×Öž××× ×§×¢× ×¢× ×××× ××סק×ַך×××, ×Ö·××× ×§××× ×¡×Öž××× × ×Öž××¢ ×§×¢× ×¢× ×¡×××Ö·×עך×× ×ך×Öž×ק×Ö·×¡× ×ך×Ö·× ××ַקש×Ö·× × ×Š× ×Ö·××¢ × ×¢×¥ ×€ÖŒ×ַך××ס×Ö·×€ÖŒ×Ö·× ×¥ ×Öž× ×× ×Öž× ×××× ×€×× ×ך×ק × ×Öž×××.
ס×Öž×£
××ך ×עק××§× ××××£ ×× Utreexo ××Ö·××ַך×××¢ ××× ×××€ÖŒ××Ö·××¢× ×Ö·× ×××Ö·× ×€ÖŒ×š×Öž×××Ö·××××€ÖŒ ××× Rust. ××ך ×עק××§× ××××£ ×× × ×¢×¥ ×ַךק×Ö·×עק×שעך ×××֞ס ×××¢× ××Öž×× ×× ×× ×Ö·×ך××ש×Ö·× ×€×× ××Ö·××ַך×××¢-×××××š× × ×Öž×××. ×× ×××Ö·××¢ ×€×× ââס×Öž××× ×§×Ö·×ש×Ö·× ××× ×× ×ך××ס ×€×× ×× ×¡××Öž×š× ××Ö·××, ×××֞ס ××¢×€ÖŒ×¢× ×ס ××Öž××ַך×××××ק×× ××××£ ×× ××Ö·×× ×€×× ×× UTXOs ש××¢××, ×××֞ס ש××ךק ך×Ö·××ס×Ö·× ×× ××××¢×š×€×¢× ××©× ×€Ö¿×ַך ××סק ×€ÖŒ××Ö·×¥ ××× ×¡××֞ך×××ש ×€×֞ךש××¢××× × ×€Ö¿×ַך ×Ö·××Ö· × ×Öž×××. ×× ××ס×Öž×š× ××× ×× × ×Öž× × ×Öž××¢ ×€×ַךקעך ×€Ö¿×ַך ×ך×Ö·× ×¡××××× × ×€ÖŒ×š×Öž××עס, ×Öž×עך ××Öž×× ×Ö·××ךע××Ö·×××Öž× ××¢×§× ×קס (×××¢× ×××× ×עך××××Ö·× ×€ÖŒ×š×Öž××עס ×× ×¢×§××ס××¢× ×¥ ×€×× ×¢×××¢××¢ ×¢××¢××¢× ××) ××× ×§×Ö·×ש×× × ×§×¢× ×¢× ××¢××€Ö¿× ××Ö·××× ×€×ַךקעך ××× ×€ÖŒ×ַס×ק ××××Ö·×¥.
×š×¢×€Ö¿×¢×š×¢× ×Š×:
GitHub ×€×× Utreexo ׀֌ך×Öž×××Ö·××××€ÖŒ ××× ×ש×Ö·××עך Thaddeus Dryja -Utreexo: ×Ö· ××× ×Ö·××ש ××ַש-×××××š× ×ַק×××××Ö·××Ö·××֞ך ×Öž×€ÖŒ××××××¢× ×€Ö¿×ַך ×× ×××ק×Öž×× UTXO ש××¢×× ×Ö·× ×××Ö·××¢× ××××ס×ך×׊×עס ×€×× ××¢× ×ַך××ק×
×ק×ך: www.habr.com