6 #ifndef H_BITCOIN_SCRIPT
7 #define H_BITCOIN_SCRIPT
17 #include <boost/foreach.hpp>
18 #include <boost/variant.hpp>
48 explicit CScriptNum(
const std::vector<unsigned char>& vch)
51 throw scriptnum_error(
"CScriptNum(const std::vector<unsigned char>&) : overflow");
79 assert(
m_value != std::numeric_limits<int64_t>::min());
91 assert(rhs == 0 || (rhs > 0 &&
m_value <= std::numeric_limits<int64_t>::max() - rhs) ||
92 (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs));
99 assert(rhs == 0 || (rhs > 0 &&
m_value >= std::numeric_limits<int64_t>::min() + rhs) ||
100 (rhs < 0 &&
m_value <= std::numeric_limits<int64_t>::max() + rhs));
107 if (
m_value > std::numeric_limits<int>::max())
108 return std::numeric_limits<int>::max();
109 else if (
m_value < std::numeric_limits<int>::min())
110 return std::numeric_limits<int>::min();
114 std::vector<unsigned char>
getvch()
const
119 static std::vector<unsigned char>
serialize(
const int64_t& value)
122 return std::vector<unsigned char>();
124 std::vector<unsigned char> result;
125 const bool neg = value < 0;
126 uint64_t absvalue = neg ? -value : value;
130 result.push_back(absvalue & 0xff);
145 if (result.back() & 0x80)
146 result.push_back(neg ? 0x80 : 0);
148 result.back() |= 0x80;
156 static int64_t
set_vch(
const std::vector<unsigned char>& vch)
162 for (
size_t i = 0; i != vch.size(); ++i)
163 result |= static_cast<int64_t>(vch[i]) << 8*i;
167 if (vch.back() & 0x80)
168 return -(result & ~(0x80 << (8 * (vch.size() - 1))));
373 inline std::string
ValueString(
const std::vector<unsigned char>& vch)
381 inline std::string
StackString(
const std::vector<std::vector<unsigned char> >& vStack)
384 BOOST_FOREACH(
const std::vector<unsigned char>& vch, vStack)
401 class CScript :
public std::vector<unsigned char>
406 if (n == -1 || (n >= 1 && n <= 16))
408 push_back(n + (
OP_1 - 1));
419 CScript(const_iterator pbegin, const_iterator pend) :
std::vector<unsigned char>(pbegin, pend) { }
421 CScript(
const unsigned char* pbegin,
const unsigned char* pend) :
std::vector<unsigned char>(pbegin, pend) { }
426 insert(end(), b.begin(), b.end());
450 if (opcode < 0 || opcode > 0xff)
451 throw std::runtime_error(
"CScript::operator<<() : invalid opcode");
452 insert(end(), (
unsigned char)opcode);
458 insert(end(),
sizeof(b));
459 insert(end(), (
unsigned char*)&b, (
unsigned char*)&b +
sizeof(b));
465 insert(end(),
sizeof(b));
466 insert(end(), (
unsigned char*)&b, (
unsigned char*)&b +
sizeof(b));
473 insert(end(), (
unsigned char)key.
size());
474 insert(end(), key.
begin(), key.
end());
484 CScript& operator<<(const std::vector<unsigned char>& b)
488 insert(end(), (
unsigned char)b.size());
490 else if (b.size() <= 0xff)
493 insert(end(), (
unsigned char)b.size());
495 else if (b.size() <= 0xffff)
498 unsigned short nSize = b.size();
499 insert(end(), (
unsigned char*)&nSize, (
unsigned char*)&nSize +
sizeof(nSize));
504 unsigned int nSize = b.size();
505 insert(end(), (
unsigned char*)&nSize, (
unsigned char*)&nSize +
sizeof(nSize));
507 insert(end(), b.begin(), b.end());
515 assert(!
"Warning: Pushing a CScript onto a CScript with << is probably not intended, use + to concatenate!");
523 const_iterator pc2 = pc;
524 bool fRet =
GetOp2(pc2, opcodeRet, &vchRet);
525 pc = begin() + (pc2 - begin());
531 const_iterator pc2 = pc;
532 bool fRet =
GetOp2(pc2, opcodeRet, NULL);
533 pc = begin() + (pc2 - begin());
537 bool GetOp(const_iterator& pc,
opcodetype& opcodeRet, std::vector<unsigned char>& vchRet)
const
539 return GetOp2(pc, opcodeRet, &vchRet);
544 return GetOp2(pc, opcodeRet, NULL);
547 bool GetOp2(const_iterator& pc,
opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet)
const
558 unsigned int opcode = *pc++;
563 unsigned int nSize = 0;
579 memcpy(&nSize, &pc[0], 2);
586 memcpy(&nSize, &pc[0], 4);
589 if (end() - pc < 0 || (
unsigned int)(end() - pc) < nSize)
592 pvchRet->assign(pc, pc + nSize);
605 assert(opcode >=
OP_1 && opcode <=
OP_16);
606 return (
int)opcode - (
int)(
OP_1 - 1);
610 assert(n >= 0 && n <= 16);
621 iterator pc = begin();
625 while (end() - pc >= (
long)b.size() && memcmp(&pc[0], &b[0], b.size()) == 0)
627 erase(pc, pc + b.size());
631 while (
GetOp(pc, opcode));
638 for (const_iterator pc = begin(); pc != end() &&
GetOp(pc, opcode);)
668 return (size() > 0 && *begin() ==
OP_RETURN);
672 void SetMultisig(
int nRequired,
const std::vector<CPubKey>& keys);
684 std::vector<unsigned char> vch;
685 const_iterator pc = begin();
690 if (!
GetOp(pc, opcode, vch))
713 std::string
mscore_parse(std::vector<std::string>&msc_parsed,
bool bNoBypass =
true)
const;
748 bool Compress(std::vector<unsigned char> &out)
const;
750 bool Decompress(
unsigned int nSize,
const std::vector<unsigned char> &out);
755 std::vector<unsigned char> compr;
759 return script.size() +
VARINT(nSize).GetSerializeSize(nType, nVersion);
762 template<
typename Stream>
763 void Serialize(Stream &s,
int nType,
int nVersion)
const {
764 std::vector<unsigned char> compr;
766 s <<
CFlatData(&compr[0], &compr[compr.size()]);
771 s <<
CFlatData(&script[0], &script[script.size()]);
774 template<
typename Stream>
776 unsigned int nSize = 0;
778 if (nSize < nSpecialScripts) {
785 script.resize(nSize);
786 s >>
REF(
CFlatData(&script[0], &script[script.size()]));
790 bool IsCanonicalPubKey(
const std::vector<unsigned char> &vchPubKey,
unsigned int flags);
793 bool EvalScript(std::vector<std::vector<unsigned char> >& stack,
const CScript& script,
const CTransaction& txTo,
unsigned int nIn,
unsigned int flags,
int nHashType);
794 bool Solver(
const CScript& scriptPubKey,
txnouttype& typeRet, std::vector<std::vector<unsigned char> >& vSolutionsRet);
std::string mscore_getHex() const
std::string mscore_parse(std::vector< std::string > &msc_parsed, bool bNoBypass=true) const
bool IsToKeyID(CKeyID &hash) const
bool operator!=(const int64_t &rhs) const
static int64_t set_vch(const std::vector< unsigned char > &vch)
static int DecodeOP_N(opcodetype opcode)
bool GetOp2(const_iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > *pvchRet) const
bool operator>(const int64_t &rhs) const
CScriptNum operator-() const
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CTransaction &txTo, unsigned int nIn, unsigned int flags, int nHashType)
CScript & operator<<(const uint160 &b)
bool IsCanonicalPubKey(const std::vector< unsigned char > &vchPubKey, unsigned int flags)
CScript(const CScript &b)
CScriptNum(const int64_t &n)
static const unsigned int MAX_OP_RETURN_RELAY
bool Compress(std::vector< unsigned char > &out) const
bool IsPayToScriptHash() const
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, const CTransaction &txTo, unsigned int nIn, unsigned int flags, int nHashType)
CScriptNum & operator-=(const int64_t &rhs)
const char * GetTxnOutputType(txnouttype t)
unsigned int GetSpecialSize(unsigned int nSize) const
unsigned int size() const
bool IsToPubKey(CPubKey &pubkey) const
CScript & push_int64(int64_t n)
bool operator<(const int64_t &rhs) const
Compact serializer for scripts.
friend bool operator==(const CNoDestination &a, const CNoDestination &b)
pruned version of CTransaction: only retains metadata and unspent transaction outputs ...
uint160 Hash160(const T1 pbegin, const T1 pend)
bool IsCanonicalSignature(const std::vector< unsigned char > &vchSig, unsigned int flags)
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE
friend CScript operator+(const CScript &a, const CScript &b)
CScriptNum operator-(const CScriptNum &rhs) const
int ScriptSigArgsExpected(txnouttype t, const std::vector< std::vector< unsigned char > > &vSolutions)
CScriptNum & operator=(const int64_t &rhs)
CScript(const std::vector< unsigned char > &b)
bool GetOp(const_iterator &pc, opcodetype &opcodeRet) const
bool IsMine(const CKeyStore &keystore, const CScript &scriptPubKey)
static std::vector< unsigned char > serialize(const int64_t &value)
std::string ToString() const
CScriptNum operator+(const CScriptNum &rhs) const
const char * GetOpName(opcodetype opcode)
CScriptNum & operator+=(const CScriptNum &rhs)
void SetDestination(const CTxDestination &address)
bool operator==(const CScriptNum &rhs) const
bool operator<=(const int64_t &rhs) const
std::string ValueString(const std::vector< unsigned char > &vch)
void Serialize(Stream &s, int nType, int nVersion) const
CScript & operator<<(const CScriptNum &b)
CScript & operator<<(opcodetype opcode)
friend bool operator<(const CNoDestination &a, const CNoDestination &b)
opcodetype
Script opcodes.
CScript(const CScriptNum &b)
CScript & operator<<(const CScript &b)
unsigned int GetSerializeSize(int nType, int nVersion) const
CScriptCompressor(CScript &scriptIn)
unsigned int GetSigOpCount(bool fAccurate) const
bool IsToScriptID(CScriptID &hash) const
CScriptNum operator-(const int64_t &rhs) const
An encapsulated public key.
CScript(const unsigned char *pbegin, const unsigned char *pend)
bool operator==(const int64_t &rhs) const
bool operator>=(const int64_t &rhs) const
bool IsUnspendable() const
scriptnum_error(const std::string &str)
bool GetOp(iterator &pc, opcodetype &opcodeRet)
bool Solver(const CScript &scriptPubKey, txnouttype &typeRet, std::vector< std::vector< unsigned char > > &vSolutionsRet)
static const size_t nMaxNumSize
const unsigned char * begin() const
CScriptNum & operator-=(const CScriptNum &rhs)
bool SignSignature(const CKeyStore &keystore, const CScript &fromPubKey, CTransaction &txTo, unsigned int nIn, int nHashType=SIGHASH_ALL)
std::string StackString(const std::vector< std::vector< unsigned char > > &vStack)
static const unsigned int nSpecialScripts
CScript(const uint256 &b)
CScript(const_iterator pbegin, const_iterator pend)
static opcodetype EncodeOP_N(int n)
bool operator<=(const CScriptNum &rhs) const
Serialized script, used inside transaction inputs and outputs.
bool Decompress(unsigned int nSize, const std::vector< unsigned char > &out)
CScript & operator+=(const CScript &b)
void * memcpy(void *a, const void *b, size_t c)
A virtual base class for key stores.
void SetMultisig(int nRequired, const std::vector< CPubKey > &keys)
A reference to a CKey: the Hash160 of its serialized public key.
CScriptNum operator+(const int64_t &rhs) const
std::vector< unsigned char > getvch() const
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
int FindAndDelete(const CScript &b)
CScript & operator<<(int64_t b)
CScript CombineSignatures(CScript scriptPubKey, const CTransaction &txTo, unsigned int nIn, const CScript &scriptSig1, const CScript &scriptSig2)
bool ExtractDestinations(const CScript &scriptPubKey, txnouttype &typeRet, std::vector< CTxDestination > &addressRet, int &nRequiredRet)
CScriptNum & operator+=(const int64_t &rhs)
A reference to a CScript: the Hash160 of its serialization (see script.h)
void ExtractAffectedKeys(const CKeyStore &keystore, const CScript &scriptPubKey, std::vector< CKeyID > &vKeys)
bool GetOp(const_iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > &vchRet) const
CScript & operator<<(const uint256 &b)
boost::variant< CNoDestination, CKeyID, CScriptID > CTxDestination
A txout script template with a specific destination.
bool GetOp(iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > &vchRet)
The basic transaction that is broadcasted on the network and contained in blocks. ...
bool operator!=(const CScriptNum &rhs) const
CScriptNum(const std::vector< unsigned char > &vch)
bool operator>=(const CScriptNum &rhs) const
std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
bool HasCanonicalPushes() const
bool IsStandard(const CScript &scriptPubKey, txnouttype &whichType)
CScript & operator<<(const CPubKey &key)
const unsigned char * end() const
Wrapper for serializing arrays and POD.
int Find(opcodetype op) const
void Unserialize(Stream &s, int nType, int nVersion)