Mercurial > hg > bitcoin
annotate src/script.cpp @ 3632:abd3935e67df draft
Merge pull request #1742 from sipa/canonical
Check for canonical public keys and signatures
author | Jeff Garzik <jgarzik@exmulti.com> |
---|---|
date | Sat, 20 Oct 2012 10:56:04 -0700 |
parents | 6405b2b19c99 ce8540bec751 |
children | d489f6576318 |
rev | line source |
---|---|
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1 // Copyright (c) 2009-2010 Satoshi Nakamoto |
1818
20667468f95b
Update all copyrights to 2012
Gavin Andresen <gavinandresen@gmail.com>
parents:
1769
diff
changeset
|
2 // Copyright (c) 2009-2012 The Bitcoin developers |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
3 // Distributed under the MIT/X11 software license, see the accompanying |
2607 | 4 // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
2274 | 5 #include <boost/foreach.hpp> |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
6 #include <boost/tuple/tuple.hpp> |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
7 |
595
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
575
diff
changeset
|
8 using namespace std; |
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
575
diff
changeset
|
9 using namespace boost; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
10 |
2274 | 11 #include "script.h" |
12 #include "keystore.h" | |
13 #include "bignum.h" | |
14 #include "key.h" | |
15 #include "main.h" | |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
16 #include "sync.h" |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
17 #include "util.h" |
2274 | 18 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
19 bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
20 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
21 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
22 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
23 typedef vector<unsigned char> valtype; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
24 static const valtype vchFalse(0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
25 static const valtype vchZero(0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
26 static const valtype vchTrue(1, 1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
27 static const CBigNum bnZero(0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
28 static const CBigNum bnOne(1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
29 static const CBigNum bnFalse(0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
30 static const CBigNum bnTrue(1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
31 static const size_t nMaxNumSize = 4; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
32 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
33 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
34 CBigNum CastToBigNum(const valtype& vch) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
35 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
36 if (vch.size() > nMaxNumSize) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
37 throw runtime_error("CastToBigNum() : overflow"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
38 // Get rid of extra leading zeros |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
39 return CBigNum(CBigNum(vch).getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
40 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
41 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
42 bool CastToBool(const valtype& vch) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
43 { |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
44 for (unsigned int i = 0; i < vch.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
45 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
46 if (vch[i] != 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
47 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
48 // Can be negative zero |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
49 if (i == vch.size()-1 && vch[i] == 0x80) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
50 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
51 return true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
52 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
53 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
54 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
55 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
56 |
3553
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
57 // |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
58 // WARNING: This does not work as expected for signed integers; the sign-bit |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
59 // is left in place as the integer is zero-extended. The correct behavior |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
60 // would be to move the most significant bit of the last byte during the |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
61 // resize process. MakeSameSize() is currently only used by the disabled |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
62 // opcodes OP_AND, OP_OR, and OP_XOR. |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
63 // |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
64 void MakeSameSize(valtype& vch1, valtype& vch2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
65 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
66 // Lengthen the shorter one |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
67 if (vch1.size() < vch2.size()) |
3553
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
68 // PATCH: |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
69 // +unsigned char msb = vch1[vch1.size()-1]; |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
70 // +vch1[vch1.size()-1] &= 0x7f; |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
71 // vch1.resize(vch2.size(), 0); |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
72 // +vch1[vch1.size()-1] = msb; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
73 vch1.resize(vch2.size(), 0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
74 if (vch2.size() < vch1.size()) |
3553
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
75 // PATCH: |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
76 // +unsigned char msb = vch2[vch2.size()-1]; |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
77 // +vch2[vch2.size()-1] &= 0x7f; |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
78 // vch2.resize(vch1.size(), 0); |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
79 // +vch2[vch2.size()-1] = msb; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
80 vch2.resize(vch1.size(), 0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
81 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
82 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
83 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
84 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
85 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
86 // Script is a stack machine (like Forth) that evaluates a predicate |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
87 // returning a bool indicating valid or not. There are no loops. |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
88 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
89 #define stacktop(i) (stack.at(stack.size()+(i))) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
90 #define altstacktop(i) (altstack.at(altstack.size()+(i))) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
91 static inline void popstack(vector<valtype>& stack) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
92 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
93 if (stack.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
94 throw runtime_error("popstack() : stack empty"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
95 stack.pop_back(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
96 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
97 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
98 |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
99 const char* GetTxnOutputType(txnouttype t) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
100 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
101 switch (t) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
102 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
103 case TX_NONSTANDARD: return "nonstandard"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
104 case TX_PUBKEY: return "pubkey"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
105 case TX_PUBKEYHASH: return "pubkeyhash"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
106 case TX_SCRIPTHASH: return "scripthash"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
107 case TX_MULTISIG: return "multisig"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
108 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
109 return NULL; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
110 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
111 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
112 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
113 const char* GetOpName(opcodetype opcode) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
114 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
115 switch (opcode) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
116 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
117 // push value |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
118 case OP_0 : return "0"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
119 case OP_PUSHDATA1 : return "OP_PUSHDATA1"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
120 case OP_PUSHDATA2 : return "OP_PUSHDATA2"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
121 case OP_PUSHDATA4 : return "OP_PUSHDATA4"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
122 case OP_1NEGATE : return "-1"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
123 case OP_RESERVED : return "OP_RESERVED"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
124 case OP_1 : return "1"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
125 case OP_2 : return "2"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
126 case OP_3 : return "3"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
127 case OP_4 : return "4"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
128 case OP_5 : return "5"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
129 case OP_6 : return "6"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
130 case OP_7 : return "7"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
131 case OP_8 : return "8"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
132 case OP_9 : return "9"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
133 case OP_10 : return "10"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
134 case OP_11 : return "11"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
135 case OP_12 : return "12"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
136 case OP_13 : return "13"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
137 case OP_14 : return "14"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
138 case OP_15 : return "15"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
139 case OP_16 : return "16"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
140 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
141 // control |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
142 case OP_NOP : return "OP_NOP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
143 case OP_VER : return "OP_VER"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
144 case OP_IF : return "OP_IF"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
145 case OP_NOTIF : return "OP_NOTIF"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
146 case OP_VERIF : return "OP_VERIF"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
147 case OP_VERNOTIF : return "OP_VERNOTIF"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
148 case OP_ELSE : return "OP_ELSE"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
149 case OP_ENDIF : return "OP_ENDIF"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
150 case OP_VERIFY : return "OP_VERIFY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
151 case OP_RETURN : return "OP_RETURN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
152 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
153 // stack ops |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
154 case OP_TOALTSTACK : return "OP_TOALTSTACK"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
155 case OP_FROMALTSTACK : return "OP_FROMALTSTACK"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
156 case OP_2DROP : return "OP_2DROP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
157 case OP_2DUP : return "OP_2DUP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
158 case OP_3DUP : return "OP_3DUP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
159 case OP_2OVER : return "OP_2OVER"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
160 case OP_2ROT : return "OP_2ROT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
161 case OP_2SWAP : return "OP_2SWAP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
162 case OP_IFDUP : return "OP_IFDUP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
163 case OP_DEPTH : return "OP_DEPTH"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
164 case OP_DROP : return "OP_DROP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
165 case OP_DUP : return "OP_DUP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
166 case OP_NIP : return "OP_NIP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
167 case OP_OVER : return "OP_OVER"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
168 case OP_PICK : return "OP_PICK"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
169 case OP_ROLL : return "OP_ROLL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
170 case OP_ROT : return "OP_ROT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
171 case OP_SWAP : return "OP_SWAP"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
172 case OP_TUCK : return "OP_TUCK"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
173 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
174 // splice ops |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
175 case OP_CAT : return "OP_CAT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
176 case OP_SUBSTR : return "OP_SUBSTR"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
177 case OP_LEFT : return "OP_LEFT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
178 case OP_RIGHT : return "OP_RIGHT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
179 case OP_SIZE : return "OP_SIZE"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
180 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
181 // bit logic |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
182 case OP_INVERT : return "OP_INVERT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
183 case OP_AND : return "OP_AND"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
184 case OP_OR : return "OP_OR"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
185 case OP_XOR : return "OP_XOR"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
186 case OP_EQUAL : return "OP_EQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
187 case OP_EQUALVERIFY : return "OP_EQUALVERIFY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
188 case OP_RESERVED1 : return "OP_RESERVED1"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
189 case OP_RESERVED2 : return "OP_RESERVED2"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
190 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
191 // numeric |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
192 case OP_1ADD : return "OP_1ADD"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
193 case OP_1SUB : return "OP_1SUB"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
194 case OP_2MUL : return "OP_2MUL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
195 case OP_2DIV : return "OP_2DIV"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
196 case OP_NEGATE : return "OP_NEGATE"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
197 case OP_ABS : return "OP_ABS"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
198 case OP_NOT : return "OP_NOT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
199 case OP_0NOTEQUAL : return "OP_0NOTEQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
200 case OP_ADD : return "OP_ADD"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
201 case OP_SUB : return "OP_SUB"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
202 case OP_MUL : return "OP_MUL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
203 case OP_DIV : return "OP_DIV"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
204 case OP_MOD : return "OP_MOD"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
205 case OP_LSHIFT : return "OP_LSHIFT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
206 case OP_RSHIFT : return "OP_RSHIFT"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
207 case OP_BOOLAND : return "OP_BOOLAND"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
208 case OP_BOOLOR : return "OP_BOOLOR"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
209 case OP_NUMEQUAL : return "OP_NUMEQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
210 case OP_NUMEQUALVERIFY : return "OP_NUMEQUALVERIFY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
211 case OP_NUMNOTEQUAL : return "OP_NUMNOTEQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
212 case OP_LESSTHAN : return "OP_LESSTHAN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
213 case OP_GREATERTHAN : return "OP_GREATERTHAN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
214 case OP_LESSTHANOREQUAL : return "OP_LESSTHANOREQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
215 case OP_GREATERTHANOREQUAL : return "OP_GREATERTHANOREQUAL"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
216 case OP_MIN : return "OP_MIN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
217 case OP_MAX : return "OP_MAX"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
218 case OP_WITHIN : return "OP_WITHIN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
219 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
220 // crypto |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
221 case OP_RIPEMD160 : return "OP_RIPEMD160"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
222 case OP_SHA1 : return "OP_SHA1"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
223 case OP_SHA256 : return "OP_SHA256"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
224 case OP_HASH160 : return "OP_HASH160"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
225 case OP_HASH256 : return "OP_HASH256"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
226 case OP_CODESEPARATOR : return "OP_CODESEPARATOR"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
227 case OP_CHECKSIG : return "OP_CHECKSIG"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
228 case OP_CHECKSIGVERIFY : return "OP_CHECKSIGVERIFY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
229 case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
230 case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
231 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
232 // expanson |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
233 case OP_NOP1 : return "OP_NOP1"; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
234 case OP_NOP2 : return "OP_NOP2"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
235 case OP_NOP3 : return "OP_NOP3"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
236 case OP_NOP4 : return "OP_NOP4"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
237 case OP_NOP5 : return "OP_NOP5"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
238 case OP_NOP6 : return "OP_NOP6"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
239 case OP_NOP7 : return "OP_NOP7"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
240 case OP_NOP8 : return "OP_NOP8"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
241 case OP_NOP9 : return "OP_NOP9"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
242 case OP_NOP10 : return "OP_NOP10"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
243 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
244 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
245 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
246 // template matching params |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
247 case OP_PUBKEYHASH : return "OP_PUBKEYHASH"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
248 case OP_PUBKEY : return "OP_PUBKEY"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
249 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
250 case OP_INVALIDOPCODE : return "OP_INVALIDOPCODE"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
251 default: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
252 return "OP_UNKNOWN"; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
253 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
254 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
255 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
256 bool IsCanonicalPubKey(const valtype &vchPubKey) { |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
257 if (vchPubKey.size() < 33) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
258 return error("Non-canonical public key: too short"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
259 if (vchPubKey[0] == 0x04) { |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
260 if (vchPubKey.size() != 65) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
261 return error("Non-canonical public key: invalid length for uncompressed key"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
262 } else if (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03) { |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
263 if (vchPubKey.size() != 33) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
264 return error("Non-canonical public key: invalid length for compressed key"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
265 } else { |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
266 return error("Non-canonical public key: compressed nor uncompressed"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
267 } |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
268 return true; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
269 } |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
270 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
271 bool IsCanonicalSignature(const valtype &vchSig) { |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
272 // See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
273 // A canonical signature exists of: <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype> |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
274 // Where R and S are not negative (their first byte has its highest bit not set), and not |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
275 // excessively padded (do not start with a 0 byte, unless an otherwise negative number follows, |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
276 // in which case a single 0 byte is necessary and even required). |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
277 if (vchSig.size() < 9) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
278 return error("Non-canonical signature: too short"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
279 if (vchSig.size() > 73) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
280 return error("Non-canonical signature: too long"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
281 if (vchSig[vchSig.size() - 1] & 0x7C) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
282 return error("Non-canonical signature: unknown hashtype byte"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
283 if (vchSig[0] != 0x30) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
284 return error("Non-canonical signature: wrong type"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
285 if (vchSig[1] != vchSig.size()-3) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
286 return error("Non-canonical signature: wrong length marker"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
287 unsigned int nLenR = vchSig[3]; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
288 if (5 + nLenR >= vchSig.size()) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
289 return error("Non-canonical signature: S length misplaced"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
290 unsigned int nLenS = vchSig[5+nLenR]; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
291 if ((unsigned long)(nLenR+nLenS+7) != vchSig.size()) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
292 return error("Non-canonical signature: R+S length mismatch"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
293 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
294 const unsigned char *R = &vchSig[4]; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
295 if (R[-2] != 0x02) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
296 return error("Non-canonical signature: R value type mismatch"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
297 if (nLenR == 0) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
298 return error("Non-canonical signature: R length is zero"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
299 if (R[0] & 0x80) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
300 return error("Non-canonical signature: R value negative"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
301 if (nLenR > 1 && (R[0] == 0x00) && !(R[1] & 0x80)) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
302 return error("Non-canonical signature: R value excessively padded"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
303 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
304 const unsigned char *S = &vchSig[6+nLenR]; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
305 if (S[-2] != 0x02) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
306 return error("Non-canonical signature: S value type mismatch"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
307 if (nLenS == 0) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
308 return error("Non-canonical signature: S length is zero"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
309 if (S[0] & 0x80) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
310 return error("Non-canonical signature: S value negative"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
311 if (nLenS > 1 && (S[0] == 0x00) && !(S[1] & 0x80)) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
312 return error("Non-canonical signature: S value excessively padded"); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
313 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
314 return true; |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
315 } |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
316 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
317 bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, bool fStrictEncodings, int nHashType) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
318 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
319 CAutoBN_CTX pctx; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
320 CScript::const_iterator pc = script.begin(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
321 CScript::const_iterator pend = script.end(); |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
322 CScript::const_iterator pbegincodehash = script.begin(); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
323 opcodetype opcode; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
324 valtype vchPushValue; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
325 vector<bool> vfExec; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
326 vector<valtype> altstack; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
327 if (script.size() > 10000) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
328 return false; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
329 int nOpCount = 0; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
330 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
331 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
332 try |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
333 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
334 while (pc < pend) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
335 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
336 bool fExec = !count(vfExec.begin(), vfExec.end(), false); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
337 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
338 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
339 // Read instruction |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
340 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
341 if (!script.GetOp(pc, opcode, vchPushValue)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
342 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
343 if (vchPushValue.size() > 520) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
344 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
345 if (opcode > OP_16 && ++nOpCount > 201) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
346 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
347 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
348 if (opcode == OP_CAT || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
349 opcode == OP_SUBSTR || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
350 opcode == OP_LEFT || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
351 opcode == OP_RIGHT || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
352 opcode == OP_INVERT || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
353 opcode == OP_AND || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
354 opcode == OP_OR || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
355 opcode == OP_XOR || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
356 opcode == OP_2MUL || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
357 opcode == OP_2DIV || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
358 opcode == OP_MUL || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
359 opcode == OP_DIV || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
360 opcode == OP_MOD || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
361 opcode == OP_LSHIFT || |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
362 opcode == OP_RSHIFT) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
363 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
364 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
365 if (fExec && 0 <= opcode && opcode <= OP_PUSHDATA4) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
366 stack.push_back(vchPushValue); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
367 else if (fExec || (OP_IF <= opcode && opcode <= OP_ENDIF)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
368 switch (opcode) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
369 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
370 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
371 // Push value |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
372 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
373 case OP_1NEGATE: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
374 case OP_1: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
375 case OP_2: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
376 case OP_3: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
377 case OP_4: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
378 case OP_5: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
379 case OP_6: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
380 case OP_7: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
381 case OP_8: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
382 case OP_9: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
383 case OP_10: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
384 case OP_11: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
385 case OP_12: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
386 case OP_13: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
387 case OP_14: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
388 case OP_15: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
389 case OP_16: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
390 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
391 // ( -- value) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
392 CBigNum bn((int)opcode - (int)(OP_1 - 1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
393 stack.push_back(bn.getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
394 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
395 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
396 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
397 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
398 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
399 // Control |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
400 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
401 case OP_NOP: |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
402 case OP_NOP1: case OP_NOP2: case OP_NOP3: case OP_NOP4: case OP_NOP5: |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
403 case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
404 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
405 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
406 case OP_IF: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
407 case OP_NOTIF: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
408 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
409 // <expression> if [statements] [else [statements]] endif |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
410 bool fValue = false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
411 if (fExec) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
412 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
413 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
414 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
415 valtype& vch = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
416 fValue = CastToBool(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
417 if (opcode == OP_NOTIF) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
418 fValue = !fValue; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
419 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
420 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
421 vfExec.push_back(fValue); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
422 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
423 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
424 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
425 case OP_ELSE: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
426 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
427 if (vfExec.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
428 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
429 vfExec.back() = !vfExec.back(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
430 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
431 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
432 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
433 case OP_ENDIF: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
434 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
435 if (vfExec.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
436 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
437 vfExec.pop_back(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
438 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
439 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
440 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
441 case OP_VERIFY: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
442 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
443 // (true -- ) or |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
444 // (false -- false) and return |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
445 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
446 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
447 bool fValue = CastToBool(stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
448 if (fValue) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
449 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
450 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
451 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
452 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
453 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
454 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
455 case OP_RETURN: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
456 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
457 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
458 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
459 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
460 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
461 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
462 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
463 // Stack ops |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
464 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
465 case OP_TOALTSTACK: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
466 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
467 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
468 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
469 altstack.push_back(stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
470 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
471 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
472 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
473 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
474 case OP_FROMALTSTACK: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
475 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
476 if (altstack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
477 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
478 stack.push_back(altstacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
479 popstack(altstack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
480 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
481 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
482 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
483 case OP_2DROP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
484 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
485 // (x1 x2 -- ) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
486 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
487 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
488 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
489 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
490 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
491 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
492 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
493 case OP_2DUP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
494 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
495 // (x1 x2 -- x1 x2 x1 x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
496 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
497 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
498 valtype vch1 = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
499 valtype vch2 = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
500 stack.push_back(vch1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
501 stack.push_back(vch2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
502 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
503 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
504 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
505 case OP_3DUP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
506 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
507 // (x1 x2 x3 -- x1 x2 x3 x1 x2 x3) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
508 if (stack.size() < 3) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
509 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
510 valtype vch1 = stacktop(-3); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
511 valtype vch2 = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
512 valtype vch3 = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
513 stack.push_back(vch1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
514 stack.push_back(vch2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
515 stack.push_back(vch3); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
516 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
517 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
518 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
519 case OP_2OVER: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
520 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
521 // (x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
522 if (stack.size() < 4) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
523 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
524 valtype vch1 = stacktop(-4); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
525 valtype vch2 = stacktop(-3); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
526 stack.push_back(vch1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
527 stack.push_back(vch2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
528 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
529 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
530 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
531 case OP_2ROT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
532 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
533 // (x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
534 if (stack.size() < 6) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
535 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
536 valtype vch1 = stacktop(-6); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
537 valtype vch2 = stacktop(-5); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
538 stack.erase(stack.end()-6, stack.end()-4); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
539 stack.push_back(vch1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
540 stack.push_back(vch2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
541 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
542 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
543 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
544 case OP_2SWAP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
545 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
546 // (x1 x2 x3 x4 -- x3 x4 x1 x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
547 if (stack.size() < 4) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
548 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
549 swap(stacktop(-4), stacktop(-2)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
550 swap(stacktop(-3), stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
551 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
552 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
553 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
554 case OP_IFDUP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
555 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
556 // (x - 0 | x x) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
557 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
558 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
559 valtype vch = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
560 if (CastToBool(vch)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
561 stack.push_back(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
562 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
563 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
564 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
565 case OP_DEPTH: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
566 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
567 // -- stacksize |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
568 CBigNum bn(stack.size()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
569 stack.push_back(bn.getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
570 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
571 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
572 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
573 case OP_DROP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
574 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
575 // (x -- ) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
576 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
577 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
578 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
579 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
580 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
581 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
582 case OP_DUP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
583 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
584 // (x -- x x) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
585 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
586 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
587 valtype vch = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
588 stack.push_back(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
589 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
590 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
591 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
592 case OP_NIP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
593 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
594 // (x1 x2 -- x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
595 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
596 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
597 stack.erase(stack.end() - 2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
598 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
599 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
600 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
601 case OP_OVER: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
602 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
603 // (x1 x2 -- x1 x2 x1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
604 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
605 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
606 valtype vch = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
607 stack.push_back(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
608 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
609 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
610 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
611 case OP_PICK: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
612 case OP_ROLL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
613 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
614 // (xn ... x2 x1 x0 n - xn ... x2 x1 x0 xn) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
615 // (xn ... x2 x1 x0 n - ... x2 x1 x0 xn) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
616 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
617 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
618 int n = CastToBigNum(stacktop(-1)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
619 popstack(stack); |
2311
20e40ae0d404
Add casts for unavoidable signed/unsigned comparisons
Jeff Garzik <jgarzik@exmulti.com>
parents:
2309
diff
changeset
|
620 if (n < 0 || n >= (int)stack.size()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
621 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
622 valtype vch = stacktop(-n-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
623 if (opcode == OP_ROLL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
624 stack.erase(stack.end()-n-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
625 stack.push_back(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
626 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
627 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
628 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
629 case OP_ROT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
630 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
631 // (x1 x2 x3 -- x2 x3 x1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
632 // x2 x1 x3 after first swap |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
633 // x2 x3 x1 after second swap |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
634 if (stack.size() < 3) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
635 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
636 swap(stacktop(-3), stacktop(-2)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
637 swap(stacktop(-2), stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
638 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
639 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
640 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
641 case OP_SWAP: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
642 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
643 // (x1 x2 -- x2 x1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
644 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
645 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
646 swap(stacktop(-2), stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
647 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
648 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
649 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
650 case OP_TUCK: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
651 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
652 // (x1 x2 -- x2 x1 x2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
653 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
654 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
655 valtype vch = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
656 stack.insert(stack.end()-2, vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
657 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
658 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
659 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
660 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
661 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
662 // Splice ops |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
663 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
664 case OP_CAT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
665 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
666 // (x1 x2 -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
667 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
668 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
669 valtype& vch1 = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
670 valtype& vch2 = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
671 vch1.insert(vch1.end(), vch2.begin(), vch2.end()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
672 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
673 if (stacktop(-1).size() > 520) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
674 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
675 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
676 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
677 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
678 case OP_SUBSTR: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
679 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
680 // (in begin size -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
681 if (stack.size() < 3) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
682 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
683 valtype& vch = stacktop(-3); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
684 int nBegin = CastToBigNum(stacktop(-2)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
685 int nEnd = nBegin + CastToBigNum(stacktop(-1)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
686 if (nBegin < 0 || nEnd < nBegin) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
687 return false; |
2311
20e40ae0d404
Add casts for unavoidable signed/unsigned comparisons
Jeff Garzik <jgarzik@exmulti.com>
parents:
2309
diff
changeset
|
688 if (nBegin > (int)vch.size()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
689 nBegin = vch.size(); |
2311
20e40ae0d404
Add casts for unavoidable signed/unsigned comparisons
Jeff Garzik <jgarzik@exmulti.com>
parents:
2309
diff
changeset
|
690 if (nEnd > (int)vch.size()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
691 nEnd = vch.size(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
692 vch.erase(vch.begin() + nEnd, vch.end()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
693 vch.erase(vch.begin(), vch.begin() + nBegin); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
694 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
695 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
696 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
697 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
698 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
699 case OP_LEFT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
700 case OP_RIGHT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
701 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
702 // (in size -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
703 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
704 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
705 valtype& vch = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
706 int nSize = CastToBigNum(stacktop(-1)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
707 if (nSize < 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
708 return false; |
2311
20e40ae0d404
Add casts for unavoidable signed/unsigned comparisons
Jeff Garzik <jgarzik@exmulti.com>
parents:
2309
diff
changeset
|
709 if (nSize > (int)vch.size()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
710 nSize = vch.size(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
711 if (opcode == OP_LEFT) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
712 vch.erase(vch.begin() + nSize, vch.end()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
713 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
714 vch.erase(vch.begin(), vch.end() - nSize); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
715 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
716 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
717 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
718 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
719 case OP_SIZE: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
720 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
721 // (in -- in size) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
722 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
723 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
724 CBigNum bn(stacktop(-1).size()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
725 stack.push_back(bn.getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
726 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
727 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
728 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
729 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
730 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
731 // Bitwise logic |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
732 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
733 case OP_INVERT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
734 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
735 // (in - out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
736 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
737 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
738 valtype& vch = stacktop(-1); |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
739 for (unsigned int i = 0; i < vch.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
740 vch[i] = ~vch[i]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
741 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
742 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
743 |
3553
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
744 // |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
745 // WARNING: These disabled opcodes exhibit unexpected behavior |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
746 // when used on signed integers due to a bug in MakeSameSize() |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
747 // [see definition of MakeSameSize() above]. |
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
748 // |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
749 case OP_AND: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
750 case OP_OR: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
751 case OP_XOR: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
752 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
753 // (x1 x2 - out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
754 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
755 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
756 valtype& vch1 = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
757 valtype& vch2 = stacktop(-1); |
3553
6405b2b19c99
Documented bug in sign-extension behavior of opcodes OP_AND, OP_OR, and OP_XOR.
Mark Friedenbach <mark@monetize.io>
parents:
3374
diff
changeset
|
758 MakeSameSize(vch1, vch2); // <-- NOT SAFE FOR SIGNED VALUES |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
759 if (opcode == OP_AND) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
760 { |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
761 for (unsigned int i = 0; i < vch1.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
762 vch1[i] &= vch2[i]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
763 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
764 else if (opcode == OP_OR) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
765 { |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
766 for (unsigned int i = 0; i < vch1.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
767 vch1[i] |= vch2[i]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
768 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
769 else if (opcode == OP_XOR) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
770 { |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
771 for (unsigned int i = 0; i < vch1.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
772 vch1[i] ^= vch2[i]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
773 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
774 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
775 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
776 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
777 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
778 case OP_EQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
779 case OP_EQUALVERIFY: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
780 //case OP_NOTEQUAL: // use OP_NUMNOTEQUAL |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
781 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
782 // (x1 x2 - bool) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
783 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
784 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
785 valtype& vch1 = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
786 valtype& vch2 = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
787 bool fEqual = (vch1 == vch2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
788 // OP_NOTEQUAL is disabled because it would be too easy to say |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
789 // something like n != 1 and have some wiseguy pass in 1 with extra |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
790 // zero bytes after it (numerically, 0x01 == 0x0001 == 0x000001) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
791 //if (opcode == OP_NOTEQUAL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
792 // fEqual = !fEqual; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
793 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
794 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
795 stack.push_back(fEqual ? vchTrue : vchFalse); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
796 if (opcode == OP_EQUALVERIFY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
797 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
798 if (fEqual) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
799 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
800 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
801 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
802 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
803 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
804 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
805 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
806 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
807 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
808 // Numeric |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
809 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
810 case OP_1ADD: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
811 case OP_1SUB: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
812 case OP_2MUL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
813 case OP_2DIV: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
814 case OP_NEGATE: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
815 case OP_ABS: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
816 case OP_NOT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
817 case OP_0NOTEQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
818 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
819 // (in -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
820 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
821 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
822 CBigNum bn = CastToBigNum(stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
823 switch (opcode) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
824 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
825 case OP_1ADD: bn += bnOne; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
826 case OP_1SUB: bn -= bnOne; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
827 case OP_2MUL: bn <<= 1; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
828 case OP_2DIV: bn >>= 1; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
829 case OP_NEGATE: bn = -bn; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
830 case OP_ABS: if (bn < bnZero) bn = -bn; break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
831 case OP_NOT: bn = (bn == bnZero); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
832 case OP_0NOTEQUAL: bn = (bn != bnZero); break; |
779
2898aa13cfc0
fix warning: X enumeration values not handled in switch [-Wswitch-enum]
Giel van Schijndel <me@mortis.eu>
parents:
766
diff
changeset
|
833 default: assert(!"invalid opcode"); break; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
834 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
835 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
836 stack.push_back(bn.getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
837 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
838 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
839 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
840 case OP_ADD: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
841 case OP_SUB: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
842 case OP_MUL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
843 case OP_DIV: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
844 case OP_MOD: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
845 case OP_LSHIFT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
846 case OP_RSHIFT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
847 case OP_BOOLAND: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
848 case OP_BOOLOR: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
849 case OP_NUMEQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
850 case OP_NUMEQUALVERIFY: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
851 case OP_NUMNOTEQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
852 case OP_LESSTHAN: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
853 case OP_GREATERTHAN: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
854 case OP_LESSTHANOREQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
855 case OP_GREATERTHANOREQUAL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
856 case OP_MIN: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
857 case OP_MAX: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
858 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
859 // (x1 x2 -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
860 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
861 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
862 CBigNum bn1 = CastToBigNum(stacktop(-2)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
863 CBigNum bn2 = CastToBigNum(stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
864 CBigNum bn; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
865 switch (opcode) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
866 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
867 case OP_ADD: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
868 bn = bn1 + bn2; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
869 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
870 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
871 case OP_SUB: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
872 bn = bn1 - bn2; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
873 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
874 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
875 case OP_MUL: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
876 if (!BN_mul(&bn, &bn1, &bn2, pctx)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
877 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
878 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
879 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
880 case OP_DIV: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
881 if (!BN_div(&bn, NULL, &bn1, &bn2, pctx)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
882 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
883 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
884 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
885 case OP_MOD: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
886 if (!BN_mod(&bn, &bn1, &bn2, pctx)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
887 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
888 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
889 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
890 case OP_LSHIFT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
891 if (bn2 < bnZero || bn2 > CBigNum(2048)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
892 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
893 bn = bn1 << bn2.getulong(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
894 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
895 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
896 case OP_RSHIFT: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
897 if (bn2 < bnZero || bn2 > CBigNum(2048)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
898 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
899 bn = bn1 >> bn2.getulong(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
900 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
901 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
902 case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
903 case OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
904 case OP_NUMEQUAL: bn = (bn1 == bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
905 case OP_NUMEQUALVERIFY: bn = (bn1 == bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
906 case OP_NUMNOTEQUAL: bn = (bn1 != bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
907 case OP_LESSTHAN: bn = (bn1 < bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
908 case OP_GREATERTHAN: bn = (bn1 > bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
909 case OP_LESSTHANOREQUAL: bn = (bn1 <= bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
910 case OP_GREATERTHANOREQUAL: bn = (bn1 >= bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
911 case OP_MIN: bn = (bn1 < bn2 ? bn1 : bn2); break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
912 case OP_MAX: bn = (bn1 > bn2 ? bn1 : bn2); break; |
779
2898aa13cfc0
fix warning: X enumeration values not handled in switch [-Wswitch-enum]
Giel van Schijndel <me@mortis.eu>
parents:
766
diff
changeset
|
913 default: assert(!"invalid opcode"); break; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
914 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
915 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
916 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
917 stack.push_back(bn.getvch()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
918 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
919 if (opcode == OP_NUMEQUALVERIFY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
920 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
921 if (CastToBool(stacktop(-1))) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
922 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
923 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
924 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
925 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
926 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
927 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
928 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
929 case OP_WITHIN: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
930 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
931 // (x min max -- out) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
932 if (stack.size() < 3) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
933 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
934 CBigNum bn1 = CastToBigNum(stacktop(-3)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
935 CBigNum bn2 = CastToBigNum(stacktop(-2)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
936 CBigNum bn3 = CastToBigNum(stacktop(-1)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
937 bool fValue = (bn2 <= bn1 && bn1 < bn3); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
938 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
939 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
940 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
941 stack.push_back(fValue ? vchTrue : vchFalse); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
942 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
943 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
944 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
945 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
946 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
947 // Crypto |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
948 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
949 case OP_RIPEMD160: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
950 case OP_SHA1: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
951 case OP_SHA256: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
952 case OP_HASH160: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
953 case OP_HASH256: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
954 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
955 // (in -- hash) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
956 if (stack.size() < 1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
957 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
958 valtype& vch = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
959 valtype vchHash((opcode == OP_RIPEMD160 || opcode == OP_SHA1 || opcode == OP_HASH160) ? 20 : 32); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
960 if (opcode == OP_RIPEMD160) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
961 RIPEMD160(&vch[0], vch.size(), &vchHash[0]); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
962 else if (opcode == OP_SHA1) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
963 SHA1(&vch[0], vch.size(), &vchHash[0]); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
964 else if (opcode == OP_SHA256) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
965 SHA256(&vch[0], vch.size(), &vchHash[0]); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
966 else if (opcode == OP_HASH160) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
967 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
968 uint160 hash160 = Hash160(vch); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
969 memcpy(&vchHash[0], &hash160, sizeof(hash160)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
970 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
971 else if (opcode == OP_HASH256) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
972 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
973 uint256 hash = Hash(vch.begin(), vch.end()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
974 memcpy(&vchHash[0], &hash, sizeof(hash)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
975 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
976 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
977 stack.push_back(vchHash); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
978 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
979 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
980 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
981 case OP_CODESEPARATOR: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
982 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
983 // Hash starts after the code separator |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
984 pbegincodehash = pc; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
985 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
986 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
987 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
988 case OP_CHECKSIG: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
989 case OP_CHECKSIGVERIFY: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
990 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
991 // (sig pubkey -- bool) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
992 if (stack.size() < 2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
993 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
994 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
995 valtype& vchSig = stacktop(-2); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
996 valtype& vchPubKey = stacktop(-1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
997 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
998 ////// debug print |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
999 //PrintHex(vchSig.begin(), vchSig.end(), "sig: %s\n"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1000 //PrintHex(vchPubKey.begin(), vchPubKey.end(), "pubkey: %s\n"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1001 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1002 // Subset of script starting at the most recent codeseparator |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1003 CScript scriptCode(pbegincodehash, pend); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1004 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1005 // Drop the signature, since there's no way for a signature to sign itself |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1006 scriptCode.FindAndDelete(CScript(vchSig)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1007 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1008 bool fSuccess = (!fStrictEncodings || (IsCanonicalSignature(vchSig) && IsCanonicalPubKey(vchPubKey))); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1009 if (fSuccess) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1010 fSuccess = CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, nHashType); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1011 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1012 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1013 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1014 stack.push_back(fSuccess ? vchTrue : vchFalse); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1015 if (opcode == OP_CHECKSIGVERIFY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1016 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1017 if (fSuccess) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1018 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1019 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1020 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1021 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1022 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1023 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1024 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1025 case OP_CHECKMULTISIG: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1026 case OP_CHECKMULTISIGVERIFY: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1027 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1028 // ([sig ...] num_of_signatures [pubkey ...] num_of_pubkeys -- bool) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1029 |
2322
e28cb2309ead
Undo part of c2e8c8ac to fix issue#1148
Gavin Andresen <gavinandresen@gmail.com>
parents:
2311
diff
changeset
|
1030 int i = 1; |
2351
e92f87e6691c
EvalScript(): cast to avoid signed/unsigned warning
Jeff Garzik <jgarzik@exmulti.com>
parents:
2322
diff
changeset
|
1031 if ((int)stack.size() < i) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1032 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1033 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1034 int nKeysCount = CastToBigNum(stacktop(-i)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1035 if (nKeysCount < 0 || nKeysCount > 20) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1036 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1037 nOpCount += nKeysCount; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1038 if (nOpCount > 201) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1039 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1040 int ikey = ++i; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1041 i += nKeysCount; |
2351
e92f87e6691c
EvalScript(): cast to avoid signed/unsigned warning
Jeff Garzik <jgarzik@exmulti.com>
parents:
2322
diff
changeset
|
1042 if ((int)stack.size() < i) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1043 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1044 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1045 int nSigsCount = CastToBigNum(stacktop(-i)).getint(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1046 if (nSigsCount < 0 || nSigsCount > nKeysCount) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1047 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1048 int isig = ++i; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1049 i += nSigsCount; |
2351
e92f87e6691c
EvalScript(): cast to avoid signed/unsigned warning
Jeff Garzik <jgarzik@exmulti.com>
parents:
2322
diff
changeset
|
1050 if ((int)stack.size() < i) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1051 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1052 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1053 // Subset of script starting at the most recent codeseparator |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1054 CScript scriptCode(pbegincodehash, pend); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1055 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1056 // Drop the signatures, since there's no way for a signature to sign itself |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1057 for (int k = 0; k < nSigsCount; k++) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1058 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1059 valtype& vchSig = stacktop(-isig-k); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1060 scriptCode.FindAndDelete(CScript(vchSig)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1061 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1062 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1063 bool fSuccess = true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1064 while (fSuccess && nSigsCount > 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1065 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1066 valtype& vchSig = stacktop(-isig); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1067 valtype& vchPubKey = stacktop(-ikey); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1068 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1069 // Check signature |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1070 bool fOk = (!fStrictEncodings || (IsCanonicalSignature(vchSig) && IsCanonicalPubKey(vchPubKey))); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1071 if (fOk) |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1072 fOk = CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, nHashType); |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1073 |
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1074 if (fOk) { |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1075 isig++; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1076 nSigsCount--; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1077 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1078 ikey++; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1079 nKeysCount--; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1080 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1081 // If there are more signatures left than keys left, |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1082 // then too many signatures have failed |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1083 if (nSigsCount > nKeysCount) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1084 fSuccess = false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1085 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1086 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1087 while (i-- > 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1088 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1089 stack.push_back(fSuccess ? vchTrue : vchFalse); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1090 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1091 if (opcode == OP_CHECKMULTISIGVERIFY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1092 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1093 if (fSuccess) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1094 popstack(stack); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1095 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1096 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1097 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1098 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1099 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1100 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1101 default: |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1102 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1103 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1104 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1105 // Size limits |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1106 if (stack.size() + altstack.size() > 1000) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1107 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1108 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1109 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1110 catch (...) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1111 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1112 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1113 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1114 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1115 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1116 if (!vfExec.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1117 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1118 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1119 return true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1120 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1121 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1122 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1123 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1124 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1125 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1126 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1127 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1128 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1129 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1130 uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1131 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1132 if (nIn >= txTo.vin.size()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1133 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1134 printf("ERROR: SignatureHash() : nIn=%d out of range\n", nIn); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1135 return 1; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1136 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1137 CTransaction txTmp(txTo); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1138 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1139 // In case concatenating two scripts ends up with two codeseparators, |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1140 // or an extra one at the end, this prevents all those possible incompatibilities. |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1141 scriptCode.FindAndDelete(CScript(OP_CODESEPARATOR)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1142 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1143 // Blank out other inputs' signatures |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
1144 for (unsigned int i = 0; i < txTmp.vin.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1145 txTmp.vin[i].scriptSig = CScript(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1146 txTmp.vin[nIn].scriptSig = scriptCode; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1147 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1148 // Blank out some of the outputs |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1149 if ((nHashType & 0x1f) == SIGHASH_NONE) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1150 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1151 // Wildcard payee |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1152 txTmp.vout.clear(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1153 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1154 // Let the others update at will |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
1155 for (unsigned int i = 0; i < txTmp.vin.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1156 if (i != nIn) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1157 txTmp.vin[i].nSequence = 0; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1158 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1159 else if ((nHashType & 0x1f) == SIGHASH_SINGLE) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1160 { |
3271
56ff97ff8aec
Bugfix: Fix a variety of misspellings
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3156
diff
changeset
|
1161 // Only lock-in the txout payee at same index as txin |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1162 unsigned int nOut = nIn; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1163 if (nOut >= txTmp.vout.size()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1164 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1165 printf("ERROR: SignatureHash() : nOut=%d out of range\n", nOut); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1166 return 1; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1167 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1168 txTmp.vout.resize(nOut+1); |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
1169 for (unsigned int i = 0; i < nOut; i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1170 txTmp.vout[i].SetNull(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1171 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1172 // Let the others update at will |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
1173 for (unsigned int i = 0; i < txTmp.vin.size(); i++) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1174 if (i != nIn) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1175 txTmp.vin[i].nSequence = 0; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1176 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1177 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1178 // Blank out other inputs completely, not recommended for open transactions |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1179 if (nHashType & SIGHASH_ANYONECANPAY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1180 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1181 txTmp.vin[0] = txTmp.vin[nIn]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1182 txTmp.vin.resize(1); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1183 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1184 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1185 // Serialize and hash |
2277
0dcf927bc6b2
Further reduce header dependencies
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2274
diff
changeset
|
1186 CDataStream ss(SER_GETHASH, 0); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1187 ss.reserve(10000); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1188 ss << txTmp << nHashType; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1189 return Hash(ss.begin(), ss.end()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1190 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1191 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1192 |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1193 // Valid signature cache, to avoid doing expensive ECDSA signature checking |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1194 // twice for every transaction (once when accepted into memory pool, and |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1195 // again when accepted into the block chain) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1196 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1197 class CSignatureCache |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1198 { |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1199 private: |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1200 // sigdata_type is (signature hash, signature, public key): |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1201 typedef boost::tuple<uint256, std::vector<unsigned char>, std::vector<unsigned char> > sigdata_type; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1202 std::set< sigdata_type> setValid; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1203 CCriticalSection cs_sigcache; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1204 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1205 public: |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1206 bool |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1207 Get(uint256 hash, const std::vector<unsigned char>& vchSig, const std::vector<unsigned char>& pubKey) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1208 { |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1209 LOCK(cs_sigcache); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1210 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1211 sigdata_type k(hash, vchSig, pubKey); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1212 std::set<sigdata_type>::iterator mi = setValid.find(k); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1213 if (mi != setValid.end()) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1214 return true; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1215 return false; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1216 } |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1217 |
3374
8c4e49592ec8
Avoid leaving return types or function attributes on their own lines.
Gregory Maxwell <greg@xiph.org>
parents:
3273
diff
changeset
|
1218 void Set(uint256 hash, const std::vector<unsigned char>& vchSig, const std::vector<unsigned char>& pubKey) |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1219 { |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1220 // DoS prevention: limit cache size to less than 10MB |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1221 // (~200 bytes per cache entry times 50,000 entries) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1222 // Since there are a maximum of 20,000 signature operations per block |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1223 // 50,000 is a reasonable default. |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1224 int64 nMaxCacheSize = GetArg("-maxsigcachesize", 50000); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1225 if (nMaxCacheSize <= 0) return; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1226 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1227 LOCK(cs_sigcache); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1228 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1229 while (static_cast<int64>(setValid.size()) > nMaxCacheSize) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1230 { |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1231 // Evict a random entry. Random because that helps |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1232 // foil would-be DoS attackers who might try to pre-generate |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1233 // and re-use a set of valid signatures just-slightly-greater |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1234 // than our cache size. |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1235 uint256 randomHash = GetRandHash(); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1236 std::vector<unsigned char> unused; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1237 std::set<sigdata_type>::iterator it = |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1238 setValid.lower_bound(sigdata_type(randomHash, unused, unused)); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1239 if (it == setValid.end()) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1240 it = setValid.begin(); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1241 setValid.erase(*it); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1242 } |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1243 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1244 sigdata_type k(hash, vchSig, pubKey); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1245 setValid.insert(k); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1246 } |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1247 }; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1248 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1249 bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1250 const CTransaction& txTo, unsigned int nIn, int nHashType) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1251 { |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1252 static CSignatureCache signatureCache; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1253 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1254 // Hash type is one byte tacked on to the end of the signature |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1255 if (vchSig.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1256 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1257 if (nHashType == 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1258 nHashType = vchSig.back(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1259 else if (nHashType != vchSig.back()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1260 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1261 vchSig.pop_back(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1262 |
2663
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1263 uint256 sighash = SignatureHash(scriptCode, txTo, nIn, nHashType); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1264 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1265 if (signatureCache.Get(sighash, vchSig, vchPubKey)) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1266 return true; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1267 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1268 CKey key; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1269 if (!key.SetPubKey(vchPubKey)) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1270 return false; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1271 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1272 if (!key.Verify(sighash, vchSig)) |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1273 return false; |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1274 |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1275 signatureCache.Set(sighash, vchSig, vchPubKey); |
9c977b16c045
Move signature cache from CKey::Verify to CheckSig in script.cpp
Gavin Andresen <gavinandresen@gmail.com>
parents:
2607
diff
changeset
|
1276 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1277 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1278 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1279 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1280 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1281 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1282 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1283 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1284 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1285 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1286 |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1287 // |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1288 // Return public keys or hashes from scriptPubKey, for 'standard' transaction types. |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1289 // |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1290 bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsigned char> >& vSolutionsRet) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1291 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1292 // Templates |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1293 static map<txnouttype, CScript> mTemplates; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1294 if (mTemplates.empty()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1295 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1296 // Standard tx, sender provides pubkey, receiver adds signature |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1297 mTemplates.insert(make_pair(TX_PUBKEY, CScript() << OP_PUBKEY << OP_CHECKSIG)); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1298 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1299 // Bitcoin address tx, sender provides hash of pubkey, receiver provides signature and pubkey |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1300 mTemplates.insert(make_pair(TX_PUBKEYHASH, CScript() << OP_DUP << OP_HASH160 << OP_PUBKEYHASH << OP_EQUALVERIFY << OP_CHECKSIG)); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1301 |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1302 // Sender provides N pubkeys, receivers provides M signatures |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1303 mTemplates.insert(make_pair(TX_MULTISIG, CScript() << OP_SMALLINTEGER << OP_PUBKEYS << OP_SMALLINTEGER << OP_CHECKMULTISIG)); |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1304 } |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1305 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1306 // Shortcut for pay-to-script-hash, which are more constrained than the other types: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1307 // it is always OP_HASH160 20 [20 byte hash] OP_EQUAL |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1308 if (scriptPubKey.IsPayToScriptHash()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1309 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1310 typeRet = TX_SCRIPTHASH; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1311 vector<unsigned char> hashBytes(scriptPubKey.begin()+2, scriptPubKey.begin()+22); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1312 vSolutionsRet.push_back(hashBytes); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1313 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1314 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1315 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1316 // Scan templates |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1317 const CScript& script1 = scriptPubKey; |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1318 BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1319 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1320 const CScript& script2 = tplate.second; |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1321 vSolutionsRet.clear(); |
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1322 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1323 opcodetype opcode1, opcode2; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1324 vector<unsigned char> vch1, vch2; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1325 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1326 // Compare |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1327 CScript::const_iterator pc1 = script1.begin(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1328 CScript::const_iterator pc2 = script2.begin(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1329 loop |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1330 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1331 if (pc1 == script1.end() && pc2 == script2.end()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1332 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1333 // Found a match |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1334 typeRet = tplate.first; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1335 if (typeRet == TX_MULTISIG) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1336 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1337 // Additional checks for TX_MULTISIG: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1338 unsigned char m = vSolutionsRet.front()[0]; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1339 unsigned char n = vSolutionsRet.back()[0]; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1340 if (m < 1 || n < 1 || m > n || vSolutionsRet.size()-2 != n) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1341 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1342 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1343 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1344 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1345 if (!script1.GetOp(pc1, opcode1, vch1)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1346 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1347 if (!script2.GetOp(pc2, opcode2, vch2)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1348 break; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1349 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1350 // Template matching opcodes: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1351 if (opcode2 == OP_PUBKEYS) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1352 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1353 while (vch1.size() >= 33 && vch1.size() <= 120) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1354 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1355 vSolutionsRet.push_back(vch1); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1356 if (!script1.GetOp(pc1, opcode1, vch1)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1357 break; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1358 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1359 if (!script2.GetOp(pc2, opcode2, vch2)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1360 break; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1361 // Normal situation is to fall through |
3271
56ff97ff8aec
Bugfix: Fix a variety of misspellings
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3156
diff
changeset
|
1362 // to other if/else statements |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1363 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1364 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1365 if (opcode2 == OP_PUBKEY) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1366 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1367 if (vch1.size() < 33 || vch1.size() > 120) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1368 break; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1369 vSolutionsRet.push_back(vch1); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1370 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1371 else if (opcode2 == OP_PUBKEYHASH) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1372 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1373 if (vch1.size() != sizeof(uint160)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1374 break; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1375 vSolutionsRet.push_back(vch1); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1376 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1377 else if (opcode2 == OP_SMALLINTEGER) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1378 { // Single-byte small integer pushed onto vSolutions |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1379 if (opcode1 == OP_0 || |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1380 (opcode1 >= OP_1 && opcode1 <= OP_16)) |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1381 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1382 char n = (char)CScript::DecodeOP_N(opcode1); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1383 vSolutionsRet.push_back(valtype(1, n)); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1384 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1385 else |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1386 break; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1387 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1388 else if (opcode1 != opcode2 || vch1 != vch2) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1389 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1390 // Others must match exactly |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1391 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1392 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1393 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1394 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1395 |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1396 vSolutionsRet.clear(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1397 typeRet = TX_NONSTANDARD; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1398 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1399 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1400 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1401 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1402 bool Sign1(const CKeyID& address, const CKeyStore& keystore, uint256 hash, int nHashType, CScript& scriptSigRet) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1403 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1404 CKey key; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1405 if (!keystore.GetKey(address, key)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1406 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1407 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1408 vector<unsigned char> vchSig; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1409 if (!key.Sign(hash, vchSig)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1410 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1411 vchSig.push_back((unsigned char)nHashType); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1412 scriptSigRet << vchSig; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1413 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1414 return true; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1415 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1416 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1417 bool SignN(const vector<valtype>& multisigdata, const CKeyStore& keystore, uint256 hash, int nHashType, CScript& scriptSigRet) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1418 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1419 int nSigned = 0; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1420 int nRequired = multisigdata.front()[0]; |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1421 for (unsigned int i = 1; i < multisigdata.size()-1 && nSigned < nRequired; i++) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1422 { |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1423 const valtype& pubkey = multisigdata[i]; |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1424 CKeyID keyID = CPubKey(pubkey).GetID(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1425 if (Sign1(keyID, keystore, hash, nHashType, scriptSigRet)) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1426 ++nSigned; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1427 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1428 return nSigned==nRequired; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1429 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1430 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1431 // |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1432 // Sign scriptPubKey with private keys stored in keystore, given transaction hash and hash type. |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1433 // Signatures are returned in scriptSigRet (or returns false if scriptPubKey can't be signed), |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1434 // unless whichTypeRet is TX_SCRIPTHASH, in which case scriptSigRet is the redemption script. |
3271
56ff97ff8aec
Bugfix: Fix a variety of misspellings
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3156
diff
changeset
|
1435 // Returns false if scriptPubKey could not be completely satisfied. |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1436 // |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1437 bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash, int nHashType, |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1438 CScript& scriptSigRet, txnouttype& whichTypeRet) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1439 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1440 scriptSigRet.clear(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1441 |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1442 vector<valtype> vSolutions; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1443 if (!Solver(scriptPubKey, whichTypeRet, vSolutions)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1444 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1445 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1446 CKeyID keyID; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1447 switch (whichTypeRet) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1448 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1449 case TX_NONSTANDARD: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1450 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1451 case TX_PUBKEY: |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1452 keyID = CPubKey(vSolutions[0]).GetID(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1453 return Sign1(keyID, keystore, hash, nHashType, scriptSigRet); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1454 case TX_PUBKEYHASH: |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1455 keyID = CKeyID(uint160(vSolutions[0])); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1456 if (!Sign1(keyID, keystore, hash, nHashType, scriptSigRet)) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1457 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1458 else |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1459 { |
2687
2cca172f83a9
Encapsulate public keys in CPubKey
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2663
diff
changeset
|
1460 CPubKey vch; |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1461 keystore.GetPubKey(keyID, vch); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1462 scriptSigRet << vch; |
892
51e9fb5de117
Fix rpc-hanging deadlocks
Gavin Andresen <gavinandresen@gmail.com>
parents:
846
diff
changeset
|
1463 } |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1464 return true; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1465 case TX_SCRIPTHASH: |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1466 return keystore.GetCScript(uint160(vSolutions[0]), scriptSigRet); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1467 |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1468 case TX_MULTISIG: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1469 scriptSigRet << OP_0; // workaround CHECKMULTISIG bug |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1470 return (SignN(vSolutions, keystore, hash, nHashType, scriptSigRet)); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1471 } |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1472 return false; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1473 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1474 |
1769
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1475 int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions) |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1476 { |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1477 switch (t) |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1478 { |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1479 case TX_NONSTANDARD: |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1480 return -1; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1481 case TX_PUBKEY: |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1482 return 1; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1483 case TX_PUBKEYHASH: |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1484 return 2; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1485 case TX_MULTISIG: |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1486 if (vSolutions.size() < 1 || vSolutions[0].size() < 1) |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1487 return -1; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1488 return vSolutions[0][0] + 1; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1489 case TX_SCRIPTHASH: |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1490 return 1; // doesn't include args needed by the script |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1491 } |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1492 return -1; |
73e4f1828765
Make transactions with extra data in their scriptSig's non-standard.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1752
diff
changeset
|
1493 } |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1494 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1495 bool IsStandard(const CScript& scriptPubKey) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1496 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1497 vector<valtype> vSolutions; |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1498 txnouttype whichType; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1499 if (!Solver(scriptPubKey, whichType, vSolutions)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1500 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1501 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1502 if (whichType == TX_MULTISIG) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1503 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1504 unsigned char m = vSolutions.front()[0]; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1505 unsigned char n = vSolutions.back()[0]; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1506 // Support up to x-of-3 multisig txns as standard |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1507 if (n < 1 || n > 3) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1508 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1509 if (m < 1 || m > n) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1510 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1511 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1512 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1513 return whichType != TX_NONSTANDARD; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1514 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1515 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1516 |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1517 unsigned int HaveKeys(const vector<valtype>& pubkeys, const CKeyStore& keystore) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1518 { |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1519 unsigned int nResult = 0; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1520 BOOST_FOREACH(const valtype& pubkey, pubkeys) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1521 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1522 CKeyID keyID = CPubKey(pubkey).GetID(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1523 if (keystore.HaveKey(keyID)) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1524 ++nResult; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1525 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1526 return nResult; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1527 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1528 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1529 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1530 class CKeyStoreIsMineVisitor : public boost::static_visitor<bool> |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1531 { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1532 private: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1533 const CKeyStore *keystore; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1534 public: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1535 CKeyStoreIsMineVisitor(const CKeyStore *keystoreIn) : keystore(keystoreIn) { } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1536 bool operator()(const CNoDestination &dest) const { return false; } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1537 bool operator()(const CKeyID &keyID) const { return keystore->HaveKey(keyID); } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1538 bool operator()(const CScriptID &scriptID) const { return keystore->HaveCScript(scriptID); } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1539 }; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1540 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1541 bool IsMine(const CKeyStore &keystore, const CTxDestination &dest) |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1542 { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1543 return boost::apply_visitor(CKeyStoreIsMineVisitor(&keystore), dest); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1544 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1545 |
690 | 1546 bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1547 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1548 vector<valtype> vSolutions; |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1549 txnouttype whichType; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1550 if (!Solver(scriptPubKey, whichType, vSolutions)) |
760
fd7e5b1cfc08
Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
757
diff
changeset
|
1551 return false; |
fd7e5b1cfc08
Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
757
diff
changeset
|
1552 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1553 CKeyID keyID; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1554 switch (whichType) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1555 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1556 case TX_NONSTANDARD: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1557 return false; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1558 case TX_PUBKEY: |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1559 keyID = CPubKey(vSolutions[0]).GetID(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1560 return keystore.HaveKey(keyID); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1561 case TX_PUBKEYHASH: |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1562 keyID = CKeyID(uint160(vSolutions[0])); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1563 return keystore.HaveKey(keyID); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1564 case TX_SCRIPTHASH: |
760
fd7e5b1cfc08
Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
757
diff
changeset
|
1565 { |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1566 CScript subscript; |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1567 if (!keystore.GetCScript(CScriptID(uint160(vSolutions[0])), subscript)) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1568 return false; |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1569 return IsMine(keystore, subscript); |
760
fd7e5b1cfc08
Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
757
diff
changeset
|
1570 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1571 case TX_MULTISIG: |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1572 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1573 // Only consider transactions "mine" if we own ALL the |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1574 // keys involved. multi-signature transactions that are |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1575 // partially owned (somebody else has a key that can spend |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1576 // them) enable spend-out-from-under-you attacks, especially |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1577 // in shared-wallet situations. |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1578 vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1); |
1640
768b5a7944f0
make sure IsMine only returns true when we own all keys
coderrr <coderrr.contact@gmail.com>
parents:
1636
diff
changeset
|
1579 return HaveKeys(keys, keystore) == keys.size(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1580 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1581 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1582 return false; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1583 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1584 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1585 bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1586 { |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1587 vector<valtype> vSolutions; |
1604
2d635cbb6a2d
Use block times for 'hard' OP_EVAL switchover, and refactored EvalScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
1603
diff
changeset
|
1588 txnouttype whichType; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1589 if (!Solver(scriptPubKey, whichType, vSolutions)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1590 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1591 |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1592 if (whichType == TX_PUBKEY) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1593 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1594 addressRet = CPubKey(vSolutions[0]).GetID(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1595 return true; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1596 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1597 else if (whichType == TX_PUBKEYHASH) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1598 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1599 addressRet = CKeyID(uint160(vSolutions[0])); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1600 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1601 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1602 else if (whichType == TX_SCRIPTHASH) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1603 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1604 addressRet = CScriptID(uint160(vSolutions[0])); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1605 return true; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1606 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1607 // Multisig txns have more than one address... |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1608 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1609 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1610 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1611 bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, vector<CTxDestination>& addressRet, int& nRequiredRet) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1612 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1613 addressRet.clear(); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1614 typeRet = TX_NONSTANDARD; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1615 vector<valtype> vSolutions; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1616 if (!Solver(scriptPubKey, typeRet, vSolutions)) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1617 return false; |
827
c418a20d8590
Bugfix: don't overuse limited ExtractAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
815
diff
changeset
|
1618 |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1619 if (typeRet == TX_MULTISIG) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1620 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1621 nRequiredRet = vSolutions.front()[0]; |
2308
eb0890ee717f
Prefer 'unsigned int' for loop index variables tested against ::size()
Jeff Garzik <jgarzik@exmulti.com>
parents:
2277
diff
changeset
|
1622 for (unsigned int i = 1; i < vSolutions.size()-1; i++) |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1623 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1624 CTxDestination address = CPubKey(vSolutions[i]).GetID(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1625 addressRet.push_back(address); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1626 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1627 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1628 else |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1629 { |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1630 nRequiredRet = 1; |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1631 CTxDestination address; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1632 if (!ExtractDestination(scriptPubKey, address)) |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1633 return false; |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1634 addressRet.push_back(address); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1635 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1636 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1637 return true; |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1638 } |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1639 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1640 bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1641 bool fValidatePayToScriptHash, bool fStrictEncodings, int nHashType) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1642 { |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1643 vector<vector<unsigned char> > stack, stackCopy; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1644 if (!EvalScript(stack, scriptSig, txTo, nIn, fStrictEncodings, nHashType)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1645 return false; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1646 if (fValidatePayToScriptHash) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1647 stackCopy = stack; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1648 if (!EvalScript(stack, scriptPubKey, txTo, nIn, fStrictEncodings, nHashType)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1649 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1650 if (stack.empty()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1651 return false; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1652 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1653 if (CastToBool(stack.back()) == false) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1654 return false; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1655 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1656 // Additional validation for spend-to-script-hash transactions: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1657 if (fValidatePayToScriptHash && scriptPubKey.IsPayToScriptHash()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1658 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1659 if (!scriptSig.IsPushOnly()) // scriptSig must be literals-only |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1660 return false; // or validation fails |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1661 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1662 const valtype& pubKeySerialized = stackCopy.back(); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1663 CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1664 popstack(stackCopy); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1665 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1666 if (!EvalScript(stackCopy, pubKey2, txTo, nIn, fStrictEncodings, nHashType)) |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1667 return false; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1668 if (stackCopy.empty()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1669 return false; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1670 return CastToBool(stackCopy.back()); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1671 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1672 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1673 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1674 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1675 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1676 |
3152
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1677 bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CTransaction& txTo, unsigned int nIn, int nHashType) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1678 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1679 assert(nIn < txTo.vin.size()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1680 CTxIn& txin = txTo.vin[nIn]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1681 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1682 // Leave out the signature from the hash, since a signature can't sign itself. |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1683 // The checksig op will also drop the signatures from its hash. |
3152
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1684 uint256 hash = SignatureHash(fromPubKey, txTo, nIn, nHashType); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1685 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1686 txnouttype whichType; |
3152
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1687 if (!Solver(keystore, fromPubKey, hash, nHashType, txin.scriptSig, whichType)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1688 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1689 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1690 if (whichType == TX_SCRIPTHASH) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1691 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1692 // Solver returns the subscript that need to be evaluated; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1693 // the final scriptSig is the signatures from that |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1694 // and then the serialized subscript: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1695 CScript subscript = txin.scriptSig; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1696 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1697 // Recompute txn hash using subscript in place of scriptPubKey: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1698 uint256 hash2 = SignatureHash(subscript, txTo, nIn, nHashType); |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1699 |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1700 txnouttype subType; |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1701 bool fSolved = |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1702 Solver(keystore, subscript, hash2, nHashType, txin.scriptSig, subType) && subType != TX_SCRIPTHASH; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1703 // Append serialized subscript whether or not it is completely signed: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1704 txin.scriptSig << static_cast<valtype>(subscript); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1705 if (!fSolved) return false; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1706 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1707 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1708 // Test solution |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1709 return VerifyScript(txin.scriptSig, fromPubKey, txTo, nIn, true, true, 0); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1710 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1711 |
3152
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1712 bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType) |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1713 { |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1714 assert(nIn < txTo.vin.size()); |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1715 CTxIn& txin = txTo.vin[nIn]; |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1716 assert(txin.prevout.n < txFrom.vout.size()); |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1717 const CTxOut& txout = txFrom.vout[txin.prevout.n]; |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1718 |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1719 return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, nHashType); |
bf716647e542
Refactor: SignSignature/VerifyScript
Gavin Andresen <gavinandresen@gmail.com>
parents:
2688
diff
changeset
|
1720 } |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1721 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1722 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, bool fStrictEncodings, int nHashType) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1723 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1724 assert(nIn < txTo.vin.size()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1725 const CTxIn& txin = txTo.vin[nIn]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1726 if (txin.prevout.n >= txFrom.vout.size()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1727 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1728 const CTxOut& txout = txFrom.vout[txin.prevout.n]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1729 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1730 if (txin.prevout.hash != txFrom.GetHash()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1731 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1732 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1733 return VerifyScript(txin.scriptSig, txout.scriptPubKey, txTo, nIn, fValidatePayToScriptHash, fStrictEncodings, nHashType); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1734 } |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1735 |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1736 static CScript PushAll(const vector<valtype>& values) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1737 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1738 CScript result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1739 BOOST_FOREACH(const valtype& v, values) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1740 result << v; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1741 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1742 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1743 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1744 static CScript CombineMultisig(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1745 const vector<valtype>& vSolutions, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1746 vector<valtype>& sigs1, vector<valtype>& sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1747 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1748 // Combine all the signatures we've got: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1749 set<valtype> allsigs; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1750 BOOST_FOREACH(const valtype& v, sigs1) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1751 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1752 if (!v.empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1753 allsigs.insert(v); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1754 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1755 BOOST_FOREACH(const valtype& v, sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1756 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1757 if (!v.empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1758 allsigs.insert(v); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1759 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1760 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1761 // Build a map of pubkey -> signature by matching sigs to pubkeys: |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1762 assert(vSolutions.size() > 1); |
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1763 unsigned int nSigsRequired = vSolutions.front()[0]; |
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1764 unsigned int nPubKeys = vSolutions.size()-2; |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1765 map<valtype, valtype> sigs; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1766 BOOST_FOREACH(const valtype& sig, allsigs) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1767 { |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1768 for (unsigned int i = 0; i < nPubKeys; i++) |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1769 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1770 const valtype& pubkey = vSolutions[i+1]; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1771 if (sigs.count(pubkey)) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1772 continue; // Already got a sig for this pubkey |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1773 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1774 if (CheckSig(sig, pubkey, scriptPubKey, txTo, nIn, 0)) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1775 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1776 sigs[pubkey] = sig; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1777 break; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1778 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1779 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1780 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1781 // Now build a merged CScript: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1782 unsigned int nSigsHave = 0; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1783 CScript result; result << OP_0; // pop-one-too-many workaround |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1784 for (unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++) |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1785 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1786 if (sigs.count(vSolutions[i+1])) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1787 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1788 result << sigs[vSolutions[i+1]]; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1789 ++nSigsHave; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1790 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1791 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1792 // Fill any missing with OP_0: |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1793 for (unsigned int i = nSigsHave; i < nSigsRequired; i++) |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1794 result << OP_0; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1795 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1796 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1797 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1798 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1799 static CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1800 const txnouttype txType, const vector<valtype>& vSolutions, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1801 vector<valtype>& sigs1, vector<valtype>& sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1802 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1803 switch (txType) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1804 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1805 case TX_NONSTANDARD: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1806 // Don't know anything about this, assume bigger one is correct: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1807 if (sigs1.size() >= sigs2.size()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1808 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1809 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1810 case TX_PUBKEY: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1811 case TX_PUBKEYHASH: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1812 // Signatures are bigger than placeholders or empty scripts: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1813 if (sigs1.empty() || sigs1[0].empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1814 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1815 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1816 case TX_SCRIPTHASH: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1817 if (sigs1.empty() || sigs1.back().empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1818 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1819 else if (sigs2.empty() || sigs2.back().empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1820 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1821 else |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1822 { |
3271
56ff97ff8aec
Bugfix: Fix a variety of misspellings
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3156
diff
changeset
|
1823 // Recur to combine: |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1824 valtype spk = sigs1.back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1825 CScript pubKey2(spk.begin(), spk.end()); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1826 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1827 txnouttype txType2; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1828 vector<vector<unsigned char> > vSolutions2; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1829 Solver(pubKey2, txType2, vSolutions2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1830 sigs1.pop_back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1831 sigs2.pop_back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1832 CScript result = CombineSignatures(pubKey2, txTo, nIn, txType2, vSolutions2, sigs1, sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1833 result << spk; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1834 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1835 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1836 case TX_MULTISIG: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1837 return CombineMultisig(scriptPubKey, txTo, nIn, vSolutions, sigs1, sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1838 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1839 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1840 return CScript(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1841 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1842 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1843 CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1844 const CScript& scriptSig1, const CScript& scriptSig2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1845 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1846 txnouttype txType; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1847 vector<vector<unsigned char> > vSolutions; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1848 Solver(scriptPubKey, txType, vSolutions); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1849 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1850 vector<valtype> stack1; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1851 EvalScript(stack1, scriptSig1, CTransaction(), 0, true, 0); |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1852 vector<valtype> stack2; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1853 EvalScript(stack2, scriptSig2, CTransaction(), 0, true, 0); |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1854 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1855 return CombineSignatures(scriptPubKey, txTo, nIn, txType, vSolutions, stack1, stack2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1856 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1857 |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1858 unsigned int CScript::GetSigOpCount(bool fAccurate) const |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1859 { |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1860 unsigned int n = 0; |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1861 const_iterator pc = begin(); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1862 opcodetype lastOpcode = OP_INVALIDOPCODE; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1863 while (pc < end()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1864 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1865 opcodetype opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1866 if (!GetOp(pc, opcode)) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1867 break; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1868 if (opcode == OP_CHECKSIG || opcode == OP_CHECKSIGVERIFY) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1869 n++; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1870 else if (opcode == OP_CHECKMULTISIG || opcode == OP_CHECKMULTISIGVERIFY) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1871 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1872 if (fAccurate && lastOpcode >= OP_1 && lastOpcode <= OP_16) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1873 n += DecodeOP_N(lastOpcode); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1874 else |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1875 n += 20; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1876 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1877 lastOpcode = opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1878 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1879 return n; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1880 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1881 |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1882 unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1883 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1884 if (!IsPayToScriptHash()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1885 return GetSigOpCount(true); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1886 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1887 // This is a pay-to-script-hash scriptPubKey; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1888 // get the last item that the scriptSig |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1889 // pushes onto the stack: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1890 const_iterator pc = scriptSig.begin(); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1891 vector<unsigned char> data; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1892 while (pc < scriptSig.end()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1893 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1894 opcodetype opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1895 if (!scriptSig.GetOp(pc, opcode, data)) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1896 return 0; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1897 if (opcode > OP_16) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1898 return 0; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1899 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1900 |
3273
7ca141395cbb
Bugfix: Correct English grammar regarding "'s"
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3271
diff
changeset
|
1901 /// ... and return its opcount: |
1752
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1902 CScript subscript(data.begin(), data.end()); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1903 return subscript.GetSigOpCount(true); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1904 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1905 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1906 bool CScript::IsPayToScriptHash() const |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1907 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1908 // Extra-fast test for pay-to-script-hash CScripts: |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1909 return (this->size() == 23 && |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1910 this->at(0) == OP_HASH160 && |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1911 this->at(1) == 0x14 && |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1912 this->at(22) == OP_EQUAL); |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1913 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1914 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1915 class CScriptVisitor : public boost::static_visitor<bool> |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1916 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1917 private: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1918 CScript *script; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1919 public: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1920 CScriptVisitor(CScript *scriptin) { script = scriptin; } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1921 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1922 bool operator()(const CNoDestination &dest) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1923 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1924 return false; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1925 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1926 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1927 bool operator()(const CKeyID &keyID) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1928 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1929 *script << OP_DUP << OP_HASH160 << keyID << OP_EQUALVERIFY << OP_CHECKSIG; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1930 return true; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1931 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1932 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1933 bool operator()(const CScriptID &scriptID) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1934 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1935 *script << OP_HASH160 << scriptID << OP_EQUAL; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1936 return true; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1937 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1938 }; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1939 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1940 void CScript::SetDestination(const CTxDestination& dest) |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1941 { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1942 boost::apply_visitor(CScriptVisitor(this), dest); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1943 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1944 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1945 void CScript::SetMultisig(int nRequired, const std::vector<CKey>& keys) |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1946 { |
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1947 this->clear(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1948 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1949 *this << EncodeOP_N(nRequired); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1950 BOOST_FOREACH(const CKey& key, keys) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1951 *this << key.GetPubKey(); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1952 *this << EncodeOP_N(keys.size()) << OP_CHECKMULTISIG; |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1953 } |