Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2011
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. case OP_CHECKSIGEX:
  2. case OP_CHECKSIGVERIFYEX:
  3. {
  4. // (sig pubkey -- bool)
  5. if (stack.size() < 2)
  6. return false;
  7.  
  8. valtype& vchSig = stacktop(-2);
  9. valtype& vchPubKey = stacktop(-1);
  10.  
  11. VECTOR_OF_SIGS = CONVERT_SIG_TO_SIGS(vchSig);
  12. VECTOR_OF_CHECKSIGEX_OPS = CONVERT_VCHPUBKEY_TO_CHECKSIGEX_OPS(vchPubKey);
  13.  
  14. // MAKE SURE WE HAVE THE RIGHT NUMBER OF SIGS OR SIG PLACEHOLDERS
  15. IF (NUMBER OF SIGS IN VECTOR_OF_SIGS !=
  16. NUMBER_OF_PUBKEYS IN VECTOR_OF_CHECKSIGEX_OPS)
  17. return false;
  18.  
  19.  
  20. // Subset of script starting at the most recent codeseparator
  21. CScript scriptCode(pbegincodehash, pend);
  22.  
  23.  
  24. FOREACH SIGNATURE IN VECTOR_OF_SIGS
  25. // Drop the signature, since there's no way for a signature to sign itself
  26. scriptCode.FindAndDelete(CScript(vchSig));
  27.  
  28. STACK CHECKSIGEX_STACK;
  29. REFERENCE_TO_SIG SR = FIRST SIG IN VECTOR_OF_SIGS;
  30.  
  31. FOREACH CHECKSIGEX_OP IN VECTOR_OF_CHECKSIGEX_OPS:
  32. switch (CHECKSIGEX_OP.OPCODE) {
  33. case 0x04:
  34. CHECKSIGEX_STACK.PUSH(CheckSig(SR, CHECKSIGEX_OP.PUBKEY, scriptCode, txTo, nIn, nHashType));
  35. break;
  36.  
  37. CASE OP_TRUE:
  38. CHECKSIGEX_STACK.PUSH(true);
  39. break;
  40. (SIMILAR FOR OP_FALSE)
  41. CASE OP_AND:
  42. if (CHECKSIGEX_STACK.size() < 2) return false;
  43. CHECKSIGEX_STACK.PUSH(CHECKSIGEX_STACK.POP() && CHECKSIGEX_STACK.POP());
  44. break;
  45. (SIMILAR FOR OP_OR, OP_XOR, OP_DUP, OP_AND3, OP_AND23)
  46.  
  47. default:
  48. return false;
  49. }
  50.  
  51. if (STACK.SIZE() < 1) RETURN FALSE;
  52. IF (STACK.POP() != TRUE) RETURN FALSE;
  53.  
  54. bool fSuccess = TRUE;
  55.  
  56. popstack(stack);
  57. popstack(stack);
  58. stack.push_back(fSuccess ? vchTrue : vchFalse);
  59. if (opcode == OP_CHECKSIGVERIFYEX)
  60. {
  61. if (fSuccess)
  62. popstack(stack);
  63. else
  64. return false;
  65. }
  66. }
  67. break;
  68.  
  69.  
  70.  
  71. CONVERT_SIG_TO_SIGS(BINARYBLOB) {
  72. IF (BINARYBLOB STARTS WITH 0x30)
  73. RETURN VECTOR CONTAINING ONLY THE ONE SIG;
  74.  
  75. ELSE // (BINARYBLOB STARTS WITH ANYTHING ELSE)
  76. ASSUME "ANYTHING ELSE" IS A SIMPLE ENCODING THAT HELPS US DETERMINE
  77. THE LENGTH OF EACH SIG;
  78. SLICE AND DICE BINARYBLOB TO GET ALL THE SIGS OUT;
  79. RETURN THEM AS A VECTOR OF SIGS
  80. }
  81.  
  82. CONVERT_VCHPUBKEY_TO_CHECKSIGEX_OPS(vchPubKey) {
  83. VECTOR<CHECKSIGOPS> V;
  84.  
  85. FOR EACH BYTE IN vchPubKey
  86. IF THE BYTE IS 0x04
  87. ADD 0x04 + THE NEXT 64 BYTES OF vchPubKey AS AN ELEMENT TO V;
  88. SKIP 64 BYTES IN THE LOOP;
  89. ELSE
  90. ADD THE SINGLE BYTE AS AN ELEMENT IN V;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement