BIP-32, 39

이동창·2022년 11월 15일
0

BIP-39

BIP(Bitcoin Improvement Proposl)-39는 2가지를 정의하고 있다.

  1. Mnemonic을 생성하는 식
  2. 그 Mnemonic으로부터 Seed을 생성하는 식

엔트로피

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

PBKDF2

자 이제 Mnemonic을 구했으니, 여기서 Seed를 구하는 법을 알아보자
Seed가 우리가 만들고자 하는 private key에 해당한다고 보면 될 것 같다.

SeedPBKDF2라는 함수로 구해지는데
이 함수의 input은 다음의 3개의 인자로 구성되어 있다.

  1. passward (Mnemonic sentence)
  2. Salt
  3. Number of iterations (= 2048)

여기서 Salt가 바로 월렛 어플리케이션이 설정할 수 있는 부분인데,
mnemonic과 특정 string을 붙이면 된다. (ex. mnemonic-hello-world)

BIP-32

그럼 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를 만들 수도, 복구할 수도 있다.

HD Wallet

BIP-32의 가장 핵심 개념은 계층적 결정(Hierarchical Deterministic) 지갑이다.
즉,

  1. 모든 계정은 하나의 루트 키에 뿌리를 두고 있다.
  2. 모든 자식 계정은 루트 키에 의해 결정된다. (의존적으로 재계산된다)

무슨 말인지 직접 해보면서 알아보자
이를 위해 BIP-39의 과정을 거쳐 아래의 Seed가 생성되었다고 가정하자.
fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542

가장 먼저 해야할 것은 이 Seed를 root key로 변환하는 것이다.
우리가 생성할 모든 Key pair는 이 root key으로부터 derive 될 것이다.

이를 생성하는 방법은 체인마다 조금 다른데, 비트코인의 방식을 사용하면 다음과 같이 나온다
(비트코인만의 방식인지, 다른 체인도 유사한지는 좀 봐야 알 것 같다)
xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U

이걸 root key, 또는 extended private key(xprv)라고 한다.

이제 xprvpath를 이용해 여러 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

0개의 댓글