[BEB] Section4 : 지갑의 사용과 지갑 개발

jsg_ko·2022년 1월 16일
0
post-custom-banner

Section4 부터는 블록체인 기술실습을 진행한다.


지갑의 종류

🔥지갑의 종류 알아보기

스마트컨트랙트 지갑

스마트컨트랙트지갑은 스마트컨트랙트 기능을 통해 고유한 능력을 가진 지갑이다. 사용자를 위한 멀티 시그 트랜잭션, 추가 보안 및 복구 기능을 사용할 수 있다.

기능

  • 2단계 인증
    인증 앱 및/또는 기본 지갑 솔루션을 통해 추가 보안 기능을 제공
  • ATM과 같은 인출 제한
    트랜잭션 금액 제한을 설정할 수 있다. 이는 사용자가 잘못 판단하여 높은 금액의 인출 가능성을 줄이고, 공격자가 한 트랜잭션에서 지갑의 모든 금액을 가져가는 것을 방지할 수 있다.
  • 화이트리스트 및 블랙리스트
    사용자는 자신이 지정한 주소(화이트리스트)로만 전송할 수 있고, 차단한 주소(블랙리스트)에는 전송을 안한다.
  • 사기 경보 및 긴급 잠금
    장치를 분실하거나 도난당한 경우 계정을 잠그거나 손상된 장치에서 계정에 대한 액세스를 비활성화 할수 있다.

💡 멀티 시그 월렛이란?

멀티 시그 월렛(multi-signature wallet)은 스마트 컨트랙트 월렛의 한 종류로, 멀티시그(multi-sig)를 통해서만 송금이 가능하다는 특징이 있다.
기존의 핫 월렛과 콜드 월렛은 하나의 개인 키를 사용하기 때문에, 이 단일 키가 노출될 경우 탈취자가 해당 개인 키에 연결된 자산에 쉽게 접근할 수 있다는 단점이 있다.이러한 단점을 보완하기 위한 것이 바로 멀티 시그 월렛이다.

멀티 시그 월렛은 하나의 지갑에 N명의 사용자가 지갑에 대한 소유 권한을 가지고, 해당 지갑에서 트랜잭션을 만들기 위해서는 N명 중 k명이 트랜잭션에 서명을 해야 한다. 이더리움 상에서 구현할 때는, 멀티 시그 월렛을 위한 스마트 컨트랙트를 만들어 N명 중 k명이 서명해야 컨트랙트를 이행한다는 서명 제한 룰을 추가하고, 실제로 k명이 멀티 시그 월렛 컨트랙트에 트랜잭션을 보내야 한다.
이에 슈노르 서명을 적용하기도 한다.

멀티 시그 월렛은 일반 지갑에 비해 보안이 우수하다는 장점이 있으며, 실수로 송금이 일어나는 경우를 방지할 수도 있다. N명 중 1명이 실수로 송금 트랜잭션을 생성해도, 나머지 N-1명이 서명을 하지 않으면 트랜잭션이 완료되지 않기 때문이다.그러나 멀티 시그 월렛은 스마트 컨트랙트 상에서 구현되기 때문에 사용성이 부족하다. 가령, 대부분의 암호화폐 거래소에서는 일반 지갑 간에 이루어진 트랜잭션만 처리하기 때문에 멀티 시그 월렛에서 일어난 트랜잭션을 인식하지 못하기도 한다.또한 멀티 시그 월렛은 스마트 컨트랙트 상에서 구현되기 때문에 컨트랙트 코드의 오류로 인해 문제가 발생할 수 있다.

멀티 시그 월렛에는 ConsenSys, Gnosis, Argent, BitGo 등이 있다.

하드웨어 지갑

하드웨어 지갑은 거래에 서명할 때 개인 키를 인터넷에 노출하지 않기 때문에 온라인 상태에서 자산에 액세스하는 가장 안전한 방법이다.

모바일 지갑

모바일 지갑은 데스크톱 & 웹 지갑의 모바일형 지갑이다.

