Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

ํ—ค์ด ํ•˜๋ธŒ๋ฅด!

๋น„ํŠธ์ฝ”์ธ ๋„คํŠธ์›Œํฌ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ํ•ฉ์˜๋ฅผ ํ†ตํ•ด ์ผ๋ จ์˜ UTXO(์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”์ธ ์ˆ˜, ์ •ํ™•ํžˆ ๋ˆ„๊ตฌ์—๊ฒŒ, ์–ด๋–ค ์กฐ๊ฑด์—์„œ)์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. UTXO ์„ธํŠธ๋Š” ๊ฒ€์ฆ์ธ ๋…ธ๋“œ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์ด๋ฉฐ, ์ด ์„ธํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋…ธ๋“œ๋Š” ๋“ค์–ด์˜ค๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ์ด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ธ”๋ก์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ด ์„ธํŠธ์˜ ์ €์žฅ๋œ ํ‘œํ˜„์„ ์ค„์ด๊ณ  ๋ณด์•ˆ ๋ณด์žฅ์„ ์žƒ์ง€ ์•Š๊ณ  ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ž‘์„์ˆ˜๋ก ๊ฒ€์ฆ์ธ ๋…ธ๋“œ์˜ ๋””์Šคํฌ ๊ณต๊ฐ„ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‚ฎ์•„์ ธ ๊ฒ€์ฆ์ธ ๋…ธ๋“œ๋ฅผ ์ €๋ ดํ•˜๊ฒŒ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ์–ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด ๋„คํŠธ์›Œํฌ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ณต๋™ ์ €์ž์˜ ์ตœ๊ทผ ์ œ์•ˆ์— ๋Œ€ํ•œ Rust ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฒŒ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ดํŠธ๋‹ ๋„คํŠธ์›Œํฌ ํŽ˜์ดํผ, ํƒ€ ๋ฐ์šฐ์Šค ๋“œ๋ผ์ด์•ผ - Utreexo: ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹UTXO ์„ธํŠธ์— ์ตœ์ ํ™”๋œ ๋™์  ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๋ˆ„์‚ฐ๊ธฐ์ด๋Š” ๊ฒ€์ฆ์ž ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋””์Šคํฌ ๊ณต๊ฐ„ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋น„ํŠธ์ฝ”์ธ์˜ ์ง€์†์ ์ธ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ํ™•์žฅ์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. "์ž์‹ ์˜ ์€ํ–‰"์ด๋ผ๋Š” ๊ฐœ๋…์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์ฐธ๊ฐ€์ž๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž๊ธˆ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ์ฝ”์ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž๊ธˆ์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ถœ๋ ฅ ์„ธํŠธ, ์ฆ‰ UTXO ์„ธํŠธ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠน๋ณ„ํžˆ ์ง๊ด€์ ์ธ ํ‘œํ˜„์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ "์ง€๊ฐ‘"์ด ๋ณ„๋„์˜ ํ•ญ๋ชฉ์œผ๋กœ "์ž”์•ก"์„ ๊ฐ–๊ณ  ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ(์˜ˆ: ์ฝ”์ธ ์กฐ์ธ).

๊ฑฐ๋ž˜ ๋‚ด์—ญ(๋ธ”๋ก์ฒด์ธ์ด๋ผ๊ณ  ํ•จ)๊ณผ ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜ ๋‚ด์—ญ์€ ํ˜„์žฌ ์•ฝ 200GB์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ์Šคํ…œ ์ƒํƒœ๋Š” 4GB ์ •๋„๋กœ ํ›จ์”ฌ ์ž‘์œผ๋ฉฐ ํ˜„์žฌ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฝ”์ธ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ์˜ ์–‘๋„ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋Š๋ฆฌ๊ณ  ๋•Œ๋กœ๋Š” ๊ฐ์†Œํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(CDPV ์ฐธ์กฐ).

๋ผ์ดํŠธ ํด๋ผ์ด์–ธํŠธ(SPV)๋Š” ๊ฐœ์ธ ํ‚ค ์ด์™ธ์˜ ์ตœ์†Œ ์ƒํƒœ(UTXO ์„ธํŠธ)๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๋„๋ก ๋ณด์•ˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

UTXO ๋ฐ UTXO ์„ธํŠธ

UTXO(Unspent Transaction Output)๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ž˜ ์ถœ๋ ฅ์ด๋ฉฐ, ๊ฑฐ๋ž˜์—์„œ ์ „์†ก๋œ ๊ฐ ์‚ฌํ† ์‹œ ์—ฌ์ •์˜ ๋์ ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ถœ๋ ฅ์€ ์ƒˆ๋กœ์šด ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ์ด ๋˜์–ด ์†Œ๋น„(์ง€์ถœ)๋˜๊ณ  UTXO ์„ธํŠธ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด UTXO๋Š” ํ•ญ์ƒ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์—†๋Š” ์ฝ”์ธ๋ฒ ์ด์Šค ๊ฑฐ๋ž˜: ์ฑ„๊ตด์ž๊ฐ€ ์ฝ”์ธ์„ ๋ฐœํ–‰ํ•  ๋•Œ ์ƒˆ๋กœ์šด UTXO๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๊ฑฐ๋ž˜: ํŠน์ • ๊ธฐ์กด UTXO ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด UTXO๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

UTXO ์ž‘์—… ํ”„๋กœ์„ธ์Šค:
Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

์ง€๊ฐ‘์€ ์ด ์ง€๊ฐ‘์—์„œ ์ง€์ถœํ•  ์ˆ˜ ์žˆ๋Š” UTXO ์–‘์„ ๊ธฐ์ค€์œผ๋กœ ์ง€์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”์ธ ์ˆ˜(์ž”๊ณ )๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ค‘ ์ง€์ถœ ์‹œ๋„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๊ฒ€์ฆ์ธ ๋…ธ๋“œ๋Š” ์„ธํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ™•์ธ ์‹œ UTXO ๊ฐ๊ฐ์˜ ์—…๋ฌด ๊ฐ ์ฐจ๋‹จํ•˜๋‹ค.

๋…ธ๋“œ์—๋Š” ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • UTXO ์„ธํŠธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€
  • UTXO ์ง‘ํ•ฉ์—์„œ ์‚ญ์ œ
  • ์„ธํŠธ์— ๋‹จ์ผ UTXO๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

์š”์†Œ๋ฅผ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ธํŠธ์— ๋Œ€ํ•ด ์ €์žฅ๋œ ์ •๋ณด์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค„์ด๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธํŠธ์—์„œ ์š”์†Œ์˜ ์กด์žฌ๋ฅผ ํ™•์ธ ๋ฐ ์ฆ๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋ˆ„์‚ฐ๊ธฐ.

UTXO์šฉ ๋ฐฐํ„ฐ๋ฆฌ

์—ฌ๋Ÿฌ ๊ฐœ์˜ UTXO๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด ๋…ผ์˜ ๋œ ์ด์ „.

UTXO ์„ธํŠธ๋Š” ์ดˆ๊ธฐ ๋ธ”๋ก ๋‹ค์šด๋กœ๋“œ(IBD) ์ค‘์— ์ฆ‰์‹œ ๊ตฌ์ถ•๋˜์–ด ์™„์ „ํ•˜๊ณ  ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜๋ฉฐ, ๋„คํŠธ์›Œํฌ์˜ ๊ฐ๊ฐ์˜ ์ƒˆ๋กญ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋ธ”๋ก์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค์—๋Š” ์•ฝ 200GB์˜ ๋ธ”๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ˆ˜์–ต ๊ฐœ์˜ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IBD ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๊ฒฐ๋ก ์ ์œผ๋กœ UTXO ์„ธํŠธ๋Š” ์•ฝ 4GB๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๊ธˆ์— ๋Œ€ํ•œ ํ•ฉ์˜ ๊ทœ์น™์ด ์•”ํ˜ธํ™” ์ฆ๋ช…์˜ ํ™•์ธ ๋ฐ ์ƒ์„ฑ์œผ๋กœ ์ถ•์†Œ๋˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž๊ธˆ์„ ์ถ”์ ํ•˜๋Š” ๋ถ€๋‹ด์€ ์ž๊ธˆ์˜ ์กด์žฌ ๋ฐ ์†Œ์œ ๊ถŒ์„ ์ฆ๋ช…ํ•˜๋Š” ํ•ด๋‹น ์ž๊ธˆ์˜ ์†Œ์œ ์ž์—๊ฒŒ ์ด์ „๋ฉ๋‹ˆ๋‹ค.

