본문 바로가기
프로그래밍/Block Chain

[Bitcoin] 지갑 2

by YuminK 2025. 4. 21.

확장키

키 유도 함수는 세 가지 입력값(키, 체인코드, 색인번호)을 기반으로 자식키를 생성한다. 중요한 요소는 키와 체인코드이고, 이 둘을 결합한 것은 확장키라고 부른다. 확장키는 256비트 크기의 키와 256비트 크기의 체인코드를 512비트 크기의 열로 연결하여 단순하게 표현된다. 확장키에는 2가지 형태가 있다. 확장 개인키는 개인키와 체인코드의 결합으로, 자식 개인키(혹은 자식 공개키)를 얻는데 사용할 수 있다. 확장 공개키는 공개키와 체인코드의 결합으로 자식 공개키를 생성하는 데 사용될 수 있다. 

 

HD지갑의 트리구조에서 확장키를 브랜치의 근원으로 간주해보면, 브랜치의 근원을 가지고 해당 브랜치의 나머지를 구할 수 있다. 확장 개인키만 있으면 브랜치의 나머지 부분을 완성할 수 있는 반면, 확장 공개키는 공개키로 이루어진 브랜치만을 생성할 수 있다. 

 

확장키는 Base58Check를 이용하여 인코딩되며, 서로 다른 bip32의 호환가능한 지갑들 사이에서 데이터를 쉽게 불러오고 전송할 수 있다. 확장키에서 Base58Check 코딩을 하려면 Base58 문자로 인코딩될 때 쉽게 인지되기 위해 xprv와 xpub라는 접두부가 붙는 특수 버전 번호를 사용한다. 

 

공개 자식키 유도하기

계층 결정적 지갑의 매우 유용한 특성 중 하나는 개인키 없이도 공개 부모키로부터 공개 자식키를 얻을 수 있다는 점이다. 자식 공개키를 얻는 방법에는 2가지가 있는데 첫째로 자식 개인키로부터 얻는 방법과 부모 공개키로부터 직접 얻는 방식이다. 따라서 HD지갑 구조의 해당 브랜치 내에서 공개키 전부를 얻기 위해 확장 공개키를 사용할 수 있다. 

 

이 방법을 이용하면 개인 키를 외부에 노출시키지 않으면서 확장 공개키의 복사본만으로도 안전한 서버나 어플리케이션을 만들 수 있다. 다만 이러한 형태의 시스템은 무한 개의 공개키와 비트코인 주소를 만들어내지만, 생성된 비트코인 주소로 송금된 비트코인을 소비할 수 없다. 

 

단절된 자식키 유도하기 

확장 공개키에서 공개키 브랜치를 생성하는 기능은 유용하지만 위험을 수반할 수 있다. 확장 공개키에 접근할 수 있다고 해서 자식 개인키에 접근할 수 있는 것은 아니다. 하지만 확장 공개키가 체인 코드를 포함하고 있기 때문에 자식 개인키를 알게 되거나 혹은 어떤 방법을 통해 자식 개인키가 유출되는 경우, 입수한 자식 개인키와 체인 코드를 함께 사용하면 다른 자식 개인키 전부를 얻을 수 있다. 부모 체인코드와 함께 자식 개인키가 단 하나만 유출되어도 자식 개인키 전부가 알려지게 된다. 이러한 정보가 부모 개인키를 추론하는 데에도 사용될 수 있는 문제점이 있다. 

 

=> 이러한 위험성에 대응하기 위해 HD지갑은 단절 유도법을 사용하여 부모 공개키와 자식 체인코드간의 관계를 끊어버린다. 단절 유도함수는 부모 공개키를 사용하지 않고 부모 개인키를 사용해서 자식 체인코드를 만든다. 이를 통해 부모/자식 열에 '방화벽'이 생성되며 체인코드는 부모 개인키나 다른 자식 개인키를 위험에 빠뜨리지 못한다. 

 

정규유도와 단절유도의 색인번호

