블록체인(Block Chain) - 암호화폐 지갑(Wallet)이란?

Jeenie·2022년 8월 17일
2
post-thumbnail
post-custom-banner

이 포스트는 암호화폐 지갑 유형 설명 - Binance Academy
잃어버린 비트코인? 지갑 원리 제대로 설명해드림 - 노마드코더 Nomad Coders 을 참조하여 요약한 글입니다.

1. 암호화폐 지갑이란?

암호화폐 지갑은 블록체인 네트워크와 상호작용하는 수단 중 하나.
지갑의 종류는 매우 다양하고, 소프트웨어, 하드웨어, 종이 지갑의 세가지 그룹으로 나눌 수 있다.

작동 메커니즘에 따라 핫 월렛, 콜드 월렛으로도 나눌 수 있다.

대부분 암호화폐 지갑 공급 업체들은 소프트웨어 기반이다.
이는 하드웨어 지갑보다 간편하지만, 가장 안전한 건 하드웨어 지갑이다.
종이 지갑은 종이에 프린트 된 지갑으로 구성되는데, 이건 구식이며 신뢰하기 힘들다.

2. 암호화폐 지갑의 작동원리

지갑의 작동원리를 이해하기 전에, 비트코인이 어떻게 전송되고 저장되는지 이해해야한다.

애초에 비트코인은 움직이지 않는다
: 비트코인을 보낸다고 할 때, 네트워크를 통해 전송되는 것이 아님.
실제로 전송되는 것은 아무것도 없다.
비트코인을 소유한다는 것은 실제로 소유한다는 것이 아니기 때문에.

비트코인은 비트코인 네트워크에 항상 있다. 비트코인 네트워크를 떠나지 않음.
지갑에 넣는 것도 불가능한데, 어떻게 소유한다는 게 가능한걸까?

비트코인을 "소유"한다 ❌
비트코인의 "소유주가 변경"된다 ⭕️

집을 샀다고 집 주소가 바뀌지 않는다.
단지 집문서에서 소유주가 바뀔 뿐.
비트코인도 이와 동일하게 소유주가 변경 된다!

이처럼 암호화폐 지갑은 실제로 암호화폐를 저장하지 않는다.
대신, 블록체인과 상호작용할 수 있는 수단을 제공한다.
다시 말해, 블록체인 트랜잭션을 통해 암호화폐를 주고받을 때 필요한 정보를 생성할 수 있다.

2-1. 공개 키, 개인 키

https://www.ledger.com/ko/academy/%EA%B0%9C%EC%9D%B8-%ED%82%A4%EC%99%80-%EA%B3%B5%EA%B0%9C-%ED%82%A4%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94 참조

그럼 생성되는 이 정보란 무엇일까?
이 정보는 하나 또는 그 이상의 공개 키(Public Key)개인 키(Private Key) 쌍으로 구성된다.

공개 키개인 키를 알려면,
지갑이 어떻게 생성되는지를 알아보자.

지갑은 어떻게 생성되는가?

지갑은 비대칭적 암호화를 이용해서 생성된다.

1. 대칭 암호

자물쇠로 잠겨있는 상자를 열기 위해서는 열쇠가 필요함.

하나의 열쇠를 주고받아야함 => 안전하지 않다
그래서 필요한 것이 비대칭적 암호화

2. 비대칭적 암호화(Asymmetric encryption)

각자 공개 키(Public Key)비공개 키(Private Key) 를 가지고 있다.

A가 전달하기 전, B의 공개 키(Public Key) 를 받아온다.

비밀상자에 데이터와 A의 공개 키를 넣은 후 B의 공개 키로 잠근다

B의 공개 키로 잠겨있으니 B는 열 수 있다.
비밀상자를 열면 데이터와 함께보낸 A의 공개키가 있다.

A의 공개키로 비밀상자를 열고 다시 A에게 보내면, A 또한 상자를 열 수 있다.

이게 바로 공개키 / 비공개키 방식이자
암호화폐 세상에서의 지갑,
블록체인 트랜잭션을 통해 암호화폐를 주고받을 때 필요한 정보

💁🏻‍♀️ :: 공개키는 은행의 계좌번호, 개인키는 계좌의 비밀번호 같은거구나!

  • 블록체인 상에 이러한 쌍은 여러개 존재할 수 있다

