ãããããã«ïŒ
ãããã³ã€ã³ãããã¯ãŒã¯ã§ã¯ããã¹ãŠã®ããŒããã³ã³ã»ã³ãµã¹ãéããŠäžé£ã®UTXOãã€ãŸããäœæã®ã³ã€ã³ããæ£ç¢ºã«èª°ã«ãã©ã®ãããªæ¡ä»¶ã§äœ¿çšã§ãããã«ã€ããŠåæããŸãã UTXO ã»ããã¯ããªããŒã¿ãŒ ããŒãã«å¿ èŠãªæå°éã®ããŒã¿ ã»ããã§ãããããããªããšããŒãã¯åä¿¡ãã©ã³ã¶ã¯ã·ã§ã³ãšããããå«ããããã¯ã®æå¹æ§ãæ€èšŒã§ããŸããã
ãã®ç¹ã«é¢ããŠãã»ãã¥ãªãã£ã®ä¿èšŒã倱ããã«ããã®ã»ããã®ä¿åãããè¡šçŸãåæžããå§çž®ããããã®ããããå¯èœãªæ¹æ³ãè©Šã¿ãããŠããŸãã ä¿åãããããŒã¿ã®éãå°ãªãã»ã©ãæ€èšŒããŒãã®ãã£ã¹ã¯å®¹éèŠä»¶ãå°ãªããªããæ€èšŒããŒãã®èµ·åãå®äŸ¡ã«ãªãããããã¯ãŒã¯ãæ¡åŒµã§ããããããããã¯ãŒã¯ã®å®å®æ§ãåäžããŸãã
ãã®æçš¿ã§ã¯ãå
±èè
ããã®æè¿ã®ææ¡ã® Rust ãããã¿ã€ããæçš¿ããŸãã
åé¡ã¯äœã§ããïŒ
ãããã³ã€ã³ã®é·å¹Žã®åé¡ã® XNUMX ã€ã¯ããã®ã¹ã±ãŒã©ããªãã£ã§ãã ãèªåã®éè¡ããšããèãã§ã¯ããããã¯ãŒã¯åå è
ã¯äœ¿çšå¯èœãªãã¹ãŠã®è³éã®èšé²ãä¿æããå¿
èŠããããŸãã ãããã³ã€ã³ã§ã¯ãå©çšå¯èœãªè³éã¯æªäœ¿çšã®åºåã®ã»ãããã€ãŸã UTXO ã»ãããšããŠè¡šçŸãããŸãã ããã¯ç¹ã«çŽèŠ³çãªè¡šçŸã§ã¯ãããŸããããåããŠã©ã¬ããããå¥åã®ãšã³ããªãšããŠãæ®é«ããæã€è¡šçŸãããå®è£
ããã©ãŒãã³ã¹ã®ç¹ã§æçã§ããããã©ã€ãã·ãŒãè¿œå ãããŸãïŒäŸ:
ãã©ã³ã¶ã¯ã·ã§ã³ã®å±¥æŽ (ãããããããã¯ãã§ãŒã³) ãšã·ã¹ãã ã®çŸåšã®ç¶æ ãåºå¥ããããšãéèŠã§ãã ãããã³ã€ã³ã®ãã©ã³ã¶ã¯ã·ã§ã³å±¥æŽã¯çŸåšãçŽ 200 GB ã®ãã£ã¹ã¯å®¹éãå ããŠãããå¢å ãç¶ããŠããŸãã ãã ããã·ã¹ãã ç¶æ 㯠4 GB çšåºŠãšã¯ããã«å°ããã誰ããçŸåšã³ã€ã³ãææããŠãããšããäºå®ã®ã¿ãèæ ®ãããŸãã ãã®ããŒã¿ã®éãæéã®çµéãšãšãã«å¢å ããŸããããã®é床ã¯ã¯ããã«é ããå Žåã«ãã£ãŠã¯æžå°ããåŸåãããããŸã (CDPV ãåç §)ã
ã©ã€ã ã¯ã©ã€ã¢ã³ã (SPV) ã¯ãã»ãã¥ãªãã£ã®ä¿èšŒãšåŒãæãã«ãç§å¯ããŒä»¥å€ã®æå°ç¶æ (UTXO ã»ãã) ãä¿åã§ããªãæ©èœãåããŠããŸãã
UTXO ããã³ UTXO ã»ãã
UTXO (Unspent Transaction Output) ã¯ãæªäœ¿çšã®ãã©ã³ã¶ã¯ã·ã§ã³åºåã§ããããã©ã³ã¶ã¯ã·ã§ã³ã§è»¢éãããåãµãã·ã®æ ã®çµç¹ã§ãã 䜿çšãããªãã£ãåºåã¯æ°ãããã©ã³ã¶ã¯ã·ã§ã³ã®å ¥åãšãªãããã䜿çšãã (spend)ãUTXO ã»ããããåé€ãããŸãã
æ°ãã UTXO ã¯åžžã«ãã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠäœæãããŸãã
- å ¥åã®ãªã Coinbase ãã©ã³ã¶ã¯ã·ã§ã³: ãã€ããŒãã³ã€ã³ãçºè¡ãããšãã«æ°ãã UTXO ãäœæããŸã
- éåžžã®ãã©ã³ã¶ã¯ã·ã§ã³: æ¢åã® UTXO ã®ç¹å®ã®ã»ããã䜿çšããªãããæ°ãã UTXO ãäœæããŸãã
UTXO ã䜿çšããããã»ã¹:
ãŠã©ã¬ããã¯ããã®ãŠã©ã¬ããã§äœ¿çšå¯èœãª UTXO ã®éã«åºã¥ããŠã䜿çšå¯èœãªã³ã€ã³ã®æ° (æ®é«) ãã«ãŠã³ãããŸãã
åããªããŒã¿ãŒ ããŒãã¯ãäºéæ¯åºã®è©Šè¡ãé²ãããã«ãã»ãããç£èŠããå¿ èŠããããŸãã ãã¹ãŠ UTXO確èªæ å ãã©ã³ã¶ã¯ã·ã§ã³ ããããã® ãããã¯ã
ããŒãã«ã¯æ¬¡ã®ããžãã¯ãå¿ èŠã§ãã
- UTXO ã»ãããžã®è¿œå
- UTXO ã»ããããã®åé€
- ã»ããå ã®åäžã® UTXO ã®ååšã確èªãã
èŠçŽ ã®è¿œå ãšåé€ãã»ããå
ã®èŠçŽ ã®ååšã®ç¢ºèªãšèšŒæãè¡ãæ©èœãç¶æããªãããã»ããã«é¢ããä¿åæ
å ±ã®èŠä»¶ã軜æžããæ¹æ³ããããŸãã
UTXOçšããããªãŒ
ããããªãŒã䜿çšããŠè€æ°ã®UTXOãä¿ç®¡ãããšããã¢ã€ãã¢
UTXO ã»ããã¯ãåæããã㯠ããŠã³ããŒã (IBD) äžã«ãªã³ã¶ãã©ã€ã§æ§ç¯ãããå®å šãã€æ°žç¶çã«ä¿åãããŸããããã®å 容ã¯ããããã¯ãŒã¯ã®æ°ããæ£ãããããã¯ããšã«ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããåŸã«å€æŽãããŸãã ãã®ããã»ã¹ã§ã¯ãçŽ 200 GB ã®ããã㯠ããŒã¿ãããŠã³ããŒãããæ°åã®ããžã¿ã«çœ²åãæ€èšŒããå¿ èŠããããŸãã IBD ããã»ã¹ãå®äºãããšãUTXO ã»ããã¯çŽ 4 GB ãå æããããšã«ãªããŸãã
ããããã¢ãã¥ã ã¬ãŒã¿ãŒã䜿çšãããšãè³éã®åæã«ãŒã«ã¯æ€èšŒãšæå·èšŒæã®çæã«ç°¡çŽ åãããå©çšå¯èœãªè³éã远跡ããè² æ ã¯ãè³éã®ååšãšæææš©ã®èšŒæãæäŸããè³éã®ææè ã«ç§»ãããŸãã
ã¢ãã¥ã ã¬ãŒã¿ã¯ãã»ããã®ã³ã³ãã¯ããªè¡šçŸãšåŒã¶ããšãã§ããŸãã ä¿åãããè¡šçŸã®ãµã€ãºã¯å®æ°ã§ããå¿ èŠããããŸãã ãŸãã¯ãã»ããã®ã«ãŒãã£ããªãã£ãšèŠçŽ èªäœã®ãµã€ãºã«é¢ããŠç·åœ¢çã«å¢å ããŸãããããšãã°ã ããã§ãn ã¯æ ŒçŽãããã»ããã®ã«ãŒãã£ããªãã£ã§ãã
ãã®å Žåãã¢ãã¥ã ã¬ãŒã¿ã¯ãèŠçŽ ãã»ããã«å«ãŸããŠããããšã®èšŒæ (å å«èšŒæ) ãçæã§ãããã®èšŒæãå¹æçã«æ€èšŒã§ããããã«ããå¿ èŠããããŸãã
ããããªãŒãšåŒã°ããŸã ãã€ããã㯠if ã䜿çšãããšãã»ããã«èŠçŽ ãè¿œå ããããã»ããããèŠçŽ ãåé€ãããã§ããŸãã
ãã®ãããªããããªãŒã®äŸã¯æ¬¡ã®ãšããã§ãã
ãŠãã¬ã¯ãœ
Thaddeus Dryja ã«ãã£ãŠææ¡ããã Utreexo ãã¶ã€ã³ã«ããã ãã€ããã㯠ã¢ãã¥ã ã¬ãŒã¿ без ä¿¡é Œã§ããã»ããã¢ããã
Utreexo ã¯å®ç§ãªãã€ããªã®æ£®ã§ã
ããããªãŒã®è«çæ§é
ããããªãŒã»ã«ã¯ãçæ³çãªäºåæšã®æ£®ã®äžã«é 眮ãããŠããŸãã æšã¯é«ãé ã«äžŠã¹ãããŸãã ãã®è¡šçŸã¯æãèŠèŠçã«éžæãããŠãããããããªãŒã§ã®æäœäžã«ããªãŒã®çµåãèŠèŠåã§ããŸãã
èè ã¯ã森ã®äžã®æšã¯ãã¹ãŠçæ³çãªã®ã§ãèªç¶æ°ã XNUMX ã®çŽ¯ä¹ã®åã§è¡šçŸã§ããã®ãšåæ§ã«ããã®é«ãã XNUMX ã®çŽ¯ä¹ã§è¡šçŸããããšè¿°ã¹ãŠããŸãã ãããã£ãŠãä»»æã®ãªãŒãã®ã»ããããã€ã㪠ããªãŒã«ã°ã«ãŒãåã§ããŸããã©ã®å Žåã§ããæ°ããèŠçŽ ãè¿œå ããã«ã¯ç¥èãå¿ èŠã§ãã ä¿åãããããªãŒã®ã«ãŒã ããŒãã®ã¿ã«ã€ããŠ.
ãããã£ãŠã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()
ãæå®ããã XNUMX ã€ã®èŠçŽ ã®èŠªããŒããèªèããŸãã
芪()é¢æ°
ããŒã¯ã« ããªãŒã䜿çšããŠãããããXNUMX ã€ã®ããŒãã®ããããã®èŠªã¯ãåããŒãã®ããã·ã¥ãé£çµããããã·ã¥ãæ ŒçŽãã XNUMX ã€ã®ããŒãã«ãªããŸãã
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
ãããŠãæ¢åã®ã«ãŒãèŠçŽ ããã±ããããšã« XNUMX ã€ãã€ããã«é 眮ããŸãã
ã³ãŒã
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);
- æåã®ãã¹ã±ããã«è¿œå ããã¢ã€ãã ãæ®ãã®ã¢ã€ãã ãšçµåããŸãã
- è€æ°ã®ååãå
¥ã£ãŠãããã¹ãŠã®ã«ãŒãã®å Žå:
- ãã¹ã±ããã®ç«¯ãã XNUMX ã€ã®èŠçŽ ãåãåºãããããã®èŠªãèšç®ããäž¡æ¹ã®èŠçŽ ãåé€ããŸã
- èšç®ããã芪ã次ã®ã«ãŒãã«è¿œå ããŸã
- è€æ°ã®ååãå
¥ã£ãŠãããã¹ãŠã®ã«ãŒãã®å Žå:
ã³ãŒã
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
}
}
ãã«ãŒãäœæã®æµã
èŠçŽ ã®èšŒæããã§ãã¯ãã
èŠçŽ ã®å å«èšŒæã®ãã§ãã¯ã¯ãæ¢åã®ã«ãŒãèŠçŽ ã«è³ããŸã§ããŒã¯ã« ãã¹ããã©ãããšã«èŠçŽãããŸãã
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
}
}
æããã«ïŒ
Aã®èšŒæããã§ãã¯ããããã»ã¹
ã¢ã€ãã ã®åé€
ããããªãŒããã»ã«ãåãå€ãã«ã¯ããã®ã»ã«ãããã«ãããšããæå¹ãªèšŒæ ãæäŸããå¿ èŠããããŸãã 蚌æããã®ããŒã¿ã䜿çšãããšãæå®ããã蚌æãçã§ã¯ãªããªãã¢ãã¥ã ã¬ãŒã¿ã®æ°ããã«ãŒãèŠçŽ ãèšç®ããããšãã§ããŸãã
ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- è¿œå ãšåæ§ã«ããã¹ã±ãã ã€ã³ããã¯ã¹ãã XNUMX ã®çŽ¯ä¹ã«çããé«ãã®ããŒã¯ã« ããªãŒã«å¯Ÿå¿ãã空ã®ãã¹ã±ããã®ã»ãããç·šæããŸãã
- ããŒã¯ã« ãã¹ã®ã¹ãããããã®èŠçŽ ããã¹ã±ããã«æ¿å ¥ããŸãã ãã¹ã±ããã€ã³ããã¯ã¹ã¯çŸåšã®ã¹ãããã®çªå·ã«çãã
- 蚌æããã®ãã¹ãå°ãã«ãŒãèŠçŽ ãåé€ããŸã
- å ç®ãšåæ§ã«ããã¹ã±ããã®èŠçŽ ããã¢ã§çµåããçµåã®çµæã次ã®ãã¹ã±ããã«ç§»åããããšã«ãã£ãŠãæ°ããã«ãŒãèŠçŽ ãèšç®ããŸãã
ã³ãŒã
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ããåé€ããããã»ã¹:
æ¢åã®ãããã¯ãŒã¯ãžã®çµ±å
ææ¡ãããã¢ãã¥ã ã¬ãŒã¿ã䜿çšãããšãããŒãã¯ãUTXO ã»ãããå€æŽã§ããäžæ¹ã§ããã¹ãŠã® UTXO ãæ ŒçŽããããã« DB ã䜿çšããããšãåé¿ã§ããŸãã ãã ãã蚌æ ã®æ±ãã«åé¡ãçããŸãã
UTXO ã¢ãã¥ã ã¬ãŒã¿ã䜿çšããããªããŒã¿ ããŒããåŒã³åºããŠã¿ãŸããã ã³ã³ãã¯ã (ã³ã³ãã¯ãç¶æ ããŒã)ãã¢ãã¥ã ã¬ãŒã¿ã®ãªãããªããŒã¿ã¯æ¬¡ã®ããã«ãªããŸãã å®æãã (ãã«ããŒã)ã XNUMX ã€ã®ã¯ã©ã¹ã®ããŒããååšãããšãããããåäžã®ãããã¯ãŒã¯ã«çµ±åããéã«åé¡ãçããŸããããã¯ãã³ã³ãã¯ã ããŒãã§ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã§æ¶è²»ããã UTXO ã®ååšèšŒæãå¿ èŠã§ããããã« ããŒãã§ã¯å¿ èŠããªãããã§ãã ãã¹ãŠã®ãããã¯ãŒã¯ ããŒããåæã«é£æºã㊠Utreexo ã®äœ¿çšã«åãæ¿ããªããšãã³ã³ãã¯ã ããŒããåãæ®ããããããã³ã€ã³ ãããã¯ãŒã¯ã§åäœã§ããªããªããŸãã
ã³ã³ãã¯ããªããŒãããããã¯ãŒã¯ã«çµ±åãããšããåé¡ã解決ããããã«ãè¿œå ã®ããŒã ã¯ã©ã¹ãå°å ¥ããããšãææ¡ãããŠããŸãã æ©ã ããªããž ããŒãã¯ãUtreexo ããããªãŒãšé»æºæå ¥èšŒæãä¿åããå®å šãªããŒãã§ãã ãã¹ãŠ UTXOã»ããã®UTXOã ããªããžã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãããããã¯ãå°çãããšãæ°ããããã·ã¥ãèšç®ããã¢ãã¥ã ã¬ãŒã¿ãšèšŒæãæŽæ°ããŸãã ã¢ãã¥ã ã¬ãŒã¿ãšèšŒæãç¶æããã³æŽæ°ããŠãããã®ãããªããŒãã«è¿œå ã®èšç®è² è·ããããããšã¯ãããŸããã ããªããžã¯ãã£ã¹ã¯å®¹éãç ç²ã«ããŸã: ç©äºãæŽçããŠããå¿ èŠããããŸã ããã·ã¥ãšæ¯èŒã㊠ã³ã³ãã¯ã ããŒãã®ããã·ã¥ãn 㯠UTXO ã»ããã®çŽ¯ä¹ã§ãã
ãããã¯ãŒã¯ ã¢ãŒããã¯ãã£
ããªããžã䜿çšãããšãæ¢åã®ããŒãã®ãœãããŠã§ã¢ãå€æŽããããšãªããã³ã³ãã¯ããªããŒãããããã¯ãŒã¯ã«åŸã ã«è¿œå ããããšãã§ããŸãã ãã«ããŒãã¯ä»¥åãšåæ§ã«åäœãããã©ã³ã¶ã¯ã·ã§ã³ãšãããã¯ãããŒãéã§åæ£ããŸãã ããªããž ããŒãã¯ãUtreexo ããããªãŒ ããŒã¿ãšäžé£ã®å å«èšŒæãè¿œå ã§ä¿åããå®å šãªããŒãã§ãã ãã¹ãŠ ãšããããUTXOã ããªããž ããŒãã¯ãããèªäœããã®ããã«ã¢ããã¿ã€ãºããããã¹ãŠã®ãã« ããŒãã«å¯ŸããŠã¯ãã« ããŒãããã¹ãŠã®ã³ã³ãã¯ã ããŒãã«å¯ŸããŠã¯ã³ã³ãã¯ã ããŒãã§ãããµããããŸãã ããªããžã¯äž¡æ¹ã®ãããã¯ãŒã¯ãæ¥ç¶ããŸãããå®éã«ã¯ãæ¢åã®ãã« ããŒãããã³ã³ãã¯ã ããŒããžãšããäžæ¹åã«ã®ã¿æ¥ç¶ããå¿ èŠããããŸãã ãããå¯èœãªã®ã¯ããã©ã³ã¶ã¯ã·ã§ã³åœ¢åŒãå€æŽããå¿ èŠããªããã³ã³ãã¯ã ããŒãã® UTXO ãã«ãŒããç Žæ£ã§ããããã§ãããã®ãããããªããž ããŒãã®åå ãªãã«ãã©ã®ã³ã³ãã¯ã ããŒããåæ§ã«ãã¹ãŠã®ãããã¯ãŒã¯åå è ã«ãã©ã³ã¶ã¯ã·ã§ã³ããããŒããã£ã¹ãã§ããŸãã
ãŸãšã
ç§ãã¡ã¯ Utreexo ããããªãŒã調ã¹ããã®ãããã¿ã€ãã Rust ã«å®è£ ããŸããã ç§ãã¡ã¯ãããããªãŒããŒã¹ã®ããŒãã®çµ±åãå¯èœã«ãããããã¯ãŒã¯ ã¢ãŒããã¯ãã£ãæ€èšããŸããã ã³ã³ãã¯ã ãã£ããã®å©ç¹ã¯ãä¿åãããããŒã¿ã®ãµã€ãºã UTXO ã®ã»ããã®èœåã«å¯Ÿæ°çã«äŸåããããšã§ããããã«ããããã®ãããªããŒãã®ãã£ã¹ã¯é åãšã¹ãã¬ãŒãž ããã©ãŒãã³ã¹ã®èŠä»¶ãå€§å¹ ã«è»œæžãããŸãã æ¬ ç¹ã¯ããã«ãŒããéä¿¡ããããã®è¿œå ã®ããŒã ãã©ãã£ãã¯ã§ããã蚌æ éçŽæè¡ (XNUMX ã€ã®ãã«ãŒããè€æ°ã®èŠçŽ ã®ååšã蚌æããå Žå) ãšãã£ãã·ã¥ã«ããããã©ãã£ãã¯ã蚱容ç¯å²å ã«æããããšãã§ããŸãã
ãªãã¡ã¬ã³ã¹:
Rust ã® Utreexo ãããã¿ã€ãã® GitHub ã¿ããŠã¹ã»ãã©ã€ã€ -Utreexo: ãããã³ã€ã³ UTXO ã»ããçšã«æé©åãããåçããã·ã¥ããŒã¹ã®ã¢ãã¥ã ã¬ãŒã¿ãŒ èšäºã®ã¢ãã¡ãŒã·ã§ã³ã€ã©ã¹ã
åºæïŒ habr.com