Monero C++ Library
monero_utils.h
1 
53 #pragma once
54 
55 #ifndef monero_utils_h
56 #define monero_utils_h
57 
58 #include "wallet/monero_wallet_model.h"
59 #include "cryptonote_basic/cryptonote_basic.h"
60 #include "serialization/keyvalue_serialization.h" // TODO: consolidate with other binary deps?
61 #include "storages/portable_storage.h"
62 
66 namespace monero_utils
67 {
68  using namespace cryptonote;
69 
70  // ------------------------ CONSTANTS ---------------------------
71 
72  static const int RING_SIZE = 12; // network-enforced ring size
73 
74  // ------------------------ BINARY SERIALIZATION ----------------------------
75 
76  void json_to_binary(const std::string &json, std::string &bin);
77  void binary_to_json(const std::string &bin, std::string &json);
78  void binary_blocks_to_json(const std::string &bin, std::string &json);
79 
80  // ------------------------------ RAPIDJSON ---------------------------------
81 
82  std::string serialize(const rapidjson::Document& doc);
83 
89  template <class T>
90  void add_json_member(std::string key, T val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field) {
91  rapidjson::Value field_key(key.c_str(), key.size(), allocator);
92  field.SetInt64((uint64_t) val);
93  root.AddMember(field_key, field, allocator);
94  }
95  void add_json_member(std::string key, std::string val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field);
96  void add_json_member(std::string key, bool val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root);
97 
98  // TODO: template implementation here, could move to monero_utils.hpp per https://stackoverflow.com/questions/3040480/c-template-function-compiles-in-header-but-not-implementation
99  template <class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<std::shared_ptr<T>>& vals) {
100  rapidjson::Value value_arr(rapidjson::kArrayType);
101  for (const auto& val : vals) {
102  value_arr.PushBack(val->to_rapidjson_val(allocator), allocator);
103  }
104  return value_arr;
105  }
106 
107  // TODO: template implementation here, could move to monero_utils.hpp per https://stackoverflow.com/questions/3040480/c-template-function-compiles-in-header-but-not-implementation
108  template <class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<T>& vals) {
109  rapidjson::Value value_arr(rapidjson::kArrayType);
110  for (const auto& val : vals) {
111  value_arr.PushBack(val.to_rapidjson_val(allocator), allocator);
112  }
113  return value_arr;
114  }
115 
116  rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<std::string>& strs);
117  rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint8_t>& nums);
118  rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint32_t>& nums);
119  rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint64_t>& nums);
120 
121  // ------------------------ PROPERTY TREES ---------------------------
122 
123  // TODO: fully switch from property trees to rapidjson
124 
125  std::string serialize(const boost::property_tree::ptree& node);
126  void deserialize(const std::string& json, boost::property_tree::ptree& root);
127 
128  // --------------------------------------------------------------------------
129 
136  bool is_valid_language(const std::string& language);
137 
144  std::shared_ptr<monero_block> cn_block_to_block(const cryptonote::block& cn_block);
145 
153  std::shared_ptr<monero_tx> cn_tx_to_tx(const cryptonote::transaction& cn_tx, bool init_as_tx_wallet = false);
154 
160  static std::string get_pruned_tx_json(cryptonote::transaction &tx)
161  {
162  std::stringstream ss;
163  json_archive<true> ar(ss);
164  bool r = tx.serialize_base(ar);
165  CHECK_AND_ASSERT_MES(r, std::string(), "Failed to serialize rct signatures base");
166  return ss.str();
167  }
168 
174  static void free(std::shared_ptr<monero_block> block) {
175  for (std::shared_ptr<monero_tx>& tx : block->m_txs) {
176  tx->m_block.reset();
177  monero_tx_wallet* tx_wallet = dynamic_cast<monero_tx_wallet*>(tx.get());
178  if (tx_wallet != nullptr) {
179  if (tx_wallet->m_outgoing_transfer != boost::none) tx_wallet->m_outgoing_transfer.get()->m_tx.reset();
180  for (std::shared_ptr<monero_transfer> transfer : tx_wallet->m_incoming_transfers) transfer->m_tx.reset();
181  for (std::shared_ptr<monero_output> output : tx_wallet->m_outputs) output->m_tx.reset();
182  for (std::shared_ptr<monero_output> input : tx_wallet->m_inputs) {
183  input->m_key_image.reset();
184  input->m_tx.reset();
185  }
186  }
187  }
188  block.reset();
189  }
190 
196  static void free(std::vector<std::shared_ptr<monero_block>> blocks) {
197  for (std::shared_ptr<monero_block>& block : blocks) monero_utils::free(block);
198  }
199 }
200 #endif /* monero_utils_h */
monero_utils::is_valid_language
bool is_valid_language(const std::string &language)
Definition: monero_utils.cpp:217
monero_utils::cn_tx_to_tx
std::shared_ptr< monero_tx > cn_tx_to_tx(const cryptonote::transaction &cn_tx, bool init_as_tx_wallet=false)
Definition: monero_utils.cpp:246
monero::monero_tx_wallet
Definition: monero_wallet_model.h:244
monero_utils
Definition: monero_utils.h:67
monero_utils::add_json_member
void add_json_member(std::string key, T val, rapidjson::Document::AllocatorType &allocator, rapidjson::Value &root, rapidjson::Value &field)
Definition: monero_utils.h:90
monero_utils::cn_block_to_block
std::shared_ptr< monero_block > cn_block_to_block(const cryptonote::block &cn_block)
Definition: monero_utils.cpp:230