ํค์ด ํ๋ธ๋ฅด!
๋นํธ์ฝ์ธ ๋คํธ์ํฌ์์ ๋ชจ๋ ๋ ธ๋๋ ํฉ์๋ฅผ ํตํด ์ผ๋ จ์ UTXO(์ฌ์ฉํ ์ ์๋ ์ฝ์ธ ์, ์ ํํ ๋๊ตฌ์๊ฒ, ์ด๋ค ์กฐ๊ฑด์์)์ ๋์ํฉ๋๋ค. UTXO ์ธํธ๋ ๊ฒ์ฆ์ธ ๋ ธ๋์ ํ์ํ ์ต์ ๋ฐ์ดํฐ ์ธํธ์ด๋ฉฐ, ์ด ์ธํธ๊ฐ ์์ผ๋ฉด ๋ ธ๋๋ ๋ค์ด์ค๋ ํธ๋์ญ์ ๊ณผ ์ด๋ฅผ ํฌํจํ๋ ๋ธ๋ก์ ์ ํจ์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ ๊ด๋ จํ์ฌ ์ด ์ธํธ์ ์ ์ฅ๋ ํํ์ ์ค์ด๊ณ ๋ณด์ ๋ณด์ฅ์ ์์ง ์๊ณ ์์ถํ๊ธฐ ์ํด ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๋ํ๊ณ ์์ต๋๋ค. ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์ด ์์์๋ก ๊ฒ์ฆ์ธ ๋ ธ๋์ ๋์คํฌ ๊ณต๊ฐ ์๊ตฌ ์ฌํญ์ด ๋ฎ์์ ธ ๊ฒ์ฆ์ธ ๋ ธ๋๋ฅผ ์ ๋ ดํ๊ฒ ์ถ์ํ ์ ์์ด ๋คํธ์ํฌ๋ฅผ ํ์ฅํ ์ ์์ด ๋คํธ์ํฌ์ ์์ ์ฑ์ด ๋์์ง๋๋ค.
์ด ๊ฒ์๋ฌผ์์ ์ฐ๋ฆฌ๋ ๊ณต๋ ์ ์์ ์ต๊ทผ ์ ์์ ๋ํ Rust ํ๋กํ ํ์
์ ๊ฒ์ํ ๊ฒ์
๋๋ค.
๋ฌธ์ ๊ฐ ๋ฌด์์ ๋๊น?
๋นํธ์ฝ์ธ์ ์ง์์ ์ธ ๋ฌธ์ ์ค ํ๋๋ ํ์ฅ์ฑ์ด์์ต๋๋ค. "์์ ์ ์ํ"์ด๋ผ๋ ๊ฐ๋
์์๋ ๋คํธ์ํฌ ์ฐธ๊ฐ์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์๊ธ์ ๋ํ ๊ธฐ๋ก์ ๋ณด๊ดํด์ผ ํฉ๋๋ค. ๋นํธ์ฝ์ธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๊ธ์ ์ฌ์ฉ๋์ง ์์ ์ถ๋ ฅ ์ธํธ, ์ฆ UTXO ์ธํธ๋ก ํํ๋ฉ๋๋ค. ์ด๋ ํน๋ณํ ์ง๊ด์ ์ธ ํํ์ ์๋์ง๋ง ๊ฐ "์ง๊ฐ"์ด ๋ณ๋์ ํญ๋ชฉ์ผ๋ก "์์ก"์ ๊ฐ๊ณ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ(์:
๊ฑฐ๋ ๋ด์ญ(๋ธ๋ก์ฒด์ธ์ด๋ผ๊ณ ํจ)๊ณผ ์์คํ ์ ํ์ฌ ์ํ๋ฅผ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋นํธ์ฝ์ธ ๊ฑฐ๋ ๋ด์ญ์ ํ์ฌ ์ฝ 200GB์ ๋์คํฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์์ผ๋ฉฐ ๊ณ์ํด์ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์คํ ์ํ๋ 4GB ์ ๋๋ก ํจ์ฌ ์์ผ๋ฉฐ ํ์ฌ ๋๊ตฐ๊ฐ๊ฐ ์ฝ์ธ์ ์์ ํ๊ณ ์๋ค๋ ์ฌ์ค๋ง ๊ณ ๋ คํฉ๋๋ค. ์ด ๋ฐ์ดํฐ์ ์๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฆ๊ฐํ์ง๋ง ์๋๊ฐ ํจ์ฌ ๋๋ฆฌ๊ณ ๋๋ก๋ ๊ฐ์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค(CDPV ์ฐธ์กฐ).
๋ผ์ดํธ ํด๋ผ์ด์ธํธ(SPV)๋ ๊ฐ์ธ ํค ์ด์ธ์ ์ต์ ์ํ(UTXO ์ธํธ)๋ฅผ ์ ์ฅํ ์ ์๋๋ก ๋ณด์์ ๋ณด์ฅํฉ๋๋ค.
UTXO ๋ฐ UTXO ์ธํธ
UTXO(Unspent Transaction Output)๋ ์ฌ์ฉ๋์ง ์์ ๊ฑฐ๋ ์ถ๋ ฅ์ด๋ฉฐ, ๊ฑฐ๋์์ ์ ์ก๋ ๊ฐ ์ฌํ ์ ์ฌ์ ์ ๋์ ์ ๋๋ค. ์ฌ์ฉ๋์ง ์์ ์ถ๋ ฅ์ ์๋ก์ด ๊ฑฐ๋์ ์ ๋ ฅ์ด ๋์ด ์๋น(์ง์ถ)๋๊ณ UTXO ์ธํธ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์๋ก์ด UTXO๋ ํญ์ ํธ๋์ญ์ ์ ์ํด ์์ฑ๋ฉ๋๋ค.
- ์ ๋ ฅ ์๋ ์ฝ์ธ๋ฒ ์ด์ค ๊ฑฐ๋: ์ฑ๊ตด์๊ฐ ์ฝ์ธ์ ๋ฐํํ ๋ ์๋ก์ด UTXO๋ฅผ ์์ฑํฉ๋๋ค.
- ์ผ๋ฐ ๊ฑฐ๋: ํน์ ๊ธฐ์กด UTXO ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๋ก์ด UTXO๋ฅผ ์์ฑํฉ๋๋ค.
UTXO ์์
ํ๋ก์ธ์ค:
์ง๊ฐ์ ์ด ์ง๊ฐ์์ ์ง์ถํ ์ ์๋ UTXO ์์ ๊ธฐ์ค์ผ๋ก ์ง์ถํ ์ ์๋ ์ฝ์ธ ์(์๊ณ )๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ด์ค ์ง์ถ ์๋๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ ๊ฒ์ฆ์ธ ๋ ธ๋๋ ์ธํธ๋ฅผ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค. ๋ชจ๋ ํ์ธ ์ UTXO ๊ฐ๊ฐ์ ์ ๋ฌด ๊ฐ ์ฐจ๋จํ๋ค.
๋ ธ๋์๋ ๋ ผ๋ฆฌ๊ฐ ์์ด์ผ ํฉ๋๋ค.
- UTXO ์ธํธ์ ๋ํ ์ถ๊ฐ
- UTXO ์งํฉ์์ ์ญ์
- ์ธํธ์ ๋จ์ผ UTXO๊ฐ ์๋์ง ํ์ธ
์์๋ฅผ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ์ธํธ์ ๋ํด ์ ์ฅ๋ ์ ๋ณด์ ๋ํ ์๊ตฌ ์ฌํญ์ ์ค์ด๊ณ ๋ค์์ ์ฌ์ฉํ์ฌ ์ธํธ์์ ์์์ ์กด์ฌ๋ฅผ ํ์ธ ๋ฐ ์ฆ๋ช
ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
UTXO์ฉ ๋ฐฐํฐ๋ฆฌ
์ฌ๋ฌ ๊ฐ์ UTXO๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ์์ด๋์ด
UTXO ์ธํธ๋ ์ด๊ธฐ ๋ธ๋ก ๋ค์ด๋ก๋(IBD) ์ค์ ์ฆ์ ๊ตฌ์ถ๋์ด ์์ ํ๊ณ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๋ฉฐ, ๋คํธ์ํฌ์ ๊ฐ๊ฐ์ ์๋กญ๊ณ ์ฌ๋ฐ๋ฅธ ๋ธ๋ก์์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ ํ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์๋ ์ฝ 200GB์ ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์์ต ๊ฐ์ ๋์งํธ ์๋ช ์ ํ์ธํด์ผ ํฉ๋๋ค. IBD ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋ ํ ๊ฒฐ๋ก ์ ์ผ๋ก UTXO ์ธํธ๋ ์ฝ 4GB๋ฅผ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ธ์ ๋ํ ํฉ์ ๊ท์น์ด ์ํธํ ์ฆ๋ช ์ ํ์ธ ๋ฐ ์์ฑ์ผ๋ก ์ถ์๋๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ์๊ธ์ ์ถ์ ํ๋ ๋ถ๋ด์ ์๊ธ์ ์กด์ฌ ๋ฐ ์์ ๊ถ์ ์ฆ๋ช ํ๋ ํด๋น ์๊ธ์ ์์ ์์๊ฒ ์ด์ ๋ฉ๋๋ค.
๋์ฐ๊ธฐ๋ ์งํฉ์ ๊ฐ๊ฒฐํ ํํ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ ์ฅ๋ ํํ์ ํฌ๊ธฐ๋ ์ผ์ ํด์ผ ํฉ๋๋ค. , ๋๋ ์ธํธ์ ์นด๋๋๋ฆฌํฐ ๋ฐ ์์ ์์ฒด์ ํฌ๊ธฐ์ ๊ด๋ จํ์ฌ ์ค์ ํ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด , ์ฌ๊ธฐ์ n์ ์ ์ฅ๋ ์ธํธ์ ์นด๋๋๋ฆฌํฐ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ๋์ฐ๊ธฐ๋ ์งํฉ์ ์์๊ฐ ํฌํจ๋์ด ์๋ค๋ ์ฆ๋ช (ํฌํจ ์ฆ๋ช )์ ์์ฑํ๊ณ ์ด ์ฆ๋ช ์ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
๋ฐฐํฐ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค ๋์ if๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํธ์์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌํ ๋ฐฐํฐ๋ฆฌ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ํธ๋ ์
Thaddeus Dryja๊ฐ ์ ์ํ Utreexo ๋์์ธ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ญ๋์ ์ธ ์ถ ์๊ธฐ ะฑะตะท ์ ๋ขฐํ ์ ์๋ ์ค์ .
Utreexo๋ ์๋ฒฝํ ๋ฐ์ด๋๋ฆฌ์ ์ฒ์
๋๋ค
๋ฐฐํฐ๋ฆฌ ๋ ผ๋ฆฌ์ ๊ตฌ์กฐ
๋ฐฐํฐ๋ฆฌ ์ ์ ์ด์์ ์ธ ์ด์ง ํธ๋ฆฌ ์ฒ์ ๋ฐฐ์ด๋ฉ๋๋ค. ๋๋ฌด๋ ๋์ด์ ๋ฐ๋ผ ์ ๋ ฌ๋ฉ๋๋ค. ์ด ํํ์ ๊ฐ์ฅ ์๊ฐ์ ์ผ๋ก ์ ํ๋์์ผ๋ฉฐ ๋ฐฐํฐ๋ฆฌ ์์ ์ค ๋๋ฌด ๋ณํฉ์ ์๊ฐํํ ์ ์์ต๋๋ค.
์ ์๋ ์ฒ์์ ๋ชจ๋ ๋๋ฌด๊ฐ ์ด์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ฐ์๊ฐ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ ํฉ์ผ๋ก ํํ๋ ์ ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ ๋๋ฌด์ ๋์ด๋ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ํํ๋๋ค๊ณ ์ง์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ฆฌํ ์ธํธ๋ ์ด์ง ํธ๋ฆฌ๋ก ๊ทธ๋ฃนํ๋ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ง์์ด ํ์ํฉ๋๋ค. ์ ์ฅ๋ ํธ๋ฆฌ์ ๋ฃจํธ ๋ ธ๋์ ๋ํด์๋ง.
๋ฐ๋ผ์ Utreexo ๋์ฐ๊ธฐ์ ์ ์ฅ๋ ํํ์ ๋ฃจํธ ๋ ธ๋(Merkle ๋ฃจํธ)์ ๋ชฉ๋ก์ ๋๋ค. ๋๋ฌด ์ฒ ์ ์ฒด๊ฐ ์๋๋ผ.
๋ฃจํธ ์์ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ด ํํํด ๋ณด๊ฒ ์ต๋๋ค. 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 });
}
}
- ๋ฃจํธ ์์๋ฅผ bin์์ ๊ฒฐ๊ณผ ๋์ฐ๊ธฐ ๋ฐฐ์ด๋ก ์ด๋ํฉ๋๋ค.
์ํธ
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
)๋ ์ฒด์ธ์ผ๋ก ๊ตฌ์ฑ๋ Merkle Path ์ญํ ์ ํฉ๋๋ค. 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
}
}
๋ถ๋ช ํ:
A์ ๋ํ ์ฆ๋ช ์ ํ์ธํ๋ ๊ณผ์
ํญ๋ชฉ ์ ๊ฑฐ
๋ฐฐํฐ๋ฆฌ์์ ์ ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ ์ด ๊ฑฐ๊ธฐ์ ์๋ค๋ ์ ํจํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ฆ๋ช ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์ฆ๋ช ์ด ๋ ์ด์ ์ฐธ์ด ์๋ ๋์ฐ๊ธฐ์ ์๋ก์ด ๋ฃจํธ ์์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ถ๊ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๋ ๋ฐ๊ตฌ๋ ์ธ๋ฑ์ค์์ 2์ ๊ฑฐ๋ญ์ ๊ณฑ๊ณผ ๋์ผํ ๋์ด๋ฅผ ๊ฐ์ง Merkle ํธ๋ฆฌ์ ํด๋นํ๋ ๋น ๋ฐ๊ตฌ๋ ์ธํธ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- Merkle ๊ฒฝ๋ก ๋จ๊ณ์ ์์๋ฅผ ๋ฐ๊ตฌ๋์ ์ฝ์ ํฉ๋๋ค. ๋ฐ์ค์ผ ์ธ๋ฑ์ค๋ ํ์ฌ ๋จ๊ณ์ ๋ฒํธ์ ๊ฐ์ต๋๋ค
- ์ฆ๋ช ์ ๊ฒฝ๋ก๊ฐ ์ด์ด์ง๋ ๋ฃจํธ ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ์ถ๊ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๊ตฌ๋์ ์์๋ฅผ ์์ผ๋ก ๊ฒฐํฉํ๊ณ ๊ฒฐํฉ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฐ๊ตฌ๋๋ก ์ด๋ํ์ฌ ์๋ก์ด ๋ฃจํธ ์์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ํธ
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 ๋์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฆ์ธ ๋ ธ๋๋ฅผ ํธ์ถํด ๋ณด๊ฒ ์ต๋๋ค. ์ฝคํฉํธ (์ปดํฉํธ ์ํ ๋ ธ๋), ๋์ฐ๊ธฐ๊ฐ ์๋ ๊ฒ์ฆ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์์ ํ (ํ๋ ธ๋). ๋ ํด๋์ค์ ๋ ธ๋๊ฐ ์กด์ฌํ๋ฉด ์ด๋ฅผ ๋จ์ผ ๋คํธ์ํฌ๋ก ํตํฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ปดํฉํธ ๋ ธ๋์๋ ํธ๋์ญ์ ์ ์ฌ์ฉ๋๋ UTXO์ ์กด์ฌ์ ๋ํ ์ฆ๊ฑฐ๊ฐ ํ์ํ ๋ฐ๋ฉด, ์ ์ฒด ๋ ธ๋๋ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ ๋คํธ์ํฌ ๋ ธ๋๊ฐ ๋์์ ์กฐ์ ๋ ๋ฐฉ์์ผ๋ก Utreexo๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ์ง ์์ผ๋ฉด ์ปดํฉํธ ๋ ธ๋๊ฐ ๋จ๊ฒ ๋์ด ๋นํธ์ฝ์ธ โโ๋คํธ์ํฌ์์ ์๋ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ปดํฉํธ ๋ ธ๋๋ฅผ ๋คํธ์ํฌ์ ํตํฉํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ถ๊ฐ ๋ ธ๋ ํด๋์ค๋ฅผ ๋์ ํ๋ ๊ฒ์ด ์ ์๋ฉ๋๋ค. ๊ต๋. ๋ธ๋ฆฌ์ง ๋ ธ๋๋ Utreexo ๋ฐฐํฐ๋ฆฌ์ ์ ์ ๊ณต๊ธ ์ฆ๋ช ๋ ์ ์ฅํ๋ ์์ ํ ๋ ธ๋์ ๋๋ค. ๋ชจ๋ UTXO ์ธํธ์ UTXO. ๋ธ๋ฆฌ์ง๋ ์๋ก์ด ํด์๋ฅผ ๊ณ์ฐํ๊ณ ์๋ก์ด ๊ฑฐ๋ ๋ธ๋ก์ด ๋์ฐฉํ๋ฉด ๋์ฐ๊ธฐ์ ์ฆ๋ช ์ ์ ๋ฐ์ดํธํฉ๋๋ค. ๋์ฐ๊ธฐ์ ์ฆ๋ช ์ ์ ์งํ๊ณ ์ ๋ฐ์ดํธํด๋ ํด๋น ๋ ธ๋์ ์ถ๊ฐ ๊ณ์ฐ ๋ถํ๊ฐ ๋ถ๊ณผ๋์ง ์์ต๋๋ค. ๋ธ๋ฆฌ์ง๋ ๋์คํฌ ๊ณต๊ฐ์ ํฌ์ํฉ๋๋ค. ์ ๋ฆฌ๋ ๋ด์ฉ์ ์ ์งํด์ผ ํฉ๋๋ค. ํด์์ ๋น๊ต ์ปดํฉํธ ๋ ธ๋์ ํด์. ์ฌ๊ธฐ์ n์ UTXO ์ธํธ์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๋๋ค.
๋คํธ์ํฌ ์ํคํ ์ฒ
๋ธ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ๋ ธ๋์ ์ํํธ์จ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋คํธ์ํฌ์ ์ํ ๋ ธ๋๋ฅผ ์ ์ง์ ์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค. ํ ๋ ธ๋๋ ์ด์ ๊ณผ ๊ฐ์ด ์๋ํ๋ฉฐ ํธ๋์ญ์ ๊ณผ ๋ธ๋ก์ ์๋ก ๋ถ์ฐํฉ๋๋ค. ๋ธ๋ฆฌ์ง ๋ ธ๋๋ Utreexo ๋ฐฐํฐ๋ฆฌ ๋ฐ์ดํฐ์ ๋ค์์ ๋ํ ํฌํจ ์ฆ๋ช ์ธํธ๋ฅผ ์ถ๊ฐ๋ก ์ ์ฅํ๋ ์ ์ฒด ๋ ธ๋์ ๋๋ค. ๋ชจ๋ ์ง๊ธ์ UTXO์ ๋๋ค. ๋ธ๋ฆฌ์ง ๋ ธ๋๋ ๋ชจ๋ ํ ๋ ธ๋์ ๋ํด ํ ๋ ธ๋์ด๊ณ ๋ชจ๋ ์ปดํฉํธ ๋ ธ๋์ ๋ํด ์ปดํฉํธ ๋ ธ๋์ธ ๊ฒ์ฒ๋ผ ๊ฐ์ฅํ์ฌ ์์ ์ ๊ด๊ณ ํ์ง ์์ต๋๋ค. ๋ธ๋ฆฌ์ง๋ ๋ ๋คํธ์ํฌ๋ฅผ ํจ๊ป ์ฐ๊ฒฐํ์ง๋ง ์ค์ ๋ก๋ ๊ธฐ์กด ํ ๋ ธ๋์์ ์ปดํฉํธ ๋ ธ๋๊น์ง ํ ๋ฐฉํฅ์ผ๋ก๋ง ์ฐ๊ฒฐํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ํธ๋์ญ์ ํ์์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ณ ์ปดํฉํธ ๋ ธ๋์ ๋ํ UTXO ์ฆ๋ช ์ ํ๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ปดํฉํธ ๋ ธ๋๋ ๋ธ๋ฆฌ์ง ๋ ธ๋์ ์ฐธ์ฌ ์์ด ๋ชจ๋ ๋คํธ์ํฌ ์ฐธ๊ฐ์์๊ฒ ์ ์ฌํ๊ฒ ํธ๋์ญ์ ์ ๋ธ๋ก๋์บ์คํธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ฐ๋ฆฌ๋ Utreexo ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ Rust๋ก ํ๋กํ ํ์ ์ ๊ตฌํํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐฐํฐ๋ฆฌ ๊ธฐ๋ฐ ๋ ธ๋์ ํตํฉ์ ํ์ฉํ๋ ๋คํธ์ํฌ ์ํคํ ์ฒ๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ์ปดํฉํธ ์บ์น์ ์ฅ์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ด๋ฉฐ, ์ด๋ UTXO ์ธํธ์ ์ฑ๋ฅ์ ๋์์ ์ผ๋ก ์์กดํ๋ฏ๋ก ํด๋น ๋ ธ๋์ ๋์คํฌ ๊ณต๊ฐ ๋ฐ ์คํ ๋ฆฌ์ง ์ฑ๋ฅ์ ๋ํ ์๊ตฌ ์ฌํญ์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค. ๋จ์ ์ ์ฆ๋ช ์ ์ก์ ์ํ ์ถ๊ฐ ๋ ธ๋ ํธ๋ํฝ์ด์ง๋ง ์ฆ๊ฑฐ ์ง๊ณ ๊ธฐ์ (ํ๋์ ์ฆ๋ช ์ด ์ฌ๋ฌ ์์์ ์กด์ฌ๋ฅผ ์ฆ๋ช ํ๋ ๊ฒฝ์ฐ)๊ณผ ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ํธ๋ํฝ์ ํ์ฉ ๊ฐ๋ฅํ ํ๋ ๋ด๋ก ์ ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฐธ์กฐ:
Rust์ Utreexo ํ๋กํ ํ์ GitHub ํ ๋ฐ์ฐ์ค ๋๋ผ์ด์ผ -Utreexo: ๋นํธ์ฝ์ธ โโUTXO ์ธํธ์ ์ต์ ํ๋ ๋์ ํด์ ๊ธฐ๋ฐ ๋์ฐ๊ธฐ ๊ธฐ์ฌ์ ์ ๋๋ฉ์ด์ ์ผ๋ฌ์คํธ๋ ์ด์
์ถ์ฒ : habr.com