SIGHASH flags

Revision as of 15:35, 21 November 2019 by Wei (talk | contribs)

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