지갑에는 공개 키와 개인 키를 기반으로 생성되는 영숫자 식별자인 공개 주소가 포함되어 있다.
이 주소는 기본적으로 코인이 전송될 수 있는 블록체인 상의 특정한 "위치".
자금을 전달받기 위해 공개 주소를 공유할 수 있다는 것.

공개키는 공유해도 상관없다. 이걸로는 아무것도 할 수 없음.

비공개 키는 항상 비밀로 남아야 한다!

지갑을 생성한다 === 비공개 키를 만든다

지갑을 만든다는 것은, 곧 비공개 키를 만든다는 것.
비공개 키공개 키를 만들고,
공개 키는 누군가에게 코인을 보낼 때 함께 공유해야 할 주소

Q. 공개키(블록체인 상의 특정한 위치)와 지갑 주소의 개념이 헷갈리네. 둘이 아예 다른 것 같은데...

키와 주소 생성 방식은 블록체인에서 공개 키, 개인 키, 주소를 생성하는 방식 이 포스트에 아주 잘 정리되어있다.
........ 그렇지만 아주 어려워 보이기 때문에 나는 정리하지 못했다

➡️ ➡️ 📌 공개 키 암호방식과 비공개 키 암호방식이 헷갈린다면?
블록체인(Block chain) - 헷갈리는 대칭키(비공개키), 비대칭키(공개키) 방식 😡 포스트 참조

3. 핫 월렛 vs 콜드 월렛

암호화폐 지갑은 작동 방식에 따라 핫 또는 콜드 월렛으로 정의할 수 있다.

3-1. 핫 월렛

인터넷과 연결된 것.

예를 들어 바이낸스에 계좌를 만들고, 내 지갑으로 자금을 전송하면 바이낸스 핫 월렛에 입금한 것이 된다.

  • 설정이 간편, 손쉽게 자금에 접근할 수 있어 트레이더와 사용 빈도가 높은 사용자에게 용이하다.
  • 일반적으로 네트워크에 연결되어 있으며, 실시간으로 사용할 수 있는 간편한 월렛이다.
  • 온라인 해킹으로부터 취약하기에, Private Key 보안에 주의해야한다.

3-2. 콜드 월렛

인터넷과 연결되지 않은 것.

  • 인터넷과 연결되어 있지 않은 오프라인 상태로, 주로 하드웨어 모습을 하고 있어 하드웨어 월렛이라고 부른다.
  • 오프라인으로 키를 저장하기 위해 물리적 매개체를 사용해서, 온라인 해킹 시도를 방어할 수 있다.
  • 콜드 스토리지 라고도 하며, 장기 투자자에게 적합하다.

예를 들어 바이낸스는, 자금을 보호하기 위해 일부의 코인만 핫 월렛에 보유하고 나머지는 콜드 스토리지에 저장하고 있다.

4. 소프트웨어 지갑

대부분은 어떤 식으로든 인터넷과 연결(핫 월렛)된다.

4-1. 웹 지갑

블록체인에 접근하기 위해 웹 지갑을 사용할 수 있고, 다운로드나 설치 없이 브라우저 인터페이스를 사용한다.
거래소 지갑과 기타 브라우저 기반 지갑 공급자가 여기에 해당한다.

보통 새 지갑을 만들고 개인 키를 설정할 수 있다.
그러나 일부 서비스 공급자는, 사용자 대신 개인 키를 보관하고 관리해주기도 한다.
이건 입문자에게는 편리하겠지만, 매우 위험한 일이다.
나의 개인 키를 내가 보유하고 있지 않으면, 다른 사람(서비스 공급자)에게 내 자금을 신탁한 것과 같다.

이 문제를 해결하기 위해
웹 지갑들은 사용자가 자신들의 개인 키를 전적으로, 혹은 공동(다중서명 지갑)을 통해 관리할 수 있게 한다.

4-2. 데스크톱 지갑

컴퓨터에 다운로드하고 실행하는 소프트웨어.
웹 기반 버전과 달리, 내 키와 자금을 전적으로 관리할 수 있다.
새로운 데스크톱 지갑을 생성하면 컴퓨터에 wallet.dat 파일이 생성된다.
이 파일은 암호화폐 지갑에 접근하는 개인 키 정보를 포함하고 있기 때문에, "개인 비밀번호" 로 해당 파일을 암호화 해야한다.

