PRCYCoin  2.0.0.7rc1
P2P Digital Currency
core_read.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2014 The Bitcoin developers
2 // Copyright (c) 2015-2018 The PIVX developers
3 // Copyright (c) 2018-2020 The DAPS Project developers
4 // Distributed under the MIT/X11 software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #include "core_io.h"
8 
9 #include "primitives/block.h"
10 #include "primitives/transaction.h"
11 #include "script/script.h"
12 #include "serialize.h"
13 #include "streams.h"
14 #include <univalue.h>
15 #include "util.h"
16 #include "utilstrencodings.h"
17 #include "version.h"
18 
19 #include <boost/algorithm/string/classification.hpp>
20 #include <boost/algorithm/string/predicate.hpp>
21 #include <boost/algorithm/string/replace.hpp>
22 #include <boost/algorithm/string/split.hpp>
23 #include <boost/assign/list_of.hpp>
24 
25 
26 CScript ParseScript(std::string s)
27 {
28  CScript result;
29 
30  static std::map<std::string, opcodetype> mapOpNames;
31 
32  std::vector<std::string> words;
33  boost::algorithm::split(words, s, boost::algorithm::is_any_of(" \t\n"), boost::algorithm::token_compress_on);
34 
35  for (std::vector<std::string>::const_iterator w = words.begin(); w != words.end(); ++w) {
36  if (w->empty()) {
37  // Empty string, ignore. (boost::split given '' will return one word)
38  } else if (all(*w, boost::algorithm::is_digit()) ||
39  (boost::algorithm::starts_with(*w, "-") && all(std::string(w->begin() + 1, w->end()), boost::algorithm::is_digit()))) {
40  // Number
41  int64_t n = atoi64(*w);
42  result << n;
43  } else if (boost::algorithm::starts_with(*w, "0x") && (w->begin() + 2 != w->end()) && IsHex(std::string(w->begin() + 2, w->end()))) {
44  // Raw hex data, inserted NOT pushed onto stack:
45  std::vector<unsigned char> raw = ParseHex(std::string(w->begin() + 2, w->end()));
46  result.insert(result.end(), raw.begin(), raw.end());
47  } else if (w->size() >= 2 && boost::algorithm::starts_with(*w, "'") && boost::algorithm::ends_with(*w, "'")) {
48  // Single-quoted string, pushed as data. NOTE: this is poor-man's
49  // parsing, spaces/tabs/newlines in single-quoted strings won't work.
50  std::vector<unsigned char> value(w->begin() + 1, w->end() - 1);
51  result << value;
52  } else if (mapOpNames.count(*w)) {
53  // opcode, e.g. OP_ADD or ADD:
54  result << mapOpNames[*w];
55  } else {
56  throw std::runtime_error("script parse error");
57  }
58  }
59 
60  return result;
61 }
62 
63 bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx)
64 {
65  if (!IsHex(strHexTx))
66  return false;
67 
68  std::vector<unsigned char> txData(ParseHex(strHexTx));
69  CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION);
70  try {
71  ssData >> tx;
72  } catch (const std::exception&) {
73  return false;
74  }
75 
76  return true;
77 }
78 
79 bool DecodeHexBlk(CBlock& block, const std::string& strHexBlk)
80 {
81  if (!IsHex(strHexBlk))
82  return false;
83 
84  std::vector<unsigned char> blockData(ParseHex(strHexBlk));
85  CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
86  try {
87  ssBlock >> block;
88  } catch (const std::exception&) {
89  return false;
90  }
91 
92  return true;
93 }
94 
95 uint256 ParseHashUV(const UniValue& v, const std::string& strName)
96 {
97  std::string strHex;
98  if (v.isStr())
99  strHex = v.getValStr();
100  return ParseHashStr(strHex, strName); // Note: ParseHashStr("") throws a std::runtime_error
101 }
102 
103 uint256 ParseHashStr(const std::string& strHex, const std::string& strName)
104 {
105  if (!IsHex(strHex)) // Note: IsHex("") is false
106  throw std::runtime_error(strName + " must be hexadecimal string (not '" + strHex + "')");
107 
108  uint256 result;
109  result.SetHex(strHex);
110  return result;
111 }
112 
113 std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName)
114 {
115  std::string strHex;
116  if (v.isStr())
117  strHex = v.getValStr();
118  if (!IsHex(strHex))
119  throw std::runtime_error(strName + " must be hexadecimal string (not '" + strHex + "')");
120  return ParseHex(strHex);
121 }
block.h
prevector::insert
iterator insert(iterator pos, const T &value)
Definition: prevector.h:343
ParseHashStr
uint256 ParseHashStr(const std::string &strHex, const std::string &strName)
Definition: core_read.cpp:103
transaction.h
ParseHex
std::vector< unsigned char > ParseHex(const char *psz)
Definition: utilstrencodings.cpp:77
streams.h
DecodeHexTx
bool DecodeHexTx(CTransaction &tx, const std::string &strHexTx)
Definition: core_read.cpp:63
SER_NETWORK
@ SER_NETWORK
Definition: serialize.h:159
version.h
core_io.h
UniValue
Definition: univalue.h:19
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:269
prevector::end
iterator end()
Definition: prevector.h:292
ParseHashUV
uint256 ParseHashUV(const UniValue &v, const std::string &strName)
Definition: core_read.cpp:95
UniValue::isStr
bool isStr() const
Definition: univalue.h:81
IsHex
bool IsHex(const std::string &str)
Definition: utilstrencodings.cpp:68
univalue.h
uint256
256-bit unsigned big integer.
Definition: uint256.h:38
base_uint::SetHex
void SetHex(const char *psz)
Definition: arith_uint256.cpp:164
CScript
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:363
DecodeHexBlk
bool DecodeHexBlk(CBlock &block, const std::string &strHexBlk)
Definition: core_read.cpp:79
CBlock
Definition: block.h:142
atoi64
int64_t atoi64(const char *psz)
Definition: utilstrencodings.cpp:569
UniValue::getValStr
const std::string & getValStr() const
Definition: univalue.h:66
ParseHexUV
std::vector< unsigned char > ParseHexUV(const UniValue &v, const std::string &strName)
Definition: core_read.cpp:113
serialize.h
CDataStream
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:34
ParseScript
CScript ParseScript(std::string s)
Definition: core_read.cpp:26
script.h
utilstrencodings.h
util.h