Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- case OP_CHECKSIGEX:
- case OP_CHECKSIGVERIFYEX:
- {
- // (sig pubkey -- bool)
- if (stack.size() < 2)
- return false;
- valtype& vchSig = stacktop(-2);
- valtype& vchPubKey = stacktop(-1);
- VECTOR_OF_SIGS = CONVERT_SIG_TO_SIGS(vchSig);
- VECTOR_OF_CHECKSIGEX_OPS = CONVERT_VCHPUBKEY_TO_CHECKSIGEX_OPS(vchPubKey);
- // MAKE SURE WE HAVE THE RIGHT NUMBER OF SIGS OR SIG PLACEHOLDERS
- IF (NUMBER OF SIGS IN VECTOR_OF_SIGS !=
- NUMBER_OF_PUBKEYS IN VECTOR_OF_CHECKSIGEX_OPS)
- return false;
- // Subset of script starting at the most recent codeseparator
- CScript scriptCode(pbegincodehash, pend);
- FOREACH SIGNATURE IN VECTOR_OF_SIGS
- // Drop the signature, since there's no way for a signature to sign itself
- scriptCode.FindAndDelete(CScript(vchSig));
- STACK CHECKSIGEX_STACK;
- REFERENCE_TO_SIG SR = FIRST SIG IN VECTOR_OF_SIGS;
- FOREACH CHECKSIGEX_OP IN VECTOR_OF_CHECKSIGEX_OPS:
- switch (CHECKSIGEX_OP.OPCODE) {
- case 0x04:
- CHECKSIGEX_STACK.PUSH(CheckSig(SR, CHECKSIGEX_OP.PUBKEY, scriptCode, txTo, nIn, nHashType));
- break;
- CASE OP_TRUE:
- CHECKSIGEX_STACK.PUSH(true);
- break;
- (SIMILAR FOR OP_FALSE)
- CASE OP_AND:
- if (CHECKSIGEX_STACK.size() < 2) return false;
- CHECKSIGEX_STACK.PUSH(CHECKSIGEX_STACK.POP() && CHECKSIGEX_STACK.POP());
- break;
- (SIMILAR FOR OP_OR, OP_XOR, OP_DUP, OP_AND3, OP_AND23)
- default:
- return false;
- }
- if (STACK.SIZE() < 1) RETURN FALSE;
- IF (STACK.POP() != TRUE) RETURN FALSE;
- bool fSuccess = TRUE;
- popstack(stack);
- popstack(stack);
- stack.push_back(fSuccess ? vchTrue : vchFalse);
- if (opcode == OP_CHECKSIGVERIFYEX)
- {
- if (fSuccess)
- popstack(stack);
- else
- return false;
- }
- }
- break;
- CONVERT_SIG_TO_SIGS(BINARYBLOB) {
- IF (BINARYBLOB STARTS WITH 0x30)
- RETURN VECTOR CONTAINING ONLY THE ONE SIG;
- ELSE // (BINARYBLOB STARTS WITH ANYTHING ELSE)
- ASSUME "ANYTHING ELSE" IS A SIMPLE ENCODING THAT HELPS US DETERMINE
- THE LENGTH OF EACH SIG;
- SLICE AND DICE BINARYBLOB TO GET ALL THE SIGS OUT;
- RETURN THEM AS A VECTOR OF SIGS
- }
- CONVERT_VCHPUBKEY_TO_CHECKSIGEX_OPS(vchPubKey) {
- VECTOR<CHECKSIGOPS> V;
- FOR EACH BYTE IN vchPubKey
- IF THE BYTE IS 0x04
- ADD 0x04 + THE NEXT 64 BYTES OF vchPubKey AS AN ELEMENT TO V;
- SKIP 64 BYTES IN THE LOOP;
- ELSE
- ADD THE SINGLE BYTE AS AN ELEMENT IN V;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement