]> Git Repo - VerusCoin.git/blob - src/script.h
Merge pull request #1899 from Diapolo/proxy_optionsmodel
[VerusCoin.git] / src / script.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef H_BITCOIN_SCRIPT
6 #define H_BITCOIN_SCRIPT
7
8 #include <string>
9 #include <vector>
10
11 #include <boost/foreach.hpp>
12 #include <boost/variant.hpp>
13
14 #include "keystore.h"
15 #include "bignum.h"
16
17 class CCoins;
18 class CTransaction;
19
20 /** Signature hash types/flags */
21 enum
22 {
23     SIGHASH_ALL = 1,
24     SIGHASH_NONE = 2,
25     SIGHASH_SINGLE = 3,
26     SIGHASH_ANYONECANPAY = 0x80,
27 };
28
29
30 enum txnouttype
31 {
32     TX_NONSTANDARD,
33     // 'standard' transaction types:
34     TX_PUBKEY,
35     TX_PUBKEYHASH,
36     TX_SCRIPTHASH,
37     TX_MULTISIG,
38 };
39
40 class CNoDestination {
41 public:
42     friend bool operator==(const CNoDestination &a, const CNoDestination &b) { return true; }
43     friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
44 };
45
46 /** A txout script template with a specific destination. It is either:
47  *  * CNoDestination: no destination set
48  *  * CKeyID: TX_PUBKEYHASH destination
49  *  * CScriptID: TX_SCRIPTHASH destination
50  *  A CTxDestination is the internal data type encoded in a CBitcoinAddress
51  */
52 typedef boost::variant<CNoDestination, CKeyID, CScriptID> CTxDestination;
53
54 const char* GetTxnOutputType(txnouttype t);
55
56 /** Script opcodes */
57 enum opcodetype
58 {
59     // push value
60     OP_0 = 0x00,
61     OP_FALSE = OP_0,
62     OP_PUSHDATA1 = 0x4c,
63     OP_PUSHDATA2 = 0x4d,
64     OP_PUSHDATA4 = 0x4e,
65     OP_1NEGATE = 0x4f,
66     OP_RESERVED = 0x50,
67     OP_1 = 0x51,
68     OP_TRUE=OP_1,
69     OP_2 = 0x52,
70     OP_3 = 0x53,
71     OP_4 = 0x54,
72     OP_5 = 0x55,
73     OP_6 = 0x56,
74     OP_7 = 0x57,
75     OP_8 = 0x58,
76     OP_9 = 0x59,
77     OP_10 = 0x5a,
78     OP_11 = 0x5b,
79     OP_12 = 0x5c,
80     OP_13 = 0x5d,
81     OP_14 = 0x5e,
82     OP_15 = 0x5f,
83     OP_16 = 0x60,
84
85     // control
86     OP_NOP = 0x61,
87     OP_VER = 0x62,
88     OP_IF = 0x63,
89     OP_NOTIF = 0x64,
90     OP_VERIF = 0x65,
91     OP_VERNOTIF = 0x66,
92     OP_ELSE = 0x67,
93     OP_ENDIF = 0x68,
94     OP_VERIFY = 0x69,
95     OP_RETURN = 0x6a,
96
97     // stack ops
98     OP_TOALTSTACK = 0x6b,
99     OP_FROMALTSTACK = 0x6c,
100     OP_2DROP = 0x6d,
101     OP_2DUP = 0x6e,
102     OP_3DUP = 0x6f,
103     OP_2OVER = 0x70,
104     OP_2ROT = 0x71,
105     OP_2SWAP = 0x72,
106     OP_IFDUP = 0x73,
107     OP_DEPTH = 0x74,
108     OP_DROP = 0x75,
109     OP_DUP = 0x76,
110     OP_NIP = 0x77,
111     OP_OVER = 0x78,
112     OP_PICK = 0x79,
113     OP_ROLL = 0x7a,
114     OP_ROT = 0x7b,
115     OP_SWAP = 0x7c,
116     OP_TUCK = 0x7d,
117
118     // splice ops
119     OP_CAT = 0x7e,
120     OP_SUBSTR = 0x7f,
121     OP_LEFT = 0x80,
122     OP_RIGHT = 0x81,
123     OP_SIZE = 0x82,
124
125     // bit logic
126     OP_INVERT = 0x83,
127     OP_AND = 0x84,
128     OP_OR = 0x85,
129     OP_XOR = 0x86,
130     OP_EQUAL = 0x87,
131     OP_EQUALVERIFY = 0x88,
132     OP_RESERVED1 = 0x89,
133     OP_RESERVED2 = 0x8a,
134
135     // numeric
136     OP_1ADD = 0x8b,
137     OP_1SUB = 0x8c,
138     OP_2MUL = 0x8d,
139     OP_2DIV = 0x8e,
140     OP_NEGATE = 0x8f,
141     OP_ABS = 0x90,
142     OP_NOT = 0x91,
143     OP_0NOTEQUAL = 0x92,
144
145     OP_ADD = 0x93,
146     OP_SUB = 0x94,
147     OP_MUL = 0x95,
148     OP_DIV = 0x96,
149     OP_MOD = 0x97,
150     OP_LSHIFT = 0x98,
151     OP_RSHIFT = 0x99,
152
153     OP_BOOLAND = 0x9a,
154     OP_BOOLOR = 0x9b,
155     OP_NUMEQUAL = 0x9c,
156     OP_NUMEQUALVERIFY = 0x9d,
157     OP_NUMNOTEQUAL = 0x9e,
158     OP_LESSTHAN = 0x9f,
159     OP_GREATERTHAN = 0xa0,
160     OP_LESSTHANOREQUAL = 0xa1,
161     OP_GREATERTHANOREQUAL = 0xa2,
162     OP_MIN = 0xa3,
163     OP_MAX = 0xa4,
164
165     OP_WITHIN = 0xa5,
166
167     // crypto
168     OP_RIPEMD160 = 0xa6,
169     OP_SHA1 = 0xa7,
170     OP_SHA256 = 0xa8,
171     OP_HASH160 = 0xa9,
172     OP_HASH256 = 0xaa,
173     OP_CODESEPARATOR = 0xab,
174     OP_CHECKSIG = 0xac,
175     OP_CHECKSIGVERIFY = 0xad,
176     OP_CHECKMULTISIG = 0xae,
177     OP_CHECKMULTISIGVERIFY = 0xaf,
178
179     // expansion
180     OP_NOP1 = 0xb0,
181     OP_NOP2 = 0xb1,
182     OP_NOP3 = 0xb2,
183     OP_NOP4 = 0xb3,
184     OP_NOP5 = 0xb4,
185     OP_NOP6 = 0xb5,
186     OP_NOP7 = 0xb6,
187     OP_NOP8 = 0xb7,
188     OP_NOP9 = 0xb8,
189     OP_NOP10 = 0xb9,
190
191
192
193     // template matching params
194     OP_SMALLINTEGER = 0xfa,
195     OP_PUBKEYS = 0xfb,
196     OP_PUBKEYHASH = 0xfd,
197     OP_PUBKEY = 0xfe,
198
199     OP_INVALIDOPCODE = 0xff,
200 };
201
202 const char* GetOpName(opcodetype opcode);
203
204
205
206 inline std::string ValueString(const std::vector<unsigned char>& vch)
207 {
208     if (vch.size() <= 4)
209         return strprintf("%d", CBigNum(vch).getint());
210     else
211         return HexStr(vch);
212 }
213
214 inline std::string StackString(const std::vector<std::vector<unsigned char> >& vStack)
215 {
216     std::string str;
217     BOOST_FOREACH(const std::vector<unsigned char>& vch, vStack)
218     {
219         if (!str.empty())
220             str += " ";
221         str += ValueString(vch);
222     }
223     return str;
224 }
225
226
227
228
229
230
231
232
233 /** Serialized script, used inside transaction inputs and outputs */
234 class CScript : public std::vector<unsigned char>
235 {
236 protected:
237     CScript& push_int64(int64 n)
238     {
239         if (n == -1 || (n >= 1 && n <= 16))
240         {
241             push_back(n + (OP_1 - 1));
242         }
243         else
244         {
245             CBigNum bn(n);
246             *this << bn.getvch();
247         }
248         return *this;
249     }
250
251     CScript& push_uint64(uint64 n)
252     {
253         if (n >= 1 && n <= 16)
254         {
255             push_back(n + (OP_1 - 1));
256         }
257         else
258         {
259             CBigNum bn(n);
260             *this << bn.getvch();
261         }
262         return *this;
263     }
264
265 public:
266     CScript() { }
267     CScript(const CScript& b) : std::vector<unsigned char>(b.begin(), b.end()) { }
268     CScript(const_iterator pbegin, const_iterator pend) : std::vector<unsigned char>(pbegin, pend) { }
269 #ifndef _MSC_VER
270     CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector<unsigned char>(pbegin, pend) { }
271 #endif
272
273     CScript& operator+=(const CScript& b)
274     {
275         insert(end(), b.begin(), b.end());
276         return *this;
277     }
278
279     friend CScript operator+(const CScript& a, const CScript& b)
280     {
281         CScript ret = a;
282         ret += b;
283         return ret;
284     }
285
286
287     //explicit CScript(char b) is not portable.  Use 'signed char' or 'unsigned char'.
288     explicit CScript(signed char b)    { operator<<(b); }
289     explicit CScript(short b)          { operator<<(b); }
290     explicit CScript(int b)            { operator<<(b); }
291     explicit CScript(long b)           { operator<<(b); }
292     explicit CScript(int64 b)          { operator<<(b); }
293     explicit CScript(unsigned char b)  { operator<<(b); }
294     explicit CScript(unsigned int b)   { operator<<(b); }
295     explicit CScript(unsigned short b) { operator<<(b); }
296     explicit CScript(unsigned long b)  { operator<<(b); }
297     explicit CScript(uint64 b)         { operator<<(b); }
298
299     explicit CScript(opcodetype b)     { operator<<(b); }
300     explicit CScript(const uint256& b) { operator<<(b); }
301     explicit CScript(const CBigNum& b) { operator<<(b); }
302     explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
303
304
305     //CScript& operator<<(char b) is not portable.  Use 'signed char' or 'unsigned char'.
306     CScript& operator<<(signed char b)    { return push_int64(b); }
307     CScript& operator<<(short b)          { return push_int64(b); }
308     CScript& operator<<(int b)            { return push_int64(b); }
309     CScript& operator<<(long b)           { return push_int64(b); }
310     CScript& operator<<(int64 b)          { return push_int64(b); }
311     CScript& operator<<(unsigned char b)  { return push_uint64(b); }
312     CScript& operator<<(unsigned int b)   { return push_uint64(b); }
313     CScript& operator<<(unsigned short b) { return push_uint64(b); }
314     CScript& operator<<(unsigned long b)  { return push_uint64(b); }
315     CScript& operator<<(uint64 b)         { return push_uint64(b); }
316
317     CScript& operator<<(opcodetype opcode)
318     {
319         if (opcode < 0 || opcode > 0xff)
320             throw std::runtime_error("CScript::operator<<() : invalid opcode");
321         insert(end(), (unsigned char)opcode);
322         return *this;
323     }
324
325     CScript& operator<<(const uint160& b)
326     {
327         insert(end(), sizeof(b));
328         insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
329         return *this;
330     }
331
332     CScript& operator<<(const uint256& b)
333     {
334         insert(end(), sizeof(b));
335         insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
336         return *this;
337     }
338
339     CScript& operator<<(const CPubKey& key)
340     {
341         std::vector<unsigned char> vchKey = key.Raw();
342         return (*this) << vchKey;
343     }
344
345     CScript& operator<<(const CBigNum& b)
346     {
347         *this << b.getvch();
348         return *this;
349     }
350
351     CScript& operator<<(const std::vector<unsigned char>& b)
352     {
353         if (b.size() < OP_PUSHDATA1)
354         {
355             insert(end(), (unsigned char)b.size());
356         }
357         else if (b.size() <= 0xff)
358         {
359             insert(end(), OP_PUSHDATA1);
360             insert(end(), (unsigned char)b.size());
361         }
362         else if (b.size() <= 0xffff)
363         {
364             insert(end(), OP_PUSHDATA2);
365             unsigned short nSize = b.size();
366             insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
367         }
368         else
369         {
370             insert(end(), OP_PUSHDATA4);
371             unsigned int nSize = b.size();
372             insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
373         }
374         insert(end(), b.begin(), b.end());
375         return *this;
376     }
377
378     CScript& operator<<(const CScript& b)
379     {
380         // I'm not sure if this should push the script or concatenate scripts.
381         // If there's ever a use for pushing a script onto a script, delete this member fn
382         assert(!"Warning: Pushing a CScript onto a CScript with << is probably not intended, use + to concatenate!");
383         return *this;
384     }
385
386
387     bool GetOp(iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet)
388     {
389          // Wrapper so it can be called with either iterator or const_iterator
390          const_iterator pc2 = pc;
391          bool fRet = GetOp2(pc2, opcodeRet, &vchRet);
392          pc = begin() + (pc2 - begin());
393          return fRet;
394     }
395
396     bool GetOp(iterator& pc, opcodetype& opcodeRet)
397     {
398          const_iterator pc2 = pc;
399          bool fRet = GetOp2(pc2, opcodeRet, NULL);
400          pc = begin() + (pc2 - begin());
401          return fRet;
402     }
403
404     bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet) const
405     {
406         return GetOp2(pc, opcodeRet, &vchRet);
407     }
408
409     bool GetOp(const_iterator& pc, opcodetype& opcodeRet) const
410     {
411         return GetOp2(pc, opcodeRet, NULL);
412     }
413
414     bool GetOp2(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet) const
415     {
416         opcodeRet = OP_INVALIDOPCODE;
417         if (pvchRet)
418             pvchRet->clear();
419         if (pc >= end())
420             return false;
421
422         // Read instruction
423         if (end() - pc < 1)
424             return false;
425         unsigned int opcode = *pc++;
426
427         // Immediate operand
428         if (opcode <= OP_PUSHDATA4)
429         {
430             unsigned int nSize;
431             if (opcode < OP_PUSHDATA1)
432             {
433                 nSize = opcode;
434             }
435             else if (opcode == OP_PUSHDATA1)
436             {
437                 if (end() - pc < 1)
438                     return false;
439                 nSize = *pc++;
440             }
441             else if (opcode == OP_PUSHDATA2)
442             {
443                 if (end() - pc < 2)
444                     return false;
445                 nSize = 0;
446                 memcpy(&nSize, &pc[0], 2);
447                 pc += 2;
448             }
449             else if (opcode == OP_PUSHDATA4)
450             {
451                 if (end() - pc < 4)
452                     return false;
453                 memcpy(&nSize, &pc[0], 4);
454                 pc += 4;
455             }
456             if (end() - pc < 0 || (unsigned int)(end() - pc) < nSize)
457                 return false;
458             if (pvchRet)
459                 pvchRet->assign(pc, pc + nSize);
460             pc += nSize;
461         }
462
463         opcodeRet = (opcodetype)opcode;
464         return true;
465     }
466
467     // Encode/decode small integers:
468     static int DecodeOP_N(opcodetype opcode)
469     {
470         if (opcode == OP_0)
471             return 0;
472         assert(opcode >= OP_1 && opcode <= OP_16);
473         return (int)opcode - (int)(OP_1 - 1);
474     }
475     static opcodetype EncodeOP_N(int n)
476     {
477         assert(n >= 0 && n <= 16);
478         if (n == 0)
479             return OP_0;
480         return (opcodetype)(OP_1+n-1);
481     }
482
483     int FindAndDelete(const CScript& b)
484     {
485         int nFound = 0;
486         if (b.empty())
487             return nFound;
488         iterator pc = begin();
489         opcodetype opcode;
490         do
491         {
492             while (end() - pc >= (long)b.size() && memcmp(&pc[0], &b[0], b.size()) == 0)
493             {
494                 erase(pc, pc + b.size());
495                 ++nFound;
496             }
497         }
498         while (GetOp(pc, opcode));
499         return nFound;
500     }
501     int Find(opcodetype op) const
502     {
503         int nFound = 0;
504         opcodetype opcode;
505         for (const_iterator pc = begin(); pc != end() && GetOp(pc, opcode);)
506             if (opcode == op)
507                 ++nFound;
508         return nFound;
509     }
510
511     // Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs
512     // as 20 sigops. With pay-to-script-hash, that changed:
513     // CHECKMULTISIGs serialized in scriptSigs are
514     // counted more accurately, assuming they are of the form
515     //  ... OP_N CHECKMULTISIG ...
516     unsigned int GetSigOpCount(bool fAccurate) const;
517
518     // Accurately count sigOps, including sigOps in
519     // pay-to-script-hash transactions:
520     unsigned int GetSigOpCount(const CScript& scriptSig) const;
521
522     bool IsPayToScriptHash() const;
523
524     // Called by CTransaction::IsStandard
525     bool IsPushOnly() const
526     {
527         const_iterator pc = begin();
528         while (pc < end())
529         {
530             opcodetype opcode;
531             if (!GetOp(pc, opcode))
532                 return false;
533             if (opcode > OP_16)
534                 return false;
535         }
536         return true;
537     }
538
539
540     void SetDestination(const CTxDestination& address);
541     void SetMultisig(int nRequired, const std::vector<CKey>& keys);
542
543
544     void PrintHex() const
545     {
546         printf("CScript(%s)\n", HexStr(begin(), end(), true).c_str());
547     }
548
549     std::string ToString() const
550     {
551         std::string str;
552         opcodetype opcode;
553         std::vector<unsigned char> vch;
554         const_iterator pc = begin();
555         while (pc < end())
556         {
557             if (!str.empty())
558                 str += " ";
559             if (!GetOp(pc, opcode, vch))
560             {
561                 str += "[error]";
562                 return str;
563             }
564             if (0 <= opcode && opcode <= OP_PUSHDATA4)
565                 str += ValueString(vch);
566             else
567                 str += GetOpName(opcode);
568         }
569         return str;
570     }
571
572     void print() const
573     {
574         printf("%s\n", ToString().c_str());
575     }
576
577     CScriptID GetID() const
578     {
579         return CScriptID(Hash160(*this));
580     }
581 };
582
583 /** Compact serializer for scripts.
584  *
585  *  It detects common cases and encodes them much more efficiently.
586  *  3 special cases are defined:
587  *  * Pay to pubkey hash (encoded as 21 bytes)
588  *  * Pay to script hash (encoded as 21 bytes)
589  *  * Pay to pubkey starting with 0x02, 0x03 or 0x04 (encoded as 33 bytes)
590  *
591  *  Other scripts up to 121 bytes require 1 byte + script length. Above
592  *  that, scripts up to 16505 bytes require 2 bytes + script length.
593  */
594 class CScriptCompressor
595 {
596 private:
597     // make this static for now (there are only 6 special scripts defined)
598     // this can potentially be extended together with a new nVersion for
599     // transactions, in which case this value becomes dependent on nVersion
600     // and nHeight of the enclosing transaction.
601     static const unsigned int nSpecialScripts = 6;
602
603     CScript &script;
604 protected:
605     // These check for scripts for which a special case with a shorter encoding is defined.
606     // They are implemented separately from the CScript test, as these test for exact byte
607     // sequence correspondences, and are more strict. For example, IsToPubKey also verifies
608     // whether the public key is valid (as invalid ones cannot be represented in compressed
609     // form).
610     bool IsToKeyID(CKeyID &hash) const;
611     bool IsToScriptID(CScriptID &hash) const;
612     bool IsToPubKey(std::vector<unsigned char> &pubkey) const;
613
614     bool Compress(std::vector<unsigned char> &out) const;
615     unsigned int GetSpecialSize(unsigned int nSize) const;
616     bool Decompress(unsigned int nSize, const std::vector<unsigned char> &out);
617 public:
618     CScriptCompressor(CScript &scriptIn) : script(scriptIn) { }
619
620     unsigned int GetSerializeSize(int nType, int nVersion) const {
621         std::vector<unsigned char> compr;
622         if (Compress(compr))
623             return compr.size();
624         unsigned int nSize = script.size() + nSpecialScripts;
625         return script.size() + VARINT(nSize).GetSerializeSize(nType, nVersion);
626     }
627
628     template<typename Stream>
629     void Serialize(Stream &s, int nType, int nVersion) const {
630         std::vector<unsigned char> compr;
631         if (Compress(compr)) {
632             s << CFlatData(&compr[0], &compr[compr.size()]);
633             return;
634         }
635         unsigned int nSize = script.size() + nSpecialScripts;
636         s << VARINT(nSize);
637         s << CFlatData(&script[0], &script[script.size()]);
638     }
639
640     template<typename Stream>
641     void Unserialize(Stream &s, int nType, int nVersion) {
642         unsigned int nSize;
643         s >> VARINT(nSize);
644         if (nSize < nSpecialScripts) {
645             std::vector<unsigned char> vch(GetSpecialSize(nSize), 0x00);
646             s >> REF(CFlatData(&vch[0], &vch[vch.size()]));
647             Decompress(nSize, vch);
648             return;
649         }
650         nSize -= nSpecialScripts;
651         script.resize(nSize);
652         s >> REF(CFlatData(&script[0], &script[script.size()]));
653     }
654 };
655
656 bool IsCanonicalPubKey(const std::vector<unsigned char> &vchPubKey);
657 bool IsCanonicalSignature(const std::vector<unsigned char> &vchSig);
658
659 bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, bool fStrictEncodings, int nHashType);
660 bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<std::vector<unsigned char> >& vSolutionsRet);
661 int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions);
662 bool IsStandard(const CScript& scriptPubKey);
663 bool IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
664 bool IsMine(const CKeyStore& keystore, const CTxDestination &dest);
665 bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
666 bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet);
667 bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
668 bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
669 bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn,
670                   bool fValidatePayToScriptHash, bool fStrictEncodings, int nHashType);
671 bool VerifySignature(const CCoins& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, bool fStrictEncodings, int nHashType);
672
673 // Given two sets of signatures for scriptPubKey, possibly with OP_0 placeholders,
674 // combine them intelligently and return the result.
675 CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2);
676
677 #endif
This page took 0.106948 seconds and 4 git commands to generate.