데스크탑(PC)지갑

데스크탑 지갑은 Windows, Mac 또는 Linux같은 OS에 다운로드하여 작동할 수 있는 앱이다.

웹 지갑

웹 지갑은 웹사이트에서 호스팅되는 지갑으로 사용자가 계정을 생성하고, 보관할 수 있다.

장점과 단점

  • 장점
    고가용성, 쉽게 접속 가능, 절대 고장 나지 않음
  • 단점
    보안에 관련하여 제공업체에 의존할 수 밖에 없다.

🔥메타마스크

메타마스크(Metamask)는 이더리움을 보유하고 송금 및 관리할 수 있는 암호화폐 지갑이다. 구글 크롬 웹브라우저에서 플러그인 방식으로 사용하는 크롬 확장 프로그램으로 사용된다.
지갑 생성은 니모닉 코드(Mnemonic code)를 사용한다.

메타마스크 사용 방법

코린이를 위한 메타마스크 사용법

🔥마이이더월렛

마이이더월렛(MEW)은 이더리움을 보관하고 입&출금 할 수 있는 암호화폐 지갑이다. 사용자들은 마이이더월렛을 이용하여 블록체인과 바로 통신할 수 있고, 이더리움 지갑을 만들어 이더리움 및 ERC20 토큰들을 보관, 전송 하거나 받을 수 있다.

마이이더월렛 특징

  • 하드웨어 지갑 스타일 보안 기능
  • 거래를 보호하기 위한 이중 인증
  • 개인 키를 얻을 수 없다.
    사용자의 개인키를 점유하지 않음.
  • 탈중앙화
    P2P 통신을 사용.
    개인 데이터를 수집하지 않는다.
    오픈 소스이다.

마이이더월렛 생성, 사용방법

마이 이더 월렛 만들기(생성법) 및 거래소에서 코인 옮기는 방법

🔥Geth Wallet

메타마스크와 마이이더월렛을 통하여 웹을 이용한 계정 생성방법을 알아보았다.
이번에는 CLI를 통해 이더리움 계정을 생성하고, 테스트넷에서 테스트 이더를 받는 방법까지 알아보자.

MacOS Geth 설치(Homebrew)

Homebrew가 설치되어 있다는 전제하에 진행된다. Homebrew가 설치되어 있지 않다면, 여기서 설치.

1. 다음 명령을 실행하여 탭을 추가

$ brew tap ethereum/ethereum

2. 탭 추가가 완료되면, Geth를 설치

$ brew install ethereum

Ubuntu Geth 설치(PPA)

Ubuntu에서 PPA(Personal Package Archives)를 사용하여 Geth를 설치한다.

1. 런치패드 저장소 활성화를 위해 다음을 실행

$ sudo add-apt-repository -y ppa:ethereum/ethereum

2. Geth를 설치

$ sudo apt-get update
$ sudo apt-get install ethereum

Geth 계정 만들기

1. Geth 명령어를 사용하여 새로운 계정을 만든다

$ geth account new

2. 위의 명령어를 실행하면, 비밀번호를 입력하라고 한다. 재확인 비밀번호도 입력해준다.

Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:

3. 알맞게 입력했다면, 새로운 키를 생성했다는 말과 함께 addresssecret key file 경로를 알려준다.

!! 중요 !! address와 secret key file 경로, 비밀번호는 잊지 않도록 안전한 곳에 백업해야함. 특히, secret key file의 경우 절대로 잃어버리시면 안됨.

Your new key was generated

Public address of the key:   [계정 주소]
Path of the secret key file:    [secret key file 경로]

- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

4. 현재 자신이 가지고 있는 계정 리스트를 보려면 다음의 명령어를 실행

$ geth account list
Account #0: {a1ce1ae4e215858f7c79da67b2996331af3ee7b1} keystore:///Users/insulee/Library/Ethereum/keystore/UTC--2021-11-11T15-29-11.509514000Z--a1ce1ae4e215858f7c79da67b2996331af3ee7b1