๋ˆ„์‚ฐ๊ธฐ๋Š” ์ง‘ํ•ฉ์˜ ๊ฐ„๊ฒฐํ•œ ํ‘œํ˜„์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ‘œํ˜„์˜ ํฌ๊ธฐ๋Š” ์ผ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•, ๋˜๋Š” ์„ธํŠธ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ ๋ฐ ์š”์†Œ ์ž์ฒด์˜ ํฌ๊ธฐ์™€ ๊ด€๋ จํ•˜์—ฌ ์ค€์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•, ์—ฌ๊ธฐ์„œ n์€ ์ €์žฅ๋œ ์„ธํŠธ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋ˆ„์‚ฐ๊ธฐ๋Š” ์ง‘ํ•ฉ์— ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ฆ๋ช…(ํฌํ•จ ์ฆ๋ช…)์„ ์ƒ์„ฑํ•˜๊ณ  ์ด ์ฆ๋ช…์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํ„ฐ๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค ๋™์  if๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ธํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ๋ฐฐํ„ฐ๋ฆฌ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 2018๋…„ XNUMX์›” Boneh, Bunz, Fisch๊ฐ€ ์ œ์•ˆํ•œ RSA ๋ˆ„์‚ฐ๊ธฐ. ์ด๋Ÿฌํ•œ ๋ˆ„์‚ฐ๊ธฐ๋Š” ์ €์žฅ๋œ ํ‘œํ˜„์˜ ์ผ์ •ํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์กด์žฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ  ๋น„๋ฐ€ (์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •). ์ด ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋น„ํŠธ์ฝ”์ธ๊ณผ ๊ฐ™์€ ๋ฌด์‹ ๋ขฐ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋ˆ„์‚ฐ๊ธฐ์˜ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋น„๋ฐ€ ์ƒ์„ฑ ์ค‘ ๋ฐ์ดํ„ฐ ๋ˆ„์ถœ๋กœ ์ธํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ UTXO ์กด์žฌ์— ๋Œ€ํ•œ ๊ฑฐ์ง“ ์ฆ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ๋Ÿฌํ•œ ๋ˆ„์‚ฐ๊ธฐ์— ๊ธฐ๋ฐ˜ํ•œ UTXO ์„ธํŠธ๋กœ ๋…ธ๋“œ๋ฅผ ์†์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ ํŠธ๋ ‰์†Œ

Thaddeus Dryja๊ฐ€ ์ œ์•ˆํ•œ Utreexo ๋””์ž์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์—ญ๋™์  ์ธ ์ถ• ์••๊ธฐ ะฑะตะท ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •.

Utreexo๋Š” ์™„๋ฒฝํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ˆฒ์ž…๋‹ˆ๋‹ค ๋จธํด ํŠธ๋ฆฌ ์— ์ œ์‹œ๋œ ์•„์ด๋””์–ด์˜ ๋ฐœ์ „์ž…๋‹ˆ๋‹ค. ๋ถ„์‚ฐ pki๋ฅผ ์œ„ํ•œ ํšจ์œจ์ ์ธ ๋น„๋™๊ธฐ ๋ˆ„์‚ฐ๊ธฐ, ์„ธํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํ„ฐ๋ฆฌ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ

