원시 거래 직렬화

비트코인 거래를 원시 16진수로 직렬화하는 방법 - 버전, 입력, 출력, 그리고 locktime을 올바른 바이트 순서로.

0단계 ·

진행률 0/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진수 블롭은 아직 유효하지 않습니다 - 서명이 필요합니다. 그것이 다음입니다.

다음 단계

거래 서명으로 계속해서 지출을 승인하는 암호학적 증명을 만드는 방법을 배우세요.