5. 지갑

이더리움 지갑에는 이더(ether)나 토큰(token)이 들어있지 않다.

지갑에는 한 쌍의 공개키와 개인키만 있을 뿐, 이더나 토큰은 이더리움 블록체인에 기록되어 있다.

사용자는 지갑에 있는 키로 트랜잭션을 서명함으로써 네트워크에서 토큰을 제어한다.

 

지갑의 유형은 크게 지갑이 포함하는 키가 서로 관련이 있냐 없냐에 따라

비결정적(무작위) 지갑(Nondeterministic Wallet)과 결정적(시드) 지갑(Deterministic Wallets)으로 구분된다.

결정적 지갑 중에서 가장 많이 사용되는 HD 지갑에 대해서 알아보자.

비결정적(무작위) 지갑
(Nondeterministic Wallet)
각기 다른 무작위 수로부터 각각의 키를 무작위적으로 추출
그냥 열쇠뭉치(Just a Bunch Of Keys)로 JBOK지갑이라고 부름
결정적(시드) 지갑
(Deterministic Wallets)
시드(seed)라고 하는 단일 마스터 키로부터 파생
지갑형태의 모든 키는 서로 관련이 있고 원래의 시드를 갖고 있다면 다시 키를 파생시킬 수 있다.
결정적 지갑에는 여러가지 키 파생(key derivation)방식이 있는데, 가장 많이 사용하는 파생방식은 HD지갑에 있는 트리구조를 사용한다

✅ 결정적(시드) 지갑

결정적 혹은 시드 지갑은 단일 마스터키 또는 단일 시드로부터 파생된 개인키를 포함하고 있다.

시드 = 개인키를 만들기 위해 인덱스 번호나 체인코드 같은 데이터와 결합된 무작위로 추출된 번호다.

결정적 지갑에서 시드는 모든 파생된 키를 복구할 수 있다.

그러므로 생성시점에 단일 백업으로 지갑에 있는 모든 자금과 컨트랙트를 안전하게 보호할 수 있다.

 

이러한 구조로 인해 시드만 있으면 전체 지갑에 접근이 가능하기 때문에 시드 보안이 최우선적인 과제이다.

✅ HD Wallet (Hierarchical Deterministic Wallet)_계층 결정적 지갑

단일시드(seed)에서 많은 키를 생성하기 위해 개발되었다.

HD지갑의 가장 유용한 특징은 개인키가 없는 부모 공개키에서 자식 공개키를 파생할 수 있다는 것이다.

HD 지갑은 비트코인의BIP-32BIP-44 표준에 정의되어 있다.

HD 지갑은 트리 구조로 생성된 키를 가지고 있다.

이 트리 구조는 부모키에서 자식키를 만들 수 있고, 자식키에서 손자키를 만들 수 있다.

이런 방법으로 키를 무한대로 생성한다.

 

키를 여러 개 생성하여 관리하는 이유는 블록체인의 투명성과 관련된 보안 문제 때문이다.
 
하나의 마스터 키로부터 다수의 키들을 계층적으로 파생할 수 있는 지갑
 
시드(Seed) 값만 가지고 있으면 여러 개의 계정을 쉽게 생성할 수 있는 방법을 제공해준다.(쉽게 이야기해 하나의 Seed가 무수한 Address를 결정한다는 의미이다.)

 

 

여러 개의 계정을 하나씩 만들어서 관리하기는 힘들 것이다. 그리고 metamsk 등의 지갑 서비스에서도 대부분 이 방식을 지원한다.

 

✅ 시드와 니모닉코드(BIP-39)

HD 지갑은 루트 시드(Root Seed) 한 개로부터 많은 키와 주소가 생성된다. 

따라서 루트 시드만 알고 있으면 수천 또는 수백만 개의 키를 가지고 있는 HD 지갑 전체를 복원할 수 있다. 

루트시드를 인코딩하는 데는 다양한 방법이 있지만, 단어 시퀀스를 사용하는 니모닉 단어 순서(Mnemonic Word Sequence)를 가장 많이 사용한다.

 

루트 시드를 HMAC-SHA512 알고리즘 함수를 사용하여 해시한 값에서 마스터 개인키(Mater Private Key)과 마스터 체인코드(Master Chain Code)를 생성한다.

512비트의 해시된 값에서 왼쪽 256비트를 마스터 개인키로 사용하고, 오른쪽 256비트를 체인코드로 사용한다.

그리고 마스터 공개키는 타원곡선 곱셈 함수를 사용하여 마스터 개인키로부터 계산된다.

계층 결정적 지갑은 자식키 유도 함수(CKD)를 사용하여 부모키로 부터 자식키를 파생한다.
자식키 생성에는 부모키, 체인코드, 인덱스 번호가 사용된다.
자식키를 생성하기 위해 부모키, 체인코드, 인덱스 번호를 결합하여 HMAC-SHA512로 해시한다.
해시된 값(512비트)을 반으로 나눠 개인키(256비트)와 체인코드(256비트)를 생성한다.
이 방법으로 자식키를 계속 생성할 수 있다.

위에서 보았듯이 체인코드는 자식키를 파생하는데 사용된다.
키와 체인코드를 포함하고 있는 키를 확장키(Extended Key)라고 한다.
대부분의 HD 지갑은 키 생성을 위해 비트코인의
BIP-32 표준을 사용한다.
그리고 확장 개인키는 xprv, 확장 공개키는 xpub라는 접두어를 사용하여 식별한다.

강화된 유도법(Hardened Derivation)으로 자식키 생성

확장된 공개키(xpub)으로부터 공개키의 분기를 파생하는 능력은 매우 유용하지만, 체인코드를 포함하므로 만약 하위 개인키가 알려져 있거나 유출된 경우 다른 모든 자식 개인키를 파생시키기 위한 체인코드로 될 수 있다,

유출된 하나의 자식 개인키와 부모 체인코드는 모든 자식의 개인키 전부를 알아 낼 수 있다. 

부모 체인코드와 함께 자식 개인키를 사용하여 부모 개인키를 추론할 수 있다.

 

이러한 문제에 대응하기 위해 HD지갑은 강화된 유도(Hardened Derivation) 함수를 사용한다. 

강화된 유도 함수는 부모 키와 자식 체인코드 관계를 끊어버린다.(break) 

이렇게 해서 부모키와 자식키 시퀀스에 방화벽(firewall)을 만든다.

이때 체인코드는 부모 또는 형제 개인키를 유출하는 데 사용할 수 없다.

 

 

HD지갑 키 식별자(path)

HD 지갑의 키는 명명 규칙인 'path'를 사용하여 식별하며,  트리의 각 레벨은 슬래시(/) 문자로 구분된다. 

마스터 개인키에서 생성된 자식 개인키는 'm'으로 시작하고, 마스터 공개키에서 생성된 자식 공개키는 'M'으로 시작한다.

예를 들면, 마스터 개인키의 0번째 자식 개인키의 path m/0이다.

 

그리고 0번째 자식 공개키의 path M/0이다.

0번째 자식 개인키의 1번째 손자 개인키는 m/0/1이 된다.

 

728x90

'5. Blockchain > Mastering Ethereum' 카테고리의 다른 글

6. 트랜잭션(Tx)  (0) 2022.07.14
4. 암호학  (0) 2022.07.14
2. 이더리움 기초  (0) 2022.07.14
1. 이더리움이란 무엇인가?  (0) 2022.07.14
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유