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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
98dbb2aa4f5a Update License in File Headers
Fordy <fanquake@gmail.com>
parents: 2351
diff changeset
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
2274
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
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
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
11 #include "script.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
12 #include "keystore.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
13 #include "bignum.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
14 #include "key.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
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
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2243
diff changeset
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
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 595
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3641
diff changeset
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 }