Leo's Garage

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.5-2 본문

BlockChain/Mastering Bitcoin

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.5-2

LeoBehindK 2020. 1. 15. 20:28
728x90
반응형

앞 장에 이어서 정리하도록 하겠다.

Creating an HD Wallet from the Seed

Mastering Bitcoin Ch.5 Figure 5-9

 

HD wallets are created from a single root seed,
which is a 128-,256- or 512- bit random
number.

HD 지갑은 우리가 앞서 살펴봤던 것과 같이 니모닉(기억할 수 있는) 단어와 개인 비밀번호를 합친 후, 스트레칭 함수로 늘린 512bits를 보통 시드로사용한다.

이렇게 만들어진 루트 시드를 HMAC-SHA256이라고 하는 단 방향 해시 함수에 넣어서 512bit를 만드는데 왼쪽 256bits은 Master Private Key, 오른쪽 256bits는 Master Chain Code가 된다.

Master Private Key는 앞 장에서 다뤘던 것과 같이 elliptic curve 함수를 이용하여 Master Public Key를 만들어 낸다.

Private child key derivation

HD wallets use a child key derivation (CKD)
function to derive child keys from parent keys.

우리는 이제 Private Child Key를 생성하는 과정을 살펴 볼 것 이다.
HD 지갑에서는 CKD라는 함수를 사용하여 부모 키에서 자녀 키를 생성한다. 그 중 Private Child Key를 도출하는 방법은 아래와 같다.

Mastering Bitcoin Ch.5 Figure5-10

 

위와 같이 Parent Private Key와 Parent Chain Code 그리고 Index 값을 HMAC-SHA512라고 하는 단 방향 해시 함수에 넣으면 왼쪽 256bits와 이전 Private key를 통해서  Child Private Key가 되고 오른쪽 256bits는 Child Chain Code가 된다.

여기서 알 수 있는 점은 Child Key 혹은 Index 값을 아는 것만으로는 다른 Child Key를 도출 할 수 없으며, 특정 Child Key와 초기 Chain Code를 아는 것만으로는 다음 자녀 키를 확인 할 수 없다. 왜냐면 Child Key는 각각의 바로 앞의 Parent Chain Code로 부터 도출되기 때문이다.

위 그림에서 보면 왼 쪽에 Index Number 32bits값을 0로 설정한 것을 볼 수 있다. 이에 따라 생성된 자녀 키의 Index는 0이다.

각각 부모 키는 Index 32bits 중 2에 31제곱 (2,147,483,647)개의 자녀 키를 만들 수 있다 이는 총 32bits로 표현할 수 있는 수 중 절반인데 나머지 절반으로는 뒤에서 소개할 방법으로 자녀키를 만든다. 일단은 이렇게 이해하도록 하자.

Using derived child keys

The Child key also cannot be used to find
any siblings. if you have nth child, you cannot
find its siblings, such as the n-1 child or
the n+1 child, or any other children that are part of the sequence.

자녀 Private Key는 비결정적 키와 구분이 되지 않는다. 이 키를 도출한 함수가 단 방향 함수이기 때문에 자녀 키로는 부모키를 찾을 수 없다. 마찬가지로 자녀 키로 그들의 자녀키를 찾는 것도 불가능하다. 오로지 부모키와 체인코드만이 모든 자녀를 도출할 수 있고, 이는 마찬가지로 자녀키와 그 자녀 체인코드가 있을 때, 손자키를 도출 할 수 있음과 같다.

*같은 Level의 자녀 키끼리는 서로를 찾을 수 없다

Extended keys

우리가 먼저 살펴봤던 것과 같이, 세 가지 Input (key, chain code, index)이 있으면 CKD 함수를 통해서 트리 내에 어떤 레벨의 자녀라도 생성할 수 있다.

The term "extended key" could also be thought of
as "extensible key" because such a key can be used
to derive children.

위 설명과 같은 이 extended key는 간단하게 아래와 같이 표현된다.
총 512bits이며 256bit Key와 256bit의 Chain Code로 구성된다.

여기에 두 가지 타입의 extended key가 있다.

1. (k,c) : k는 normal private key, c는 chain code이다.
2. (K,c) : K = point(k), 즉 public key 그리고 c는 chain code이다.
(단, 여기서 K는 prefix가 적용된 Compressed Public key를 의미하므로 실제로는 256bit + 8bit이 추가되어 264bit이다.)

1번은 extended private key라고 부르며, child private key를 생성할 수 있고 그것으로 child public key까지 생성할 수 있다.

2번은 extended public key라고 부르며, 오로지 child public key만을 생성할 수 있다.

An extended key consists of a private or public
key and chain code. An extended key can
children, generating its own branch in the tree
structure. Sharing an extended key gives access to the entire branch.

