mirror of
https://github.com/monero-project/monero.git
synced 2025-10-11 20:40:39 -04:00
Merge pull request #3716
a2b557f
6795bd0
209ec96
ed2c81e
a830db2
57ea902
31a895e
ba8331c
f7f1917
41be339
f025ae9
ef2cb63
dcfd299
5d3e702
2704624
2771a18
0e4c7d0
(moneromooo-monero)
This commit is contained in:
commit
a844844cda
32 changed files with 763 additions and 496 deletions
|
@ -226,47 +226,47 @@ namespace cryptonote
|
|||
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_BLOCKS_FAST>(invoke_http_mode::BIN, "/getblocks.bin", req, res, r))
|
||||
return r;
|
||||
|
||||
std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > > bs;
|
||||
std::vector<std::pair<std::pair<cryptonote::blobdata, crypto::hash>, std::vector<std::pair<crypto::hash, cryptonote::blobdata> > > > bs;
|
||||
|
||||
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, bs, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
|
||||
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, bs, res.current_height, res.start_height, req.prune, !req.no_miner_tx, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
|
||||
{
|
||||
res.status = "Failed";
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t pruned_size = 0, unpruned_size = 0, ntxes = 0;
|
||||
res.blocks.reserve(bs.size());
|
||||
res.output_indices.reserve(bs.size());
|
||||
for(auto& bd: bs)
|
||||
{
|
||||
res.blocks.resize(res.blocks.size()+1);
|
||||
res.blocks.back().block = bd.first;
|
||||
pruned_size += bd.first.size();
|
||||
unpruned_size += bd.first.size();
|
||||
res.blocks.back().block = bd.first.first;
|
||||
pruned_size += bd.first.first.size();
|
||||
unpruned_size += bd.first.first.size();
|
||||
res.output_indices.push_back(COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices());
|
||||
res.output_indices.back().indices.push_back(COMMAND_RPC_GET_BLOCKS_FAST::tx_output_indices());
|
||||
block b;
|
||||
if (!parse_and_validate_block_from_blob(bd.first, b))
|
||||
if (!req.no_miner_tx)
|
||||
{
|
||||
res.status = "Invalid block";
|
||||
return false;
|
||||
bool r = m_core.get_tx_outputs_gindexs(bd.first.second, res.output_indices.back().indices.back().indices);
|
||||
if (!r)
|
||||
{
|
||||
res.status = "Failed";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
bool r = m_core.get_tx_outputs_gindexs(get_transaction_hash(b.miner_tx), res.output_indices.back().indices.back().indices);
|
||||
if (!r)
|
||||
{
|
||||
res.status = "Failed";
|
||||
return false;
|
||||
}
|
||||
size_t txidx = 0;
|
||||
ntxes += bd.second.size();
|
||||
for (std::list<cryptonote::blobdata>::iterator i = bd.second.begin(); i != bd.second.end(); ++i)
|
||||
res.blocks.back().txs.reserve(bd.second.size());
|
||||
res.output_indices.back().indices.reserve(bd.second.size());
|
||||
for (std::vector<std::pair<crypto::hash, cryptonote::blobdata>>::iterator i = bd.second.begin(); i != bd.second.end(); ++i)
|
||||
{
|
||||
unpruned_size += i->size();
|
||||
res.blocks.back().txs.push_back(std::move(*i));
|
||||
i->clear();
|
||||
i->shrink_to_fit();
|
||||
unpruned_size += i->second.size();
|
||||
res.blocks.back().txs.push_back(std::move(i->second));
|
||||
i->second.clear();
|
||||
i->second.shrink_to_fit();
|
||||
pruned_size += res.blocks.back().txs.back().size();
|
||||
|
||||
res.output_indices.back().indices.push_back(COMMAND_RPC_GET_BLOCKS_FAST::tx_output_indices());
|
||||
bool r = m_core.get_tx_outputs_gindexs(b.tx_hashes[txidx++], res.output_indices.back().indices.back().indices);
|
||||
bool r = m_core.get_tx_outputs_gindexs(i->first, res.output_indices.back().indices.back().indices);
|
||||
if (!r)
|
||||
{
|
||||
res.status = "Failed";
|
||||
|
@ -286,7 +286,7 @@ namespace cryptonote
|
|||
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_ALT_BLOCKS_HASHES>(invoke_http_mode::JON, "/get_alt_blocks_hashes", req, res, r))
|
||||
return r;
|
||||
|
||||
std::list<block> blks;
|
||||
std::vector<block> blks;
|
||||
|
||||
if(!m_core.get_alternative_blocks(blks))
|
||||
{
|
||||
|
@ -328,8 +328,8 @@ namespace cryptonote
|
|||
res.status = "Error retrieving block at height " + std::to_string(height);
|
||||
return true;
|
||||
}
|
||||
std::list<transaction> txs;
|
||||
std::list<crypto::hash> missed_txs;
|
||||
std::vector<transaction> txs;
|
||||
std::vector<crypto::hash> missed_txs;
|
||||
m_core.get_transactions(blk.tx_hashes, txs, missed_txs);
|
||||
res.blocks.resize(res.blocks.size() + 1);
|
||||
res.blocks.back().block = block_to_blob(blk);
|
||||
|
@ -544,8 +544,8 @@ namespace cryptonote
|
|||
}
|
||||
vh.push_back(*reinterpret_cast<const crypto::hash*>(b.data()));
|
||||
}
|
||||
std::list<crypto::hash> missed_txs;
|
||||
std::list<transaction> txs;
|
||||
std::vector<crypto::hash> missed_txs;
|
||||
std::vector<transaction> txs;
|
||||
bool r = m_core.get_transactions(vh, txs, missed_txs);
|
||||
if(!r)
|
||||
{
|
||||
|
@ -566,25 +566,26 @@ namespace cryptonote
|
|||
if(r)
|
||||
{
|
||||
// sort to match original request
|
||||
std::list<transaction> sorted_txs;
|
||||
std::vector<transaction> sorted_txs;
|
||||
std::vector<tx_info>::const_iterator i;
|
||||
unsigned txs_processed = 0;
|
||||
for (const crypto::hash &h: vh)
|
||||
{
|
||||
if (std::find(missed_txs.begin(), missed_txs.end(), h) == missed_txs.end())
|
||||
{
|
||||
if (txs.empty())
|
||||
if (txs.size() == txs_processed)
|
||||
{
|
||||
res.status = "Failed: internal error - txs is empty";
|
||||
return true;
|
||||
}
|
||||
// core returns the ones it finds in the right order
|
||||
if (get_transaction_hash(txs.front()) != h)
|
||||
if (get_transaction_hash(txs[txs_processed]) != h)
|
||||
{
|
||||
res.status = "Failed: tx hash mismatch";
|
||||
return true;
|
||||
}
|
||||
sorted_txs.push_back(std::move(txs.front()));
|
||||
txs.pop_front();
|
||||
sorted_txs.push_back(std::move(txs[txs_processed]));
|
||||
++txs_processed;
|
||||
}
|
||||
else if ((i = std::find_if(pool_tx_info.begin(), pool_tx_info.end(), [h](const tx_info &txi) { return epee::string_tools::pod_to_hex(h) == txi.id_hash; })) != pool_tx_info.end())
|
||||
{
|
||||
|
@ -595,7 +596,7 @@ namespace cryptonote
|
|||
return true;
|
||||
}
|
||||
sorted_txs.push_back(tx);
|
||||
missed_txs.remove(h);
|
||||
missed_txs.erase(std::find(missed_txs.begin(), missed_txs.end(), h));
|
||||
pool_tx_hashes.insert(h);
|
||||
const std::string hash_string = epee::string_tools::pod_to_hex(h);
|
||||
for (const auto &ti: pool_tx_info)
|
||||
|
@ -614,7 +615,7 @@ namespace cryptonote
|
|||
LOG_PRINT_L2("Found " << found_in_pool << "/" << vh.size() << " transactions in the pool");
|
||||
}
|
||||
|
||||
std::list<std::string>::const_iterator txhi = req.txs_hashes.begin();
|
||||
std::vector<std::string>::const_iterator txhi = req.txs_hashes.begin();
|
||||
std::vector<crypto::hash>::const_iterator vhi = vh.begin();
|
||||
for(auto& tx: txs)
|
||||
{
|
||||
|
@ -1655,10 +1656,10 @@ namespace cryptonote
|
|||
PERF_TIMER(on_flush_txpool);
|
||||
|
||||
bool failed = false;
|
||||
std::list<crypto::hash> txids;
|
||||
std::vector<crypto::hash> txids;
|
||||
if (req.txids.empty())
|
||||
{
|
||||
std::list<transaction> pool_txs;
|
||||
std::vector<transaction> pool_txs;
|
||||
bool r = m_core.get_pool_transactions(pool_txs);
|
||||
if (!r)
|
||||
{
|
||||
|
|
|
@ -83,10 +83,12 @@ namespace cryptonote
|
|||
std::list<crypto::hash> block_ids; //*first 10 blocks id goes sequential, next goes in pow(2,n) offset, like 2, 4, 8, 16, 32, 64 and so on, and the last one is always genesis block */
|
||||
uint64_t start_height;
|
||||
bool prune;
|
||||
bool no_miner_tx;
|
||||
BEGIN_KV_SERIALIZE_MAP()
|
||||
KV_SERIALIZE_CONTAINER_POD_AS_BLOB(block_ids)
|
||||
KV_SERIALIZE(start_height)
|
||||
KV_SERIALIZE(prune)
|
||||
KV_SERIALIZE_OPT(no_miner_tx, false)
|
||||
END_KV_SERIALIZE_MAP()
|
||||
};
|
||||
|
||||
|
@ -110,7 +112,7 @@ namespace cryptonote
|
|||
|
||||
struct response
|
||||
{
|
||||
std::list<block_complete_entry> blocks;
|
||||
std::vector<block_complete_entry> blocks;
|
||||
uint64_t start_height;
|
||||
uint64_t current_height;
|
||||
std::string status;
|
||||
|
@ -188,7 +190,7 @@ namespace cryptonote
|
|||
|
||||
struct response
|
||||
{
|
||||
std::list<crypto::hash> m_block_ids;
|
||||
std::vector<crypto::hash> m_block_ids;
|
||||
uint64_t start_height;
|
||||
uint64_t current_height;
|
||||
std::string status;
|
||||
|
@ -273,7 +275,7 @@ namespace cryptonote
|
|||
uint64_t total_received;
|
||||
uint64_t total_received_unlocked = 0; // OpenMonero only
|
||||
uint64_t scanned_height;
|
||||
std::list<transaction> transactions;
|
||||
std::vector<transaction> transactions;
|
||||
uint64_t blockchain_height;
|
||||
uint64_t scanned_block_height;
|
||||
std::string status;
|
||||
|
@ -561,7 +563,7 @@ namespace cryptonote
|
|||
{
|
||||
struct request
|
||||
{
|
||||
std::list<std::string> txs_hashes;
|
||||
std::vector<std::string> txs_hashes;
|
||||
bool decode_as_json;
|
||||
bool prune;
|
||||
|
||||
|
@ -598,11 +600,11 @@ namespace cryptonote
|
|||
struct response
|
||||
{
|
||||
// older compatibility stuff
|
||||
std::list<std::string> txs_as_hex; //transactions blobs as hex (old compat)
|
||||
std::list<std::string> txs_as_json; //transactions decoded as json (old compat)
|
||||
std::vector<std::string> txs_as_hex; //transactions blobs as hex (old compat)
|
||||
std::vector<std::string> txs_as_json; //transactions decoded as json (old compat)
|
||||
|
||||
// in both old and new
|
||||
std::list<std::string> missed_tx; //not found transactions
|
||||
std::vector<std::string> missed_tx; //not found transactions
|
||||
|
||||
// new style
|
||||
std::vector<entry> txs;
|
||||
|
@ -1931,7 +1933,7 @@ namespace cryptonote
|
|||
{
|
||||
struct request
|
||||
{
|
||||
std::list<std::string> txids;
|
||||
std::vector<std::string> txids;
|
||||
|
||||
BEGIN_KV_SERIALIZE_MAP()
|
||||
KV_SERIALIZE(txids)
|
||||
|
@ -2148,7 +2150,7 @@ namespace cryptonote
|
|||
{
|
||||
struct request
|
||||
{
|
||||
std::list<std::string> txids;
|
||||
std::vector<std::string> txids;
|
||||
|
||||
BEGIN_KV_SERIALIZE_MAP()
|
||||
KV_SERIALIZE(txids)
|
||||
|
|
|
@ -50,9 +50,9 @@ namespace rpc
|
|||
|
||||
void DaemonHandler::handle(const GetBlocksFast::Request& req, GetBlocksFast::Response& res)
|
||||
{
|
||||
std::list<std::pair<blobdata, std::list<blobdata> > > blocks;
|
||||
std::vector<std::pair<std::pair<blobdata, crypto::hash>, std::vector<std::pair<crypto::hash, blobdata> > > > blocks;
|
||||
|
||||
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, blocks, res.current_height, res.start_height, req.prune, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
|
||||
if(!m_core.find_blockchain_supplement(req.start_height, req.block_ids, blocks, res.current_height, res.start_height, req.prune, true, COMMAND_RPC_GET_BLOCKS_FAST_MAX_COUNT))
|
||||
{
|
||||
res.status = Message::STATUS_FAILED;
|
||||
res.error_details = "core::find_blockchain_supplement() returned false";
|
||||
|
@ -62,9 +62,6 @@ namespace rpc
|
|||
res.blocks.resize(blocks.size());
|
||||
res.output_indices.resize(blocks.size());
|
||||
|
||||
//TODO: really need to switch uses of std::list to std::vector unless
|
||||
// it's a huge performance concern
|
||||
|
||||
auto it = blocks.begin();
|
||||
|
||||
uint64_t block_count = 0;
|
||||
|
@ -72,7 +69,7 @@ namespace rpc
|
|||
{
|
||||
cryptonote::rpc::block_with_transactions& bwt = res.blocks[block_count];
|
||||
|
||||
if (!parse_and_validate_block_from_blob(it->first, bwt.block))
|
||||
if (!parse_and_validate_block_from_blob(it->first.first, bwt.block))
|
||||
{
|
||||
res.blocks.clear();
|
||||
res.output_indices.clear();
|
||||
|
@ -89,11 +86,11 @@ namespace rpc
|
|||
res.error_details = "incorrect number of transactions retrieved for block";
|
||||
return;
|
||||
}
|
||||
std::list<transaction> txs;
|
||||
for (const auto& blob : it->second)
|
||||
std::vector<transaction> txs;
|
||||
for (const auto& p : it->second)
|
||||
{
|
||||
txs.resize(txs.size() + 1);
|
||||
if (!parse_and_validate_tx_from_blob(blob, txs.back()))
|
||||
if (!parse_and_validate_tx_from_blob(p.second, txs.back()))
|
||||
{
|
||||
res.blocks.clear();
|
||||
res.output_indices.clear();
|
||||
|
@ -163,10 +160,10 @@ namespace rpc
|
|||
|
||||
void DaemonHandler::handle(const GetTransactions::Request& req, GetTransactions::Response& res)
|
||||
{
|
||||
std::list<cryptonote::transaction> found_txs;
|
||||
std::list<crypto::hash> missed_hashes;
|
||||
std::vector<cryptonote::transaction> found_txs_vec;
|
||||
std::vector<crypto::hash> missed_vec;
|
||||
|
||||
bool r = m_core.get_transactions(req.tx_hashes, found_txs, missed_hashes);
|
||||
bool r = m_core.get_transactions(req.tx_hashes, found_txs_vec, missed_vec);
|
||||
|
||||
// TODO: consider fixing core::get_transactions to not hide exceptions
|
||||
if (!r)
|
||||
|
@ -176,20 +173,7 @@ namespace rpc
|
|||
return;
|
||||
}
|
||||
|
||||
size_t num_found = found_txs.size();
|
||||
|
||||
// std::list is annoying
|
||||
std::vector<cryptonote::transaction> found_txs_vec
|
||||
{
|
||||
std::make_move_iterator(std::begin(found_txs)),
|
||||
std::make_move_iterator(std::end(found_txs))
|
||||
};
|
||||
|
||||
std::vector<crypto::hash> missed_vec
|
||||
{
|
||||
std::make_move_iterator(std::begin(missed_hashes)),
|
||||
std::make_move_iterator(std::end(missed_hashes))
|
||||
};
|
||||
size_t num_found = found_txs_vec.size();
|
||||
|
||||
std::vector<uint64_t> heights(num_found);
|
||||
std::vector<bool> in_pool(num_found, false);
|
||||
|
@ -204,7 +188,7 @@ namespace rpc
|
|||
// if any missing from blockchain, check in tx pool
|
||||
if (!missed_vec.empty())
|
||||
{
|
||||
std::list<cryptonote::transaction> pool_txs;
|
||||
std::vector<cryptonote::transaction> pool_txs;
|
||||
|
||||
m_core.get_pool_transactions(pool_txs);
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ BEGIN_RPC_MESSAGE_CLASS(GetHashesFast);
|
|||
RPC_MESSAGE_MEMBER(uint64_t, start_height);
|
||||
END_RPC_MESSAGE_REQUEST;
|
||||
BEGIN_RPC_MESSAGE_RESPONSE;
|
||||
RPC_MESSAGE_MEMBER(std::list<crypto::hash>, hashes);
|
||||
RPC_MESSAGE_MEMBER(std::vector<crypto::hash>, hashes);
|
||||
RPC_MESSAGE_MEMBER(uint64_t, start_height);
|
||||
RPC_MESSAGE_MEMBER(uint64_t, current_height);
|
||||
END_RPC_MESSAGE_RESPONSE;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue