본문 바로가기
Bitcoin

비트코인의 지갑

by PudgeKim 2021. 3. 19.

이번 글에서는 비트코인의 지갑이 어떤 표준들에 의해 만들어지고 관련 기술들에 대해 알아보겠습니다.

보통 비트코인의 지갑들은 BIP-32, BIP-39, BIP-44를 참고하여 만듭니다. (이더리움도 조금씩 다른부분이 있지만 비슷합니다.)

 

대부분 HD지갑으로 만들게 되는데 HD는 Hierarchical Deterministic의 약자입니다. HD지갑의 특징은 트리 구조로 파생된 키들을 가지고 있습니다. 트리 구조이기 때문에 부모로부터 자식을 만들고 그 자식은 다시 부모가 되어 자식을 만들 수 있습니다.
아래와 같은 형태입니다.

HD지갑의 장점은 책에서 2가지를 소개하고 있습니다.
첫번째는 하위키의 특정분기의 역할을 나누어서 각각 다른용도로 사용할 수 있다는점입니다.
두번째는 개인키에 접속하지 않고 사용자가 공개키 sequence를 만들 수 있습니다. (공개키 sequence?)

HD지갑은 위 그림에서 나와있듯이 하나의 seed로부터 시작이 됩니다. 이제 이 seed를 구하는 과정에 대해 알아보겠습니다.

 

시드를 구하기 이전에 니모닉 코드에 대해 알아야합니다. BIP-39에 의해 표준화 되어있습니다.

니모닉이란 단어 시퀀스를 사용한 방법으로 몇 개의 단어들의 나열을 사용자에게 기억하게 함으로써 이 단어들의 나열은 나중에 지갑 복구에 사용됩니다.

예를 들어 wall cliff insect more detail hub 등의 나열을 사용자에게 가르쳐주고 사용자는 이를 동일한 순서로 기억해야합니다.

 

그럼 니모닉 단어가 어떻게 생성되는지 알아보겠습니다.

1. 128~256비트의 무작위 암호화 시퀀스 S를 생성합니다. (이 예제에서는 128비트로 설명하겠습니다.)

2. 128비트를 32로 나누어서 4라는 값을 얻습니다. (이 예제에서는 128비트를 사용해서 128/32 인것이고 만약 256비트라면 256/32를 해야합니다.)

3. S를 SHA-256함수에 넣어 결고 값을 얻습니다. 결과값이 아래와 같다고 가정해봅시다.
0111000010101100101 ....
우리는 이 결과 값의 첫 4비트만 사용합니다. (이 4는 2번과정의 결과로 나온 값이므로 만약 S가 256비트라면 8입니다.)

4. S의 마지막에 3번의 결과 값인 0111을 추가합니다. (여기서 햇갈리지 말아야 할점은 우리는 지금 원본S와 해쉬함수에 넣은 S의 일부 둘 다 사용하고 있는 점입니다.)

5. 4번의 결과값을 S`이라고 하겠습니다. S`을 11비트 단위로 나눕니다. 

6. 2048 단어로 구성된 BIP-39 영어 단어 목록에서 각 11비트마다 매칭되는 단어를 나열하여 니모닉 코드를 생성합니다.
예를 들면 첫 11비트가 01110000111라면 영어 단어 목록에 01110000111: 'lion' 이런 식으로 각 단어가 매칭되어 있습니다.
즉, S`은 128 + 4 = 132비트이고 132비트를 11비트 단위로 나누었으니 총 12개의 단어를 얻을 수 있습니다.

 

이제 이 단어들을 기반으로 시드를 구하는 과정을 알아보겠습니다.

시드는 PBKDF2라는 함수를 사용하여 만들게 되는데 이 함수는 2가지 parameter를 필요로 합니다. 한가지는 위에서 구한 니모닉 단어들이고 나머지 하나는 salt입니다.

salt란 사용자가 추가로 정하는 암호로 만약 선택하지 않는다면 기본값인 "mnemonic"으로 설정되고
만약 사용자가 지정한다면 기본값인 "mnemonic"에 추가되어집니다.

예를 들어 사용자가 "secretkey123"이란 암호를 추가했다면 salt는 "mnemonicsecretkey123"이 됩니다.

PBKDF2는 HMAC-SHA512 알고리즘으로 우리의 니모닉 단어들과 salt를 인자로 집어넣으면 내부적으로 2048 해시 라운드를 사용하여 최종 결과 값으로 512비트 값을 출력하게 되고 이게 바로 시드입니다.
*2048라운드란 예를들어 해쉬함수 f(x)가 있고 f(1)의 결과값이 2라면 이 결과값을 다시 f(x)에 넣습니다. 그럼 2라운드를 돌린 것입니다.

당연한 이야기지만 같은 니모닉 단어들이여도 salt값이 다르다면 시드 값은 달라집니다.

 

 

 

'Bitcoin' 카테고리의 다른 글

비트코인에서의 분기  (0) 2021.03.21
비트코인의 orphan block  (0) 2021.03.21
비트코인의 채굴원리  (0) 2021.03.19
비트코인에서의 Base58 인코딩  (0) 2021.03.18
비트코인의 머클트리(Merkle Tree)  (0) 2021.03.17