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.
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