Hierarchical Deterministic Wallet
HD Wallet
HD Wallet์ด๋ ๋ฌด์์ผ๊น?
HD ์ง๊ฐ(์์ด์น๋ ์ง๊ฐ)์ด๋ Hierarchical Deterministic Wallet์ ์ฝ์๋ก์, ํ๋์ ๋ง์คํฐ ์๋(seed) ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌด์ํ ๋ง์ ์ฃผ์๋ฅผ ์์ฑํ ์ ์๋ ์ํธํํ ์ง๊ฐ์ด๋ค. ๊ณ์ธต์ ๊ฒฐ์ ์ง๊ฐ์ด๋ผ๊ณ ๋ ํ๋ค.
โํด์๋ท ์ํคโ
ํ ๋ง๋๋ก ๋ง์คํฐ seed ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ฃผ์๋ฅผ ์์ฑํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ง๊ฐ์ด๋ค.
๋งค๋ฒ ์ฝ์ธ์ ํธ๋์ญ์
์ด ๋ฐ์ํ ๋๋ง๋ค ์ง๊ฐ์ ์ฃผ์๊ฐ ์๋ก ์์ฑ๋๋ ์ง๊ฐ์ HD Wallet
์ด๋ผ๊ณ ํ๋ค.
๋ณดํต ์ผ๋ฐ์ ์ผ๋ก๋ ์ง๊ฐ = 1๊ฐ์ ์ฃผ์๋ผ๊ณ ์๊ฐํ๋๋ฐ, ๊ทธ๋ ์ง ์๋ค.
ํ๋์ ์ง๊ฐ์ ์ฌ๋ฌ ์ฃผ์๋ฅผ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ ์๋ ์์ผ๋ฉฐ, ์ด๋ ๊ฒ ์์๋ก ์ฌ๋ฌ ๊ฐ์ ์ฃผ์๋ฅผ ๊ทธ๋ ๊ทธ๋ ์ถ๊ฐ ์์ฑํ๊ธฐ๋ ํ๋ค.
๋ด๋ถ์ ์ผ๋ก ์ถ๊ฐ๋๊ณ ์์ฑ๋ ์ ์ด ์๋ ๋ชจ๋ ์ฃผ์๋ ๊ณ์ํด์ ์ ํจํ๋ฉฐ, HD ์ง๊ฐ ๋ด์์ ํตํฉ๋์ด ๊ด๋ฆฌ๋๋ค.
์ง๊ฐ์์ ๋ณด์ฌ์ง๋ ์์ก์ ์ด ๋ชจ๋ ์ฃผ์์ ๋ค์ด์๋ ์ฝ์ธ ์์ ์ดํฉ์ด ๋๋ฉฐ, ์์ ๊ฐ๋ฅํ๊ฒ ํ์๋๋ ์ฃผ์๋ ๋จ์ง ์ต๊ทผ์ ์์ฑํ ์ฃผ์๋ฅผ ๋ํ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ ๋ฟ์ด๋ค.

