Merge pull request #7154
cf7e1571d
protocol: reject claimed block hashes that already are in the chain (moneromooo-monero)af0a25544
protocol: drop peers we can't download anything from in sync mode (moneromooo-monero)
This commit is contained in:
commit
609dbe6b92
|
@ -2298,30 +2298,16 @@ skip:
|
|||
return true;
|
||||
}
|
||||
|
||||
// if we're still around, we might be at a point where the peer is pruned, so we could either
|
||||
// drop it to make space for other peers, or ask for a span further down the line
|
||||
const uint32_t next_stripe = get_next_needed_pruning_stripe().first;
|
||||
const uint32_t peer_stripe = tools::get_pruning_stripe(context.m_pruning_seed);
|
||||
const uint32_t local_stripe = tools::get_pruning_stripe(m_core.get_blockchain_pruning_seed());
|
||||
if (!(m_sync_pruned_blocks && peer_stripe == local_stripe) && next_stripe && peer_stripe && next_stripe != peer_stripe)
|
||||
// we can do nothing, so drop this peer to make room for others unless we think we've downloaded all we need
|
||||
const uint64_t blockchain_height = m_core.get_current_blockchain_height();
|
||||
if (std::max(blockchain_height, m_block_queue.get_next_needed_height(blockchain_height)) >= m_core.get_target_blockchain_height())
|
||||
{
|
||||
// at this point, we have to either close the connection, or start getting blocks past the
|
||||
// current point, or become dormant
|
||||
MDEBUG(context << "this peer is pruned at seed " << epee::string_tools::to_string_hex(context.m_pruning_seed) <<
|
||||
", next stripe needed is " << next_stripe);
|
||||
if (!context.m_is_income)
|
||||
{
|
||||
if (should_drop_connection(context, next_stripe))
|
||||
{
|
||||
m_p2p->add_used_stripe_peer(context);
|
||||
return false; // drop outgoing connections
|
||||
}
|
||||
}
|
||||
// we'll get back stuck waiting for the go ahead
|
||||
context.m_state = cryptonote_connection_context::state_normal;
|
||||
MLOG_PEER_STATE("Nothing to do for now, switching to normal state");
|
||||
return true;
|
||||
}
|
||||
MLOG_PEER_STATE("We can download nothing from this peer, dropping");
|
||||
return false;
|
||||
}
|
||||
|
||||
skip:
|
||||
|
@ -2562,6 +2548,8 @@ skip:
|
|||
}
|
||||
|
||||
std::unordered_set<crypto::hash> hashes;
|
||||
uint64_t height = arg.start_height;
|
||||
const uint64_t blockchain_height = m_core.get_current_blockchain_height();
|
||||
for (const auto &h: arg.m_block_ids)
|
||||
{
|
||||
if (!hashes.insert(h).second)
|
||||
|
@ -2570,6 +2558,17 @@ skip:
|
|||
drop_connection(context, true, false);
|
||||
return 1;
|
||||
}
|
||||
if (height < blockchain_height)
|
||||
{
|
||||
const crypto::hash block_in_chain = m_core.get_block_id_by_height(height);
|
||||
if ((height < context.m_expect_height - 1 && block_in_chain == h) || (height == context.m_expect_height - 1 && block_in_chain != h))
|
||||
{
|
||||
LOG_ERROR_CCONTEXT("sent existing block " << h << " at height " << height << ", expected height was " << context.m_expect_height << ", dropping connection");
|
||||
drop_connection(context, true, false);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
++height;
|
||||
}
|
||||
|
||||
uint64_t n_use_blocks = m_core.prevalidate_block_hashes(arg.start_height, arg.m_block_ids, arg.m_block_weights);
|
||||
|
|
|
@ -112,5 +112,6 @@ namespace tests
|
|||
bool prune_blockchain(uint32_t pruning_seed) const { return true; }
|
||||
bool get_txpool_complement(const std::vector<crypto::hash> &hashes, std::vector<cryptonote::blobdata> &txes) { return false; }
|
||||
bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const { return false; }
|
||||
crypto::hash get_block_id_by_height(uint64_t height) const { return crypto::null_hash; }
|
||||
};
|
||||
}
|
||||
|
|
|
@ -93,6 +93,7 @@ public:
|
|||
bool has_block_weights(uint64_t height, uint64_t nblocks) const { return false; }
|
||||
bool get_txpool_complement(const std::vector<crypto::hash> &hashes, std::vector<cryptonote::blobdata> &txes) { return false; }
|
||||
bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const { return false; }
|
||||
crypto::hash get_block_id_by_height(uint64_t height) const { return crypto::null_hash; }
|
||||
void stop() {}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue