본문으로 바로가기

지갑(Wallet)은 개인키(Private 키) 와 공개키(Public key)를 담는곳입니다.

비트코인과 같은 화폐가 저장되는곳이 아니고  키가 저장되는곳입니다.

실제 비트코인은 UTXO(Unspedt Transaction Output)의 형태로 블록체인상에 여러 사용자에게 모두 공유되어 저장이 되어있고, 자신의 비트코인을 사용하고자 할때 키를 사용하여 자신소유임을 증명하여 사용하게 되는 것입니다.

이와같이 지갑은 실제 비트코인을 저장하는것이 아니고, 자신 소유임을 증명하기위한 개인키와 공개키를 저장하는 곳입니다.


지갑은 그 종류에 따라 다음과 같이 3가지로 나누어집니다.


1. 비결정적 지갑

2. 결정적 지갑

3. 계층 결정적 지갑


각 지갑의 특징에 대해서 알아보도록 하겠습니다.


1. 비결정적 지갑


비결정적 지갑은 말그대로 무작위로 선택된 Private 키가 저장되어있는 지갑입니다.

쯕, 여러개의 키 사이에 규칙이나 연속성이 없이 무작위로 생성이 되는것입니다.

예를 들어 지갑이 생성될때 100개의 개인키를 무작위로 생성하여 사용하고 이후 모든키가 사용된후에 다시 무작위로 새로운 키를 생성하는 것입니다.

이렇게 동작되는 경우 지갑의 모든키를 백업하지못한 경우에 지갑이 손실되면 복구를 할수가 없는 문제가 발생할수 있습니다.

즉 지갑의 손실을 방지하기 위해서는 주기적으로 지갑의 모든키를 백업해야 한다는 것입니다.


2. 결정적 지갑


결정적 지갑은 비결정적 지갑의 단점을 보완하기 위해 랜덤하게 발생된 Common Seed 에서 단방향 Hash 함수를 통해서  개인키를 연속적으로 생성합니다.

개념적으로 다음과 같이 볼수 있습니다.



Hash 함수는 입력값이 같은경우 동일한 출력값을 생성하기 때문에 Common Seed만 알고 있다면 연속된 모든 개인키를 복원할수 있습니다.


Common Seed를 생성하기 위해 연상기호 코드 워드(Mnemonic Code Words) 가 사용됩니다.

연상기호코드란 Common seed를 생성하기 위해 사용되는 영어 단어열입니다.

예를 들어, "apple house soccer tree cake gun..." 등의 임의의 단어열입니다.

이러한 단어를 PBKDF2 함수를 사용하여 512비트의 Common Seed를 생성하는것입니다.


연상기호 단어를 생성하는 과정은 다음과 같습니다.


1. 128~256 비트의 random 값 A 생성

2. SHA256(A) 값의 첫 몇비트를 check sum으로 생성

3. check sum을 A 값의 끝부분에 추가

4. A를 11비트로 나누어 24개의 인덱스를 생성하고, 미리 정해진 2048개의 단어로 구성된 배열의 인덱스로 사용하여 단어열 생성


이 과정을 그림으로 표현해보면 다음과 같습니다.




즉, Checksum이 포함된 Random 값을 11비트로 나누어 각각의 인덱스를 생성해내고, 2048개의 단어가 포함된 배열에서 해당 인덱스에 해당하는 단어를 가져와 단어열을 생성하는 것입니다.


연상기호 코드의 엔트로피와 단어길이는 다음과 같이 정의되어 있습니다.

예를 들어 Random 값이 128비트인 경우 체크섬은 해쉬값의 상위 4비트를 가져오며, random값에 4비트를 추가한 132비트를 11로 나누게 되어 단어길이는 12가 됩니다.


 엔트로피(비트)

 체크섬(비트)

 엔트로피+체크섬

 단어 길이

 128

 4

 132

 12

 160

 5

 165

 15

 192

 6

 198

 18

 224

 7

 231

 21

 256

 8

 264

 24


연상기호 코드는 BIP39에 정의되어 있습니다. 

( https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki )


3. 계층 결정적 지갑 (HD 지갑)


계층결정적 지갑(Hierarchical Deterministic wallet) 혹은 HD 지갑이라 하는것으로 BIP0032에서 규정하고 있습니다.

계층 결정적 지갑은 트리 구조에서 생성된 키를 담고 있으며, 부모키가 자식키열을 만들어낼수 있고, 각각의 자식키가 손자키열을 만들어낼수 있습니다.



HD지갑은 128,256,512비트 크기의 Root seed로부터 만들어지며, HMAC-SHA512 알고리즘을 통해 마스터 개인키마스터 체인코드를 생성합니다.

Root seed를 생성하는 과정에는 결정적 지갑에서 설명되고 있는 연상기호 코드 워드가 사용됩니다.

이와같이 HD 지갑은 계층적으로 키를 생성하여 매 거래마다 새로운 주소를 생성하여 거래에 사용할수 있도록 하여 익명성을 보장합니다.