데스크톱 지갑을 암호화하면, 소프트웨어를 실행할 때마다 비밀번호를 입력해야 wallet.dat 파일을 읽을 수 있다.

파일을 잃어버리거나 비밀번호를 잊어버리면 자금에 접근하지 못한다.

따라서 wallet.dat 파일을 백업하고 안전한 곳에 보관해야한다.
(또는 상응하는 개인 키 또는 시드 문구를 내보내 다른 장치에서 자금에 접근할 수 있도록 할 수 있다.)

일반적으로 웹 버전보다는 더 안전한 것으로 간주되지만,
암호화폐 지갑을 설정하고 사용하기 전에 컴퓨터가 바이러스에 감영되지 않았는지 필수적으로 확인해야 한다.

4-3. 모바일 지갑

데스크톱 지갑과 유사하지만, 스마트폰 애플리케이션으로 특히 디자인 된 지갑이다.

일상적 거래와 결제를 처리하는데 적합하고, 현실에서 암호화폐를 사용할 수 있게 하는 매우 실용적인 옵션이다.
트러스트월렛이 그 예시.

  • QR 코드로 암호화폐를 주고받을 수 있어 편리하다
  • 데스크톱과 모바일 기기는 악성 앱과 맬웨어 감염에 매우 취약하다.
  • 스마트폰 분실/파손을 대비해 "비밀번호"로 모바일 지갑을 암호화하고, 개인키(또는 시드문구)를 백업하는 것이 좋다.

5. 하드웨어 지갑

공개 키와 개인 키를 생성하기 위해 난수 생성기(RNG, Random Number Generation)를 사용하는 물리적 전자 장치

이것으로 생성된 키는 인터넷과 연결되지 않은 장치 안에 저장된다.

따라서 하드웨어 저장소는 콜드 월렛의 일종으로 구성되고, 가장 안전한 방법으로 여겨진다.
암호화폐를 장기간 보관하거나, 많은 양의 암호화폐를 보유하고 있는 경우 하드웨어 지갑의 사용을 고려해야한다.

  • 온라인 공격을 방어하는 높은 수준의 보안을 제공하지만,
    펌웨어 구현이 제대로 이루어지지 않은 경우 위험할 수 있다.
  • 하드웨어 지갑은 사용이 어렵고, 핫 월렛과 비교했을 때 자금에 접근하기 어렵다.

6. 종이 지갑

QR코드 형태공개주소개인 키가 실제로 프린트 된 종이.
암호화폐 트랜잭션을 위해 이를 스캔할 수 있다.

일부 종이 지갑은 웹사이트에서 코드를 다운로드한 후 오프라인 상태에서 새로운 주소와 키를 생성할 수 있다.
이런 지갑은 해킹에 매우 안전하고, 콜드 스토리지의 대안이 될 수 있다.

  • 하지만 종이지갑은 전체 자금을 한 번에 전송하기 때문에 부분 전송엔 적합하지 않다.
  • 부분 전송을 위해 일부를 데스크톱 지갑 등에 전송한 뒤에 종이 지갑에 남아있는 전부를 전송하고, 다시 데스크톱 지갑에서 종이지갑으로 옮길 수는 있지만,
    데스크톱 지갑에 종이 지갑의 개인 키를 불러오고 자금의 일부를 사용하면, 잔여 코인은 비트코인 프로토콜을 따라 자동으로 생성된 변경주소로 전송된다.
  • 이 변경주소를 직접 설정하지 않는다면, 자금을 잃을 수도 있다!

대부분의 소프트웨어 지갑은, 잔여 코인을 지갑의 일부인 주소로 전송하는 해당 변경을 대신 처리해준다.
그러나 종이 지갑은 첫번째 전송 이후 지갑이 텅 비어버리는 것을 명심해야함.

8. MetaMask

메타마스크는 사용자들이 이더리움 계정과 개인키를 안전하게 관리할 수 있게 해주는,
크롬/파이어폭스 브라우저 확장 프로그램이다.
해당 계정으로 Web3.js를 사용하는 웹사이트들과 상호작용을 할 수 있게 해준다!

DApp을 메타마스크와 호환시킨다는 것은,
사용자들이 웹 브라우저를 통해 내 DApp과 상호작용할 수 있다는 것.

메타마스크는 내부적으로 Infura의 서버를 Web3 프로바이더로 사용한다.
사용자들이 그들만의 Web3 프로바이더를 선택할 수 있는 옵션 또한 있다.
따라서 메타마스크의 Web3 Provider를 사용하도록 하자.

메타마스크는 web3 라는 전역 자바스크립트 객체를 통해,
브라우저에 Web3 Provider를 주입한다.

따라서 내 앱에서는 web3 객체가 존재하는지 확인하고,
존재한다면 web3.currentProvider를 Provider로 사용하면 되는 것.

8-1. web3 객체?

8-1-1. Injected Web3

웹 브라우저 자체에 내장된 프로바이더

크롬 지갑인 메타마스크와 연동하여 사용한다.

  • web3 오브젝트에 대한 프로바이더로 메타마스크미스트 브라우저를 사용할 수 있다

  • 미스트에서 리믹스를 실행하면 기본적으로 Injected Web3환경이 선택된다

  • 미스트와 연결된 geth클라이언트를 사용한다

-미스트에서는 Injected Web3 환경에서 컨트랙트를 생성했을 때 트랜잭션이 처리되지만 생성된 컨트랙트가 화면에 표시되지 않는다.

여기서 web3 외부 API를 이용하면, 자신이 작성한 애플리케이션에서 이더리움 노드에 접근할 수 있다.

8-1-2. Web3 Provider

이더리움 클라이언트의 RPC 주소를 제공하도록 요청

메타마스크web3 Provider가 웹 브라우저에 내장될 수 있는데,
이걸 테스트 넷 또는 메인넷에 연결하도록 구성할 수 있고 이를 실제 네트워크와 상호작용하도록 할 수 있다.

메타마스크의 Web3 프로바이더로 Web3.js를 초기화하는 것.

왜 메타마스크가 제공하는 web3로 초기화해야해?

메타 마스크는 자체적인 Web3 Provider를 갖고, 그러니 메타 마스크는 Injected Web3와 Web3 Provider면에서 비슷한 기능을 갖는다.
그러나 가장 중요한 차이점은,
메타 마스크는 계정 관리가 가능한데, Web3 Provider의 경우는 그러한 계정 관리를 클라이언트에서 해야 된다는 것이다

📌 세상을 바꿀 Web 3.0 - Web3.js 예제로 실습하기(1) 참조

geth나 Ganache 사용시에 이용한다.

  • 원격 프로시저 호출(RPC, Remote Procedure Call)을 이용해서 리모트에 있는 geth 클라이언트를 사용할 수 있다. 원격 프로시저 호출을 사용하려면 geth 클라이언트 실행 시 --rpc 옵션을 지정해야하는데, 보통 8545포트를 기본 포트로 사용한다.

8-1-1. 어떻게 서로 연결 시켜주는가?

web3 provider같은 것들을 어떻게 서로 연결 시켜주는가?

메타마스크가 제공하는 템플릿 코드

사용자가 메타마스크를 설치했는지 확인하고,
설치가 안되었다면 메타마스크를 설치해야한다고 알려주는 코드다.

이로써 메타마스크의 Web3 프로바이더로 Web3.js를 초기화된다.

window.addEventListener('load', function() {

  // Web3가 브라우저에 주입되었는지 확인(Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Mist/MetaMask의 프로바이더 사용
    web3js = new Web3(web3.currentProvider);
  } else {
    // 사용자가 Metamask를 설치하지 않은 경우에 대해 처리
    // 사용자들에게 Metamask를 설치하라는 등의 메세지를 보여줄 것
  }

  // 앱을 시작하고 web3에 자유롭게 접근할 수 있다
  startApp()

})

미스트(Mist)란?
메타마스크 말고도 사용자들이 쓸 수 있는 다른 개인 키 관리 웹브라우저.
이또한 web3 변수를 주입하는 동일한 형태를 사용한다.
그러니 사용자들이 다른 프로그램을 쓰더라도 여기서 설명하는 방식으로 사용자의 Web3 프로바이더를 인식할 수 있다.

참고
블록체인에서의 UTXO와 Account/Balance 모델

profile
Web Front-end developer
post-custom-banner

0개의 댓글