Geth에서 롭스텐 테스트넷 이더 받고, 확인하기

1. Geth JavaScript 콘솔을 사용하여 롭스텐 테스트넷에 접속

> geth console 2> /dev/null --ropsten
  • 네트워크 연결이 잘 되었는지 확인하기 위해 다음의 명령어를 실행
> net.listening

2. 롭스텐 테스트넷 용 계정을 생성한다.

계정 생성 전에 다음의 명령어를 실행하고, 생성 전과 후가 어떤 차이가 있는지 확인해보자

> eth.accounts;

명령어를 실행하고, 비밀번호재확인 비밀번호를 입력.

> personal.newAccount();
Passphrase:
Repeat passphrase:

3. 롭스텐 테스트 이더 받는 페이지에서 테스트 이더를 받은 후 실제로 들어왔는지 확인해보자.

# eth.accounts[ ] 에 있는 숫자는 `eth.accounts;` 실행 후 몇 번째 주소인지 입력하면 된다. ex, 첫 번째 주소는 "0"
> eth.getBalance(eth.accounts[0]);

이더스캔으로 내 계정 확인하기

이더스캔(Etherscan)은 이더리움 블록체인에서 일어나고 있는 모든 활동과 정보를 쉽게 검색할 수 있는 사이트이다. 이더리움의 블록 생성 내역, 트랜잭션 조회, 지갑 정보 조회, 이더리움 기반의 토큰 검색 등 블록체인에서 일어나고 있는 모든 활동과 정보를 쉽게 검색할 수 있다.
지금까지 생성해본 메타마스크, 마이이더월렛, GethWallet은 결국 같은 형태의 지갑이기 때문에 각각의 주소를 검색하면 찾을수 있다.

사용방법

  • 이더스캔에 접속하여, 검색창에 지갑 주소를 복붙 한다
  • 지갑이 보유하고 있는 계정 정보를 확인가능.

    테스트넷에서 발생한 트랜잭션 확인은 시간이 걸린다.

🔥클레이튼 kaikas 월렛

카이카스(KaiKas)는 클레이튼 기반의 지갑이다. 누구나 새로운 지갑을 생성할 수 있고, PC 버전의 크롬 브라우저와 개인키 또는 시드구문만 기억하고 있다면 언제, 어디서든 자신의 지갑을 가져올 수 있다.

크롬 웹 스토어에서 카이카스 설치하기

크롬 웹 스토어의 카이카스 설치화면 바로가기를 클릭하여 크롬 웹 스토어로 이동하고, 안내를 따라 카이카스 지갑을 설치, 설치한 카이카스 지갑을 실행한다. 크롬 브라우저의 우측 상단에서 설치된 카이카스를 실행할 수 있다.

카이카스 지갑 생성하기

다음은 노트북을 분실하거나 크롬 브라우저를 삭제했을 때처럼 예기치 못하게 지갑을 분실한 경우, 새로운 환경에서 지갑을 불러올 때 사용하는 방법이다. Restore 이라고 하는 이 과정은 시드 구문을 이용해 카이카스 지갑을 불러오는 과정이다. 이 과정을 실습해보려면, 크롬 브라우저에 설치된 카이카스를 삭제하고 재설치해라.

새로운 환경에서 카이카스 지갑 불러오기

크롬 확장프로그램 MetaMask에서 생성한 지갑은 KaiKas에서 Import 하거나 반대로 카이카스 지갑을 메타마스크로 Import 할 수 할수있다.이 방법을 이용하면 서로 다른 체인으로 보낸 (NFT를 포함하는) 토큰을 다시 되찾을 수 있다.

baobab 테스트넷 전용 클레이튼 발급

