원시 거래 직렬화
비트코인 거래를 원시 16진수로 직렬화하는 방법 - 버전, 입력, 출력, 그리고 locktime을 올바른 바이트 순서로.
0단계 ·
무엇을 배우는가
- 비트코인 거래의 완전한 직렬화 형식
- 리틀 엔디안 인코딩과 비트코인이 그것을 사용하는 이유
- 모든 필드를 단일 16진수 문자열로 조립하는 방법
거래 형식 개요
직렬화된 비트코인 거래는 엄격한 구조의 바이트 시퀀스입니다. 레거시(비 SegWit) 거래의 레이아웃:
[Version] [Input Count] [Inputs...] [Output Count] [Outputs...] [Locktime]
SegWit 거래의 경우 두 개의 추가 필드가 삽입됩니다:
[Version] [Marker] [Flag] [Input Count] [Inputs...] [Output Count] [Outputs...] [Witness...] [Locktime]
각 필드를 살펴봅시다.
버전 (4 바이트)
거래 버전 번호. 거의 모든 현대 거래는 버전 2를 사용합니다(BIP68을 통한 상대 타임락을 활성화):
02000000
이것은 리틀 엔디안으로 0x00000002입니다. 버전 1 (01000000)은 여전히 유효하지만 BIP68 시퀀스 기반 타임락을 지원하지 않습니다.
Marker와 Flag (SegWit 전용, 2 바이트)
SegWit 거래는 버전 뒤에 마커 바이트(0x00)와 플래그 바이트(0x01)를 삽입합니다. 이들은 파서에게 증인 데이터가 뒤따른다는 것을 알립니다:
0001
마커는 반드시 0x00이어야 합니다. 플래그는 반드시 0이 아니어야 합니다(현재는 항상 0x01).
입력 수 (VarInt)
입력의 수를 나타내는 가변 길이 정수. 1~252개 입력의 경우, 단일 바이트입니다:
01 → 1 input
02 → 2 inputs
fd → followed by 2-byte little-endian count (for 253+)
직렬화된 입력
각 입력은 3단계에서 설명한 대로 직렬화됩니다:
[Previous TX Hash: 32 bytes]
[Output Index: 4 bytes]
[ScriptSig Length: VarInt]
[ScriptSig: variable]
[Sequence: 4 bytes]
서명 전 SegWit 입력의 경우, ScriptSig는 비어 있습니다 (길이 = 00).
출력 수 (VarInt)
입력 수와 같은 인코딩. 우리의 2-출력 거래:
02
직렬화된 출력
4단계에서 설명한 각 출력:
[Value: 8 bytes]
[ScriptPubKey Length: VarInt]
[ScriptPubKey: variable]
증인 데이터 (SegWit 전용)
증인 섹션은 모든 출력 뒤, locktime 앞에 나타납니다. 각 입력은 대응하는 증인 스택을 갖습니다. 8단계에서 자세히 다루겠지만, 구조는 다음과 같습니다:
[Stack item count: VarInt]
[Item 1 length: VarInt] [Item 1 data]
[Item 2 length: VarInt] [Item 2 data]
...
P2WPKH 입력의 경우, 증인은 두 개의 항목을 포함합니다: 서명과 공개키.
Locktime (4 바이트)
locktime 필드는 거래가 블록에 포함될 수 있는 가장 이른 시간 또는 블록 높이를 지정합니다:
00000000 → No locktime (can be mined immediately)
값이 500,000,000 미만이면 블록 높이로 해석됩니다. 그렇지 않으면 Unix 타임스탬프입니다. 대부분의 거래는 0 또는 현재 블록 높이를 사용합니다(fee sniping - 채굴자 인센티브 공격을 방지하기 위해).
리틀 엔디안 인코딩
비트코인 직렬화는 대부분의 다중 바이트 정수에 리틀 엔디안 바이트 순서를 사용합니다. 이는 최하위 바이트가 먼저 온다는 것을 의미합니다:
Decimal 500,000 = 0x0007A120
Big-endian: 0007A120
Little-endian: 20A10700
예외는 이전 거래 해시인데, 원시 256비트 값으로 저장됩니다 - 하지만 txid는 전통적으로 빅 엔디안으로 표시되기 때문에, 직렬화된 거래에 삽입할 때는 바이트 순서를 뒤집어야 합니다.
완전한 예시
여기 우리의 1-입력, 2-출력 SegWit 거래(서명 전):
02000000 # Version 2
0001 # SegWit marker + flag
01 # 1 input
3f4fa198...7b1eabe0 # Previous TX hash (32 bytes, reversed)
00000000 # Output index 0
00 # Empty ScriptSig
fdffffff # Sequence (RBF enabled)
02 # 2 outputs
e093040000000000 # Output 0: 300,000 sats
160014<recipient-hash> # P2WPKH ScriptPubKey
b882020000000000 # Output 1: 198,590 sats (change)
160014<change-hash> # P2WPKH ScriptPubKey
# Witness data (empty until signing)
00000000 # Locktime 0
이 16진수 블롭은 아직 유효하지 않습니다 - 서명이 필요합니다. 그것이 다음입니다.
다음 단계
거래 서명으로 계속해서 지출을 승인하는 암호학적 증명을 만드는 방법을 배우세요.