๐Ÿ” BIP-39: ๋‹ˆ๋ชจ๋‹‰ โ†’ ์‹œ๋“œ ๋ณ€ํ™˜

โœ… ํ‘œ์ค€ ์„ค๋ช…

  • BIP-39๋Š” ๋‹ˆ๋ชจ๋‹‰ ๋ฌธ๊ตฌ(mnemonic phrase)์™€ ์„ ํƒ์  ํŒจ์Šคํ”„๋ ˆ์ด์ฆˆ(passphrase)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **512๋น„ํŠธ ์‹œ๋“œ(seed)**๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€๊ฐ‘ ๋ณต๊ตฌ ์‹œ ์‚ฌ์šฉํ•˜๋Š” “๋‹จ์–ด ๋ฆฌ์ŠคํŠธ”๋Š” ์ด ๋‹จ๊ณ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ wallet-core ๋‚ด๋ถ€ ๋™์ž‘

  • ํŒŒ์ผ: HDWallet.cpp
cppCopyEditHDWallet::HDWallet(const std::string& mnemonic, const std::string& passphrase) {
    const auto seed = mnemonicToSeed(mnemonic, passphrase);
    this->seed = Data(seed.begin(), seed.end());
}
  • ๋‚ด๋ถ€ ํ•จ์ˆ˜ mnemonicToSeed๋Š” Trezor-crypto ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ:
cppCopyEditmnemonic_to_seed(mnemonic.c_str(), passphrase.c_str(), seed, nullptr);

๐Ÿงญ BIP-44: ๊ณ„์ธต์  ํ‚ค ํŒŒ์ƒ (HD Wallet)

โœ… ํ‘œ์ค€ ์„ค๋ช…

  • ๊ฒฝ๋กœ ๊ตฌ์กฐ: m / purpose' / coin_type' / account' / change / address_index
  • BIP-44๋Š” ๋ชฉ์ (Purpose) = 44'๋ฅผ ๊ณ ์ •ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ฝ”์ธ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ coin_type ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ: ์ด๋”๋ฆฌ์›€ ์ฃผ์†Œ: m/44'/60'/0'/0/0

๐Ÿงฉ wallet-core ๋‚ด๋ถ€ ๋™์ž‘

  • ํŒŒ์ผ: DerivationPath.cpp ๋ฐ Coin.cpp
cppCopyEditauto path = DerivationPath("m/44'/60'/0'/0/0");
PrivateKey privKey = hdWallet.getKey(path);
auto pubKey = privKey.getPublicKey(TWPublicKeyTypeSECP256k1);
auto address = Ethereum::Address(pubKey);
  • getKey(path)๋Š” ์‹œ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ HMAC-SHA512 ํŒŒ์ƒ์„ ํ†ตํ•ด private key๋ฅผ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ BIP-84: Native SegWit (๋น„ํŠธ์ฝ”์ธ ์ „์šฉ)

โœ… ํ‘œ์ค€ ์„ค๋ช…

  • ๊ฒฝ๋กœ ๊ตฌ์กฐ: m/84'/0'/0'/0/0
  • Bech32 (bc1…) ์ฃผ์†Œ ํฌ๋งท์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋น„ํŠธ์ฝ”์ธ์˜ ์„ธ๊ทธ์œ—(segwit) ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹.

๐Ÿงฉ wallet-core ๋‚ด๋ถ€ ๋™์ž‘

  • ๋น„ํŠธ์ฝ”์ธ ๊ณ„์—ด ์ฝ”์ธ์˜ Coin.cpp์— coinType ๋ณ„ defaultDerivationPath ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
cppCopyEdit// BIP84 - Native Segwit
if (coin == TWCoinTypeBitcoin) {
    return DerivationPath("m/84'/0'/0'/0/0");
}
  • ์‹ค์ œ ์ฃผ์†Œ ์ƒ์„ฑ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ:
cppCopyEditauto privKey = wallet.getKey(coin, derivationPath);
auto pubKey = privKey.getPublicKey(TWPublicKeyTypeSECP256k1);
auto addr = Bitcoin::Bech32Address(pubKey, HRP); // bc1q...

๐Ÿ“ ํ•ต์‹ฌ ๊ด€๋ จ ํŒŒ์ผ ์ •๋ฆฌ

๊ธฐ๋Šฅ๊ฒฝ๋กœ์„ค๋ช…
BIP-39 ์‹œ๋“œ ์ƒ์„ฑHDWallet.cpp, TrezorCrypto/mnemonic.c๋‹ˆ๋ชจ๋‹‰ โ†’ ์‹œ๋“œ
BIP-44 ๊ฒฝ๋กœ ํŒŒ์‹ฑDerivationPath.cpp๊ฒฝ๋กœ ๋ฌธ์ž์—ด โ†’ ์ˆซ์ž ๋ฐฐ์—ด
ํ‚ค ํŒŒ์ƒ (44, 84 ๊ณตํ†ต)HDWallet::getKey(...)์‹œ๋“œ โ†’ private key
์ฃผ์†Œ ์ƒ์„ฑCoin.cpp, Bitcoin/Address.*, Ethereum/Address.*pubkey โ†’ address
์ฝ”์ธ๋ณ„ ๊ฒฝ๋กœ ์ง€์ •Coin.cppBIP-44 vs BIP-84 ๋“ฑ ์ ์šฉ

๐Ÿง  ์š”์•ฝ ํ๋ฆ„๋„

csharpCopyEdit[Mnemonic (BIP-39)]
        โ†“
  [Seed: 512bit]
        โ†“
[DerivationPath (BIP-44/84)]
        โ†“
[Private Key]
        โ†“
[Public Key]
        โ†“
[Address: Coin-specific format]

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค