OP_CHECKSIG is used to verify that a signature for a tx output is valid
In addition to the script code itself, to operate OP_CHECKSIG needs to know the current transaction, the current transaction input, and the current hashtype (discussed later)
How it works
- the public key and the signature are popped from the stack, in that order.
- A new subscript is created from the instruction from the most recent OP_CODESEPARATOR to the end of the script. If there is no OP_CODESEPARATOR the entire script becomes the subscript (hereby referred to as subScript)
- The sig is deleted from subScript.
- The hashtype is removed from the last byte of the sig and stored
- A deep copy is made of the current transaction (hereby referred to txCopy)
- All OP_CODESEPARATORS are removed from subScript
- The scripts for all transaction inputs in txCopy are set to empty scripts
- The script for the current transaction input in txCopy is set to subScript
Now depending on the hashtype various things can happen to txCopy, these will be discussed individually
- The output of txCopy is set to a vector of zero size.
- All other inputs aside from the current input in txCopy have their outpoint index set to zero
- The output of txCopy is resized to the size of the current input index
- All other txCopy outputs aside from the output that is the same as the current input index are set to a blank script and a value of (long) -1;
- All other txCopy inputs aside from the current input are set to have an outpoint index of zero
- The txCopy input vector is resized to a length of one
- The current input is set as the first and only member of this vector
An array of bytes is constructed from the serialized txCopy + one byte for the hash type. This array is sha256 hashed twice, then the public key is used to to check the supplied signature against the hash.
OP_CHECKSIG will push true to the stack if the check passed, false otherwise. OP_CHECKSIG_VERIFY leaves nothing on the stack but will cause the script eval to fail immediately if the check does not pass.