๋ฐฐํ„ฐ๋ฆฌ ์…€์€ ์ด์ƒ์ ์ธ ์ด์ง„ ํŠธ๋ฆฌ ์ˆฒ์— ๋ฐฐ์—ด๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฌด๋Š” ๋†’์ด์— ๋”ฐ๋ผ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ํ‘œํ˜„์€ ๊ฐ€์žฅ ์‹œ๊ฐ์ ์œผ๋กœ ์„ ํƒ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐํ„ฐ๋ฆฌ ์ž‘์—… ์ค‘ ๋‚˜๋ฌด ๋ณ‘ํ•ฉ์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์ž๋Š” ์ˆฒ์†์˜ ๋ชจ๋“  ๋‚˜๋ฌด๊ฐ€ ์ด์ƒ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ž์—ฐ์ˆ˜๊ฐ€ 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]:

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

  • ๋ฃจํŠธ ์š”์†Œ๋ฅผ 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
    }
}

์ฆ๊ฑฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •

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

๋ถ„๋ช…ํžˆ:

A์— ๋Œ€ํ•œ ์ฆ๋ช…์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •

Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

ํ•ญ๋ชฉ ์ œ๊ฑฐ

๋ฐฐํ„ฐ๋ฆฌ์—์„œ ์…€์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์…€์ด ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ์œ ํšจํ•œ ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ์ฆ๋ช…์ด ๋” ์ด์ƒ ์ฐธ์ด ์•„๋‹Œ ๋ˆ„์‚ฐ๊ธฐ์˜ ์ƒˆ๋กœ์šด ๋ฃจํŠธ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ถ”๊ฐ€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋Š” ๋ฐ”๊ตฌ๋‹ˆ ์ธ๋ฑ์Šค์—์„œ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ๊ณผ ๋™์ผํ•œ ๋†’์ด๋ฅผ ๊ฐ€์ง„ Merkle ํŠธ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ ๋ฐ”๊ตฌ๋‹ˆ ์„ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Merkle ๊ฒฝ๋กœ ๋‹จ๊ณ„์˜ ์š”์†Œ๋ฅผ ๋ฐ”๊ตฌ๋‹ˆ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์Šค์ผ“ ์ธ๋ฑ์Šค๋Š” ํ˜„์žฌ ๋‹จ๊ณ„์˜ ๋ฒˆํ˜ธ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค
  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;
    }
}

์š”์†Œ "A"๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •:
Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

๊ธฐ์กด ๋„คํŠธ์›Œํฌ์— ํ†ตํ•ฉ

์ œ์•ˆ๋œ ๋ˆ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋…ธ๋“œ๋Š” UTXO ์ง‘ํ•ฉ์„ ๊ณ„์† ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ๋ชจ๋“  UTXO๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฆ๊ฑฐ ์ž‘์—…์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

UTXO ๋ˆ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ฆ์ธ ๋…ธ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝคํŒฉํŠธ (์ปดํŒฉํŠธ ์ƒํƒœ ๋…ธ๋“œ), ๋ˆ„์‚ฐ๊ธฐ๊ฐ€ ์—†๋Š” ๊ฒ€์ฆ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ (ํ’€๋…ธ๋“œ). ๋‘ ํด๋ž˜์Šค์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ด๋ฅผ ๋‹จ์ผ ๋„คํŠธ์›Œํฌ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒฉํŠธ ๋…ธ๋“œ์—๋Š” ํŠธ๋žœ์žญ์…˜์— ์‚ฌ์šฉ๋˜๋Š” UTXO์˜ ์กด์žฌ์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ˜๋ฉด, ์ „์ฒด ๋…ธ๋“œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ์กฐ์ •๋œ ๋ฐฉ์‹์œผ๋กœ Utreexo๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒฉํŠธ ๋…ธ๋“œ๊ฐ€ ๋‚จ๊ฒŒ ๋˜์–ด ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹๋„คํŠธ์›Œํฌ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ปดํŒฉํŠธ ๋…ธ๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋…ธ๋“œ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ต๋Ÿ‰. ๋ธŒ๋ฆฌ์ง€ ๋…ธ๋“œ๋Š” Utreexo ๋ฐฐํ„ฐ๋ฆฌ์™€ ์ „์› ๊ณต๊ธ‰ ์ฆ๋ช…๋„ ์ €์žฅํ•˜๋Š” ์™„์ „ํ•œ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  UTXO ์„ธํŠธ์˜ UTXO. ๋ธŒ๋ฆฌ์ง€๋Š” ์ƒˆ๋กœ์šด ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฑฐ๋ž˜ ๋ธ”๋ก์ด ๋„์ฐฉํ•˜๋ฉด ๋ˆ„์‚ฐ๊ธฐ์™€ ์ฆ๋ช…์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„์‚ฐ๊ธฐ์™€ ์ฆ๋ช…์„ ์œ ์ง€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด๋„ ํ•ด๋‹น ๋…ธ๋“œ์— ์ถ”๊ฐ€ ๊ณ„์‚ฐ ๋ถ€ํ•˜๊ฐ€ ๋ถ€๊ณผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์„ ํฌ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌ๋œ ๋‚ด์šฉ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ• ํ•ด์‹œ์™€ ๋น„๊ต Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ• ์ปดํŒฉํŠธ ๋…ธ๋“œ์˜ ํ•ด์‹œ. ์—ฌ๊ธฐ์„œ n์€ UTXO ์„ธํŠธ์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์ž…๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜

