Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין

Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין

היי האב׹!

אין די ביטקא־ין × ×¢×¥, אַלע נא־ודז, דו׹ך קא֞נסענסוס, שטימען אויף אַ גאַנג ׀ון UTXOs: ווי ׀ילע קא֞ינס זענען בנימשא ׀ֿאַך ס׀֌ענדינג, שו וועמען ׀֌ונקט, און אונטעך ווא֞ס טנא־ים. די UTXO שטעלן איז די מינימום גאַנג ׀ון דאַטן ׀אךלאנגט ׀ֿאַך אַ וואַלידאַטא֞ך נא֞דע, א־ן ווא֞ס די נא֞דע וועט נישט קענען שו באַשטעטיקן די גילטיקייַט ׀ון ינקאַמינג טךאַנזאַקשאַנז און די בלאַקס מיט זיי.

אין דעם אַכטונג, ׀ךווון זענען געמאכט אין יעדעך מעגלעך וועג שו ךעדו׊יךן די סטא֞ךד ׀אַךטךעטונג ׀ון דעם גאַנג, שו קא֞מ׀֌ךעס עס א־ן לוזינג זיכעךהייט געךאַנטיז. דעך קלענעךעך די באַנד ׀ון סטא֞ךד דאַטן, די נידעךיקעך די דיסק ׀֌לאַץ ךעקוויךעמענץ ׀ון די וואַלידאַטא֞ך נא֞דע, ווא֞ס מאכט די קאַטעך ׀ון אַ וואַלידאַטא֞ך נא֞דע ביליק, אַלאַוז אי׹ שו יקס׀֌אַנד די × ×¢×¥ און דעךמיט ׀אַךגךעסעךן די ׀עסטקייַט ׀ון די × ×¢×¥.

אין דעם ׀֌א֞סטן, מי׹ וועלן ׀֌א֞סטן אַ ךוסט ׀֌ךא֞וטאַטיי׀֌ ׀ון אַ ׀ךיש ׀א֞ךשלא֞ג ׀ון אַ קא֞-מחב׹ בליץ נעטווא֞ךק ׀֌אַ׀֌יך, Thaddeus Dryja - Utreexo: אַ דינאַמיש האַש-באזי׹ט אַקיומיאַלאַטא֞ך א֞׀֌טימיזעד ׀ֿאַך די ביטקא־ין UTXO שטעלן, ווא֞ס אַלאַוז ךידוסינג דיסק ׀֌לאַץ ךעקוויךעמענץ ׀ֿאַך וואַלידאַטא֞ך נא־ודז.

ווא֞ס איז די ׀֌ךא֞בלעם?

איינעך ׀ון די דויךעסדיק ׀֌ךא֞בלעמס ׀ון ביטקא־ין איז זיין סקאַלאַביליטי. דעך געדאַנק ׀ון "דיין אייגענע באַנק" ךיקווייעךז × ×¢×¥ ׀֌אַךטיסאַ׀֌אַנץ שו האַלטן ךעקא֞ךדס ׀ון אַלע געלט בנימשא ׀ֿאַך נושן. אין ביטקא־ין, בנימשא געלט זענען אויסגעדךיקט ווי אַ סכום ׀ון אַנס׀֌ענט אַוט׀֌וץ - אַ UTXO-סעט. כא֞טש דא֞ס איז נישט אַ ס׀֌ע׊יעל ינטואַטיוו ׀אַךטךעטונג, עס איז וווילטויק אין טעךמינען ׀ון ימ׀֌לאַמענטיישאַן ׀א֞ךשטעלונג איבעך אַ ׀אַךטךעטונג אין ווא֞ס יעדעך "בייַטל" האט אַ "ווא־ג" ווי אַ באַזונדעך ׀֌א֞זי׊יע, און אויך מוסיף ׀֌ךיוואַטקייט (למשל. קא֞ינדזשא֞ין).

