áá ááĽá!
á Bitcoin á ááłá¨áá¨áĽ ááľáĽ ᣠááá á áááὠᣠá áľáááᾠᣠá UTXOs áľáĽáľáĽ áá ááľááá-áá áŤá á áłáá˛áá˝ áá᪠áĽáá°ááá ᣠá áľááá ááá áĽá á áá áááłáá˝á˘ á¨UTXO áľáĽáľáĽ áá á¨ááá ááľááá ááááľ á¨ááŤáľáááá áá á°áá á¨ááἠáľáĽáľáĽ ááᣠáŤááá ááľááá ááááľ á¨áᢠááĽááśá˝á áĽá á¨áŤááľá áĽááŽá˝ áľááááááľ áá¨ááἠá áá˝ááá˘
á áá á¨ááľ, á¨áá á áľáĽáľáĽ á¨á°á¨áḠáááá áááááľ, á¨á°á áááľ ááľáľááá˝á áłáŤáĄ ááááá á ááá ááááśá˝ áá¨áŤáá˝ áĽá¨á°á°á¨á áá. á ááľá°á áá á áŤáá á¨á°á¨áḠáá¨á áá áᣠá¨á á¨ááá ááľááá ááááľ áá á°áá á¨á˛áľá áŚáł ááľáááśá˝ áá á°á ááᣠáá á á á¨ááá ááľááá ááááľ ááľááá ááŤá˝ áŤá°ááááᣠá ááłá¨ áá¨áĄá áááľááľ áĽá á áá á á¨á ááłá¨ áá¨áĄ áá¨áááľ áá¨ááŤáá˘
á áá
ááĄá á˝áá áá á á
áᥠá¨á ááľ á°áŁáŁáŞ á°áŤá˛ á¨áá¨á ááłáĽ á¨áááľ ááłá áĽáááĽáááá˘
áŤáşá ááŽáĽáá?
á¨Bitcoin á¨ááááľ á˝ááŽá˝ á ááą á¨áá á á á
á ááᢠ"á¨áŤáľá
áŁáá" á¨ááá ááłáĽ á¨á ááłá¨ áá¨áĽ á°áłáłááá˝ áááá á¨áááἠáľáááá˝ áá áááááľ ááááĽáľ áĽáá˛áá áá áááᢠá Bitcoin ááľáĽ, á¨ááá ááááŚá˝ áŤáá°á áááŁá¸á áá¤áśá˝ áľáĽáľáĽ - UTXO-set ááááá. ááá áĽááłá áá
á á°áá ááłáá
á¨áá˝á áááá áŁááááᣠáĽáŤááłááą âá¨áŞáľ áŚááłâ áĽáá° á¨á°áᨠáá¤áľ âáááâ áŤáá áĽá áĽáá˛áá áááááľá á áá¨ááá áľ á¨áááá á áááá áá á áá áá (áááłá
á¨ááĽááśá˝á áłáŞá (áĽáááźáá á°áĽá á¨áá áŤá) áĽá á¨áľáááąá áá áłá áááł ááá¨áľ á áľááá áá. ᨠBitcoin ááĽááľ áłáŞá á á áá áá 200 áᢠá¨á˛áľá áŚáłá áááá áĽá áá°áá ááĽááᢠááá áĽáá á¨áľáááą áááł á 4 áᢠá á°á á°á¨á°á á áŁá áľáá˝ áá, áĽá á ááľ á°á á á áá áá áłáá˛áá˝á á¨ááŤáá áĽáááł áĽáť áááľ ááľáĽ áŤáľááŁá. á¨áá áá¨á áá á á¨áá áá° áá áĽá¨á¨áᨠáááłá, ááá áá á áŁá áááá áĽá á ááłáá´á á¨ááááľ á ááá፠á áá (CDPV áááá¨áą).
á¨áá áááá˝ áá ááá áá á°á áááł (UTXO-set) ááá¨áá¸áľ ááá á°áá áá˝ (SPVs) á¨áááľ á°á áááľ ááľáľááá˝á˘
UTXO áĽá UTXO-áľáĽáľáĽ
UTXO (áŤáá°á¨áá ááĽááľ áá ááľ) áŤááá á¨ááĽááľ áá ááľ ááᣠá ááĽááśá˝ ááľáĽ á¨á°áááá á¨áĽáŤááłááą áłáśáş á¨áá á¨áá¨á¨áť ááĽáĽ ááᢠáŤáá°á¨áá áá¤áśá˝ á¨á áłá˛áľ ááĽááśá˝ ááĽááśá˝ áááá áĽá á áá á á᪠(áá) áĽá ᨠUTXO-áľáĽáľáĽ ááááłáá˘
á á˛áľ UTXOáá˝ áááá á¨ááá áŠáľ á ááĽááśá˝ áááĄ-
- áŤá ááĽááśá˝ á¨coinbase ááĽááśá˝áĄ- áááľá á ááŞáá˝ áłáá˛á á˛áŤáᥠá á˛áľ UTXO ááá áŠ
- áá°á á ááĽááśá˝áĄ á¨á°áá°á á¨UTXO áľáĽáľáŚá˝á á ááŤááĄá áľ áá á á˛áľ UTXO ááá áŠ
ᨠUTXO áá á¨ááĽáŤáľ áá°áľáĄ-
á¨áŞáľ áŚááłáá˝ ááá á¨áŞáľ áŚááł áŁáá ᨠUTXO áá á áá á áááľá¨áľ áá᪠(ááá) áŤááľá á¨áłáá˛áá˝ áĽááľ áááĽáŤáá˘
áĽáŤááłááą á á¨ááá ááľááá ááááľáŁ áľáἠá᪠áá¨áŤáá˝á ááá¨áá¨áᣠáľáĽáľáĄá áá¨áłá°á á áá áľá˘ вŃĐľŃ UTXO á˛áá°á˝ áĽáŤááłááą ááĽááśá˝ áĽáŤááłááłá¸á á ááľ
ááľááá ááááľ ááá ááá¨á áááŁááĄ-
- áá° UTXO-áľáĽáľáĽ á°á¨ááŞáá˝
- á¨UTXO-áľáĽáľáĽ áľá¨ááá˝
- á á ááľ áľáĽáľáĽ ááľáĽ áá á UTXO áááŠá áá¨áááĽ
á¤ááááśá˝á á¨áá¨áá áĽá á¨ááľáááľ á˝ááłá á áá á á
áľá áľáĽáľáĽ á¨á°á¨áḠáá¨á áááááľ á¨ááŤáľááááľá ááľáááśá˝ á¨ááááľáŁá¸á ááááśá˝ á áᣠá á ááľ áľáĽáľáĽ ááľáĽ áŤááá ááĽá¨ ááá áŤá¨ááᥠáĽá áŤá¨áááĄá˘
áŁáľáŞáá˝ á UTXO
áĽá UTXOáá˝á ááá¨áá¸áľ áŁáľáŞáá˝á á¨áá áá ááłáĽ
ᨠUTXO-áľáĽáľáĽ á á á¨áŤ áá á¨á°áááŁá á áááá፠á¨ááá ááá¨á (IBD) áá áá á áá áĽá á ááááľ á¨á°á¨áḠá˛áá áááą á¨áĽáŤááłááą á á˛áľ áĽá áľáááá á¨á ááłá¨ áá¨áĽ áĽááł ááĽááśá˝á áŤáľáŹá° á áá áááááŁáᢠáá áá°áľ á áááľ 200 áᢠá¨ááá ááἠááá¨áľ áĽá á ááś áááŽáá˝ á¨ááá አá˛ááłá ááááá˝á áá¨ááἠáááááᢠᨠIBD áá°áą á¨á°á ááá á áá, á¨áłá˝áá ááľáá ᨠUTXO-áľáĽáľáĽ 4 áᢠáá°á áááá.
ááá áĽáá, accumulators áá, áááἠáááááľ áľááááľ á°ááŚá˝ áá° áá¨áá፠áĽá ááľá ፠áá¨áá፠áľáááľ áááˇá áá¸á, áĽá á¨áá¨áłá°áŤ á¨ááá áááἠáŤááá á¸áá áŤáá¸áá áááá áĽá á¨áŁáá¤áľááľ áá¨áá፠áá°áŁá áĽáááŤá áááἠáŁáá¤áľ, ááŻá.
á ááľ ááá˝áľ á¨á ááľ áľáĽáľáĽ áááá á°áĽá áá ፠áá˝ááᢠá¨á°á¨áḠáááá áá á áá ááá á áá ᾠᣠááá á¨áľáĽáľáĄ áŤáá˛ááááľ áĽá á¨áŤáą á¨ááĽá áá á áá á á°áŤáŤá á áááľ-ááá áá¨áአᣠáááłá , n á¨á°á¨áḠáľáĽáľáĽ áŤáá˛ááᲠá¨áľ áá.
á áá áááł, á°áĽáłá˘á á áľáĽáľáĄ ááľáĽ áŤááá ááĽá¨ ááá (á¨ááŤá°áľ áá¨áááŤ) ááŤá°áľ áá¨áá፠áĽáá˛áŤááá ááááľ áĽá áá áá áá¨áá፠á áĽááľ áá¨ááἠáĽáá˛á˝á ááľá¨á á áá áľá˘
áŁáľáŞá á°á ááˇá á°áááá á¤ááááśá˝á ááá¨áá áĽá ááĽá¨ áááŽá˝á á¨áľáĽáľáĽ áááľáááľ á¨ááá°á˘
á¨áá
á áááľ áŁáľáŞ ááłá áááá
áŠáľáŹááś
á áłáľá¨áľ áľáŞá á¨áá¨á á á¨Utreexo ááľá áááá á áŤáľá˝áá á°áááá á¨áá áŤáá፠áŤá á¨áłáá-áááá.
Utreexo áášá á¨áááľáŽá˝ á°á ááá˘
á¨áŁáľáŞ á ááááŽá á ááá á
á¨áŁáľáŞ á´áá˝ á°áľáá á¨áá áááľáŽá˝ ááá˝ áŁáá áľ áŤáŤ ááľáĽ á°á°ááľá¨ááᢠááá˝ á á¨ááł áłáááá. áá áááá á áŁá ááľáá áá á°ááá§á áĽá á áŁáľáŞá áá á áá°áŠ áľáŤáá˝ áá áľ á¨ááá˝á áá á°áľ áĽáá˛ááá¨áą áŤáľá˝áááłá.
á°áŤá˛á á áŤáŤ ááľáĽ áŤááľ ááá˝ á áá á°áľáá áľááá áááłá¸á á áááľ ááá áĽáá°áááá áá ááááá á¨á°ááĽáŽ ááĽá áĽáá° áááľ áááá˝ áľáá ááá¨á áĽáá°áá˝áá áááżáᢠá áá áá á¨áľ ááááá á¨á á áá˝ áľáĽáľáĽ á áááľáŽá˝ ááá˝ ááá°áĽ áá˝áá, áĽá á ááá áááłáá˝, á á˛áľ ááĽá¨ ááá áá¨áá áĽáááľá áá ááá áľá á¨á°á¨ááš ááá˝ áĽá á áááá˝ áĽáť.
áľááá ᣠá¨á°á¨áḠá¨Utreexo accumulator áááá á¨áľá ááśá˝ ( 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()
ááááľ á¨á°á°áĄ á áŤááľ á¨ááá
ááľááá ááááľá á¨ááŤáá
á˘
á¨ááá () á°ááŁá
á¨áááá ááá˝á áĽá¨á°á ááá áľááá á¨áááąá á áááá˝ ááá á ááľ ááľááá ááááľ á˛áá á¨ááášá ááśá˝ áááŁá á፠áá˝ áŤá¨ááťáá˘
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[..])
}
á°áŤá˛á á áťáááľ áĄáŞáááľáŁ áá¨á-á ááá ááŠáŁ á Რáťáá áĽá á´áŁáľá˛á ááá á¨á°ááášáľá áĽááśá˝ ááá¨áá¨á áĽ.á¤.á .
ááĽá¨ áááŽášá áá° áá áŤáááŤá á˛á¨áአᣠá¨áľáááš áľáá á áŤááľ áĽáá°á°áá¨áŠ áá¨áłá°á áŤáľáááááłáᢠááá¨ááŠáľ áĽáŤááłááą ááĽá¨ ááá á¨áľá á áŁáá˝á á¨ááá¨á ááááľá á áá¨á°áᣠá áá á¨áĽááá ááĽá¨ áááŽá˝ ááá áá¨áá፠ááááŁáľ áá˝ááá˘
áááŚášá á˛áŤáá áá¨áłá°á
á¨á°á°á¨ááľá áááŚá˝ ááá¨áłá°á, ááá
áŠá áĽááá
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
), á ááľ á¤ááááľ áá° áŁáľáŞá áá¨ááŠá áá¨áá፠ááá á áá˝áá. áá
áá áááľá¨á á á°á°á¨ááľ áááŚá˝ á°áá á¨áĽ ááľáĽ áĽááááá áĽá áĽáŤááłááąá áĽááá áá° áááá ááááľ áĽáá¨ááŤáá ᣠáá
á á ááá á áĽáá° áá¨áá፠áááá á˘
áŽáľ
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
}
}
ááľá¨áá á¨ááá á áá°áľ
áá ááľ á¤ááááľ áá¨áááŤáá á ááá°á˝ áá
á¨á ááľá ááĽá¨ ááá ááŤá°áľ áá¨áá፠áá° ááŁá áľáá á áŤá áĽáľáŞáŤá፠áľá¨áľ á¨ááááá ááááľ ááá¨á°á áááááĄ
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;
}
}
á¤ááááąá á¨ááľáááľ áá°áľ;
áá° ááŁá á ááłá¨ áá¨áĽ áá á°áľ
á¨áłáá°áá accumulator á áá áá, á ááá UTXO-áľáĽáľáĽ ááá¨á áĽá¨áťá áá UTXOs ááá¨áá¸áľ á áááá˝ á˛á˘ á¨áá áá ááá ἠáá˝áá. ááá áá á ááľá¨á á¨ááĽáŤáľ á˝áá ááá áŤáá˘
ᨠUTXO á á¨áá¸á á¨áá áááá á á¨ááá ááľ áĽááĽáŤ á¨áłáá (áŽááááľ-áááľ ááľááá ááááľ)ᣠáĽá á á¨ááá áŤáá á¨áḠááᢠá°á ááá (áá á áá). áááľ á¨á áááá˝ ááá ááአáá° áá á á ááłá¨áá¨áĽ áááááľ á˝áá áááĽáŤá ᣠááááŤáąá á¨áłáá á áááá˝ áá á áááá˝ á áŤá°ááá ᣠá ááĽááśá˝ ááľáĽ á¨ááá UTXOs áááŤá¸áá á¨ááŤá¨ááᥠáá¸áᢠááá á¨á ááłá¨ áá¨áĽ ááśá˝ á á ááľ áá áĽá á á°ááá ááአáá° áŠáľáŹááś áŤááá¨áŠáŁ á¨áłáá ááśá˝ áá° áá áááŤá áĽá á Bitcoin á ááłá¨ áá¨áĽ áá ááĽáŤáľ á áá˝ááá˘
á¨áłáá ááśá˝á áá° á ááłá¨ áá¨áĄ á¨ááááľ á˝áá ááááłáľ á°á¨á᪠á¨á áááá˝á ááá áááľá°ááá ááá¨áŤá - áľááľáŽá˝. á¨áľááľá ááľááá ááááľ áá ááľááá ááááľ á˛áá á¨Utreexo áŁáľáŞ áĽá á¨ááĽáŤáľ áá¨áááŤá á¨ááŤá¨áá˝ ááᢠвŃĐľŃ UTXO ᨠUTXO-áľáĽáľáĽ. áľááľáŽá˝ á á˛áľ áá˝ áŤá°á áĽá á á˛áľ á¨ááĽááśá˝ áĽááŽá˝ á˛áᥠááá˝áľ áĽá áá¨áááŤáá˝á áŤáááᢠáá áŤáááŤáá áĽá áá¨áááŤáá˝á ááá¨áľ áĽá áááá á áĽáá°áá áŤá á áááá˝ áá á°á¨á᪠á¨ááłáĽ áááľ á ááŤááᢠáľááľáŽá˝ á¨á˛áľá áŚáłá áá ááłáᥠáááŽá˝á áá°áŤááľ áŤáľáááá hashes, áá á˛ááťá¸á hashes á á¨áłáá á áááá˝, á¨áľ n ᨠUTXO áľáĽáľáĽ ááá áá.
á¨á ááłá¨ áá¨áĽ á ááá´áá¸á
áľááľáŽá˝ á¨ááŁá á áááá˝á áśááľáá áłáááአááľ á ááľ á¨áłáá ááśá˝á áá° á ááłá¨ áá¨áĄ ááá¨áá áŤáľá˝ááᢠáá á áááá˝ áá áĽáá°á ááą áá°áŤáᣠááĽááśá˝á áĽá áĽááŽá˝á á áŤáłá¸á ááŤá¨á áŤá°áŤáŤáᢠá¨áľááľá ááśá˝ á á°á¨á᪠á¨Utreexo áŁáľáŞ áá¨áá á¨ááŤá¨ááš áĽá á¨ááŤá°áľ áá¨áááŤáá˝ áľáĽáľáĽ áá¸áᢠвŃĐľŃ UTXO áá ááᢠá¨áľááľáŠ ááľááá ááááľ áĽáŤáąá áĽáá°á፠á áŤáľá°ááá áᣠáááá áá á áááá˝ áá ááľááá ááááľ áĽá áááá á¨áłáá ááľááá ááááľ ááľááᢠááá áĽááłá áľááľáŽá˝ áááąáá ááľáááŽá˝ á ááľ áá á¨ááŤááá á˘áááᣠáĽáááąá á á ááľ á á áŁáŤ áĽáť áááááľ á ááŁá¸áᥠá¨ááŁá áá ááśá˝ áĽáľá¨ á¨áłáá á áááá˝á˘ áá ááá á¨áťáá á¨ááĽááąá ááááľ ááá¨á áľáááŤáľááá áĽá ᨠUTXO á¨áłáá ááśá˝ áá¨áááŤáá˝ ááááą áľááá˝á ááááá á¨áłáá ááľááá ááááľ áľááľá ááśá˝ áłááłá°á áááá á¨ááľááá á°áłáłááá˝ ááĽááśá˝á ááľá°ááá áá˝ááá˘
áá°áá°ááŤ
ᨠUtreexo áŁáľáŞá á°áááá°áá áĽá ááŽáśáłááá á áŠáľáľ ááľáĽ á°ááŁáŤá áĽáá°ááááᢠá áŁáľáŞ áá á¨á°áá°á¨áą ááśá˝á áááááľ á¨ááŤáľá˝á á¨ááľááá á ááá´áá¸áá á°áááá°ááᢠá¨áłáá ááŤáŁáá˝ áĽá á á¨á°á¨áḠáá¨á áá á áá, áá á á áááŞáá á UTXOs áľáĽáľáĽ ááá áá á¨á°áá°á¨á° áá, áá á áá˛áľá áŚáł áĽá ááĽáá°áá ááááśáš á áááá˝ á¨áá¨ááť á áááá ááľáááśá˝á á áĽá á ááááłá. ááłáą ááľá¨ááá˝á áááľá°ááá á°á¨á᪠á¨ááľááá ááááľ áľáŤáá ááᣠááá áá á¨ááľá¨á áá°áŁá°á˘áŤ á´áááŽá˝ (á ááľ ááľá¨á á¨á ááŤáł ááĽá¨ áááŽá˝ áááŤá¸áá á˛áŤá¨áááĽ) áĽá áá¸á፠áľáŤáá á°ááŁáááľ áŁáá áá°áĽ ááľáĽ áááá¨áľ áá¨áłáá˘
ááŁááťáá˝:
GitHub ᨠUtreexo ááŽáśáłáá á áŠáľáľ ááľáĽ áłá´ááľ áľáŞá -UtreexoᥠáBitcoin UTXO áľáĽáľáĽ á¨á°ááťá¸ á°áááá áá˝ áá á¨á°áá°á¨á° ááá˝áľ á¨á˝áá á¨áłáá ááłááá˝
ááá: hab.com