BIP(Bitcoin Improvement Proposl)-39는 2가지를 정의하고 있다.
Mnemonic을 만드는 것은 엔트로피로부터 시작된다.
엔트로피는 128~256 비트 사이의 임의의 숫자이며,
숫자의 비트 크기가 클 수록 더 많은 mnemonic words들이 생성되게 되고, 보안성이 증가한다 볼 수 있다.
128비트 -> 12단어, 256 -> 24단어이며, 32비트마다 3단어씩 증가한다.
예를 들어, 12단어 Mnemonic을 생성하려면 128비트 크기의 임의의 숫자 하나를 고르면 된다.
128비트 크기면 2^128승이고 이는 말도 안되게 큰 숫자로,
다른 사람이 고른 숫자를 다시 고르는 확률은 매우 희박하다. 아니, 사실상 불가능하다.
관련영상(256 비트 이야기지만, 뭐 128비트 비유만 들어봐도..)
그 후, 우리는 그 숫자를 12단어로 쪼갤거다.
하지만 128비트는 12로 나누어 떨어지지 않으니, checksum
이라는 걸 엔트로피 끝에 더해야 한다.
다른 크기의 비트들도 12에 나누어 떨어질 수 있도록 checksum
을 더해주면 된다.
그럼 엔트로피를 SHA-256로 hash하고, 그 중 앞에서부터 checksum
크기만큼의 비트들을
엔트로피 끝에 추가적으로 붙여주면 끝이다.
그럼 이제 128 + 4 / 12 = 11
에 의해, 각 12단어들은 11비트 크기의 숫자가 된다.
이를 magic number
라고 하는데, 이 숫자의 범위는 0~2^11, 즉 0~2047이 된다.
이 숫자 하나에 단어 하나씩 매핑해서 보여주면, 그게 Mnemonic Words가 된다.
bip39-english
자 이제 Mnemonic을 구했으니, 여기서 Seed
를 구하는 법을 알아보자
이 Seed
가 우리가 만들고자 하는 private key
에 해당한다고 보면 될 것 같다.
이 Seed
는 PBKDF2라는 함수로 구해지는데
이 함수의 input은 다음의 3개의 인자로 구성되어 있다.
여기서 Salt가 바로 월렛 어플리케이션이 설정할 수 있는 부분인데,
mnemonic
과 특정 string을 붙이면 된다. (ex. mnemonic-hello-world
)
그럼 BIP-32는 무엇인가?
사실 BIP-32는 BIP-39와 반대되거나 유사한 개념이라기보다는, 아예 다른 개념이라고 보는 것이 맞다.
그냥 32번째 제안, 39번째 제안일 뿐이다.BIP-39 -> “Mnemonic code for generating deterministic keys”
BIP-32 -> “Hierarchical Deterministic Wallets”
BIP-44 -> “Multi-Account Hierarchy for Deterministic Wallets”
BIP-32는 우리가 BIP-39에서 생성한 Seed로부터, 여러 개의 Key pair를 만드는 방법이다.
BIP-39와 함께 쓰면, 하나의 Mnemonic sentence나 Seed로부터
여러 개의 Key pair를 만들 수도, 복구할 수도 있다.
BIP-32의 가장 핵심 개념은 계층적 결정(Hierarchical Deterministic) 지갑이다.
즉,
무슨 말인지 직접 해보면서 알아보자
이를 위해 BIP-39의 과정을 거쳐 아래의 Seed가 생성되었다고 가정하자.
fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542
가장 먼저 해야할 것은 이 Seed를 root key
로 변환하는 것이다.
우리가 생성할 모든 Key pair는 이 root key
으로부터 derive 될 것이다.
이를 생성하는 방법은 체인마다 조금 다른데, 비트코인의 방식을 사용하면 다음과 같이 나온다
(비트코인만의 방식인지, 다른 체인도 유사한지는 좀 봐야 알 것 같다)
xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U
이걸 root key, 또는 extended private key(xprv
)라고 한다.
이제 xprv
와 path
를 이용해 여러 Key pair를 만들어내면 된다.
https://wolovim.medium.com/ethereum-201-mnemonics-bb01a9108c38
https://wolovim.medium.com/ethereum-201-hd-wallets-11d0c93c87f7
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
https://bitcoin.stackexchange.com/questions/62533/key-derivation-in-hd-wallets-using-the-extended-private-key-vs-hardened-derivati/63996#63996