ย
bitcoinABC(bitcoinCache)
Merkle tree๋ฅผ Merklix-metadata ํธ๋ฆฌ๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
Merkle ํธ๋ฆฌ์ radix(patricia) ํธ๋ฆฌ์ ์ฅ์ ์ ๊ฒฐํฉํ์ฌ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ.
Merkleํธ๋ฆฌ์ bitwise trie์ ๊ฒฐํฉ
embarrassingly parallel์ ์ ์ง์ ์ผ๋ก ์ํ ํ ์ ์์ผ๋ฉฐ Bitcoin์ ๊ธฐ์กด ์์ฉ ํ๊ฒฝ๊ณผ์ ํ์ ํธํ์ฑ์ ์ต๋ํ ๋ณด์กด
ํ์ฌ ๋นํธ์ฝ์ธ์์ ์ฌ์ฉํ๊ณ ์๋ balanced merkle tree๋ ๋ณํ ์ฝ์
์ ์ ํฉํ์ง ์์ผ๋ฉฐ, ๋ธ๋ก์ด ์ปค์ง์๋ก ํ์ฅ์ฑ ๋ฌธ์ ๋ฐ์
ย
merklix tree์ ์ ํ์ฑ์ ๋ธ๋ก์ฒด์ธ ํ๋กํ ์ฝ์ ์์ ํ ํธ๋์ญ์
์์์ ์์กดํจ. canonical transaction ordering rule์ด ํ์.
์ฝ์
,์ ๊ฑฐ,๋ณํฉ ๋ฑ์ embarrassingly parallel๋ก ์ํ ๊ฐ๋ฅ(๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์์ ์ ๋์ฌ ๋ฒ์์ ๋ํด ๋ถํ ๋ ์ ์๊ธฐ ๋๋ฌธ์)
Merklix ํธ๋ฆฌ๋ ๋ธ๋ก์ n ๊ฐ์ ํธ๋์ญ์
์ด์์ ๊ฒฝ์ฐ O (ln2(n))์ ์ ๊ทผ์ ๋ณต์ก์ฑ์ผ๋ก ์ฝ์
๋ฐ ์ ๊ฑฐ์ ์ต์ ์ ์ ๊ทผ์ ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ๋ค. ์ค์ ๋ก ์์๋ ๋งค์ฐ ๋ฎ์ ๊ฒ์ผ๋ก ์์
ย
Merkle tree์ ์ญ์ฌ์ ์ธ ์ค๊ณ ๊ฒฐํจ์ ์ ๊ฑฐ, ๋น ๋ธ๋์น์ edge case๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
๊ท ํํธ๋ฆฌ๋ฐ์ด๋๋ฆฌ ํธ๋ฆฌํํ์ ๋จธํด ํธ๋ฆฌ์์ ํธ๋์ญ์
์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ถ๊ฐ ๋๋ฉฐ ์ค๋ฅธ์ชฝ์ ๋น branch๋ leaf๋ฅผ ํฌํจํ๊ธฐ๋ ํ๋ค.
์ต์ ์ผ๋ ์ฝ์
์ O(ln2(n))์ ์ ๊ทผ์ ์ฑ๋ฅ์ ์ ๊ณตํ์์. ๊ทธ๋ฌ๋ ๊ฐ๋จํ ๊ตฌํ์ ๊ณ ๋ คํ๋ฉด ์ด ์ฑ๋ฅ์ ์์ฐจ์ ์ธ ์ถ๊ฐ ์ฝ์
์ ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
๋จธํดํธ๋ฆฌ์ radixํธ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ง์ ๋ณ์ข
์ด ์์ด์๋ค.
๋ธ๋ก ํด์ฑ๋ก์ง๋ง ๋ณ๊ฒฝ
Merklix ํธ๋ฆฌ๋ ์ฒด์ธ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ํ์ฉ ๋ ์์๋ ๋ชจ๋ ์ํ ๊ต์ ๋ณธ์ ๋ณด์กดํ๋ฉด์ ์ต์ํ์ ๊ณ์ฐ ์ค๋ฒ ํค๋๋ก ๋ธ๋ก ๋ด์์ ๋๊ท๋ชจ ํธ๋์ญ์
์ ๊ตฌ์ฑํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
ย
๊ทผ๋ณธ์ ์ผ๋ก์ด ์์ด๋์ด๋ ํค์ ๋นํธ๋ฅผ ์ ๋์ด๋ก ์ฌ์ฉํ๋ฉด์ ํธ๋ฆฌ๋ฅผ ๋นํธ ํธ๋ฆฌ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์ด ์ ๊ทผ๋ฒ์ ์์ญ ๋
๋์ ์๋ ค์ ธ ์๋ X-fast trie์ ๋ฐ์ด๋ ์ฑ๋ฅ ๋๋ฌธ์ ์ด์ต์ ๊ฐ์ ธ๋ค์ค๋ค.
๋ค์ ์คํค๋ง๋ ๋นํธ ํธ๋ผ์ด๊ฐ 6 ๋ฐ์ดํธ ๊ธธ์ด์ 6 ๊ฐ ๊ฐ ์งํฉ์ ๋ํ๋ด๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋ค.
ย
ํน์ฑ
- 0๋ ธ๋๋ ์ผ์ชฝ ์์์๋ง ์ฌ์์๊ณ , 1๋ ธ๋๋ ์ค๋ฅธ์ชฝ ์์์๋ง ์ฌ์ ์๋ค.
- ์์ ๋น ์์ด์๋ ์งํฉ์ ๊ฐ์ ์ ํํ๊ฒ ํฌํจ
- ์์ ๋ํ ๊ฒฝ๋ก๋ ์์ ํฌํจ ๋ ๊ฐ์ ๋นํธ prefix
ย
pseudocode
// T: set of transactions // k: index of the bit used for partitioning MerklixHash(T,k) { match (T) with | { t } => SHA256(t) // single transaction | (T0,T1) where { t โ T0 : t[k] == 0 } and { t โ T1 : t[k] == 1 } => match (T0,T1) with | (_,ร) => MerklixHash(T0,k+1) | (ร,_) => MerklixHash(T1,k+1) | _ => SHA256(MerklixHash(T0,k+1)::MerklixHash(T1,k+1)) } // Root start at bit index zero MerklixHashRoot(T) => MerklixHash(T, 0)
T: ํธ๋์ญ์
์งํฉ
k: ํธ๋์ญ์
id์ k๋ฒ์งธ bit
t : ํธ๋์ญ์
ย
T์ t๋ง ์๋ ๊ฒฝ์ฐ sha256๊ณ์ฐ
ํธ๋์ญ์
t์ id์ k๋ฒ์งธ bit๊ฐ t[k]๋ก ํํ
operator::๋ byte-wise concatenation.
SHA256์ Bitcoin์์ ์ฌ์ฉํ๋ ์ด์ค sha-256
๋ธ๋ก ๋ ๋ฒจ์์ ๋จธํดํธ๋ฆฌ๋ฅผ ๋ณด์กด Merkle ํธ๋ฆฌ์ ํ๋ฆฌ์ฆ์ ํตํด ๋ธ๋ก์ ํ์ํ๋ ๊ธฐ์กด ์ํํธ์จ์ด์ ๋ชจ๋ ํ์ ํธํ์ฑ์ ์ ์งํ๋ค.
ย
์ด์งํธ๋ฆฌ ํน์ง
- ๋์ด๊ฐย
h
์ธย ํฌํ ์ด์ง ํธ๋ฆฌ(full binary tree)๋ย `2^h`โ1๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค
- ๋
ธ๋๊ฐย
N
๊ฐ์ธย ํฌํ(full) ํน์ย ์์ (complete) ์ด์ง ํธ๋ฆฌ์ย ๋์ด๋ย logN์ด๋ค.
O(logN)
- ํ์ชฝ์ผ๋ก ์ ๋ฆฐ๊ฒฝ์ฐ ์ต์ ์ ๋์ด N
ย
bitwise trie๋ ์ผ๋ฐ ์ด์ง ํธ๋ฆฌ์ด๋ฏ๋ก Merkle ํด์ฑ์ ๊ฐ๋จํ๊ฒ ์ ์ฉ ํ ์ ์์ต๋๋ค. ๋
ผ๋ฆฌ์ ์ผ๋ก, ๋นํธ ํธ๋ผ์ด์ ์ฐ๊ด๋ ์ด์ง ํธ๋ฆฌ๊ฐ ์๋ฃ๋จ์ ๋ฐ๋ผ (์ฆ, ๋น ๋ฆฌํ๊ฐ ์์), ๋น ๋ฆฌํ ์์ง ์ผ์ด์ค์ ๋์ฒํ ํ์๊ฐ ์์ ํ ์ ๊ฑฐ๋๋ค. ์ด ์์ฑ์ Bitcoin ์ฑ์ ๊ตฌํ์ ๊ฐ์ํํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์งํฉ๋๋ค.
ย
๋จธํด๋ฆญ์ค ํธ๋ฆฌ์ ์ฝ์
์ O(ln2(n))
๋ฌ๋ Bitcoin์ ๋งฅ๋ฝ์์ ๋ณผ ๋ ํค๋ SHA-256 ํด์์ด๋ฏ๋ก ํค์ ๋ณธ์ฑ์ผ๋ก ์ธํด ํธ๋ฆฌ์ ๊น์ด๊ฐ ์ ์ด๋ฉ๋๋ค. ์ด๋ ๋งค์ฐ ๋น์๋๋ค. ๊น์ด 256์ ๋ถ๊ท ํ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ SHA-256์ ๊นจ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ Bitcoin ์ปจํ
์คํธ์์ ๋นํธ ํธ๋ผ์ด์ ๊น์ด๋ 256์์ ์ํ์ด ๋ณด์ฅ๋ฉ๋๋ค. ๋ํ ๋ฐ์ธ๋ฉ์ ์ค์ ๋ก๋ ํจ์ฌ ๋ฎ์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
ย
ย
ย
๋ก์ปฌ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๋ฉ(UTXO๋ฅผ ๋ถํ )
4๊ฐ์ ํธ๋์ญ์
์ด ์๋ ๋ธ๋ก, txA < txB ์๊ฐ์ ์์ผ๋ก ์ฌ์ ์ ์ ๋ ฌ(์ผโ์ค)
๋๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ๊ณ , ์๋ธํธ๋ฆฌ B์ C์ ํด์๋ฅผ ๊ฐ๊ฐ ๊ณ์ฐ
์ด๋ฐ ๊ณ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ง์ฝํด ์๋ธํธ๋ฆฌ A๋ฅผ ์์ฑ
์ฝ์ธ๋ฒ ์ด์ค ํด์์ ๊ฒฐํฉ๋์ด ๋จธํด๋ฆญ์ค ๋ฃจํธ ์์ฑ
๊ฐ ๋ฆฌํ๋
ธ๋์ tx ํด์ ์กด์ฌ
(์ค๋๋ ์์คํ
์ด๋๋ผ๋ ๋๊ธฐํ ์์ด๋ ์๋ธํธ๋ฆฌ ํด์๋ฅผ ์ฌ์ ๊ณ์ฐํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ณ ์ฌ๋์ ์ํด ๊ณ์ฐ๋ ์ ์๋ ํ์ํธ๋ฆฌํด์์ ์ง๊ณ๋ก ๊ณ์ฐ๋๋๋ก ๊ตฌ์ฑ๋์ด์ผํจ)
CTOR ํด์๋ก ์์๋ฅผ ํ์คํํ๋ ๊ฒ์ ๋๋ค๋ฅธ ์ ์ฉํํน์ฑ์, mempool์ ์์ฉ์ด ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ๋ถํ ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ ํธ๋์ญ์
๋ผ์ฐํฐ๋ฅผ ์ฌ๋ฌmempoolํ๋ก์ธ์ ์์ ๋ฐฐ์นํ์ฌ ์ํ ํ ์ ์๋ค.
์ด ์ํคํ
์ฒ์์ ๋ผ์ฐํฐ 1๊ณผ ๋ผ์ฐํฐ 2๋ ์ด์ ์ ํฉ์ํ mempool ์๋ฝ ์์๊ฒ ๋์ผํ ๋ฒ์ ๋ด์์ ํธ๋์ญ์
์ ๋ณด๋ผ ์ ์์ต๋๋ค.ย ๋น์ทํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ mempool acceptor๋ ์๋ก ๋ฐ UTXO ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ฌ ์์ ํธ๋์ญ์
์ด ์กด์ฌํ๊ณ ์๋น ๊ฐ๋ฅํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ค์ค ํ๋ก์ธ์ค์ ๊ฑธ์ณ mempool์ ๋ถํ ํ๋ฉด API ์์ฒญ ํ๋ก์ธ์๊ฐ ๋ค์ํ Merkle ํ์ ํธ๋ฆฌ์ ํด์๋ฅผ ์ฟผ๋ฆฌ ํ ์ โโ์์ต๋๋ค.ย ๊ทธ๋ฆผ (1)์์ Subtree B์ Subtree C๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ Merkle ๋ฃจํธ๋ก ๊ณ์ ์ง๊ณ ํ ์ ์์ต๋๋ค.
ย
ย
references
ย
ย
ย
https://okky.kr/article/464145 โ ๋๊ธ๋๋ณด๊ธฐ ์ํ์ ์ด