✅ 표준 설명
- 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.cpp | BIP-44 vs BIP-84 등 적용 |
🧠 요약 흐름도
csharpCopyEdit[Mnemonic (BIP-39)]
↓
[Seed: 512bit]
↓
[DerivationPath (BIP-44/84)]
↓
[Private Key]
↓
[Public Key]
↓
[Address: Coin-specific format]