클레이튼 기반 테스트넷은 baobab(바오밥)이라고 부른다. 바오밥 테스트넷은 클레이튼 기반의 메인넷에 새로운 스마트 컨트랙트를 발행하기 전 테스트해볼 수 있는 네트워크이다. 블록체인에서 스마트 컨트랙트를 생성하거나, 스마트 컨트랙트를 호출하여 연산을 실행하는 경우 체인이 요구하는 코인을 지급해야 한다. 다시 말해, 클레이튼 기반에서 스마트 컨트랙트를 생성하거나, 스마트 컨트랙트를 호출하여 연산을 실행하는 경우에는 클레이튼이 일부 사용된다는 말이다. baobab testnet에서 사용할 클레이튼을 받아보자.

  • 앞서 생성한 카이카스 지갑을 이용해 테스트넷에 등록한다.

    💡 테스트용 클레이튼 지급을 요구할 때마다 지갑의 개인키를 이용해야 하기 때문에 테스트용 지갑은 메인넷 지갑과 별개로 사용하는 것이 좋다.

    • 카이카스 지갑의 개인키 복사하기
      1. 카이카스를 실행한다.

      2. 카이카스의 좌측 상단에 위치한 지갑의 별명을 클릭해 계정 정보에 진입한다.

      3. 나타난 팝업 창의 하단에 위치한 지갑키 관리 를 클릭합니다.

      4. 지갑키 내보내기를 클릭 (주의) 어떤 서비스에서도 지갑키를 직접적으로 요구하는 경우는 없다. 따라서, 테스트용 지갑을 별도로 운용하는 것이 좋다.

      5. 나타난 개인키를 사용한다. 키스토어 파일로 저장하고 사용해도 됨.

        복사한 개인키는 다음과 같은 모양을 하고 있다.

        0x4025c289c531346c947c2dfa03830e6f3af165719ae8f57c0598a445feaf44d6
        
        0xeb56c41cc64aad8fb7f6d7e5d4e2983a8a84e9fff66958af532cde9928bc9a5e
  • Klaytn Wallet으로 이동하여, 개인키를 붙여넣는다. 이 화면에서는 몇 가지 확인할 사항이 있다.**
    1. 우측 상단의 네트워크가 Baobab Testnet 인지 확인.

    2. 좌측에 선택된 카테고리가 Klay Faucet 인지 확인.

    3. 위에서 복사한 개인키를 붙여넣는다.

    4. 체크박스를 클릭하여 개발용 클레이튼 지급에 동의.

    5. Access 버튼을 클릭하여 다음 화면으로 이동.

      다음의 화면이 나타나면, 정상적으로 진입한 결과이다.

      Run Faucet 버튼을 클릭하여 테스트용 클레이튼 지급을 실행. 테스트용 클레이튼은 지급 후 24시간이 지나야 새롭게 지급받을 수 있다. 이때 지급되는 테스트용 클레이튼의 수량은 5개이다.

🔥클레이튼 모바일 klip 월렛

Klip의 특징

  • Klip은 Kaikas와 동일하게 클레이튼 기반의 디지털 자산 지갑이다.
  • 카카오톡 계정과 연동하여 개인키를 보관한다.
    • 개인키가 소유주를 포함한 그 누구에게도 공개되지 않는다.
    • 개인키를 분실할 우려가 없다.
    • 카카오톡 친구와 토큰이나 NFT를 주고받을 수 있다.
    • 다양한 Dapp과 연동하여 사용할 수 있다.

지갑 개발

🔥니모닉과 HD Wallet 이해하기

니모닉(Mnemonic)

니모닉이란 난수(시드 키)를 12개의 영단어로 인코딩한 영단어 그룹으로 블록체인에서 니모닉은 지갑을 복구하기 위한 일반적인 단어들의 조합을 뜻한다.

기존의 시드 키는 숫자와 문자로 구성된 난수이기 때문에 사용자가 기억하기 어려웠지만, 니모닉 코드 단어의 경우 사용자가 기억하고 사용하기 쉬운 형태로 구성되어 있다는 장점이 있다. 이 니모닉 코드만 기억하고있으면 시드 키 및 파생된 모든 비밀 키를 복구할 수 있다.