유도 함수에서 사용하는 색인 번호는 32비트 정수다. 정규 유도 함수에서 얻은 키와 단절 유도법을 통해 얻은 키를 쉽게 구분하기 위해, 두 영역으로 나눈다. 0~2^31-1은 정규 유도법에서 사용하고 2^31~2^32-1은 단절 유도법에서만 사용된다. 단절 자식키에 대한 색인번호에는 ' 프라임 부호가 붙는다. 

 

HD지갑의 트리구조 탐색하기

부모 확장키 각각은 40억개의 자식키를 보유할 수 있다. 20억 개는 정규 자식이고 20억 개는 단절 자식이다. 자식은 각각 40억 개의 자식을 또 가질 수 있다.

 

bip43에서는 HD지갑 트리 구조에 대한 표준을 제시한다.첫 번째 단절 자식 색인번호를 트리 구조의 용도로 나타내는 특별한 식별자로 사용하길 권장한다. 이 사양을 확장한 bip44에서는 '용도'번호로 44를 제시하고 있다. bip44를 따르는 HD 지갑은 트리의 브랜치를 하나만 사용한다. 

 

m / purpose' / coin_type' / account' / change / address_index

 

purpose'는 44, coin_type은 암호화폐 동전 유형을 의미한다. account는 사용자들에게 지갑을 그룹별 세분화하도록 돕는다. change는 잔액을 받기위한 주소를 여부를 지정한다. (수신주소, 잔액주소) 4번째 단계에서는 정규 유도법을 사용한다. 

 

예시

M/44'/0'/0'/0/2 비트코인 첫 계좌에 대한 세 번째 수신 공개키

M/44'/0'/3'/1/14 네 번째 비트코인 계좌에 대한 15번째 잔액을 받는 주소 공개키

 

암호화된 개인키(bip 38)

bip38은 패스프레이즈를 이용해 개인키를 암호화하고 Base58Check로 개인키를 인코딩하는 데 필요한 공동 표준을 제안한다. 일반적으로 앞이 '5'인 Base58Check 문자열로 되어 있는 WIF형태로 인코딩된 비트코인 개인키를 입력값으로 사용한다. bip38암호화 기법의 결과값은 Base58Check로 인코딩된 암호화 개인키로 앞이 6P로 시작한다. 6P로 시작하는 키를 본다면 해당 키가 암호되었고 WIP 포맷 개인키로 전환하기 위해서는 패스프레이즈가 필요함을 의미한다. 

 

P2SH(Pay to Script Hash)와 다중서명 주소

P2SH는 비트코인 거래의 수령인을 공개키 소유주가 아닌 스크립트의 해시로 지정한다. P2SH 해시 주소는 거래 스크립트로부터 생성되며, 이를 통해 누가 거래 출력값을 소비할 수 있는 지를 규정한다. P2SH 주소를 인코딩하는 작업 시 비트코인 주소를 생성할 때 사용하는 함수를 사용하며, 공개키 대신 스크립트에 적용한다. 

 

script hash = RIPEMD160(SHA256(script))

결과값으로 나온 스크립트 해시는 버전 prefix 5를 가진 Base58Check로 인코딩 되며, 결론적으로 3으로 시작하는 주소를 얻게 된다. 

 

다중서명 주소와 P2SH

P2SH 함수의 가장 흔한 구현은 다중서명 주소 스크립트이다. 소유권을 증명해서 돈을 소비하기 위해서는 하나 이상의 서명을 필요로 한다. 비트코인에서 다중 서명의 특징은 총 N개의 키 중에서 M개의 서명이 필요하다. (M of N으로 알려져 있으며, M의 값은 N보다 작거나 같다)

 

종이지갑

종이지갑은 비트코인 개인키를 종이에 인쇄해 놓은 것이다. 편리성을 위해 개인키에 대응하는 비트코인 주소가 종이지갑에 함께 들어있는 경우도 있다. 

 

출처: 마스터링 비트코인 챕터 4

'프로그래밍 > Block Chain' 카테고리의 다른 글

[Bitcoin] 거래  (0) 2025.04.23
[Bitcoin] Descriptor  (0) 2025.04.22
[Bitcoin] 지갑 1  (0) 2025.04.20
[Bitcoin] 개인키와 공개키  (1) 2025.04.19
[Block Chain] 블록체인 월렛 개발 강의  (1) 2023.11.20

댓글