์ ๊ทธ๋ฆผ์ ์ดํด๋ณด์. 12 word random Mnemonic
์์ Master Private Key
๊ฐ ๋์จ๋ค.
๊ทธ ๋ค์์ผ๋ก add Counter
๋ผ๋ ์์
์ ๊ฑฐ์น๋๋ฐ, ๋จ์ํ๊ฒ ์๊ฐํด์ ๋ด๊ฐ 10๊ฐ์ ์ฃผ์๋ฅผ ์์ฑํ๊ฒ ๋ค๊ณ ํ๋ค๋ฉด 10๊ฐ๊น์ง ์์
์ ์งํํ๋ฉด ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด generate key
๋จ๊ณ์์ 10๊ฐ์ private key๊ฐ ๋์ค๊ณ , ๋น์ฐํ ์ด๋ฅผ ํตํด 10 ๊ฐ์ ์ฃผ์๋ฅผ ์์ฑํ ์ ์๋ค.
๊ฐ๊ธฐ ๋ค๋ฅธ 10๋ช ์ด ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ ์ฃผ์์ ์ ๊ธํ๋๋ผ๋, 1๊ฐ์ ์ง๊ฐ์ ๋์ด ๋ชจ์ด๊ฒ ๋๋ค.
์ํํ์ง ์์๊น?
๊ทธ๋ ์ง ์๋ค. ์คํ๋ ค ๋ ์์ ํด์ง๋ค.
๋ธ๋ก์ฒด์ธ์ ์ง๊ฐ ์ฃผ์๋ ์ด๋ฉ์ผ๊ณผ ๊ฐ๋ค. ๋จ ํ๋์ ์ฃผ์๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ด๊ฐ ๋ณด๋ด๊ณ ๋ฐ๋ ๋ชจ๋ ํธ๋์ญ์ ๋ด์ญ์ ํ ๋์ ํ์ ํ ์ ์๊ฒ ๋๋ค.
HD์ง๊ฐ์์๋ ํ๋์ ์ง๊ฐ๋ด์ ์ฌ๋ฌ๊ฐ์ ์ฃผ์๋ฅผ ์์ฑํ์ฌ ์์์ ๋ถ์ฐํ์ฌ ๋ณด๊ดํ๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๋ถ๋ถ์ ์ด๋์ ๋ ๋ฐฉ์งํ ์ ์๊ฒ ๋๋ค.
๋ฌผ๋ก ํ์๋ ๋ฌธ์๋ ๋ง์ถ์ด๋ณผ ์ ์๋ฏ์ด, ๋ถ์ง๋ฐํ ๋ธ๋ญ์ฒด์ธ์ ์กฐํฉํด๋ณด๋ฉด ์ด๊ฒ์ด HD์ง๊ฐ ๋ด๋ถ์ ์ฌ๋ฌ ์ฃผ์์ ๊ฒ์ธ๊ฐ ์ถ๋ก ์ ํด๋ณผ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋น์ฐํ ํ ๋์ ์ ๋ฆฌ๋์ด ๋ณด์ด๋ ๊ฒ๊ณผ๋ ์๋นํ ์์ค์ ์ฐจ์ด๊ฐ ์๋ค.
์์์ ๋น๋ฐํค๊ฐ ๋
ธ์ถ๋๋ฉด ๋ถ๋ชจ์ ๋น๋ฐํค๋ ์ํํ์ง ์์๊น?
๋น์ฐํ ๊ด์ฐฎ๋ค. ์์์ ๋น๋ฐํค๋ก ๋ถ๋ชจ์ ๋น๋ฐํค๋ฅผ ์ญ์ฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๊ตฌํ๋ฒ
Seed
HD ์ง๊ฐ์ ๋ฃจํธ ์๋(Root Seed) ํ ๊ฐ๋ก๋ถํฐ ๋ง์ ํค์ ์ฃผ์๊ฐ ์์ฑ๋๋ค.
๋ฃจํธ ์๋๋ ๋๋ชจ๋ ๋จ์ด ์์(Mnemonic Word Sequence)๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค.
๋ฃจํธ ์๋๋ฅผ HMAC-SHA512 ์๊ณ ๋ฆฌ์ฆ
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด์ํ ๊ฐ์์ ๋ง์คํฐ ๊ฐ์ธํค(Mater Private Key)
๊ณผ ๋ง์คํฐ ์ฒด์ธ์ฝ๋(Master Chain Code)
๋ฅผ ์์ฑํ๋ค.
512๋นํธ์ ํด์๋ ๊ฐ์์ ์ผ์ชฝ 256๋นํธ๋ฅผ ๋ง์คํฐ ๊ฐ์ธํค๋ก ์ฌ์ฉํ๊ณ , ์ค๋ฅธ์ชฝ 256๋นํธ๋ฅผ ์ฒด์ธ์ฝ๋๋ก ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์คํฐ ๊ณต๊ฐํค๋ ํ์๊ณก์ ๊ณฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์คํฐ ๊ฐ์ธํค๋ก๋ถํฐ ๊ณ์ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์๋(A)๋ฅผ ์์ฑํด์ ์ด ์๋(A)๋ฅผ ๊ฐ์ง๊ณ ๋ง์คํฐ ํค๋ฅผ ์์ฑํ๋ค.
๋ฐ๋ผ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์์ํค๋ ๋๋ชจ๋ ํน์ ๋ฃจํธ ์๋๋ง ์๊ณ ์๋ค๋ฉด ์๋ฐฑ๋ง ๊ฐ์ ํค๊ฐ ํฌํจ๋ HD ์ง๊ฐ์ ๋ฐฑ์ , ๋ณต์, ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์ ๋ฃจํธ ์๋๋ฅผ ๋ง๋ค์ด๋๊ณ ๋ค์ ์๋(A)๋ฅผ ๋ง๋๋๊ฑธ๊น?
์ด ๋ DRBG๋ผ๋ ๊ฒ์ด ์ฌ์ฉ๋๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋๋ค ํจ์๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ด๊ฒ์ ์ฌ์ค ์์ธก์ด ๊ฐ๋ฅํ ๊ฐ์ง ๋์์ด๋ค.
๋ฐ๋ผ์ ์ง์ง ๋์๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๊ฐ์ง ๋์๊ฐ์ ํด์ฑํ ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ง์ง ๋์๋ฅผ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ์ DRBG
๋ผ๊ณ ํ๊ณ , HD ์ง๊ฐ์์ ์๋ํค๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
์๋์์ ๋ง์คํฐํค๊ฐ ์ด๋ป๊ฒ ๋์ค๋๊ฑธ๊น?
๊ณ์ธต ๊ฒฐ์ ์ ์ง๊ฐ์ ์์ํค ์ ๋ ํจ์(CKD)๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจํค๋ก ๋ถํฐ ์์ํค๋ฅผ ํ์ํ๋ค.
์์ํค ์์ฑ์๋ ๋ถ๋ชจํค, ์ฒด์ธ์ฝ๋, ์ธ๋ฑ์ค ๋ฒํธ๊ฐ ์ฌ์ฉ๋๋ค.
์์ํค๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ถ๋ชจํค, ์ฒด์ธ์ฝ๋, ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๊ฒฐํฉํ์ฌ HMAC-SHA512๋ก ํด์ํ๋ค.
ํด์๋ ๊ฐ(512๋นํธ)์ ๋ฐ์ผ๋ก ๋๋ ๊ฐ์ธํค(256๋นํธ)์ ์ฒด์ธ์ฝ๋(256๋นํธ)๋ฅผ ์์ฑํ๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก ์์ํค๋ฅผ ๊ณ์ ์์ฑํ ์ ์๋ค.
๊ฐํ๋ ์ ๋๋ฒ (Hardened Derivation)
๋ง์ฝ ์์ ํ์ฅ ๊ฐ์ธํค๊ฐ ์ ์ถ๋๋ ๊ฒฝ์ฐ, ์์ ํ์ฅ ๊ฐ์ธํค๊ฐ ํฌํจํ๊ณ ์๋ ํค์ ์ฒด์ธ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์์์ ๊ฐ์ธํค ์ ๋ถ๋ฅผ ์์ ๋ผ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ๋์ํ๊ธฐ ์ํด HD์ง๊ฐ์ ๊ฐํ๋ ์ ๋(Hardened Derivation) ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐํ๋ ์ ๋ ํจ์๋ ๋ถ๋ชจ ํค์ ์์ ์ฒด์ธ์ฝ๋ ๊ด๊ณ๋ฅผ ๋์ด๋ฒ๋ ค์, ๋ถ๋ชจํค์ ์์ํค ์ฌ์ด์ **๋ฐฉํ๋ฒฝ(firewall)**์ ๋ง๋ ๋ค.
m/44'/60'/0'/0/0 ์ ๋ญ๊น
์์ ์ ์ ์๋ ์ ๋ฌธ์ฅ์ ๋ฐ๋ก ๊ฒฝ๋ก
์ด๋ค.
HD ์ง๊ฐ์ ๊ฐ ํธ๋ฆฌ ๋ ๋ฒจ์ ์ฌ๋์๋ก ๊ตฌ๋ถ๋๋ค.
๋ง์คํฐ Private Key์์ ํ์๋ ๋น๋ฐ ํค๋ m
์ด ๋๊ณ , ๋ง์คํฐ ๊ณต๊ฐ ํค์์ ์์ฑ๋ ๊ณต๊ฐํค๋ M
์ด ๋๋ค.
์ด ํ ํธ๋ฆฌ ๋ ๋ฒจ์ด ๊น์ด์ง ์๋ก ์ฌ๋์๊ฐ ๋ ๋ถ์ผ๋ฉด์ ๊ฒฝ๋ก๊ฐ ์ถ๊ฐ๋๋ค.
M / 0 : ๋ง์คํฐ ๊ณต๊ฐํค์ ์ฒซ ๋ฒ์งธ ์์ ๊ณต๊ฐํค
m / 0 : ๋ง์คํฐ ๋น๋ฐํค์ ์ฒซ ๋ฒ์งธ ์์ ๋น๋ฐํค
m / 0 / 1 : ๋ง์คํฐ ๋น๋ฐ ํค์ ์ฒซ ๋ฒ์งธ ์์์ ๋ ๋ฒ์งธ ์์ ๋น๋ฐํค
โฆ
BIP-44
๋นํธ์ฝ์ธ์ BIP-44 ํ์ค์ ๋ณต์กํ ํค ์์ฑ์ ๋ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
BIP-44๋ ๋ฏธ๋ฆฌ ์ ์๋ 5๊ฐ์ ๋ ๋ฒจ์ path๋ก ๊ตฌ์ฑ๋๋ค.
m / purpose' / coin_type' / account' / change / address_index
๊ฒฝ๋ก์ ์๋ ์ํฌ์คํธ๋กํผ(') ๋ฌธ์๋ BIP-32์ ๊ฐํ๋ ์ ๋(hardened derivation)๊ฐ ์ฌ์ฉ๋จ์ ๋ํ๋ธ๋ค.
purpose๋ 44'๋ฅผ ์ฌ์ฉํ๋ค. BIP-44 ๊ท๊ฒฉ์ด ์ฌ์ฉ๋จ์ ์๋ฏธํ๋ค.
coin_type์ ๊ฐ์ํํ ์ฝ์ธ ์ ํ์ ์๋ฏธํ๋ค. ์ด๋๋ฆฌ์์ 60'์ ์ฌ์ฉํ๋ค. ๋ค๋ฅธ ์ฝ์ธ ์ ํ ์ฝ๋๋ SLIP0044 ํ์ค ๋ฌธ์์์ ์ฐพ์ ๋ณผ ์ ์๋ค.
account์ ํ๊ณ๋ ์กฐ์ง ๋ชฉ์ ์ ์ํด ์ง๊ฐ์ ํ์ ๊ณ์ข๋ก ์ธ๋ถํํ ๋ ์ฌ์ฉํ๋ค.
change์ ์ด๋๋ฆฌ์์์ ์ฌ์ฉํ์ง ์๋๋ค.
๋นํธ์ฝ์ธ์์ ์์ ์ฃผ์(receiving address)์ ์์ก ์ฃผ์(change address)๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
address_index๋ ์ฃผ์ ๋ฒํธ๋ฅผ ์๋ฏธํ๋ค. ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ค.
Javascript ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
var Bitcore = require('bitcore-lib');
// ๋ง์คํฐ ํ์ฅ ๊ฐ์ธํค ์์ฑ
var xPriKey = new Bitcore.HDPrivateKey();
// ๋จ์ ๋ ํ์ฅ ์์ ๊ณต๊ฐํค ์์ฑ
var xPubKey = xPriKey.deriveChild("m/44'/60'/0'").hdPublicKey;
// 0๋ฒ์งธ ์์ ๊ณต๊ฐํค ์์ฑ
var pubKey = xPubKey.deriveChild("m/0/0").publicKey;
console.log(publicKey)
pubKey
๊ฐ ์์์ ๊ณต๊ฐํค ์ฃผ์, xPriKey
๊ฐ ์์์ ๋น๋ฐํค๊ฐ ๋๋ค.
๋๋ชจ๋ ์ฝ๋ ๋จ์ด BIP-39
๋๋ชจ๋ ์ฝ๋ ๋จ์ด(mnemonic code words)๋ ์์๋๋ก ๋์ด๋ ์์ด ๋จ์ด์์ ์๋(seed)๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
๋๋ชจ๋ ์ฝ๋๋ BIP-39 ํ์ค์ ์ ์๋์ด ์๋ค. ๋๋ชจ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด HD ์ง๊ฐ์ ์ฝ๊ฒ ๋ณต์ํ ์ ์๋ค.
๋๋ชจ๋ ์ฝ๋ ๋จ์ด์ด์ 12 ~ 24 ๋จ์ด๋ก ๊ตฌ์ฑ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ ๋๋ชจ๋ ์๋์์ ํค๋ฅผ ์์ฑํด๋ณด์.
var Mnemonic = require('bitcore-mnemonic');
// ๋๋ชจ๋ ์ฝ๋ ์์ฑ
var code = new Mnemonic(Mnemonic.Words.ENGLISH);
console.log(code.toString());
// ๋๋ชจ๋ ์ฝ๋์์ ๊ฐ์ธํค ์์ฑ
var xPriKey = code.toHDPrivateKey();
console.log(xPriKey);
๋๋ชจ๋ ๋จ์ด๋ก๋ถํฐ ๊ฐ์ธํค๋ฅผ ๋ณต์ํ ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// ๋ณต์์ฉ ๋๋ชจ๋ ๋จ์ด
var words = "damage clog alert hurt fork purchase iron cotton apple buffalo survey vast";
// ๋๋ชจ๋ ๋จ์ด๋ก ๋ถํฐ ๊ฐ์ธํค ๋ณต์
var xPriKey = Mnemonic(words).toHDPrivateKey();
console.log(xPriKey);
์ฐธ๊ณ ๋ก bip39 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๊ธ์ ๋๋ชจ๋ ๋จ์ด๋ก ์ฌ์ฉ ํ ์ ์๋ค.
๋ง์ฝ ์ด๋๋ฆฌ์ ์ง๊ฐ์ ๊ฐ๋ฐํ๋ค๋ฉด BIP-32, BIP-39, BIP-43, BIP-44 ํ์ค์ ๋ฐ๋ผ ๋๋ชจ๋ ์ฝ๋๋ฅผ ์๋๋ก ์ฌ์ฉํ๋ HD์ง๊ฐ์ผ๋ก ๊ตฌํํด์ผ ํ๋ค.
Sources โฆ
Last updated