거래 서명

비트코인 거래 서명이 작동하는 방식 - SIGHASH 유형, 서명 다이제스트, 소유권을 증명하는 ECDSA 서명.

0단계 ·

진행률 0/0

무엇을 배우는가

  • SIGHASH 유형이 무엇이고 무엇이 서명되는지를 어떻게 제어하는지
  • 서명 다이제스트를 구성하는 방법 (해시되는 데이터)
  • ECDSA 서명이 개인키를 공개하지 않고 소유권을 증명하는 방식

서명이 필요한 이유

입력은 UTXO를 참조하지만, 누구나 당신의 코인을 쓴다고 주장하는 거래를 작성할 수 있습니다. 서명은 거래가 UTXO의 잠금 스크립트에 해당하는 개인키 소유자에 의해 승인되었다는 것을 증명합니다.

유효한 서명 없이는 노드가 거래를 거부합니다. 서명은 소원을 승인으로 바꾸는 것입니다.

SIGHASH 유형

서명 전에 서명이 거래의 어느 부분을 커버하는지 결정하는 SIGHASH 유형을 선택합니다. 이것은 서명 후에 무엇이 수정될 수 있는지를 제어합니다.

SIGHASH 유형서명되는 것
SIGHASH_ALL0x01모든 입력과 모든 출력
SIGHASH_NONE0x02모든 입력, 출력 없음
SIGHASH_SINGLE0x03모든 입력, 같은 인덱스의 출력만
SIGHASH_ANYONECANPAY0x80위와 결합; 현재 입력만 서명

**SIGHASH_ALL (0x01)**은 대다수 거래에서 사용됩니다. 의미: "나는 정확히 이 입력들이 정확히 이 출력들에 쓰이는 것을 승인합니다. 아무것도 바꾸지 마세요."

SIGHASH_ANYONECANPAY | SIGHASH_ALL (0x81)은 여러 사람이 공유된 출력 집합에 입력을 기여하는 크라우드펀딩 스타일 거래에 사용됩니다.

서명 다이제스트

서명은 원시 거래를 직접 커버하지 않습니다. 대신 서명 다이제스트를 구성합니다 - 관련 거래 데이터에 커밋하는 해시입니다.

레거시 서명 (SegWit 이전)

레거시 거래의 경우, 과정은:

  1. 직렬화된 거래로 시작
  2. 현재 입력의 ScriptSig를 이전 출력의 ScriptPubKey로 교체
  3. 다른 모든 입력의 ScriptSig를 비움으로 설정
  4. SIGHASH 유형을 4바이트 리틀 엔디안 값으로 추가
  5. 결과에 더블 SHA256 적용
digest = SHA256(SHA256(modified_tx || sighash_type))

이 과정은 각 입력에 대해 개별적으로 반복되어야 합니다.

SegWit 서명 (BIP143)

BIP143은 SegWit 입력에 대해 더 효율적인 서명 알고리즘을 도입했습니다. 각 입력에 대해 전체 거래를 다시 직렬화하는 대신, 미리 계산된 해시를 사용합니다:

digest = SHA256(SHA256(
    version              # 4 bytes
    hashPrevouts         # SHA256d of all input outpoints
    hashSequence         # SHA256d of all input sequences
    outpoint             # This input's txid + vout (36 bytes)
    scriptCode           # The script being satisfied
    value                # This input's UTXO value (8 bytes)
    sequence             # This input's sequence (4 bytes)
    hashOutputs          # SHA256d of all outputs
    locktime             # 4 bytes
    sighash_type         # 4 bytes
))

이것은 레거시 서명의 O(n^2) 스케일링 문제를 제거합니다 - n개 입력을 서명하려면 전체 거래의 n개 사본을 해싱해야 했습니다.

ECDSA 서명

비트코인은 secp256k1 곡선 위의 **ECDSA (Elliptic Curve Digital Signature Algorithm)**를 사용합니다. 주어진:

  • 개인키 d (256비트 정수)
  • 메시지 해시 z (서명 다이제스트)

알고리즘은 서명 (r, s)를 생성합니다 - 해당 공개키를 사용해 누구나 검증할 수 있지만 d를 모르는 누구도 위조할 수 없는 두 개의 256비트 정수.

서명은 DER로 인코딩되고 SIGHASH 바이트가 추가됩니다:

30 <total-length>
  02 <r-length> <r-value>
  02 <s-length> <s-value>
<sighash-byte>

일반적인 DER 인코딩 서명은 71~73 바이트입니다.

Low-S 요구사항

BIP62와 BIP146은 s 값이 곡선 차수의 하위 절반에 있을 것을 요구합니다. ECDSA 구현이 높은 S 값을 생성하면, order - s로 교체해야 합니다. 높은 S 서명을 가진 거래는 현대 노드에 의해 거부됩니다.

거래에 넣기

레거시 입력의 경우, 서명과 공개키는 ScriptSig로 들어갑니다:

<sig-length> <DER-signature + sighash>
<pubkey-length> <compressed-public-key (33 bytes)>

SegWit 입력의 경우, ScriptSig는 비어 있는 채로 남고 데이터는 증인 필드로 들어갑니다 - 다음에 다룹니다.

다음 단계

SegWit과 증인 데이터로 계속해서 SegWit 거래가 증인 구조에 서명을 저장하는 방식을 배우세요.