사전적 의미로는 정보의 기억을 위한 기억술이다.

[예시]

💡 시드 키: 8979644bfb6b6206792bdd6a071b3a00daebfb84ac5e3d81fa8c87a8012b04be060765762d4540ff10788959a84dec51667f34b0380e66be373d0ab2c62f8f94
니모닉: endless convince patrol calm apology scene client jungle fitness blind grass pause

[예시] 메타마스크에서 사용되는 니모닉

  • 니모닉이 필요한 이유
    먼저, 디지털 서명을 떠올려 보자. 은행의 공인인증서 역할을 하는 디지털 서명을, 분산 장부에서 쉽게 표현하면 다른 이가 보지 못하고, 내 행위를 증명하는 것으로 사용된다.
    이 디지털 서명에 사용되는 방식 중 비대칭 키 암호 방식 공개 키(Public key)비밀 키(Secret key; Private key) 가 있다. 이 두 키의 관계를 보면, 공개 키로 데이터에 서명했을경우, 비밀 키로는 계산이 되는데, 공개 키로는 계산이 불가능하게 된다. 다시 말해, 비밀 키만 가지고 있으면, 공개 키는 여기저기 공개해도 상관없는 것이다.

    💡 일반적인 암호화 알고리즘은 데이터를 숨기고 안전하게 전달하는 기밀성이 그 목적이기 때문에 공개 키로 암호화하는 방식을 사용하는데 블록체인에서는 디지털 서명을 하여 데이터의 무결성과 진위성을 검증하는것을 목적으로 하기 떄문에 비밀 키로 암호화하는 방식을 사용한다.

    이 방법을 사용하면 공개 키는 누구에게나 공개되어 있기 때문에 중요한 데이터를 암호화하는 데에는 적합하지 않다.
    개인 키가 유출되거나 손상될 경우, 해당 디지털서명이 송신자에 의해 생성되었음을 확인할 수 있는 진위성이 무효화된다. 특히 암호화폐에서 개인 키를 잃어버릴 경우 재정적 손실로 이어지기도 하다. 여기서 이 비밀 키를 사람이 쓰기 편하게 기억하기 쉽게 만들어진 것이 바로, 니모닉(mnemonic)이다

    비밀 키의 암호화 알고리즘 보안 성능은 2^256(2의 256승)이다. 이것을 사람이 사용하기엔 엄청나게 큰 수이기 때문에 16진수 64글자로 바꾼다. 여기에 비슷하게 생긴 글자들(ex. 0,O 등)을 제외한 58개를 가지고 2^256(2의 256승)을 표현하더라도 사람이 쓰기엔 불편하다. (ex. 5KRQ7XK5oU48pqABR2bkiwqP6oZj2W1Fb6stJgjdoNhBZsVYK7m)

    니모닉은 순서대로 맞춰진 단어가 암호화된 보안 비밀번호 방식으로, 문자 배열을 초기대로 하지 못하면 어느 누구도 지갑을 열 수 없다.
    메타마스크 지갑 만들기를 실습했던 것처럼 영단어 그룹을 사용하여 고유의 지갑 문구를 생성하며, 이 지갑 문구가 니모닉이다.
    니모닉은 12개 또는 24개의 랜덤한 영어 단어로 이루어져 있다. 일반적인 단어로 표현되는 니모닉 코드는 암호화폐 지갑 사용자가 난해한 기술에 대한 이해 없이도 지갑을 편리하게 사용할 수 있도록 돕는다.
  • 니모닉 Wallet
    니모닉 Wallet은 니모닉을 사용하여 비밀 키 관리를 용이하게 해주는 암호화폐 지갑이다.
    사실 암호화폐 지갑에는 돈이 들어있지 않다. 정확하게 표현하는 암호화폐 지갑은 키를 관리하는 키 매니지먼트 시스템 이라고 할 수 있다. 예를 들어, 내 계정에 있는 이더리움을 내 것이라고 증명할 수 있는 비밀 키를 지갑이 관리한다고 보면 된다. 하지만, 사람은 비밀 키를 잘 잃어버릴 수 있어서 비밀 키 복구(리커버리) 할 때 니모닉을 사용하게 된다.
    즉, 암호화폐 지갑은 비밀 키가 핵심인데, 니모닉 Wallet은 비밀 키 관리를 용이하게 해주고, 모든 비밀 키는 니모닉으로 관리하는 지갑이다.
  • 니모닉 코드와 시드 생성 9단계
    니모닉 코드는 BIP-39에 정의되어 있으며, BIP-39는 니모닉 코드의 표준이 된다. BIP39에서는 니모닉 단어로부터 시드 키를 생성한다. 여기서 생성된 시드는 결정적 지갑을 구축하고 비밀 키를 생성하는 데 사용된다.
    니모닉 코드는 해시 함수를 재귀적으로 반복하는 키 스트레칭 과정을 거쳐 마스터 시드를 생성하고, 그 마스터 시드는 HD지갑 주소 생성의 바탕이 된다.

    💡 시드 키를 생성할 때는 PBKDF2 함수를 사용한다. PBKDF2는 키 스트레칭 함수의 한 종류이다.

    BIP-39에 정의된 니모닉 코드와 시드 생성 9단계는 다음과 같다.

    니모닉 단어 생성
    1. 128bit 또는 256bit 길이의 난수를 생성

    2. 난수를 SHA-256 알고리즘으로 해싱하고, 해시값에서 (시드 키의 길이) / 32 만큼을 떼어낸다. 가령, 난수의 길이가 128bit라면, 해시값에서 128 / 32 인 4bit를 앞에서부터 떼어내 체크섬으로 만든다.

      체크섬(checksum): 어떤 일련의 데이터에 오류가 존재하는 지 확인하기 위한 검사용 데이터

    3. 체크섬을 난수의 뒤에 붙인다.

    4. 체크섬을 붙인 난수를 11bit 단위로 잘라낸다.

    5. 각 11bit의 단어를 사전에 정의된 단어로 치환한다.

    6. 각 11bit의 순서를 유지하여 일련의 니모닉 코드를 만든다.

    BIP39에서의 시드 생성 방법
    1. PBKDF2 함수에 니모닉 코드를 입력한다.
    2. PBKDF2에 솔트를 입력한다. 솔트는 문자열 "Mnemonic"에 임의의 암호문을 붙인 형태이다.
    3. PBKDF2 함수는 입력받은 니모닉 코드와 솔트로 HMAC-SHA512로 2048번 해싱하여 512 bit의 값을 만들어내며, 이 값이 시드 키가 된다.

HD Wallet

HD Wallet은 Hierarchical Deterministic Wallet(계층적 결정적 지갑)의 약자로, 하나의 시드(Seed) 값만 가지고 있으면 여러 개의 주소를 쉽게 생성할 수 있는 지갑이다.
쉽게 설명하자면, 증권사에서 필요에 따라 계좌를 여러개 쓰는 것과 동일하다.(ex. CMA, 종합, 금 등) 여러 개의 키를 관리할 때 하나로 관리하면 되기 때문에 하나의 키로부터 다목적 관리를 할 때 좋다.
Hierarchical는 하나에서 다른 하나를 유도하는 것, Deterministic은 트리구조가 상위의 비밀 키만 알면 하위는 다 알 수 있다는 뜻이다. 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 트리 구조로 이루어져 있으며, 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 수 있다.
HD Wallet은 BIP-32에서 제안되었고, BIP-44에서 개선되었다.

💡 비결정적 지갑과 결정적 지갑
기본적으로 암호화폐를 사용할 때는 개인 정보 보호를 위해 암호화폐 주소는 재사용하지 않는 것이 가장 바람직하다. 극단적으로는 매 트랜잭션마다 새로운 비밀 키를 생성할 수 있다. 이는 기존의 지갑은 새로운 비밀 키를 무작위로 추출해 보관해야 한다. 이런 식으로 매번 무작위로 비밀 키를 생성하다보면, 실수로 지갑 데이터를 분실하는 경우 해당 비밀 키에 저장된 코인과 해당 비밀 키로 생성한 스마트 컨트랙트에 접근하지 못하게 된다. 따라서 지갑 데이터를 자주 백업해야 하는 불편함이 있다. 이렇게 매번 비밀 키를 무작위로 생성하는 방식의 지갑을 비결정적 지갑이라고 한다.

이러한 비결정적 지갑의 불편함을 해결하는 방식의 지갑이 바로 결정적 지갑이다. 결정적 지갑은 하나의 시드에서 하나의 시드 키를 가지고 있으며, 이 시드 키는 비밀 키를 만들기 위한 난수이다. 비밀 키는 시드 키를 인덱스 또는 다른 데이터와 결합하여 만든다. 이 시드 키는 자신으로부터 만들어진 비밀 키를 복구할 수 있다. 이러한 특징 때문에 시드 키로부터 만들어지는 모든 비밀 키는 그 값이 미리 정해져 있다고 볼 수 있다. 따라서 시드 키를 이용한 지갑 방식을 결정적 지갑(deterministic wallet)이라고 한다. 결정적 지갑을 사용하면 하나의 시드 키와 경로만 알고 있어도 시드 키에서 파생된 모든 비밀 키를 알 수 있기 때문에 모든 비밀 키를 관리할 필요 없이, 시드 키 하나만을 관리하면 된다.

  • HD Wallet 계정 생성 주요개념
    HD Wallet으로 계정을 만들기 위해서는 크게 두 가지가 필요하다. 하나는 정수로 된 시드(seed)값이고, 다른 하나는 그 계정까지의 경로(path)이다. HD Wallet의 경로는 여러 개의 정수로 구성되며, 개수에 제한은 없다. HD Wallet은 시드와 경로가 있으면 항상 동일한 값의 자식 키를 구할 수 있다.
    • 시드(seed)
      HD Wallet은 시드로부터 마스터키를 생성한다. 시드는 128, 256, 512비트(bits)의 루트 시드(root seed)로 만들며, 니모닉(mnemonic)으로부터 생성된다. HD Wallet의 모든 키는 루트 시드에서 파생되었으며, 생성된 시드로부터 자손 HD Wallet을 재생성할 수 있다. 이렇게 루트 시드를 파생시킨 니모닉을 전송하는 것만으로도 수천 혹은 수백만 개의 키가 포함된 HD Wallet의 내보내기, 백업, 복원, 가져오기를 쉽게 할 수 있다.
    • 경로(path)
      HD Wallet 키의 경로(path)에는 규칙을 사용하여 식별하며, 각 트리 레벨은 슬래시(/) 문자로 한다. 마스터 비밀 키로부터 파생된 비밀 키는 m, 마스터 공개키에서 파생된 공개키는 M으로 시작한다. 예를 들어, m/0은 마스터 비밀 키의 첫 번째 자식 비밀 키이고, M/0은 첫 번째 자식 공개 키가 된다. m/0/1은 마스터 비밀 키의 첫 번째 자식의 두 번째 자식 비밀 키이며, 마스터 키의 손자의 비밀 키가 된다.

💡 HMAC-SHA512
HD 지갑에서는 부모 키를 통해 자식 키를 확인할 수 있어야 하기 때문에, HMAC 방식을 사용하여 자식 키를 마든다. HMAC-SHA512는 부모의 키 값을 패딩하여 XOR 연산을 하고, 그 결과값을 해싱한다. 마스터 키는 시드 키에 HMAC-SHA512를 연산한 결과값이다.

BIP 44

