I was wondering if somebody could point me to or give me a worked out example of how OP_CHECKMULTISIG works behind the curtains?
I expect that CHECKMULTISIG will call the CHECKSIG function and manipulate the stack to run CHECKSIG in a loop until it terminates and either has its M-out-of-N valid sigs or not?
But how exactly does it work? E.g. for 2-of-3 multisig. If we have OP_0 (sig1) (sig2) in the scriptSig, then the stack will look like:
- (sig2)
- (sig1)
- 0
Now from the general way of writing CHECKMULTISIG in the scriptPubKey: 2 (pubKey1) (pubKey2) (pubKey3) 3 OP_CHECKMULTISIG, when pushing all the data onto the stack, the stack for the scriptPubKey will look like:
- 3
- (pubKey3)
- (pubKey2)
- (pubKey1)
- 2
What exactly will the first step be of CHECKMULTISIG?
Will it pop the "3" from the stack and then maybe check if there are three pubKeys on the stack?
Or will it just pop the "3" and then immediately run CHECKSIG on (sig2) and (pubKey3), which will not be valid, hence CHECKSIG will push a "0" on the stack?
Will then CHECKMULTISIG remove the "0" that CHECKSIG introduced on the stack and try again with (sig2) and (pubKey2)? Since this is valid CHECKSIG will push a "1" on the stack, but where does CHECKMULTISIG store this "1"?
And will CHECKMULTISIG at the end count how many "1"'s CHECKSIG made and this number must correspond to the last value on the stack, in this case "2", but in general "M"?
I would really like to find a low-level description of CHECKMULTISIG, similarly to the one I could find for CHECKSIG: https://en.bitcoin.it/wiki/OP_CHECKSIG
Any help would be very appreciated!