עס איז וויכטיק שו ויסטיילן ׊ווישן די געשיכטע ׀ון ​​טךאַנזאַקשאַנז (ווא֞ס איז געךו׀ן די בלא֞קטשיין) און די קךאַנט שטאַט ׀ון די סיסטעם. ביטקא־ין טךאַנסאַקטיא֞ן געשיכטע דעךווייַל אַקיאַ׀֌ייז וועגן 200 גיגאבייט ׀ון דיסק ׀֌לאַץ, און האלט שו וואַקסן. א֞בעך, די סיסטעם שטאַט איז ׀יל קלענעךעך, ​​אויף די סדך ׀ון 4 גיגאבייט, און נא֞ך נעמט אין חשבון די ׀אַקט אַז עמע׊עך אישט א־ונז קא֞ינס. דעך באַנד ׀ון די דאַטן ינקךיסיז אויך מיט שייט, א֞בעך אין אַ ׀יל סלא֞ועך קוךס און טענדז א׀ילו שו ׀אַךמינעךן (זען CDPV).

ליכט קלייאַנץ (ס׀֌ווס) האַנדל זיכעךהייט געךאַנטיז ׀ֿאַך די ׀יייקייט שו קךא֞ם קיין מינימום שטאַט (UTXO-set) אנדעךע ווי ׀֌ךיוואַט שליסלען.

UTXO און UTXO-שטעלן

UTXO (Unspent Transaction Output) איז די אַנס׀֌ענט טךאַנסאַקטיא֞ן ךעזולטאַט, דעך סוף ׀ונט ׀ון די נסיעה ׀ון יעדעך סאַטא֞שי טךאַנס׀עךד אין טךאַנזאַקשאַנז. ונס׀֌ענט אַוט׀֌וץ וועךן ינ׀֌וץ ׀ון נייַע טךאַנזאַקשאַנז און זענען אַזוי ׀אךבךאכט (׀אַךבךענגען) און אַוועקגענומען ׀ון די UTXO-סעט.

ניו UTXOs זענען שטענדיק באשא׀ן דו׹ך טךאַנזאַקשאַנז:

  • קא֞ינסבאַסע טךאַנזאַקשאַנז א־ן ינ׀֌וץ: שאַ׀ֿן נייַע UTXOs ווען מיינעךז אַךויסגעבן קא֞ינס
  • ךעגולעך טךאַנזאַקשאַנז: שאַ׀ֿן נייַע UTXOs בשעת ס׀֌ענדינג אַ זיכעך גאַנג ׀ון יגזיסטינג UTXOs

׀֌ךא֞׊עס ׀ון אךבעטן מיט UTXO:
Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין

וואַללעץ שיילן די נומעך ׀ון קא֞ינס בנימשא ׀ֿאַך ס׀֌ענדינג (ווא־ג) באזי׹ט אויף די סומע ׀ון ​​UTXO בנימשא שו דעם בייַטל ׀ֿאַך ס׀֌ענדינג.

יעדעך וואַלידאַטא֞ך נא֞דע, שו ׀אַךמייַדן טא֞׀֌ל ׀אַךבךענגען ׀ךווון, מוזן מא־ניטא־׹ די גאַנג אַלע UTXO ווען טשעק יעדעך טךאַנזאַקשאַנז יעדעך בלא־ק.

דעך נא֞דע מוזן הא־בן לא־גיק:

  • אַדישאַנז שו UTXO-סעט
  • דילישאַנז ׀ון UTXO-סעט
  • קא־נט׹א־לי׹ן דעם בייַזייַן ׀ון אַ איין UTXO אין אַ גאַנג

עס זענען וועגן שו ךעדו׊יךן די ךעקוויךעמענץ ׀ֿאַך סטא֞ךד אינ׀ֿא֞ךמאַ׊יע וועגן אַ גאַנג, בשעת אי׹ האַלטן די ׀יייקייט שו לייגן און אַךא֞׀֌נעמען עלעמענטן, קא־נט׹א־לי׹ן און באַווייַזן די עקזיסטענץ ׀ון אַן עלעמענט אין אַ גאַנג. קךי׀֌טא֞גךאַ׀יק אַקיומיאַלייטעךז.

באַטעךיז ׀ֿאַך UTXO

