X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fscript.h;h=8901981f60c59e8f58c19a6735c1a5392df1bba6;hb=fa9796de83b7a3ec401a4b502c246a55d79ef0c1;hp=2aa08febe17da15a372419bef17e696d5d458fcd;hpb=0561bbd1c69263dceb24ffacf850788e6e961a13;p=novacoin.git diff --git a/src/script.h b/src/script.h index 2aa08fe..8901981 100644 --- a/src/script.h +++ b/src/script.h @@ -1,22 +1,22 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2012 The Bitcoin developers -// Copyright (c) 2012 The PPCoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef H_BITCOIN_SCRIPT #define H_BITCOIN_SCRIPT -#include "base58.h" - #include #include #include +#include + +#include "keystore.h" +#include "bignum.h" typedef std::vector valtype; class CTransaction; -class CKeyStore; /** Signature hash types/flags */ enum @@ -36,8 +36,23 @@ enum txnouttype TX_PUBKEYHASH, TX_SCRIPTHASH, TX_MULTISIG, + TX_NULL_DATA, +}; + +class CNoDestination { +public: + friend bool operator==(const CNoDestination &a, const CNoDestination &b) { return true; } + friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; } }; +/** A txout script template with a specific destination. It is either: + * * CNoDestination: no destination set + * * CKeyID: TX_PUBKEYHASH destination + * * CScriptID: TX_SCRIPTHASH destination + * A CTxDestination is the internal data type encoded in a CBitcoinAddress + */ +typedef boost::variant CTxDestination; + const char* GetTxnOutputType(txnouttype t); /** Script opcodes */ @@ -178,6 +193,7 @@ enum opcodetype // template matching params + OP_SMALLDATA = 0xf9, OP_SMALLINTEGER = 0xfa, OP_PUBKEYS = 0xfb, OP_PUBKEYHASH = 0xfd, @@ -323,6 +339,12 @@ public: return *this; } + CScript& operator<<(const CPubKey& key) + { + std::vector vchKey = key.Raw(); + return (*this) << vchKey; + } + CScript& operator<<(const CBigNum& b) { *this << b.getvch(); @@ -360,7 +382,7 @@ public: { // I'm not sure if this should push the script or concatenate scripts. // If there's ever a use for pushing a script onto a script, delete this member fn - assert(!"warning: pushing a CScript onto a CScript with << is probably not intended, use + to concatenate"); + assert(!"Warning: Pushing a CScript onto a CScript with << is probably not intended, use + to concatenate!"); return *this; } @@ -434,7 +456,7 @@ public: memcpy(&nSize, &pc[0], 4); pc += 4; } - if (end() - pc < nSize) + if (end() - pc < 0 || (unsigned int)(end() - pc) < nSize) return false; if (pvchRet) pvchRet->assign(pc, pc + nSize); @@ -502,7 +524,7 @@ public: bool IsPayToScriptHash() const; - // Called by CTransaction::IsStandard + // Called by CTransaction::IsStandard and P2SH VerifyScript (which makes it consensus-critical). bool IsPushOnly() const { const_iterator pc = begin(); @@ -517,14 +539,11 @@ public: return true; } + // Called by CTransaction::IsStandard. + bool HasCanonicalPushes() const; - void SetBitcoinAddress(const CBitcoinAddress& address); - void SetBitcoinAddress(const std::vector& vchPubKey) - { - SetBitcoinAddress(CBitcoinAddress(vchPubKey)); - } + void SetDestination(const CTxDestination& address); void SetMultisig(int nRequired, const std::vector& keys); - void SetPayToScriptHash(const CScript& subscript); void PrintHex() const @@ -532,7 +551,7 @@ public: printf("CScript(%s)\n", HexStr(begin(), end(), true).c_str()); } - std::string ToString() const + std::string ToString(bool fShort=false) const { std::string str; opcodetype opcode; @@ -548,7 +567,7 @@ public: return str; } if (0 <= opcode && opcode <= OP_PUSHDATA4) - str += ValueString(vch); + str += fShort? ValueString(vch).substr(0, 10) : ValueString(vch); else str += GetOpName(opcode); } @@ -559,6 +578,11 @@ public: { printf("%s\n", ToString().c_str()); } + + CScriptID GetID() const + { + return CScriptID(Hash160(*this)); + } }; @@ -568,11 +592,20 @@ public: bool EvalScript(std::vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, int nHashType); bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector >& vSolutionsRet); int ScriptSigArgsExpected(txnouttype t, const std::vector >& vSolutions); -bool IsStandard(const CScript& scriptPubKey); +bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType); bool IsMine(const CKeyStore& keystore, const CScript& scriptPubKey); -bool ExtractAddress(const CScript& scriptPubKey, CBitcoinAddress& addressRet); -bool ExtractAddresses(const CScript& scriptPubKey, txnouttype& typeRet, std::vector& addressRet, int& nRequiredRet); +bool IsMine(const CKeyStore& keystore, const CTxDestination &dest); +void ExtractAffectedKeys(const CKeyStore &keystore, const CScript& scriptPubKey, std::vector &vKeys); +bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet); +bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std::vector& addressRet, int& nRequiredRet); +bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, + bool fValidatePayToScriptHash, int nHashType); bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, int nHashType); +// Given two sets of signatures for scriptPubKey, possibly with OP_0 placeholders, +// combine them intelligently and return the result. +CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2); + #endif