SIGHASH flags
A SIGHASH flag is used to indicate which part of the transaction is signed by the ECDSA signature. The mechanism provides a flexibility in constructing transactions. There are in total 6 different flags that can be added to a digital signature in a transaction.
Flag | Value | Functional Meaning |
---|---|---|
SIGHASH_ALL | 0x00000001 | Sign all inputs and outputs |
SIGHASH_NONE | 0x00000002 | Sign all inputs and no output |
SIGHASH_SINGLE | 0x00000003 | Sign all inputs and the output with the same index |
SIGHASH_ALL | ANYONECANPAY | 0x00000081 | Sign its own input and all outputs |
SIGHASH_NONE | ANYONECANPAY | 0x00000082 | Sign its own input and no output |
SIGHASH_SINGLE | ANYONECANPAY | 0x00000083 | Sign its own input and the output with the same index |
The table below illustrates what is signed and what is not signed in a more granulated detail by an ECDSA siganture in the Input 1 in a transaction.
ALL | NONE | SINGLE | ALL | ANYONECANPAY | NONE | ANYONECANPAY | SINGLE | ANYONECANPAY | |
Version | Yes | Yes | Yes | Yes | Yes | Yes |
Locktime | Yes | Yes | Yes | Yes | Yes | Yes |
Input 1 outpoint | Yes | Yes | Yes | Yes | Yes | Yes |
Input 1 scriptSig | No | No | No | No | No | No |
Input 1 sequence number | Yes | Yes | Yes | Yes | Yes | Yes |
Input 2 outpoint | Yes | Yes | Yes | No | No | No |
Input 2 scriptSig | No | No | No | No | No | No |
Input 2 sequence number | Yes | Yes | Yes | No | No | No |
Output 1 | Yes | No | Yes | Yes | No | Yes |
Output 2 | Yes | No | No | Yes | No | No |
Note that the version number and locktime are always signed, and the scriptSigs are never signed.
SIGHASH flags are handy when constructing smart contracts and negotiable transactions in payment channels.
Use Case 1 - crowdfunding
Use Case 2 - blank check
Use Case 3 - Modular Transaction
References
https://github.com/bitcoin-sv/bitcoin-sv/blob/master/src/script/sighashtype.h