서명 해시 (Signature Hash, SIGHASH)
서명 해시(Signature Hash, SIGHASH)는 비트코인 서명이 트랜잭션의 어느 부분에 서명하는지 나타내는 플래그입니다. (기본값은 SIGHASH_ALL입니다.) 서명되지 않은 트랜잭션 부분은 수정될 수 있습니다. 서명자는 트랜잭션 내용 가운데 이 플래그가 고른 부분만 해시해 서명하며, 플래그 값은 서명 끝에 1바이트로 붙습니다.
어떻게 작동합니까?
Sighash는 계약서 서명에 비유할 수 있습니다. 어떻게 서명하느냐에 따라 계약서의 어느 부분에 동의하는지가 정해집니다. 노드는 서명을 검증할 때 플래그를 읽고, 서명자가 정한 범위대로 트랜잭션의 해시를 다시 계산해 서명과 맞는지 확인합니다. 서명 범위에 들어간 부분을 누군가 바꾸면 해시가 달라져 서명이 무효가 되고, 범위 밖의 부분은 서명을 깨지 않고 바꿀 수 있습니다.
A가 B에게 1 BTC를 보내면서 기본값인 SIGHASH_ALL로 서명하면, 누군가 트랜잭션을 가로채 금액이나 받는 주소를 바꾸는 순간 서명이 무효가 됩니다. 다른 플래그를 쓰면 서명한 후에도 다른 사람이 입력을 추가하거나 출력을 정하도록 일부를 열어 둘 수 있습니다.
Sighash 유형
| 플래그 | 값 | 서명하는 범위 | 쓰임 |
|---|---|---|---|
| SIGHASH_ALL | 0x01 | 모든 입력과 모든 출력 | 기본값. 서명 후 어떤 입력이나 출력도 바꿀 수 없습니다. |
| SIGHASH_NONE | 0x02 | 모든 입력, 출력은 서명하지 않음 | 출력을 누구나 바꿀 수 있어 사실상 “이 코인을 어디로든 보내도 좋다”는 뜻이 되므로 오용하면 위험합니다. |
| SIGHASH_SINGLE | 0x03 | 모든 입력과, 자기 입력과 같은 순번의 출력 하나 | 자신과 관련된 출력 하나만 고정하고 나머지 출력은 다른 참가자가 정하게 합니다. |
| SIGHASH_ANYONECANPAY | 0x80 (수정자) | 위 세 가지와 결합해, 입력은 자기 입력 하나만 서명 | 다른 사람이 서명을 무효화하지 않고 입력을 추가할 수 있습니다. |
ANYONECANPAY는 단독으로 쓰지 않고 ALL, NONE, SINGLE과 결합해 0x81, 0x82, 0x83으로 씁니다. 예를 들어 ALL|ANYONECANPAY는 “출력(모금 목표)은 고정하되 누구나 입력을 보태도 된다”는 뜻이어서 크라우드펀딩 방식의 트랜잭션에 쓸 수 있습니다. SINGLE|ANYONECANPAY는 “내 입력과 내가 받을 출력 하나만 묶어 둔다”는 뜻이어서, 판매자가 미리 서명해 둔 거래 제안에 구매자가 자기 입력과 출력을 붙여 완성하는 방식에 쓰입니다.
업그레이드에 따른 변화
- 세그윗(BIP 143): 서명 해시를 계산하는 방식을 바꾸어, 입력 금액까지 서명에 포함하고 큰 트랜잭션에서 해시 계산량이 급격히 늘어나는 문제를 줄였습니다.
- 탭루트(BIP 341): SIGHASH_DEFAULT(0x00)가 추가되었습니다. ALL과 같은 범위를 서명하지만 플래그 바이트를 생략해 서명이 1바이트 짧아집니다.
장점
- 유연성: 트랜잭션의 특정 부분만 서명할 수 있으므로 여러 참가자가 하나의 트랜잭션을 함께 만드는 다자간 프로토콜이 가능해집니다.
- 보안: SIGHASH_ALL을 쓰면 금액과 받는 주소 같은 중요한 구성 요소를 서명 후 바꿀 수 없습니다.
단점
- 복잡성: 여러 sighash 유형을 도입하면 사용자와 개발자가 트랜잭션을 이해하고 구현하는 것이 더 복잡해질 수 있습니다.
- 오류 발생 가능성: 올바르게 사용되지 않으면 트랜잭션의 중요한 부분이 서명되지 않고 수정에 취약한 상태로 남아 자금을 잃을 수 있습니다. 예를 들어 레거시 트랜잭션에서 SIGHASH_SINGLE을 쓸 때 입력과 같은 순번의 출력이 없으면, 서명이 트랜잭션 내용 대신 고정된 값에 대해 만들어지는 알려진 결함이 있습니다.
일반적인 송금에서는 지갑이 자동으로 SIGHASH_ALL을 쓰므로 사용자가 플래그를 고를 일은 거의 없습니다. 다른 플래그는 작동 방식을 정확히 이해한 상태에서만 다루어야 합니다.
이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.