궁금한 주제를 찾아보세요

비트코인, 스테이블코인, 온체인 데이터처럼 주제로 검색하세요.

다시 읽을 이야기

저장한 글은 이 브라우저에만 보관됩니다.

해설기술·생태계

비트코인 SIGHASH 유형은 거래의 어느 부분에 서명할까

ALL·NONE·SINGLE과 ANYONECANPAY 조합이 입력·출력 커밋 범위를 어떻게 바꾸는지 Legacy·SegWit·Taproot 조건과 함께 설명합니다.

난이도 중급주제 카테고리와 개념 밀도 기준검토 정보AI 보조 초안 · 출처 목록 제공 · 주장별 대조 진행 중
여러 입력·출력 칸 중 서명으로 묶이는 범위를 색으로 나누어 비교한 SIGHASH 유형 그림
주제의 이해를 돕기 위해 imagegen으로 제작한 AI 생성 개념 일러스트
먼저 읽는 핵심

ALL·NONE·SINGLE은 output 범위를, ANYONECANPAY는 input 범위를 바꿉니다.
SINGLE은 대응 output index 존재 여부와 순서를 확인해야 합니다.
Taproot는 SIGHASH_DEFAULT 0x00을 추가하고 digest 구성이 달라집니다.

SIGHASH의 낮은 기본 유형은 출력 커밋 범위를 정합니다. ALL은 모든 outputs, NONE은 outputs 없음, SINGLE은 서명 중인 input index와 같은 index의 output 하나에 커밋합니다. ANYONECANPAY bit를 결합하면 모든 inputs 대신 현재 input에만 커밋합니다. 하지만 version·locktime·현재 input 정보 등 포함 필드는 서명 알고리즘 세대마다 다르므로 이 한 문장만으로 Legacy, SegWit v0, Taproot digest를 동일하게 구현하면 안 됩니다.

서명은 거래 전체가 아니라 규칙이 만든 digest에 적용됩니다

Wallet은 unsigned transaction과 prevout 정보에서 signature message를 만들고 private key로 서명합니다. Hash type byte는 어떤 fields가 digest에 들어가는지 선택합니다. 다른 참여자가 나중에 바꿀 수 있는 부분은 서명자가 승인하지 않은 영역이므로 UI와 protocol이 그 변경 의도를 제한해야 합니다.

Legacy ECDSA signature에서는 DER bytes 뒤에 sighash byte를 붙입니다. Taproot key path·tapscript Schnorr signature는 DEFAULT이면 64바이트만 쓸 수 있고 명시적 type이면 65번째 byte를 붙입니다. 0x00 byte를 불필요하게 붙인 65바이트 encoding은 유효하지 않습니다.

SIGHASH는 서명 강도를 고르는 등급이 아니라, 거래의 어느 부분을 signer가 고정했는지 정하는 범위 선택입니다.

JOBCOIN 해설

VISUAL GUIDE키 보관과 거래 서명
보호된 개인키로 거래에 서명하고 노드가 서명을 검증하는 개념도
그림과 함께 짚어볼 본문 내용

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.

  1. 서명은 거래 전체가 아니라 규칙이 만든 digest에 적용됩니다

    Wallet은 unsigned transaction과 prevout 정보에서 signature message를 만들고 private key로 서명합니다.

  2. ALL·NONE·SINGLE은 outputs 범위를 바꿉니다

    SIGHASH_ALL은 일반 결제에서 모든 outputs에 커밋해 수신액과 change를 보호합니다.

  3. ANYONECANPAY는 다른 inputs 추가를 허용합니다

    ANYONECANPAY가 설정되면 signature는 현재 input에 집중하고 다른 inputs는 커밋하지 않습니다.

AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.

ALL·NONE·SINGLE은 outputs 범위를 바꿉니다

SIGHASH_ALL은 일반 결제에서 모든 outputs에 커밋해 수신액과 change를 보호합니다. NONE은 outputs에 커밋하지 않아 다른 참여자가 목적지와 금액을 추가·변경할 수 있습니다. SINGLE은 현재 input index와 같은 output에만 커밋해 input-output pair를 조립하는 protocol에 사용될 수 있습니다.

SINGLE은 output index가 존재하고 원하는 pair 순서가 유지되는지 확인해야 합니다. Legacy에는 이른바 SIGHASH_SINGLE bug가 있어 대응 output이 없을 때 특수 hash 1을 반환하는 동작이 보존됩니다. SegWit v0·Taproot 구현은 각 BIP의 정확한 규칙을 따라 세대 간 차이를 감추지 않습니다.

SIGHASH 커밋 범위
유형 Inputs Outputs
ALL 모든 입력 정보 기본 모든 outputs
NONE 모든 입력 정보 기본 없음
SINGLE 모든 입력 정보 기본 같은 index output
ALL|ANYONECANPAY 현재 input 모든 outputs
SINGLE|ANYONECANPAY 현재 input 같은 index output

