vins, vouts -> inputs -> outputs

This commit is contained in:
woodser
2019-12-09 15:22:15 -05:00
parent 2aa790e7b5
commit 2f6e0a5a3a
5 changed files with 87 additions and 87 deletions
+45 -45
View File
@@ -267,8 +267,8 @@ namespace monero {
if (m_is_failed != boost::none) monero_utils::addJsonMember("isFailed", m_is_failed.get(), allocator, root);
// set sub-arrays
if (!m_vins.empty()) root.AddMember("vins", monero_utils::to_rapidjson_val(allocator, m_vins), allocator);
if (!m_vouts.empty()) root.AddMember("vouts", monero_utils::to_rapidjson_val(allocator, m_vouts), allocator);
if (!m_inputs.empty()) root.AddMember("inputs", monero_utils::to_rapidjson_val(allocator, m_inputs), allocator);
if (!m_outputs.empty()) root.AddMember("outputs", monero_utils::to_rapidjson_val(allocator, m_outputs), allocator);
if (!m_output_indices.empty()) root.AddMember("outputIndices", monero_utils::to_rapidjson_val(allocator, m_output_indices), allocator);
if (!m_extra.empty()) root.AddMember("extra", monero_utils::to_rapidjson_val(allocator, m_extra), allocator);
if (!m_signatures.empty()) root.AddMember("signatures", monero_utils::to_rapidjson_val(allocator, m_signatures), allocator);
@@ -304,8 +304,8 @@ namespace monero {
else if (key == string("prunableHash")) tx->m_prunable_hash = it->second.data();
else if (key == string("size")) throw runtime_error("size deserialization not implemented");
else if (key == string("weight")) throw runtime_error("weight deserialization not implemented");
else if (key == string("vins")) throw runtime_error("vins deserializationn not implemented");
else if (key == string("vouts")) throw runtime_error("vouts deserializationn not implemented");
else if (key == string("inputs")) throw runtime_error("inputs deserializationn not implemented");
else if (key == string("outputs")) throw runtime_error("outputs deserializationn not implemented");
else if (key == string("outputIndices")) throw runtime_error("m_output_indices deserialization not implemented");
else if (key == string("metadata")) tx->m_metadata = it->second.data();
else if (key == string("commonTxSets")) throw runtime_error("commonTxSets deserialization not implemented");
@@ -346,20 +346,20 @@ namespace monero {
tgt->m_prunable_hash = src->m_prunable_hash;
tgt->m_size = src->m_size;
tgt->m_weight = src->m_weight;
if (!src->m_vins.empty()) {
tgt->m_vins = vector<shared_ptr<monero_output>>();
for (const shared_ptr<monero_output>& vin : src->m_vins) {
shared_ptr<monero_output> vinCopy = vin->copy(vin, make_shared<monero_output>());
vinCopy->m_tx = tgt;
tgt->m_vins.push_back(vinCopy);
if (!src->m_inputs.empty()) {
tgt->m_inputs = vector<shared_ptr<monero_output>>();
for (const shared_ptr<monero_output>& input : src->m_inputs) {
shared_ptr<monero_output> input_copy = input->copy(input, make_shared<monero_output>());
input_copy->m_tx = tgt;
tgt->m_inputs.push_back(input_copy);
}
}
if (!src->m_vouts.empty()) {
tgt->m_vouts = vector<shared_ptr<monero_output>>();
for (const shared_ptr<monero_output>& vout : src->m_vouts) {
shared_ptr<monero_output> voutCopy = vout->copy(vout, make_shared<monero_output>());
voutCopy->m_tx = tgt;
tgt->m_vouts.push_back(voutCopy);
if (!src->m_outputs.empty()) {
tgt->m_outputs = vector<shared_ptr<monero_output>>();
for (const shared_ptr<monero_output>& output : src->m_outputs) {
shared_ptr<monero_output> output_copy = output->copy(output, make_shared<monero_output>());
output_copy->m_tx = tgt;
tgt->m_outputs.push_back(output_copy);
}
}
if (!src->m_output_indices.empty()) tgt->m_output_indices = vector<uint32_t>(src->m_output_indices);
@@ -436,89 +436,89 @@ namespace monero {
m_unlock_time = gen_utils::reconcile(m_unlock_time, other->m_unlock_time, "m_unlock_time");
m_num_confirmations = gen_utils::reconcile(m_num_confirmations, other->m_num_confirmations, "m_num_confirmations");
// merge vins
if (!other->m_vins.empty()) {
for (const shared_ptr<monero_output>& merger : other->m_vins) {
// merge inputs
if (!other->m_inputs.empty()) {
for (const shared_ptr<monero_output>& merger : other->m_inputs) {
bool merged = false;
merger->m_tx = self;
for (const shared_ptr<monero_output>& mergee : m_vins) {
for (const shared_ptr<monero_output>& mergee : m_inputs) {
if ((*mergee->m_key_image)->m_hex == (*merger->m_key_image)->m_hex) {
mergee->merge(mergee, merger);
merged = true;
break;
}
}
if (!merged) m_vins.push_back(merger);
if (!merged) m_inputs.push_back(merger);
}
}
// merge vouts
if (!other->m_vouts.empty()) {
for (const shared_ptr<monero_output>& vout : other->m_vouts) vout->m_tx = self;
if (m_vouts.empty()) m_vouts = other->m_vouts;
// merge outputs
if (!other->m_outputs.empty()) {
for (const shared_ptr<monero_output>& output : other->m_outputs) output->m_tx = self;
if (m_outputs.empty()) m_outputs = other->m_outputs;
else {
// validate output indices if present
int num_indices = 0;
for (const shared_ptr<monero_output>& vout : this->m_vouts) if (vout->m_index != boost::none) num_indices++;
for (const shared_ptr<monero_output>& vout : other->m_vouts) if (vout->m_index != boost::none) num_indices++;
if (num_indices != 0 && this->m_vouts.size() + other->m_vouts.size() != num_indices) {
throw runtime_error("Some vouts have an output index and some do not");
for (const shared_ptr<monero_output>& output : this->m_outputs) if (output->m_index != boost::none) num_indices++;
for (const shared_ptr<monero_output>& output : other->m_outputs) if (output->m_index != boost::none) num_indices++;
if (num_indices != 0 && this->m_outputs.size() + other->m_outputs.size() != num_indices) {
throw runtime_error("Some outputs have an output index and some do not");
}
// merge by output indices if present
if (num_indices > 0) {
for (const shared_ptr<monero_output>& merger : other->m_vouts) {
for (const shared_ptr<monero_output>& merger : other->m_outputs) {
bool merged = false;
merger->m_tx = self;
for (const shared_ptr<monero_output>& mergee : this->m_vouts) {
for (const shared_ptr<monero_output>& mergee : this->m_outputs) {
if (mergee->m_index.get() == merger->m_index.get()) {
mergee->merge(mergee, merger);
merged = true;
break;
}
}
if (!merged) this->m_vouts.push_back(merger);
if (!merged) this->m_outputs.push_back(merger);
}
} else {
// determine if key images present
int numKeyImages = 0;
for (const shared_ptr<monero_output> vout : m_vouts) {
if (vout->m_key_image != boost::none) {
if ((*vout->m_key_image)->m_hex == boost::none) throw runtime_error("Key image hex cannot be null");
for (const shared_ptr<monero_output> output : m_outputs) {
if (output->m_key_image != boost::none) {
if ((*output->m_key_image)->m_hex == boost::none) throw runtime_error("Key image hex cannot be null");
numKeyImages++;
}
}
for (const shared_ptr<monero_output>& vout : other->m_vouts) {
if (vout->m_key_image != boost::none) {
if ((*vout->m_key_image)->m_hex == boost::none) throw runtime_error("Key image hex cannot be null");
for (const shared_ptr<monero_output>& output : other->m_outputs) {
if (output->m_key_image != boost::none) {
if ((*output->m_key_image)->m_hex == boost::none) throw runtime_error("Key image hex cannot be null");
numKeyImages++;
}
}
if (numKeyImages != 0 && m_vouts.size() + other->m_vouts.size() != numKeyImages) throw runtime_error("Some vouts have a key image and some do not");
if (numKeyImages != 0 && m_outputs.size() + other->m_outputs.size() != numKeyImages) throw runtime_error("Some outputs have a key image and some do not");
// merge by key images
if (numKeyImages > 0) {
for (const shared_ptr<monero_output>& merger : other->m_vouts) {
for (const shared_ptr<monero_output>& merger : other->m_outputs) {
bool merged = false;
merger->m_tx = self;
for (const shared_ptr<monero_output>& mergee : m_vouts) {
for (const shared_ptr<monero_output>& mergee : m_outputs) {
if ((*mergee->m_key_image)->m_hex == (*merger->m_key_image)->m_hex) {
mergee->merge(mergee, merger);
merged = true;
break;
}
}
if (!merged) m_vouts.push_back(merger);
if (!merged) m_outputs.push_back(merger);
}
}
// merge by position
else {
if (m_vouts.size() != other->m_vouts.size()) throw runtime_error("Vout sizes are different");
for (int i = 0; i < other->m_vouts.size(); i++) {
m_vouts.at(i)->merge(m_vouts.at(i), other->m_vouts.at(i));
if (m_outputs.size() != other->m_outputs.size()) throw runtime_error("Vout sizes are different");
for (int i = 0; i < other->m_outputs.size(); i++) {
m_outputs.at(i)->merge(m_outputs.at(i), other->m_outputs.at(i));
}
}
}
+2 -2
View File
@@ -192,8 +192,8 @@ namespace monero {
boost::optional<string> m_prunable_hash;
boost::optional<uint64_t> m_size;
boost::optional<uint64_t> m_weight;
vector<shared_ptr<monero_output>> m_vins;
vector<shared_ptr<monero_output>> m_vouts;
vector<shared_ptr<monero_output>> m_inputs;
vector<shared_ptr<monero_output>> m_outputs;
vector<uint32_t> m_output_indices;
boost::optional<string> m_metadata;
boost::optional<string> m_common_tx_sets;
+14 -14
View File
@@ -256,30 +256,30 @@ shared_ptr<monero_tx> monero_utils::cn_tx_to_tx(const cryptonote::transaction& c
tx->m_hash = epee::string_tools::pod_to_hex(cn_tx.hash);
tx->m_extra = cn_tx.extra;
// init vins
// init inputs
for (const txin_v& cnVin : cn_tx.vin) {
if (cnVin.which() != 0 && cnVin.which() != 3) throw runtime_error("Unsupported variant type");
if (tx->m_is_miner_tx == boost::none) tx->m_is_miner_tx = cnVin.which() == 0;
if (cnVin.which() != 3) continue; // only process txin_to_key of variant TODO: support other types, like 0 "gen" which is miner tx?
shared_ptr<monero_output> vin = init_as_tx_wallet ? make_shared<monero_output_wallet>() : make_shared<monero_output>();
vin->m_tx = tx;
tx->m_vins.push_back(vin);
shared_ptr<monero_output> input = init_as_tx_wallet ? make_shared<monero_output_wallet>() : make_shared<monero_output>();
input->m_tx = tx;
tx->m_inputs.push_back(input);
const txin_to_key& txin = boost::get<txin_to_key>(cnVin);
vin->m_amount = txin.amount;
vin->m_ring_output_indices = txin.key_offsets;
input->m_amount = txin.amount;
input->m_ring_output_indices = txin.key_offsets;
crypto::key_image cnKeyImage = txin.k_image;
vin->m_key_image = make_shared<monero_key_image>();
vin->m_key_image.get()->m_hex = epee::string_tools::pod_to_hex(cnKeyImage);
input->m_key_image = make_shared<monero_key_image>();
input->m_key_image.get()->m_hex = epee::string_tools::pod_to_hex(cnKeyImage);
}
// init vouts
// init outputs
for (const tx_out& cnVout : cn_tx.vout) {
shared_ptr<monero_output> vout = init_as_tx_wallet ? make_shared<monero_output_wallet>() : make_shared<monero_output>();
vout->m_tx = tx;
tx->m_vouts.push_back(vout);
vout->m_amount = cnVout.amount;
shared_ptr<monero_output> output = init_as_tx_wallet ? make_shared<monero_output_wallet>() : make_shared<monero_output>();
output->m_tx = tx;
tx->m_outputs.push_back(output);
output->m_amount = cnVout.amount;
const crypto::public_key& cnStealthPublicKey = boost::get<txout_to_key>(cnVout.target).key;
vout->m_stealth_public_key = epee::string_tools::pod_to_hex(cnStealthPublicKey);
output->m_stealth_public_key = epee::string_tools::pod_to_hex(cnStealthPublicKey);
}
return tx;
+23 -23
View File
@@ -336,19 +336,19 @@ namespace monero {
tx->m_is_double_spend_seen = false;
tx->m_is_locked = !m_w2.is_transfer_unlocked(td);
// construct vout
shared_ptr<monero_output_wallet> vout = make_shared<monero_output_wallet>();
vout->m_tx = tx;
tx->m_vouts.push_back(vout);
vout->m_amount = td.amount();
vout->m_index = td.m_global_output_index;
vout->m_account_index = td.m_subaddr_index.major;
vout->m_subaddress_index = td.m_subaddr_index.minor;
vout->m_is_spent = td.m_spent;
vout->m_is_frozen = td.m_frozen;
// construct output
shared_ptr<monero_output_wallet> output = make_shared<monero_output_wallet>();
output->m_tx = tx;
tx->m_outputs.push_back(output);
output->m_amount = td.amount();
output->m_index = td.m_global_output_index;
output->m_account_index = td.m_subaddr_index.major;
output->m_subaddress_index = td.m_subaddr_index.minor;
output->m_is_spent = td.m_spent;
output->m_is_frozen = td.m_frozen;
if (td.m_key_image_known) {
vout->m_key_image = make_shared<monero_key_image>();
vout->m_key_image.get()->m_hex = epee::string_tools::pod_to_hex(td.m_key_image);
output->m_key_image = make_shared<monero_key_image>();
output->m_key_image.get()->m_hex = epee::string_tools::pod_to_hex(td.m_key_image);
}
// return pointer to new tx
@@ -719,7 +719,7 @@ namespace monero {
tx->m_hash = epee::string_tools::pod_to_hex(txid);
tx->m_unlock_time = unlock_time;
shared_ptr<monero_output_wallet> output = make_shared<monero_output_wallet>();
tx->m_vouts.push_back(output);
tx->m_outputs.push_back(output);
output->m_tx = tx;
output->m_amount = amount;
output->m_account_index = subaddr_index.major;
@@ -743,7 +743,7 @@ namespace monero {
tx->m_block = block;
tx->m_hash = epee::string_tools::pod_to_hex(txid);
shared_ptr<monero_output_wallet> output = make_shared<monero_output_wallet>();
tx->m_vins.push_back(output);
tx->m_inputs.push_back(output);
output->m_tx = tx;
output->m_amount = amount;
output->m_account_index = subaddr_index.major;
@@ -1659,28 +1659,28 @@ namespace monero {
sort(txs.begin(), txs.end(), tx_height_less_than);
// filter and return outputs
vector<shared_ptr<monero_output_wallet>> vouts;
vector<shared_ptr<monero_output_wallet>> outputs;
for (const shared_ptr<monero_tx_wallet>& tx : txs) {
// sort outputs
sort(tx->m_vouts.begin(), tx->m_vouts.end(), vout_before);
sort(tx->m_outputs.begin(), tx->m_outputs.end(), vout_before);
// collect queried outputs, remove excluded outputs
vector<shared_ptr<monero_output>>::iterator voutIter = tx->m_vouts.begin();
while (voutIter != tx->m_vouts.end()) {
vector<shared_ptr<monero_output>>::iterator voutIter = tx->m_outputs.begin();
while (voutIter != tx->m_outputs.end()) {
shared_ptr<monero_output_wallet> vout_wallet = static_pointer_cast<monero_output_wallet>(*voutIter);
if (_query->meets_criteria(vout_wallet.get())) {
vouts.push_back(vout_wallet);
outputs.push_back(vout_wallet);
voutIter++;
} else {
voutIter = tx->m_vouts.erase(voutIter); // remove excluded vouts
voutIter = tx->m_outputs.erase(voutIter); // remove excluded outputs
}
}
// remove txs without vouts
if (tx->m_vouts.empty() && tx->m_block != boost::none) tx->m_block.get()->m_txs.erase(std::remove(tx->m_block.get()->m_txs.begin(), tx->m_block.get()->m_txs.end(), tx), tx->m_block.get()->m_txs.end()); // TODO, no way to use const_iterator?
// remove txs without outputs
if (tx->m_outputs.empty() && tx->m_block != boost::none) tx->m_block.get()->m_txs.erase(std::remove(tx->m_block.get()->m_txs.begin(), tx->m_block.get()->m_txs.end(), tx), tx->m_block.get()->m_txs.end()); // TODO, no way to use const_iterator?
}
return vouts;
return outputs;
}
string monero_wallet_core::get_outputs_hex() const {
+3 -3
View File
@@ -421,10 +421,10 @@ namespace monero {
// at least one output must meet output query if defined
if (m_output_query != boost::none && !m_output_query.get()->is_default()) {
if (tx->m_vouts.empty()) return false;
if (tx->m_outputs.empty()) return false;
bool matchFound = false;
for (const shared_ptr<monero_output>& vout : tx->m_vouts) {
shared_ptr<monero_output_wallet> vout_wallet = static_pointer_cast<monero_output_wallet>(vout);
for (const shared_ptr<monero_output>& output : tx->m_outputs) {
shared_ptr<monero_output_wallet> vout_wallet = static_pointer_cast<monero_output_wallet>(output);
if (m_output_query.get()->meets_criteria(vout_wallet.get())) {
matchFound = true;
break;