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 해설

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.
- 서명은 거래 전체가 아니라 규칙이 만든 digest에 적용됩니다
Wallet은 unsigned transaction과 prevout 정보에서 signature message를 만들고 private key로 서명합니다.
- ALL·NONE·SINGLE은 outputs 범위를 바꿉니다
SIGHASH_ALL은 일반 결제에서 모든 outputs에 커밋해 수신액과 change를 보호합니다.
- 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의 정확한 규칙을 따라 세대 간 차이를 감추지 않습니다.
| 유형 | 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바이트 서명은 허용되지 않습니다.
더 깊이 읽기
본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.