BIP44는 여러 계정이 여러 목적에 맞게 여러 지갑을 사용할 수 있는 HD 지갑 구조를 제안하였다. BIP44에는 다섯 가지 트리 레벨로 구성된다.

  1. 목적: 항상 44로 설정된다.
  2. 코인 종류: 어떤 종류의 코인인지 나타낸다. SLIP0044 문서에 각 코인의 종류와 할당된 번호가 있다
  3. 계정: 사용자는 자신의 지갑을 논리적 계정으로 나눌 수 있다. 가령 m/44'/0'/0'과 m/44'/0'/1'은 하나의 HD 지갑에 2개의 비트코인 계정이 있는 것이다.
  4. 잔액 계정 여부: 비트코인의 잔액 계정 여부. 하위 트리에 있는 값이 입금 주소인지 잔액 주소인지 표기하며, 잔액 주소이면 1을 넣고, 아니면 0을 넣는다. 이더리움에서는 UTXO가 아닌 어카운트 기반이기 때문에 늘 잔액 주소가 필요없어 늘 이 값이 0이다.
  5. 사용 가능한 주소: 입금 주소나 잔액 주소를 표기합니다.
M/44'/60'/0'/0/2 : 이더리움 계정에 대한 세 번째 수신 공개키
M/44'/0'/3'/1/14 : 4번째 비트코인 계정의 15번째 주소 변경 공개키
m/44'/2'/0'/0/1 : 트랜잭션 서명을 위한 라이트코인 메인 계정의 두 번째 개인 키

🔥Mnemonic Wallet 개발하기

지갑을 import 하는 등 지갑에 대한 본인인증을 할 때는 2가지 방법이 있다.

  • private key(pk)를 이용하여 지갑에 대한 본인 인증을 한다.
    • 문제는 pk(64 hex 문자열)를 기억하기 쉽지 않고, 관리 이슈도 있다.
  • Keystore 파일과 pw를 이용하여 지갑에 대한 본인 인증을 한다.
    • Keystore 파일은 pk의 암호화된 버전이다.
    • pk를 pw와 암호화 알고리즘을 이용해 암호화하여 keystore 파일로 만드는 것이다.

이 방법이 더 좋은 2가지 이유가 있다.

  • 안전성:
    • 만약 사용자가 pk만 사용할 경우, 해커는 그 pk만 알아내면 사용자의 지갑은 해킹당하게 된다.
    • 그런데, keystore 파일을 사용하면 해커는 추가로 pw까지 알아야 하고 암호화 되어있기 때문에 원본데이터를 구해야해서 더 안전하다.
  • 사용성:
    • 복잡한 pk 대신 사용자들에게 익숙한 pw와 파일로 쉽게 지갑을 사용할 수 있다.

참고Ethereum Wallet 및 Keystore 파일 생성 및 암호화 원리

keystore 파일 데이터 구조

  • 마이이더 Wallet - keystore 아래 구조 중, Crypto 객체가 keystore 파일 암호화에 대한 정보이다.
  • Geth Wallet - keystore 아래 구조 중, Crypto 객체가 keystore 파일 암호화에 대한 정보이다.
  • Mnemonic Wallet - keystore

Mnemonic Wallet 개발해보기

eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 간단한 Mnemonic Wallet을 개발하고, Postman을 사용하여 API 테스트를 해보자. 서버는 express로 구현하였다.

  1. newMnemonic API 만들기

    Postman을 사용해 테스트 해보면 정상적으로 니모닉코드가 응답되는 것 을 알 수 있다.

  2. mnemonic codepassword를 이용해 newWallet API 만들기

    Postman을 사용해 테스트 해보자

    • 적절한 엔드포인트로 1에서 얻은 니모닉 코드를 mnemonic이라는 키의 값으로, password에는 원하는 비밀번호를 입력 후 요청한다.
    1. fs모듈을 사용하여 생성된 keystore를 json 파일로 만들어 로컬 서버에 저장하기 Postman을 실행하여, 로컬에 키스토어 파일이 생기는지 확인
profile
디버깅에서 재미를 추구하면 안되는 걸까
post-custom-banner

0개의 댓글