Checksum

비트코인 지갑 주소는 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 처럼 복잡한 난수들의 집합으로 보인다. 만약 친구에게 돈을 보내려다 주소의 맨 마지막 글자 a를 b로 잘못 입력하면 어떻게 될까? 내 소중한 비트코인은 영원히 허공으로 사라지는 걸까? 다행히도 그런 일은 거의 발생하지 않는다. 바로 체크섬(Checksum) 이라는 기술 덕분이다.

체크섬은 데이터의 무결성 확인하기 위한 일종의 지문이다. 원본 데이터에서 수학적 알고리즘을 통해 도출된 작은 데이터 조각으로, 주로 네트워크 전송이나 저장 과정에서 데이터가 손상되거나 변조되지 않았는지(오타 감지) 확인하기 위해 사용된다. 대표적으로 주민등록번호의 마지막 자리나, 신용카드 번호의 마지막 자리가 바로 앞의 숫자들을 검증하기 위한 체크섬이다. 따라서, 카드 번호를 임의로 바꾸면 검증 실패하게 된다.

비트코인 주소는 단순히 공개키의 해시값이 아니다. 사용자가 실수로 오타를 내는 것을 방지하기 위해 Base58Check 라는 인코딩 방식을 사용한다. 이 구조를 뜯어보면 체크섬의 역할을 명확히 알 수 있다.

비트코인 주소는 공개 키 자체가 아니라 공개 키의 해시 값(Public Key Hash)이다. 생성 과정은 다음과 같다.

비트코인 주소(Bitcoin Address) 생성 시, 공개 키를 해싱하는 주된 이유 는 주소 로 변환하기 전에 길이를 줄이기 위해서이다. 또한 RIPEMD-160은 퍼블릭 키를 더 짧게 압축하는 데 사용되며, 생성된 해시에는 더블 SHA-256을 이용한 체크섬이 추가되어 오류를 방지하고 주소의 유효성을 검증한다.

비트코인 주소는 크게 세 부분으로 나뉜다.

[ 버전(Prefix) ] + [ 데이터(Payload: 공개키 해시) ] + [ 체크섬(Checksum 4bytes) ]
  • Version: 주소의 타입을 나타낸다. (e.g 메인넷은 0x00으로 시작해서 1로 표시됨)
  • Payload: 실제 코인을 받을 계좌번호(공개키의 해시)이다.
  • Checksum: 앞의 데이터가 올바른지 검증하는 꼬리표이다.

비트코인은 체크섬을 만들기 위해 Double SHA-256을 사용한다.

Checksum = SHA256(SHA256(Version + Payload)) 의 앞 4바이트

즉, 주소의 맨 뒤에 붙어 있는 4바이트는 앞의 데이터들을 두 번 해시한 결과물의 일부분이다.

예를 들어 여러분이 지갑 앱에 주소를 입력할 때 오타를 냈다고 가정해 보자. 지갑 앱은 입력된 주소에서 마지막 4바이트(체크섬) 를 분리한다. 그리고 나머지 앞부분(버전+데이터)을 가지고 직접 해시 함수를 돌려 새로운 체크섬을 계산하고, 입력된 체크섬 vs 계산된 체크섬을 비교한다. 만약, 오타가 단 한 글자라도 있다면, 해시 함수의 특성(쇄도 효과) 때문에 계산된 체크섬은 완전히 다른 값이 된다. 지갑 앱은 즉시 "유효하지 않은 주소입니다" 라는 경고를 띄우고 전송 버튼을 비활성화한다.