블록체인에서 사용하는 지갑은 코인이나 토큰과 같은 자산을 관리하고 거래할 수 있다. 실제로 지갑에 자산이 들어있는 것은 아니지만 개인키와 공개키를 가지고 블록체인에 기록된 자산에 접근할 수 있는 권한을 관리할 수 있다. 또한 사용자가 자산을 전송할 때 지갑은 개인키를 사용해 트랜잭션(거래)에 서명하며 해당 자산이 내 것이다 라고 소유임을 증명하며 네트워크는 이 서명을 검증하여 거래를 승인하게 된다.
지갑의 유형
블록체인 지갑은 소프트웨어 지갑, 하드웨어 지갑으로 구분할 수 있다.
소프트웨어지갑
소프트웨어지갑은 데스크탑, 모바일, 웹에서 사용되며 편리하지만 해킹위험이 있다. 특히나 많이 사용되고 있는 웹지갑은 웹브라우저에서 사용되는 지갑이며 모바일 지갑은 스마트폰에 설치되는 지갑으로 MetaMask, TrustWallet 등이 있다.
하드웨어지갑
하드웨어지갑은 인터엣에 연결되지 않는 물리적 장치에 저장된 지갑이기 때문에 보안성이 높으며 사용할때 인터넷을 연결해 사용한다.
예시로 Ledger, Trezor 등이 있다.
지갑의 구성요소
지갑에서 중요한 3대 구성요소는 다음과 같다.
개인키(Private Key)
사용자가 자산을 전송하거나 트랜잭션에 서명할때 사용하는 개인키이다. 개인키는 비밀로 유지되어야 하며 개인키를 알면 그 지갑의 자산을 컨트롤할 수 있는 모든 권한을 가지고 있다고 보면된다. 따라서 지갑생성시 개인키를 꼭 서면에 보관하라는 메시지가 표시될 정도로 개인키를 복사해서 인터넷으로 연결하면 접근가능한 곳에 보관하면 매우 위험하다. 즉 이러한 보관법은 해킹의 위험성이 굉장히 높다.
공개키(Public Key)
개인키로부터 생성된 키가 공개키 이며 이 둘은 한 쌍을 이룬다. 공개키를 통해서 지갑 주소가 만들어진다.
지갑주소(Wallet Address)
지갑주소는 공개키를 변환해 짧에 만든 문자열로 사용자가 자산을 받을때 이 주소를 통해서 자산을 수신하게 된다.
블록체인 지갑의 동작 방식
A사용자가 암호화폐를 전송하기 위해서는 암호화폐 거래에 개인키를 사용해야 해당 거래에 서명을 한다. 여기서 거래는 트랜잭션이라고 부른다. 서명된 트랜잭션은 블록체인 네트워크에 전송되어 해당 트랜잭션이 검증되고 블록에 기록된다.
네트워크는 공개키를 사용해 서명이 올바르게 되었는지 검증하고 올바른 서명일 경우에만 블록체인에 기록된다.
지갑 주소는 어떻게 생성될까?
블록체인 지갑을 만들때 보통 비대칭 암호화 알고리즘 기반으로 이루어진다. 가장 많이 사용되는 알고리즘은 ECDSA (Elliptic Curve Digital Signature Algorithm, 타원 곡선 디지털 서명 알고리즘이다. 이 알고리즘을 사용해 개인키와 공개키를 생성하고 이를 통해 지갑 주소를 만들어낸다.
지갑 생성 과정
1. 랜덤한 개인키 생성
지갑 생성시 첫 단계는 난수를 이용해 고유한 개인키를 생성하는 것이다. 개인키는 일반적으로 256비트의 숫자이며 임의의 큰 숫자로 생성된다. 이 과정은 암호화적 난수 생성기를 사용해 예측 불가능하게 이루어진다.
개인키는 보통 64자리 16진수로 표현된다. 예를 들면 이와같은 형태이다.
- 0xA3B1D1...
개인키를 생성하기 위해서 난수를 이용한다고 했는데, 이때 난수는 중복되지 않을 수 있을까?에 대한 질문을 한다면 엔트로피로부터 사용되는 개인키이기 때문에 중복될 가능성이 없다고 봐도 된다고 말할 수 있다.
엔트로피는 지갑의 개인키를 생성할 때 사용되는 난수의 무작위성을 측정하는 개념으로 암호학에서 중요한 역할을 하며 예측 불가능하고 무작위적인 값을 보장하기 위해 사용된다.
엔트로피는 보통 비트(bit) 단위로 측정된다. 예를 들어, 개인키의 경우 256비트의 엔트로피를 요구하는데, 이는 2^256(약 10^77)개의 가능한 값 중 하나로 개인키가 무작위로 선택된다는 뜻으로 이는 어마어마한 양의 무작위성으로, 사실상 예측 불가능하다.
2. 개인키로부터 공개키 생성
개인키를 생성했다면 타원곡선 암호화 (ECC) 알고리즘을 사용해 공개키를 생성한다. ECC는 개인키로부터 공개키를 생성할 수 있지만 반대로 공개키에서 개인키를 만들어내는 것은 불가능하다.
타원 곡선 알고리즘의 특징은 공개키는 개인키의 일방향 함수를 사용해 생성해 매우 안전하다는 것이다.
비트코인과 이더리움과 같은 블록체인에서 사용되는 타원 곡선은 secp256k1 곡선을 사용한다.
3. 공개키 해싱 및 지갑 주소 생성
공개키를 만들었다면 공개키로부터 지갑주소를 생성하기 위해 공개키에 대해 해시 알고리즘을 적용한다. 이 과정은 블록체인마다 다르며 일반정인 경우 다음과 같은 단계로 진행된다.
- 공개키를 해싱 : SHA256알고리즘 사용하여 공개키를 해싱한다.
- 그 결과를 RIPEMD-160 해시 알고리즘을 적용해 160비트의 해시값을 생성한다.
- 그 후 특정 네트워크 정보를 추가하며 최종 지갑 주소를 만든다.
비트코인의 경우 다음과 같은 단계로 진행된다.
- 공개키 해싱 : 공개키에 SHA256 과 RIPEMD-160 알고리즘을 차례대로 적용해 짧은 해시값을 생성한다.
- 버전 바이트 추가 : 네트워크 타입 (메인넷 , 테스트넷)에 따라 버전 바이트를 추가한다. 비트코인의 경우는 0x00을 추가한다.
- 체크섬 추가 : 데이터 무결성을 확인하기 위해 추가적인 체크섬을 추가한다.
- Base58 인코딩 : 최종적으로 사람이 읽기 쉬운 문자열 형태로 표현하기 위해 Base58로 인코딩한다.
이 과정을 진행하면 지갑 주소가 생성된다.
비트코인 지갑 생성하는 알고리즘을 코드로 비교해보겠다.
개인키 생성
private_key = random(256-bit)
공개키 생성
public_key = private_key * G // G는 타원 곡선의 생성점
공개키 해싱
public_key_hash = RIPEMD-160(SHA-256(public_key))
지갑주소 생성
versioned_hash = version_byte + public_key_hash
checksum = SHA-256(SHA-256(versioned_hash))[:4]
address = Base58(versioned_hash + checksum)
이더리움 지갑의 경우는 공개키를 생성한후 공개키 마지막 20바이트를 사용해 지갑주소를 생성하는데, 이더리움 지갑주소는 체크섬이 없기 때문에 바로 Base16형식으로 주소를 표시한다.
'Development' 카테고리의 다른 글
iOS Swift PassKey 구현 샘플 코드 (0) | 2024.10.21 |
---|---|
OAuth2.0 동작 흐름 알아보기 (0) | 2024.10.20 |
OpenID Connect 와 Auth2.0 (0) | 2024.10.19 |
Android12 SplashScreen 대응 방법 (feat. 앱 실행상태) (0) | 2024.07.30 |
Flutter In iOS 14+, debug mode Flutter apps can only be launched from Flutter tooling 오류를 만난 이유 (1) | 2024.06.08 |