13 #include <boost/foreach.hpp> 44 static multimap<txnouttype, CScript> mTemplates;
45 if (mTemplates.empty())
57 vSolutionsRet.clear();
64 vector<unsigned char> hashBytes(scriptPubKey.
begin()+2, scriptPubKey.
begin()+22);
65 vSolutionsRet.push_back(hashBytes);
80 const CScript& script1 = scriptPubKey;
83 const CScript& script2 = tplate.second;
84 vSolutionsRet.
clear();
87 vector<unsigned char> vch1, vch2;
94 if (pc1 == script1.
end() && pc2 == script2.
end())
97 typeRet = tplate.first;
101 unsigned char m = vSolutionsRet.front()[0];
102 unsigned char n = vSolutionsRet.back()[0];
103 if (
m < 1 || n < 1 || m >
n || vSolutionsRet.size()-2 !=
n)
108 if (!script1.
GetOp(pc1, opcode1, vch1))
110 if (!script2.
GetOp(pc2, opcode2, vch2))
116 while (vch1.size() >= 33 && vch1.size() <= 65)
118 vSolutionsRet.push_back(vch1);
119 if (!script1.
GetOp(pc1, opcode1, vch1))
122 if (!script2.
GetOp(pc2, opcode2, vch2))
130 if (vch1.size() < 33 || vch1.size() > 65)
132 vSolutionsRet.push_back(vch1);
136 if (vch1.size() !=
sizeof(
uint160))
138 vSolutionsRet.push_back(vch1);
142 if (opcode1 ==
OP_0 ||
146 vSolutionsRet.push_back(
valtype(1,
n));
151 else if (opcode1 != opcode2 || vch1 != vch2)
159 vSolutionsRet.clear();
166 vector<valtype> vSolutions;
168 if (!
Solver(scriptPubKey, whichType, vSolutions))
177 addressRet = pubKey.
GetID();
198 vector<valtype> vSolutions;
199 if (!
Solver(scriptPubKey, typeRet, vSolutions))
208 nRequiredRet = vSolutions.front()[0];
209 for (
unsigned int i = 1; i < vSolutions.size()-1; i++)
216 addressRet.push_back(address);
219 if (addressRet.empty())
228 addressRet.push_back(address);
236 class CScriptVisitor :
public boost::static_visitor<bool>
241 CScriptVisitor(
CScript *scriptin) { script = scriptin; }
248 bool operator()(
const CKeyID &keyID)
const {
254 bool operator()(
const CScriptID &scriptID)
const {
266 boost::apply_visitor(CScriptVisitor(&script), dest);
boost::variant< CNoDestination, CKeyID, CScriptID > CTxDestination
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
vector< unsigned char > valtype
static const unsigned int MAX_OP_RETURN_RELAY
static const bool DEFAULT_ACCEPT_DATACARRIER
bool fAcceptDatacarrier
bytes (+1 for OP_RETURN, +2 for the pushdata opcodes)
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
bool ExtractDestinations(const CScript &scriptPubKey, txnouttype &typeRet, vector< CTxDestination > &addressRet, int &nRequiredRet)
uint160 Hash160(const T1 pbegin, const T1 pend)
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
bool GetOp(iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > &vchRet)
const unsigned char * begin() const
const char * GetTxnOutputType(txnouttype t)
bool IsPayToScriptHash() const
CScript GetScriptForDestination(const CTxDestination &dest)
const unsigned char * end() const
bool IsPushOnly(const_iterator pc) const
bool Solver(const CScript &scriptPubKey, txnouttype &typeRet, vector< vector< unsigned char > > &vSolutionsRet)
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
static int DecodeOP_N(opcodetype opcode)
static opcodetype EncodeOP_N(int n)
unsigned nMaxDatacarrierBytes
std::vector< unsigned char > ToByteVector(const T &in)