Mercurial > hg > bitcoin
annotate src/script.cpp @ 3649:eb986f1e2e93 draft
Ultraprune
This switches bitcoin's transaction/block verification logic to use a
"coin database", which contains all unredeemed transaction output scripts,
amounts and heights.
The name ultraprune comes from the fact that instead of a full transaction
index, we only (need to) keep an index with unspent outputs. For now, the
blocks themselves are kept as usual, although they are only necessary for
serving, rescanning and reorganizing.
The basic datastructures are CCoins (representing the coins of a single
transaction), and CCoinsView (representing a state of the coins database).
There are several implementations for CCoinsView. A dummy, one backed by
the coins database (coins.dat), one backed by the memory pool, and one
that adds a cache on top of it. FetchInputs, ConnectInputs, ConnectBlock,
DisconnectBlock, ... now operate on a generic CCoinsView.
The block switching logic now builds a single cached CCoinsView with
changes to be committed to the database before any changes are made.
This means no uncommitted changes are ever read from the database, and
should ease the transition to another database layer which does not
support transactions (but does support atomic writes), like LevelDB.
For the getrawtransaction() RPC call, access to a txid-to-disk index
would be preferable. As this index is not necessary or even useful
for any other part of the implementation, it is not provided. Instead,
getrawtransaction() uses the coin database to find the block height,
and then scans that block to find the requested transaction. This is
slow, but should suffice for debug purposes.
author | Pieter Wuille <pieter.wuille@gmail.com> |
---|---|
date | Sun, 01 Jul 2012 18:54:00 +0200 (2012-07-01) |
parents | d489f6576318 |
children | 4fc1724fc60e |
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 |
3649 | 1722 bool VerifySignature(const CCoins& 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 |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1730 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
|
1731 } |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1732 |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1733 static CScript PushAll(const vector<valtype>& values) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1734 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1735 CScript result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1736 BOOST_FOREACH(const valtype& v, values) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1737 result << v; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1738 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1739 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1740 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1741 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
|
1742 const vector<valtype>& vSolutions, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1743 vector<valtype>& sigs1, vector<valtype>& sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1744 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1745 // Combine all the signatures we've got: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1746 set<valtype> allsigs; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1747 BOOST_FOREACH(const valtype& v, sigs1) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1748 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1749 if (!v.empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1750 allsigs.insert(v); |
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 BOOST_FOREACH(const valtype& v, sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1753 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1754 if (!v.empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1755 allsigs.insert(v); |
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 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1758 // 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
|
1759 assert(vSolutions.size() > 1); |
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1760 unsigned int nSigsRequired = vSolutions.front()[0]; |
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1761 unsigned int nPubKeys = vSolutions.size()-2; |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1762 map<valtype, valtype> sigs; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1763 BOOST_FOREACH(const valtype& sig, allsigs) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1764 { |
3156
505666711e5b
Use unsigned ints to fix signed/unsigned warnings
Gavin Andresen <gavinandresen@gmail.com>
parents:
3154
diff
changeset
|
1765 for (unsigned int i = 0; i < nPubKeys; i++) |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1766 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1767 const valtype& pubkey = vSolutions[i+1]; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1768 if (sigs.count(pubkey)) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1769 continue; // Already got a sig for this pubkey |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1770 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1771 if (CheckSig(sig, pubkey, scriptPubKey, txTo, nIn, 0)) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1772 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1773 sigs[pubkey] = sig; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1774 break; |
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 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1777 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1778 // Now build a merged CScript: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1779 unsigned int nSigsHave = 0; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1780 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
|
1781 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
|
1782 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1783 if (sigs.count(vSolutions[i+1])) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1784 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1785 result << sigs[vSolutions[i+1]]; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1786 ++nSigsHave; |
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 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1789 // 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
|
1790 for (unsigned int i = nSigsHave; i < nSigsRequired; i++) |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1791 result << OP_0; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1792 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1793 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1794 } |
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 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
|
1797 const txnouttype txType, const vector<valtype>& vSolutions, |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1798 vector<valtype>& sigs1, vector<valtype>& sigs2) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1799 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1800 switch (txType) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1801 { |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1802 case TX_NONSTANDARD: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1803 // 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
|
1804 if (sigs1.size() >= sigs2.size()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1805 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1806 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1807 case TX_PUBKEY: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1808 case TX_PUBKEYHASH: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1809 // Signatures are bigger than placeholders or empty scripts: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1810 if (sigs1.empty() || sigs1[0].empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1811 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1812 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1813 case TX_SCRIPTHASH: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1814 if (sigs1.empty() || sigs1.back().empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1815 return PushAll(sigs2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1816 else if (sigs2.empty() || sigs2.back().empty()) |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1817 return PushAll(sigs1); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1818 else |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1819 { |
3271
56ff97ff8aec
Bugfix: Fix a variety of misspellings
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3156
diff
changeset
|
1820 // Recur to combine: |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1821 valtype spk = sigs1.back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1822 CScript pubKey2(spk.begin(), spk.end()); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1823 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1824 txnouttype txType2; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1825 vector<vector<unsigned char> > vSolutions2; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1826 Solver(pubKey2, txType2, vSolutions2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1827 sigs1.pop_back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1828 sigs2.pop_back(); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1829 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
|
1830 result << spk; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1831 return result; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1832 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1833 case TX_MULTISIG: |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1834 return CombineMultisig(scriptPubKey, txTo, nIn, vSolutions, sigs1, sigs2); |
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 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1837 return CScript(); |
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 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
|
1841 const CScript& scriptSig1, const CScript& scriptSig2) |
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 txnouttype txType; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1844 vector<vector<unsigned char> > vSolutions; |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1845 Solver(scriptPubKey, txType, vSolutions); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1846 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1847 vector<valtype> stack1; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1848 EvalScript(stack1, scriptSig1, CTransaction(), 0, true, 0); |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1849 vector<valtype> stack2; |
3520
ce8540bec751
Check for canonical public keys and signatures
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3374
diff
changeset
|
1850 EvalScript(stack2, scriptSig2, CTransaction(), 0, true, 0); |
3154
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1851 |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1852 return CombineSignatures(scriptPubKey, txTo, nIn, txType, vSolutions, stack1, stack2); |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1853 } |
6c1eeeb7e4c2
Implement raw transaction RPC calls
Gavin Andresen <gavinandresen@gmail.com>
parents:
3152
diff
changeset
|
1854 |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1855 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
|
1856 { |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1857 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
|
1858 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
|
1859 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
|
1860 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
|
1861 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1862 opcodetype opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1863 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
|
1864 break; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1865 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
|
1866 n++; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1867 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
|
1868 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1869 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
|
1870 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
|
1871 else |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1872 n += 20; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1873 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1874 lastOpcode = opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1875 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1876 return n; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1877 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1878 |
2309
ce4d0278e085
SigOp and orphan-tx constants and counts are always unsigned.
Jeff Garzik <jeff@garzik.org>
parents:
2308
diff
changeset
|
1879 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
|
1880 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1881 if (!IsPayToScriptHash()) |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1882 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
|
1883 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1884 // 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
|
1885 // 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
|
1886 // 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
|
1887 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
|
1888 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
|
1889 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
|
1890 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1891 opcodetype opcode; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1892 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
|
1893 return 0; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1894 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
|
1895 return 0; |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1896 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1897 |
3273
7ca141395cbb
Bugfix: Correct English grammar regarding "'s"
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3271
diff
changeset
|
1898 /// ... 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
|
1899 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
|
1900 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
|
1901 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1902 |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1903 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
|
1904 { |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1905 // 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
|
1906 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
|
1907 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
|
1908 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
|
1909 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
|
1910 } |
7b4383bddf3b
Replace OP_EVAL (BIP 12) with Pay-to-script-hash (BIP 16).
Gavin Andresen <gavinandresen@gmail.com>
parents:
1751
diff
changeset
|
1911 |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1912 class CScriptVisitor : public boost::static_visitor<bool> |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1913 { |
2688
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1914 private: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1915 CScript *script; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1916 public: |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1917 CScriptVisitor(CScript *scriptin) { script = scriptin; } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1918 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1919 bool operator()(const CNoDestination &dest) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1920 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1921 return false; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1922 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1923 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1924 bool operator()(const CKeyID &keyID) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1925 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1926 *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
|
1927 return true; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1928 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1929 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1930 bool operator()(const CScriptID &scriptID) const { |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1931 script->clear(); |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1932 *script << OP_HASH160 << scriptID << OP_EQUAL; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1933 return true; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1934 } |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1935 }; |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1936 |
2c65e5d626eb
Refactor: split CKeyID/CScriptID/CTxDestination from CBitcoinAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2687
diff
changeset
|
1937 void CScript::SetDestination(const CTxDestination& dest) |
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 boost::apply_visitor(CScriptVisitor(this), dest); |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1940 } |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1941 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1942 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
|
1943 { |
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1944 this->clear(); |
1600
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1945 |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1946 *this << EncodeOP_N(nRequired); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1947 BOOST_FOREACH(const CKey& key, keys) |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1948 *this << key.GetPubKey(); |
dc663e46a784
OP_EVAL implementation
Gavin Andresen <gavinandresen@gmail.com>
parents:
1598
diff
changeset
|
1949 *this << EncodeOP_N(keys.size()) << OP_CHECKMULTISIG; |
1598
057a59e89d51
Support 3 new multisignature IsStandard transactions
Gavin Andresen <gavinandresen@gmail.com>
parents:
1596
diff
changeset
|
1950 } |
3641
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1951 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1952 bool CScriptCompressor::IsToKeyID(CKeyID &hash) const |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1953 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1954 if (script.size() == 25 && script[0] == OP_DUP && script[1] == OP_HASH160 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1955 && script[2] == 20 && script[23] == OP_EQUALVERIFY |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1956 && script[24] == OP_CHECKSIG) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1957 memcpy(&hash, &script[3], 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1958 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1959 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1960 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1961 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1962 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1963 bool CScriptCompressor::IsToScriptID(CScriptID &hash) const |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1964 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1965 if (script.size() == 23 && script[0] == OP_HASH160 && script[1] == 20 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1966 && script[22] == OP_EQUAL) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1967 memcpy(&hash, &script[2], 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1968 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1969 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1970 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1971 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1972 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1973 bool CScriptCompressor::IsToPubKey(std::vector<unsigned char> &pubkey) const |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1974 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1975 if (script.size() == 35 && script[0] == 33 && script[34] == OP_CHECKSIG |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1976 && (script[1] == 0x02 || script[1] == 0x03)) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1977 pubkey.resize(33); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1978 memcpy(&pubkey[0], &script[1], 33); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1979 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1980 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1981 if (script.size() == 67 && script[0] == 65 && script[66] == OP_CHECKSIG |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1982 && script[1] == 0x04) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1983 pubkey.resize(65); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1984 memcpy(&pubkey[0], &script[1], 65); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1985 CKey key; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1986 return (key.SetPubKey(CPubKey(pubkey))); // SetPubKey fails if this is not a valid public key, a case that would not be compressible |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1987 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1988 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1989 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1990 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1991 bool CScriptCompressor::Compress(std::vector<unsigned char> &out) const |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1992 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1993 CKeyID keyID; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1994 if (IsToKeyID(keyID)) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1995 out.resize(21); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1996 out[0] = 0x00; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1997 memcpy(&out[1], &keyID, 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1998 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
1999 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2000 CScriptID scriptID; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2001 if (IsToScriptID(scriptID)) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2002 out.resize(21); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2003 out[0] = 0x01; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2004 memcpy(&out[1], &scriptID, 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2005 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2006 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2007 std::vector<unsigned char> pubkey; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2008 if (IsToPubKey(pubkey)) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2009 out.resize(33); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2010 memcpy(&out[1], &pubkey[1], 32); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2011 if (pubkey[0] == 0x02 || pubkey[0] == 0x03) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2012 out[0] = pubkey[0]; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2013 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2014 } else if (pubkey[0] == 0x04) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2015 out[0] = 0x04 | (pubkey[64] & 0x01); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2016 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2017 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2018 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2019 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2020 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2021 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2022 unsigned int CScriptCompressor::GetSpecialSize(unsigned int nSize) const |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2023 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2024 if (nSize == 0 || nSize == 1) |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2025 return 20; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2026 if (nSize == 2 || nSize == 3 || nSize == 4 || nSize == 5) |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2027 return 32; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2028 return 0; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2029 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2030 |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2031 bool CScriptCompressor::Decompress(unsigned int nSize, const std::vector<unsigned char> &in) |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2032 { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2033 switch(nSize) { |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2034 case 0x00: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2035 script.resize(25); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2036 script[0] = OP_DUP; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2037 script[1] = OP_HASH160; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2038 script[2] = 20; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2039 memcpy(&script[3], &in[0], 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2040 script[23] = OP_EQUALVERIFY; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2041 script[24] = OP_CHECKSIG; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2042 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2043 case 0x01: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2044 script.resize(23); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2045 script[0] = OP_HASH160; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2046 script[1] = 20; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2047 memcpy(&script[2], &in[0], 20); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2048 script[22] = OP_EQUAL; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2049 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2050 case 0x02: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2051 case 0x03: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2052 script.resize(35); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2053 script[0] = 33; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2054 script[1] = nSize; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2055 memcpy(&script[2], &in[0], 32); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2056 script[34] = OP_CHECKSIG; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2057 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2058 case 0x04: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2059 case 0x05: |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2060 std::vector<unsigned char> vch(33, 0x00); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2061 vch[0] = nSize - 2; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2062 memcpy(&vch[1], &in[0], 32); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2063 CKey key; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2064 if (!key.SetPubKey(CPubKey(vch))) |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2065 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2066 key.SetCompressedPubKey(false); // Decompress public key |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2067 CPubKey pubkey = key.GetPubKey(); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2068 script.resize(67); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2069 script[0] = 65; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2070 memcpy(&script[1], &pubkey.Raw()[0], 65); |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2071 script[66] = OP_CHECKSIG; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2072 return true; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2073 } |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2074 return false; |
d489f6576318
Compact serialization for scripts
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3632
diff
changeset
|
2075 } |