ANYONECANPAY는 다른 inputs 추가를 허용합니다

ANYONECANPAY가 설정되면 signature는 현재 input에 집중하고 다른 inputs는 커밋하지 않습니다. 다른 참여자가 fee funding input을 추가하거나 여러 독립 서명 inputs를 묶는 구조에 유용합니다. 이름 때문에 ‘누구나 내 coin을 쓴다’고 오해하지만 현재 UTXO의 서명 권한 자체를 공개하는 것은 아닙니다.

다만 NONE 또는 SINGLE과 결합하면 outputs 변경 범위도 넓어집니다. Signature를 받은 coordinator가 signer가 예상하지 않은 transaction 맥락에 넣을 수 없는지 protocol을 검토합니다. PSBT는 UTXO·sighash type·outputs를 signer 화면에 명시해야 합니다.

  • Input별 sighash type을 decode합니다.
  • 서명 알고리즘이 Legacy·BIP143·BIP341 중 무엇인지 구분합니다.
  • SINGLE의 대응 output index를 확인합니다.
  • ANYONECANPAY가 허용한 추가 inputs를 검토합니다.
  • 최종 transaction을 각 signer 정책과 재대조합니다.

Taproot DEFAULT는 ALL과 유사하지만 별도 값입니다

BIP341의 SIGHASH_DEFAULT 0x00은 ALL과 같은 output 범위를 갖는 기본 선택이지만 encoding과 message 구성은 Taproot 규칙입니다. Valid explicit types는 0x01, 0x02, 0x03과 0x81, 0x82, 0x83 조합이며 정의되지 않은 hash type은 실패합니다.

Taproot sighash는 모든 input amounts와 scriptPubKeys, sequences 등을 기본적으로 커밋하고 ANYONECANPAY 여부에 따라 현재 input 데이터로 대체합니다. Annex 존재와 script path에서는 tapleaf hash, key version, codesep position 같은 extension이 message에 들어갑니다. Legacy serializer를 재사용하지 않습니다.

제품 UI는 변경 가능한 부분을 보여 줘야 합니다

Signer가 SIGHASH_NONE을 승인하면서 수신 outputs가 잠기지 않는다는 사실을 모르면 정상 signature도 위험한 결과에 쓰일 수 있습니다. Hardware wallet은 type 이름뿐 아니라 ‘다른 사람이 outputs를 변경할 수 있음’ 같은 효과를 표시하고 unusual type에는 강한 확인을 요구해야 합니다.

테스트에는 각 type의 한 field를 바꿨을 때 verify가 성공·실패하는 matrix를 넣습니다. JSON test case를 저장한다면 hashType을 문자열 라벨과 정수 byte로 함께 두고 실제 parser로 syntax를 검증합니다. 화면 설명과 digest 구현이 다른 상태를 release하지 않습니다.

자주 묻는 질문

SIGHASH_NONE이면 서명 없이도 UTXO를 쓸 수 있나요?

아닙니다. 현재 input 지출 서명은 필요하지만 outputs를 서명으로 고정하지 않습니다.

ANYONECANPAY는 누구나 내 입력을 바꿀 수 있다는 뜻인가요?

현재 서명 input은 고정하고 다른 inputs의 추가·변경을 허용하는 범위 선택입니다.

Taproot DEFAULT는 0x01 ALL과 완전히 같은 byte인가요?

효과는 기본 ALL과 유사하지만 값과 signature encoding이 다르며 0x00을 붙인 65바이트 서명은 허용되지 않습니다.

더 깊이 읽기

본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.

참고한 원문 자료

자료 확인 기준일 2026.09.27
  1. BIP 341: Taproot signature validationbips.dev
  2. BIP 143: Transaction Signature Verification for Version 0 Witness Programbips.dev
자료 대조 기록과 확인 범위
출처 수집
원문 링크 2개 제공
핵심 주장 대조
완료 근거가 아직 기록되지 않았습니다.
분야 전문가 검수
별도 완료 기록이 없습니다.

원문 링크와 자료 확인일은 글 전체의 주장 대조나 전문가 검수 완료를 뜻하지 않습니다. 별도 확인이 필요한 절차는 원문의 적용 대상과 최신 안내를 함께 확인해 주세요.

AI 활용 안내

이 글은 초안 구성과 자료 정리에 AI를 활용했습니다. 글에 표시된 출처와 기준일을 함께 확인해 주세요. 별도 검토 정보가 없다면 전문가 검수를 뜻하지 않습니다.

이해를 위한 정보 콘텐츠

이 글은 특정 자산의 매수·매도 또는 수익을 권유하지 않습니다. 자료의 발표 시점과 이후 변경 사항을 함께 확인해 주세요.

편집 원칙 보기 →이 기사 정정 제보 →