확장된 키를 가지고 있으면 우리는 자식 키로 구성된 우리만의 트리 구조의 지갑을 만들 수 있으며, 이 확장된 키를 공유하면 이 전체 구조에 접근할 수 있게 한다.

이러한 extended key는 서로 다른 BIP-32 호환 지갑 상에서 쉽게 추출되고 입력될 수 있는데 이 과정에서 Base58Check를 사용하여 인코딩한다.

Private key의 경우에는 'xprv', Public key의 경우에는 'xpub'을 Prefix로 사용하여 encoding하게 된다.

예시는 아래와 같다.

xprv9tyUQV64JT5qs3RSTJkXCWKMyUgoQp7F3hA1xzG6ZGu6u6Q9VMNjGr67Lctvy5P8oyaYAL9CAWrUE9i6GoNMKUga5biW6Hx4tws2six3b9c

xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeMVKZBPLrtJunSDMstweyLXhRgPxdp14sk9tJPW9


Public child Key derivation

Mastering Bitcoin Ch.5 Fig5-11

 

위에서 언급한 것과 같이 부모 Public key와 Chain code를 가지고 있으면 index를 사용하여 Child Public key를 생성할 수 있다.

말 그대로 Private Key에 대한 정보없이도 각 index별 혹은 각 level별의
수많은 자녀 Public key는 생성 가능하고 활용이 가능하다는 말이다.

이 점의 장점은 명확하다.

예를 들어 비트코인 지갑이 연동된 웹사이트 (특히 상업 웹사이트)를 운영한다고 해보자. 우리는 상대적으로 보안이 취약한 이 웹사이트에 굳이 위험하게 Private key를 올리지 않고, 부모 Public key와 Chain code만으로 거래 대금을 받거나, 거스름돈을 받을 수많은 주소들을 자녀 Public Key를 만들어 생성할 수 있다.

앞서 보았던 Cold Wallet의 경우처럼 web과 isolation된 기기에 Private키를 보관하고 Public Key는 웹에 연동하여 오로지 받는 용도의 주소로 활용할 수도 있다.

Hardened Child key derivation

Mastering Bitcoin Ch.5 Fig.5-13

 

Hardened derivation의 목적은 명확하다.

바로 Parent Public Key와 Child Chain Code의 관계를 없애는 것이다.
다른말로 하면 방화벽을 세우는 작업이다.

왜 이런 일이 필요할까?

xpub을 이용하여 우리가 수많은 지갑들을 웹 상에 올렸다고 해보자.
이 xpub에는 Chain Code가 포함되어 있다. 만약에 누군가의 실수로
Child private key가 노출된다면, 그것들을 이용하여 다른 Child Private
Key들을 도출해 낼 수 있다. 더 나쁜 경우에는 Parent Private key마저 유추할 수 있기도 하다.

harden derivation을 사용할 경우, 생성되는 child private key와 chain
code는 일반적인 derivation function과는 완전히 다른 결과가 나온다.

이러한 점을 이용하여 사용자는 일정 트리 레벨마다 harden derivation을 이용하여 외부의 위험에 노출되는 것을 방지한다.

그렇다면 수학적으로 어떻게 이것이 가능한 지 살펴보자

BIP-32를 살펴보면 아래와 같은 내용이 있다.

(BIP-32)

위 내용은 타원곡선 방정식 내의 (+) 연산과 각 표준 변환 함수의 정의를 내리고 있다. 

가령 Point(p)는 secp256k1 타원 곡선에서 Base 지점으로 부터 정수 값 P만큼 (+)연산한 결과 좌표를 의미한다.

ser32(i)는 4byte의 unsigned int i를 32bit로 나열한다는 의미이다.

(BIP-32)

위 내용은 Private parent Key에서 Private child key를 도출하는 과정과 
Public parent key에서 public child key를 도출하는 과정을 설명한다.

여기서 Private parent Key에서 Private child key를 도출하는 과정에서 I, 즉  index value가 2의 31제곱보다 같거나 큰지를 확인하는 과정이 있다. 이 과정이 바로 hardened child를 도출할 지 아니면 그냥 normal child를 도출할 지 결정하는 과정이다.

즉 앞 서 말한 것과 같이 normal한 child key를 생성할 수 있는 가지 수는
2의 31제곱 개만큼이다. 나머지 절반의 수는 즉 hardened child의 몫이 된다. 

(BIP-32)

마지막 장은 Private Parent key에서 public child key를 도출하는 방식이다. 

처음에 수학적으로 각 도출식이 어떻게 이루어지는지 정확히 파악하지 못해 시간이 오래걸렸다. 다행히 BIP에서 이러한 부분을 자세히 설명해주어 이해할 수 있었다.

동원샘물 미네마인, 2L, 12개

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

728x90
반응형
Comments