Utreexo: ๋งŽ์€ UTXO ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹์••์ถ•

๋ธŒ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ๋…ธ๋“œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋„คํŠธ์›Œํฌ์— ์†Œํ˜• ๋…ธ๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ’€ ๋…ธ๋“œ๋Š” ์ด์ „๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜๋ฉฐ ํŠธ๋žœ์žญ์…˜๊ณผ ๋ธ”๋ก์„ ์„œ๋กœ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ๋…ธ๋“œ๋Š” Utreexo ๋ฐฐํ„ฐ๋ฆฌ ๋ฐ์ดํ„ฐ์™€ ๋‹ค์Œ์— ๋Œ€ํ•œ ํฌํ•จ ์ฆ๋ช… ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•˜๋Š” ์ „์ฒด ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ง€๊ธˆ์€ UTXO์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ๋…ธ๋“œ๋Š” ๋ชจ๋“  ํ’€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ํ’€ ๋…ธ๋“œ์ด๊ณ  ๋ชจ๋“  ์ปดํŒฉํŠธ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ปดํŒฉํŠธ ๋…ธ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅํ•˜์—ฌ ์ž์‹ ์„ ๊ด‘๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” ๋‘ ๋„คํŠธ์›Œํฌ๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ธฐ์กด ํ’€ ๋…ธ๋“œ์—์„œ ์ปดํŒฉํŠธ ๋…ธ๋“œ๊นŒ์ง€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠธ๋žœ์žญ์…˜ ํ˜•์‹์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ์ปดํŒฉํŠธ ๋…ธ๋“œ์— ๋Œ€ํ•œ UTXO ์ฆ๋ช…์„ ํ๊ธฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ปดํŒฉํŠธ ๋…ธ๋“œ๋Š” ๋ธŒ๋ฆฌ์ง€ ๋…ธ๋“œ์˜ ์ฐธ์—ฌ ์—†์ด ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์ฐธ๊ฐ€์ž์—๊ฒŒ ์œ ์‚ฌํ•˜๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” Utreexo ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ณ  Rust๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐฐํ„ฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๋…ธ๋“œ์˜ ํ†ตํ•ฉ์„ ํ—ˆ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ปดํŒฉํŠธ ์บ์น˜์˜ ์žฅ์ ์€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์ด๋ฉฐ, ์ด๋Š” UTXO ์„ธํŠธ์˜ ์„ฑ๋Šฅ์— ๋Œ€์ˆ˜์ ์œผ๋กœ ์˜์กดํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋””์Šคํฌ ๊ณต๊ฐ„ ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์ฆ๋ช… ์ „์†ก์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๋…ธ๋“œ ํŠธ๋ž˜ํ”ฝ์ด์ง€๋งŒ ์ฆ๊ฑฐ ์ง‘๊ณ„ ๊ธฐ์ˆ (ํ•˜๋‚˜์˜ ์ฆ๋ช…์ด ์—ฌ๋Ÿฌ ์š”์†Œ์˜ ์กด์žฌ๋ฅผ ์ฆ๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ)๊ณผ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ํ•œ๋„ ๋‚ด๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ:

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€