Chapter 4. 직렬화

Kyle Lee
Programming Bitcoin
8 min readMay 31, 2020

아래 글에서는 <밑바닥부터 시작하는 비트코인(Programming Bitcoin)> — Jimmy Song, 한빛미디어(2019)의 Chapter4 직렬화에 대한 내용을 다룬다. 직렬화는 비트코인 네트워크에서 데이터를 주고 받기 위해 사용하는 방식에 대한 설명이다.

Writer. Kyle Lee

Programming Bitcoin Series

Chapter 1. 유한체
Chapter 2. 타원곡선
Chapter 3. 타원곡선 암호
Chapter 4. 직렬화
Chapter 5. 트랜잭션
Chapter 6. 스크립트
Chapter 7. 트랜잭션 검증과 생성
Chapter 8. p2sh 스크립트
Chapter 9. 블록
Chapter 10. 네트워킹
Chapter 11. 단순 지급 검증
Chapter 12. 블룸 필터
Chapter 13. 세그윗

Contents

  1. 직렬화(Serialization)란?
  2. 빅엔디언/리틀엔디언
  3. SEC 형식 직렬화
  4. DER 서명 형식 직렬화
  5. 비트코인 주소 및 WIF 형식 직렬화

1. 직렬화(Serialization)란?

각 Transaction은 아래 4가지 구성요소로 이루어진다.(Chapter 5. 트랜잭션 참고)

*1. 버전(Version)
*2. 입력(Inputs)
*3. 출력(Outputs)
*4. 록타임(Locktime)

그리고 각 입력(Inputs)은 다시 4가지의 하위 구성요소를 가진다.

*2-A. 이전 Transaction ID
*2-B. 이전 Transaction Output에서의 Index
*2-C. 해제 스크립트(ScriptSig)
*2-D. 시퀀스(Sequence)

각 출력(Outputs) 또한 하위의 구성요소를 가진다.

이와 같이 Transaction을 구성하는 각 data를 네트워크를 통해 다른 노드들에게 전송하기 위해서는 이를 byte stream으로 변환한는 과정이 필요하다. 이것이 “직렬화(Serialization)”이다.

(참고A) byte란?
일반적으로 8비트로 표시할 수 있는 데이터의 크기(2⁸ = 256)를 말한다. 1바이트는 16진수 두개로 표시를 한다.
ex) 0 = 0x00, 1 = 0x01, 2 = 0x02, …, 254 = 0xFE, 255 = 0xFF

(참고B) byte stream이란?
바이트 단위로 데이터를 주고 받는것을 말한다.

책 Chapter 4.의 뒤쪽에 있는 “직렬화”의 두 가지 방식을 먼저 이해하는 것이 좋다.

2. 빅엔디언/리틀엔디언

위 그림 오른쪽의 “빅엔디언”은 우리가 숫자를 쓰는 방법과 마찬가지로 높은 자리수의 byte가 앞(왼쪽)에 씌여지는 방식이다.

위 그림 왼쪽의 “리틀엔디언”은 이와는 반대로 높은 자리수의 byte가 뒷(오른쪽)에 씌여진다. 헷갈리지 말아야 하는 것은 1byte는 16진수를 나타내는 문자(0 ~ 9, A ~ F) 2개로 씌여지며, 이것은 항상 “빅엔디언” 방식으로 씌여진다. 참고로, 빅엔디언은 디버깅에 용이하며, 리틀엔디언은 컴퓨터의 연산에 용이하다.

사토시는 비트코인에서 리틀엔디언을 자주 사용했다. 그러나, SEC형식과 주소, 그리고 WIF 형식에서는 빅엔디언을 사용한다. 이것에 대한 명확한 규칙은 없다고 책에서 설명한다.

3. SEC 형식 직렬화

“SEC(Standards for Efficient Cryptography)”는 ECDSA 공개키를 직렬화하는 표준안이다.

“ECDSA(Elliptic Curve Digital Signature Algorithm)”는 디지털 서명 알고리즘이다. 자세한 내용은 3장을 참조하길 바란다.

타원곡선 암호방식에서 공개키는 (x, y) 좌표 형식으로 씌여진다. 이 data를 직렬화하는 방식은 다음과 같다.

*1. 0x04 : Marker이며, 크기는 1byte.
*2. x 좌표를 기록한다. 크기는 32byte이며, 빅엔디언 형식으로 씌여진다.
*3. y 좌표를 기록한다. 크기는 32byte이며, 빅엔디언 형식으로 씌여진다.

비압축방식은 총 65byte를 사용한다.

그런데, 타원곡선 특성상 같은 x 좌푯값을 갖는 타원곡선 위 점은 2개이다. 이를 구분할 수 있다면, 직렬화 할 때, y좌표값을 생략하여 기록할 수 있다.

*1. Marker를 기록한다. 크기는 1byte이며, y값이 짝수이면 0x02, 홀수이면 0x03이 해당 값이다.
*2. x 좌표를 기록한다. 크기는 32byte이며, 빅엔디언 형식으로 씌여진다.

즉, 압축 SEC 형식으로 직렬화에 사용되는 data의 양은 총 33byte로 줄여진다.

4. DER 서명형식 직렬화

“DER(Distinguished Encoding Rules)”는 서명을 직렬화하는 표준형식이다.

*1. 0x30 : Marker이며, 크기는 1byte.
*2. 서명의 길이, 보통 0x44 or 0x45
*3. 0x02 : r값의 시작을 표시
*4. r값의 길이
*5. r값 : 빅엔디언 정수로 표현
*6. 0x02 : s값의 시작을 표시
*7. s값의 길이
*8. s값 : 빅엔디언 정수로 표현

DER형식은 최대 72byte까지 길어질 수 있다.

5. 비트코인 주소 및 WIF 형식 직렬화

A. Base58 부호화
아라비아 숫자 10개, 영어 알파벳 대소문자 총52개에서 숫자0, 알파벳I, 알파벳O, 알파벳l을 제외한 총 58개 문자로 데이터를 표시하는 방식이다. 공개키의 가독성을 높이고, 길이를 줄이며, 동시에 보안을 높이기 위한 방안이라고는 하나, 실질적인 불편함은 전혀 감소되지 않았다고 생각된다.

B. 비트코인 주소 형식
*1. 0x00 : 메인넷 주소를 의미(0x6f : 테스트넷 주소)
*2. hash160(pubKey) = ripemd160(sha256(pubKey))
*3. hash256(#1 || #2)
*4. #3의 첫 4바이트를 취함
*5. Base58(#3||#4)
*6. pubKey : SEC형식의 공개키

C. 비밀키의 WIF 형식
비트코인 비밀키는 256비트의 숫자이며, 이는 네트워크를 통해 전송해서는 안된다. 단, WIF는 비밀키를 읽기 쉽도록 직렬화 하는 방법이다.

*1. 0x80 : 메인넷 비밀키를 의미(0xef : 테스트넷 비밀키)
*2. 256비트의 숫자를 32바이트(256/8) 길이의 빅엔디언으로 표현
*3. 대응하는 공개키가 압축 SEC 형식으로 표현했다면, 0x01을 뒤에 추가
*4. hash256(#1 || #2 || #3)
*5. #4의 첫 4바이트를 취함
*6. Base58(#4 || #5)

Base58은 사토시 나카모토에 의해 도입된 인코딩 방식이다. Base64와 비슷하지만 숫자와 알파벳이 헷갈리지 않도록 수정되었다. 그러나 위에서도 언급했듯이 Base58로 인코딩이 되었다고 해도 사람이 인식하기에는 너무나 불편함이 크다. 이를 위한 대안으로, 비트코인 프로토콜(Bitcoin Protocol) 상위에 이메일 형식을 개인의 공개키 주소로 쓰는 Paymail protocol이 점차 확산되며 사용되고 있다. Handcash, Moneybutton, RelayX, Centbee 등 대부분의 비트코인 지갑은 Paymail을 지원한다. 따라서 Base58로 인코딩된 주소를 사용자들이 쓰게될 일은 점차 사라질 것으로 예상한다.

Paymail과 P2P Tansaction

Paymail protocol의 도입은 단순히 공개키 주소를 쉽게 알아보기 것 이상의 의미가 있다. 비트코인 네트워크의 확장을 위해 필수적인 P2P 트랜잭션을 위한 필수요소이다.

사용자A가 사용자B에게 비트코인 전송하는 방식은 A가 트랜잭션을 생성하여 브로드캐스팅하고 이를 B가 인식하는 것으로 알려져있다. 그렇지만 Paymail protocol을 이용한다면 A는 B와 Peer-to-Peer로 연결하여 트랜잭션을 직접적으로 전달하고, 이를 B가 브로드캐스팅하는 방식으로도 비트코인 전송이 가능해진다. 이는 마치 checkbook을 사용하는 것과 비슷한 방식이다. 이로인해 사용자 B는 자신의 잔고를 업데이트하기 위해 블록체인의 모든 트랜잭션을 검색할 필요가 없어지게 된다.

사토시 나카모토가 IP-to-IP 방식으로 비트코인을 전송하는 방식을 초기에 마련해 놓았으나, 이후 보안상의 문제로 제거되었다. 그렇지만 Paymail protocol과 P2P 트랜잭션의 도입으로 예전보다 더 편리하고 보안성 높은 방식으로 이것이 구현되었으며, 동시에 이를 통해 비트코인의 확장성 문제도 해결이 되었다.

만일 비트코인의 전송이 느리고 수수료도 비싸다고 알고 있다면, 그것은 사토시 나카모토가 만든 것이 아닌 기술적으로 변형된 비트코인을 사용했다는 것이다. 비트코인은 매우 빠르고 저렴한 수수료로 즉시 전송 및 사용이 가능하다.

  • 이 글에서의 비트코인(Bitcoin)은 기술적으로 original protocol에 가장 가까운 것을 지칭한다.

--

--