#include #include "core_io.h" #include "core.h" #include "serialize.h" #include "script.h" #include #include #include #include #include using namespace std; using namespace boost; using namespace boost::algorithm; CScript ParseScript(std::string s) { CScript result; static map mapOpNames; if (mapOpNames.size() == 0) { for (int op = 0; op <= OP_NOP10; op++) { // Allow OP_RESERVED to get into mapOpNames if (op < OP_NOP && op != OP_RESERVED) continue; const char* name = GetOpName((opcodetype)op); if (strcmp(name, "OP_UNKNOWN") == 0) continue; string strName(name); mapOpNames[strName] = (opcodetype)op; // Convenience: OP_ADD and just ADD are both recognized: replace_first(strName, "OP_", ""); mapOpNames[strName] = (opcodetype)op; } } vector words; split(words, s, is_any_of(" \t\n"), token_compress_on); BOOST_FOREACH(string w, words) { if (w.size() == 0) { // Empty string, ignore. (boost::split given '' will return one word) } else if (all(w, is_digit()) || (starts_with(w, "-") && all(string(w.begin()+1, w.end()), is_digit()))) { // Number int64_t n = atoi64(w); result << n; } else if (starts_with(w, "0x") && IsHex(string(w.begin()+2, w.end()))) { // Raw hex data, inserted NOT pushed onto stack: std::vector raw = ParseHex(string(w.begin()+2, w.end())); result.insert(result.end(), raw.begin(), raw.end()); } else if (w.size() >= 2 && starts_with(w, "'") && ends_with(w, "'")) { // Single-quoted string, pushed as data. NOTE: this is poor-man's // parsing, spaces/tabs/newlines in single-quoted strings won't work. std::vector value(w.begin()+1, w.end()-1); result << value; } else if (mapOpNames.count(w)) { // opcode, e.g. OP_ADD or ADD: result << mapOpNames[w]; } else { throw runtime_error("script parse error"); } } return result; } bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx) { if (!IsHex(strHexTx)) return false; vector txData(ParseHex(strHexTx)); CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); try { ssData >> tx; } catch (std::exception &e) { return false; } return true; }