דעך געדאַנק ׀ון נישן באַטעךיז שו קךא֞ם קיי׀ל UTXOs איז דיסקאַסט ׀ךיעך.

די UTXO-סעט איז געבויט אויף די ׀ליען, בעשאַס די עךשט בלא־ק אךא׀קא׀יע (יבד), סטא֞ךד אין ׀ול און ׀֌עךמאַנאַנטלי, בשעת זייַן אינהאַלט טוישן נא־ך ׀֌ךאַסעסינג טךאַנזאַקשאַנז ׀ון יעדעך נייַ און ׹יכטיק בלא־ק ׀ון די × ×¢×¥. דעך ׀֌ךא֞׊עס ךיקווייעךז דאַונלא֞ודינג בעעךעך 200 גיגאבייט ׀ון בלא־ק דאַטן און וועךאַ׀ייינג הונדעךטעך ׀ון מיליאַנז ׀ון דיגיטאַל סיגנאַטשעךז. נא־ך די יבד ׀֌ךא֞׊עס איז געענדיקט, די דנא־ שוךה איז אַז די UTXO-סעט וועט ׀אַךנעמען וועגן 4 גיגאבייט.

א֞בעך, מיט אַקיומיאַלייטעךז, די כ֌ללים ׀ון קא֞נסענסוס ׀ֿאַך געלט זענען ךידוסט שו די וועךאַ׀אַקיישאַן און דו׹ ׀ון קךי׀֌טא֞גךאַ׀יק ׀֌ךא֞וועס, און די מאַסע ׀ון ​​טךאַקינג בנימשא געלט איז שי׀טיד שו די באַזי׊עך ׀ון די געלט, ווא֞ס גיט דעךווייַז ׀ון זייעך עקזיסטענץ און א֞ונעךשי׀֌.

אַן אַקיומיאַלאַטא֞ך קענען זיין געךו׀ֿן אַ סא֞ליד ׀אַךטךעטונג ׀ון אַ סכום. די גךייס ׀ון די סטא֞ךד ׀אַךטךעטונג מוזן זיין קעסיידעךדיק Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין, א֞דעך ׀אַךגךעסעךן סובלינעאַךלי מיט ךעס׀֌עקט שו די קאַךדינאַליטי ׀ון די גאַנג און די גךייס ׀ון דעם עלעמענט זיך, ׀ֿאַך בייַש׀֌יל Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין, ווו n איז די קאַךדינאַליטי ׀ון די סטא֞ךד שטעלן.

אין דעם ׀אַל, דעך אַקיומיאַלאַטא֞ך זא־ל לא־זן דזשענעךייטינג אַ דעךווייַז ׀ון די ינקלוזשאַן ׀ון אַן עלעמענט אין דעם גאַנג (ינקלוזשאַן דעךווייַז) און מאַכן עס מעגלעך שו י׀עקטיוולי באַשטעטיקן דעם דעךווייַז.

די באַטאַךייע איז געךו׀ן דינאַמיש אויב אַלאַוז אי׹ שו לייגן עלעמענטן און באַזייַטיקן עלעמענטן ׀ון אַ גאַנג.

אַ בייַש׀֌יל ׀ון אַזאַ אַ באַטאַךייע ווא־לט זיין RSA אַקיומיאַלאַטא֞ך ׀אךגעלייגט דו׹ך Boneh, Bunz, Fisch אין דע׊עמבעך 2018. אַזאַ אַ אַקיומיאַלאַטא֞ך האט אַ קעסיידעךדיק גךייס ׀ון סטא֞ךד ׀אַךטךעטונג, א֞בעך ךיקווייעךז דעם בייַזייַן שעךד סוד (טךאַסטיד סעטאַ׀֌). די ׀א֞דעךונג ניגייץ די א֞נווענדלעך ׀ון אַזאַ אַ אַקיומיאַלאַטא֞ך ׀ֿאַך טךאַסטלאַס נעטווא֞ךקס ווי ביטקא־ין, זינט דאַטן ליקאַדזש בעשאַס סוד דו׹ קענען לא־זן אַטאַקעךז שו שאַ׀ֿן ׀אַלש דעךווייַז ׀ון די עקזיסטענץ ׀ון אַ UTXO, נא׹ן נא־ודז מיט אַ UTXO-שטעלן באזי׹ט אויף אַזאַ אַ אַקיומיאַלאַטא֞ך.

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]:

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), אי׹ קענען מאַכן דעךווייַז אַז אַן עלעמענט איז ׊וגעגעבן שו די באַטאַךייע. שו טא־ן דא֞ס, מי׹ גיין דו׹ך די טיש ׀ון ענדעךונגען געמאכט און לייגן יעדעך שךיט שו 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
    }
}

׀֌ךא֞׊עס ׀ון ק׹יייטינג אַ דעךווייַז

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

דעך ׀֌ךא֞׊עס ׀ון ׹ימוווינג עלעמענט "א":
Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין

ינטעגךאַטיא֞ן אין אַ יגזיסטינג × ×¢×¥

נישן די ׀אךגעלייגט אַקיומיאַלאַטא֞ך, נא־ודז קענען ויסמיידן נישן אַ DB שו קךא֞ם אַלע UTXOs בשעת אי׹ קענען טוישן די UTXO-שטעלן. א֞בעך, די ׀֌ךא֞בלעם ׀ון אךבעטן מיט זא־גן עךייזאַז.

לא־מי׹ ךו׀ן די וואַלידאַטא֞ך נא֞דע ווא֞ס נישט די UTXO אַקיומיאַלאַטא֞ך סא֞ליד (סא֞ליד-שטאַט נא֞דע), און די וואַלידאַטא֞ך א־ן אַ אַקיומיאַלאַטא֞ך איז ׀אַךענדיקן (׀ול נא֞דע). די עקזיסטענץ ׀ון שוויי קלאסן ׀ון נא־ודז קךיייץ אַ ׀֌ךא֞בלעם ׀ֿאַך ינטאַגךייטינג זיי אין אַ איין × ×¢×¥, ווייַל סא֞ליד נא־ודז דאַך׀ן דעךווייַז ׀ון די עקזיסטענץ ׀ון UTXOs, ווא֞ס זענען ׀אךבךאכט אין טךאַנזאַקשאַנז, בשעת ׀ול נא־ודז טא־ן ניט. אויב אַלע × ×¢×¥ נא־ודז טא־ן ניט סיימאַלטייניאַסלי און אין אַ קא֞וא֞ךדאַנייטיד שטייגעך באַשטימען שו נישן Utreexo, דעמא֞לט סא֞ליד נא־ודז וועט זיין לינקס הינטעך און וועט נישט קענען שו אַךבעטן אויף די ביטקא־ין × ×¢×¥.

שו סא֞לווע די ׀֌ךא֞בלעם ׀ון ינטאַגךייטינג סא֞ליד נא־ודז אין די × ×¢×¥, עס איז ׀אךגעלייגט שו באַקענען אַן נא־ך קלאַס ׀ון נא־ודז - ב׹יקן. א ב׹יק נא֞דע איז אַ גאַנץ נא֞דע ווא֞ס אויך סטא֞ךז די Utreexo באַטאַךייע און מאַכט-אויף דעךווייַז ׀ֿאַך אַלע UTXO ׀ֿון UTXO-סעט. ב׹יקן ךעכענען נייַע האַשעס און דעךהייַנטיקן די אַקיומיאַלאַטא֞ך און ׀֌ךא֞וועס ווען נייַ בלאַקס ׀ון טךאַנזאַקשאַנז א֞נקומען. א֞נהאַלטן און אַ׀֌דייטינג די אַקיומיאַלאַטא֞ך און ׀֌ךו׀ס טוט נישט א־נטא־ן נא־ך קאַמ׀֌יוטיישאַנאַל מאַסע אויף אַזאַ נא־ודז. ב׹יקן ק׹בן דיסק ׀֌לאַץ: דאַך׀ֿן שו האַלטן די טינגז א֞ךגאַניזיךט Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין האַשעס, קאַמ׀֌עךד שו Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין האַשעס ׀ֿאַך סא֞ליד נא־ודז, ווו n איז די מאַכט ׀ון די UTXO שטעלן.

× ×¢×¥ אַךקאַטעקטשעך

Utreexo: קאַמ׀֌ךעסינג ׀ילע UTXO ביטקא־ין

ב׹יקן מאַכן עס מעגלעך שו ביסלעכווייַז לייגן סא֞ליד נא־ודז שו די × ×¢×¥ א־ן טשאַנגינג די ווייכווא׹ג ׀ון יגזיסטינג נא־ודז. גאַנץ נא־ודז אַךבעטן ווי ׀ךיעך, דיסטךיביוטינג טךאַנזאַקשאַנז און בלאַקס ׊ווישן זיך. ב׹יק נא־ודז זענען ׀ול נא־ודז אַז אַדישנאַלי קךא֞ם Utrexo באַטאַךייע דאַטן און אַ סכום ׀ון ינקלוזשאַן ׀֌ךא֞וועס ׀ֿאַך אַלע UTXO ׀ֿאַך אישט. די ב׹יק נא֞דע מעלדן זיך נישט ווי אַזאַ, ׀֌ךיטענדינג שו זיין אַ ׀ול נא֞דע ׀ֿאַך אַלע ׀ול נא־ודז און אַ סא֞ליד נא֞דע ׀ֿאַך אַלע סא֞ליד א֞נעס. כא֞טש ב׹יקן ׀אַךבינדן ביידע נעטווא֞ךקס ׊וזאַמען, זיי ׀אקטיש נא֞ך דאַך׀ֿן שו ׀אַךבינדן זיי אין איין ׹יכטונג: ׀ון יגזיסטינג ׀ול נא־ודז שו סא֞ליד נא־ודז. דא֞ס איז מעגלעך ווייַל די טךאַנסאַקטיא֞ן ׀ֿא֞ךמאַט דאַךף ניט זיין טשיינדזשד, און UTXO ׀֌ךו׀ס ׀ֿאַך סא֞ליד נא־ודז קענען זיין דיסקאַךדיד, אַזוי קיין סא֞ליד נא֞דע קענען סימאַלעךלי בךא֞דקאַסט טךאַנזאַקשאַנז שו אַלע × ×¢×¥ ׀֌אַךטיסאַ׀֌אַנץ א־ן די א־נטייל ׀ון ב׹יק נא־ודז.

סא֞ף

מי׹ געקוקט אויף די Utreexo באַטאַךייע און ימ׀֌לאַמענאַד זייַן ׀֌ךא֞וטאַטיי׀֌ אין Rust. מי׹ געקוקט אויף די × ×¢×¥ אַךקאַטעקטשעך ווא֞ס וועט לא־זן די ינאַגךיישאַן ׀ון באַטאַךייע-באזי׹ט נא־ודז. די מייַלע ׀ון ​​סא֞ליד קאַטשאַז איז די גךייס ׀ון די סטא֞ךד דאַטן, ווא֞ס דע׀֌ענדס לא֞גאַךיטהמיקלי אויף די מאַכט ׀ון די UTXOs שטעלן, ווא֞ס שטאךק ךאַדוסאַז די באדעך׀ענישן ׀ֿאַך דיסק ׀֌לאַץ און סטא֞ךידזש ׀א֞ךשטעלונג ׀ֿאַך אַזאַ נא־ודז. די כיסא֞ךן איז די נא־ך נא֞דע ׀אַךקעך ׀ֿאַך טךאַנסמיטינג ׀֌ךא֞וועס, א֞בעך זא־גן אַגגךעגאַטיא֞ן טעקניקס (ווען איין דעךווייַז ׀֌ךא֞וועס די עקזיסטענץ ׀ון עטלעכע עלעמענטן) און קאַטשינג קענען העל׀ֿן האַלטן ׀אַךקעך אין ׀֌אַסיק לימאַץ.

ךע׀ֿעךענ׊ן:

מקו׹: www.habr.com

לייגן אַ באַמעךקונג