일반적인 개념에서의 지갑의 주된 역할은 동전이나 지폐와 같은 화폐, 신용카드, 신분증 따위를 넣어다니는 것입니다.
그럼 비트코인이나 이더리움 같은 블록체인 플랫폼의 지갑(Wallet)에는 무엇이 들어있을까요? 당연히 비트나 이더가 들어있을 것 같지만 실제로는 그렇지않습니다.
그럼 지갑엔 무엇이 들어있나?
블록체인 플랫폼에서 지갑이라는 용어는 여러가지 뜻으로 쓰입니다.
- 개인키를 모아놓은 것
- 개인키들을 모아 관리하고 트랜잭션을 수행하는데 사용하는 소프트웨어 클라이언트
- 개인키들을 안전하게 저장하고 관리할 수 있도록 제작된 하드웨어
이 모든 지갑들은 공통적으로 개인키들을 모아두는 역할을 합니다.
(사실 지갑보다는 키홀더라고 표현하는게 더 적합할지도 모르겠네요.)
그럼 내 소중한 비트랑 이더는 다 어디에 있는걸까?
정답은 ‘블록체인 상에 있다.’ 입니다.
지갑 2.로 제시된 소프트웨어 클라이언트들이 소유한 자산을 조회하여 보여주는 기능을 제공하고 있기 때문에 지갑 속에 비트나 이더가 들어있다고 착각하게되는 경우가 종종 있습니다.
여기서 소유 자산으로 조회되는 것은
비트코인 플랫폼 상에서 지갑의 개인키와 연관된 모든 주소(address)의 UTXO의 합,
이더리움 플랫폼 상에서 지갑의 개인키와 연관된 모든 계좌(account)의 잔액(balance)으로,
보유하고 있는 개인키를 사용하여 서명된 트랜잭션을 통해 소유권을 증명할 수 있는 자산들입니다.
(개인키와 주소의 관계에 대해 궁금하신분은
비트코인에서 개인키, 공개키, 주소를 생성하는 방식을 읽어보세요!)
당연한 이야기지만 개인키가 유실되면 자산의 소유권을 증명할 수 없게되므로 매우 소중하게 관리하여야 합니다.
그렇다면, 단순하게 생각했을 때 여러개의 개인키와 공개키 쌍을 관리하는 것보다 하나의 개인키와 공개키 쌍을 관리하는 것이 쉬울것 같아보입니다.
그런데 하나의 개인키와 공개키 쌍으로만 반복해서 거래를 하면(트랜잭션을 발생시키면) 어떤 일이 발생할까요?
공개키와 주소를 재사용하면 발생하는 문제
자산의 이동을 위해 발생시킨 트랜잭션에는 돈을 지불하는 사람과 받는 사람의 공개키와 주소가 남습니다. 블록체인 상의 모든 트랜잭션은 누구나 조회할 수 있기 때문에 이를 통해 특정한 사람이 발생시킨 모든 트랜잭션을 추적 할 수 있게됩니다. 때문에 공개키와 주소를 지속적으로 재사용할 경우 자산규모와 거래 내역을 쉽게 추적당할 수 있습니다.
그렇다면 프라이버시를 위해서라도 공개키와 주소를 재사용하는 것을 피해야할 것만 같습니다.
잦은 빈도로 새로운 공개키와 주소를 사용하려면 반복적으로 개인키를 새로 생성해야겠죠?
결정성이 없는 (무작위) 지갑 - Nondeterministic(Random) Wallets
비트코인 상에서 처음 사용되었던 지갑의 형태인 이것은 주소의 재사용을 피하기 위해서 기본적으로 100개의 개인키를 무작위 생성하여 가지고 있으면서 매 거래마다 새로운 개인키와 공개키를 사용하였습니다.
공개키와 주소 재사용 문제를 회피할 수는 있었지만, 매 거래에 대해 지갑에 무작위로 생성된 모든 개인키를 백업하고 관리해야 한다는 단점이 있었습니다.
결정성을 지닌 (시드 기반) 지갑 - Deterministic (Seeded) Wallets
원시적이고 번거로운 무작위 키 생성이 갖는 백업과 관리의 불편함 때문에, 하나의 시드(seed)를 가지고 순차적으로 키를 생성하는 방식의 아이디어가 도입된 지갑이 고안되었습니다.
이러한 형태의 지갑에서 개인키는, 시드에 인덱스 숫자 또는 체인코드(chain code)를 결합한 뒤 단방향 연산을 거치는 방식으로 생성됩니다.
이러한 성질 덕분에 시드만 안전하게 백업, 관리할 수 있다면 시드로부터 모든 개인키들을 재생성해낼 수 있기 때문에 새로운 개인키를 생성할 때마다 모든 키를 백업, 관리해야하는 번거로움을 회피할 수 있습니다.
계층구조의 결정성을 지닌 지갑 - Hierarchical Deterministic Wallets
비트코인 개발자 중 하나인 Pieter Wuille가 결정성을 지닌 지갑에 대한 표준으로 계층구조 개념을 도입한 HD 지갑(BIP-0032)을 제안하였습니다.
(고화질을 나타내는 High-Definition과는 전혀 상관이 없습니다.)
BIP: 32
Layer: Applications
Title: Hierarchical Deterministic Wallets
Author: Pieter Wuille <pieter.wuille@gmail.com>
Comments-Summary: No comments yet.
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0032
Status: Final
Type: Informational
Created: 2012-02-11
License: BSD-2-Clause
HD 지갑은 마스터 시드(Master Seed)로부터 개인키를 계층적으로 생성하고 관리할 수 있도록 합니다. 때문에 사용자는 편의에 따라 사용할 공개키와 주소를 구분하여 사용하고 이를 관리하기 더욱 용이해 졌습니다.
BIP-0032가 제안된 이후 HD 지갑의 구현체들간의 호환성을 위하여,
BIP-0043(Purpose Field for Deterministic Wallets)와
BIP-0044(Multi-Account Hierarchy for Deterministic Wallets)가 제안되었습니다.
BIP-0043에서 아래와 같이 HD 지갑에서 트리구조의 상단을 목적(purpose) 기준으로 구분하도록 제안하였고,
m / purpose' / *
BIP-0044에서는 더 나아가 5 레벨 구조를 제안하였습니다.
m / purpose' / coin_type' / account' / change / address_index
여기서 coin_type은 비트코인, 이더리움 등의 화폐의 종류를 의미하며 화폐별coin_type은 SLIP-0044에서 확인할 수 있습니다.
때문에, HD 지갑을 사용하면 하나의 지갑에서 다양한 종류의 화폐와 사용자, 주소의 사용 여부 등에 따라 개인키와 공개키를 구분해서 관리할 수 있습니다.
간단할 줄 알았던 지갑 하나 때문에 생각외로 많은 이야기가 나온거 같지만, HD 지갑까지의 고도화 과정은 매우 흥미롭네요.