Clear crypto derivation/key cache when a block is found

This commit is contained in:
SChernykh 2021-09-27 13:28:23 +02:00
parent 4fce76576f
commit 4bcaa41c8e
4 changed files with 18 additions and 2 deletions

View file

@ -227,6 +227,14 @@ public:
return true; return true;
} }
void clear()
{
MutexLock lock(m);
derivations.clear();
public_keys.clear();
}
private: private:
uv_mutex_t m; uv_mutex_t m;
std::unordered_map<std::array<uint8_t, HASH_SIZE * 2>, hash> derivations; std::unordered_map<std::array<uint8_t, HASH_SIZE * 2>, hash> derivations;
@ -245,4 +253,9 @@ bool derive_public_key(const hash& derivation, size_t output_index, const hash&
return cache.get_public_key(derivation, output_index, base, derived_key); return cache.get_public_key(derivation, output_index, base, derived_key);
} }
void clear_crypto_cache()
{
cache.clear();
}
} // namespace p2pool } // namespace p2pool

View file

@ -23,5 +23,6 @@ void generate_keys(hash& pub, hash& sec);
bool check_keys(const hash& pub, const hash& sec); bool check_keys(const hash& pub, const hash& sec);
bool generate_key_derivation(const hash& key1, const hash& key2, hash& derivation); bool generate_key_derivation(const hash& key1, const hash& key2, hash& derivation);
bool derive_public_key(const hash& derivation, size_t output_index, const hash& base, hash& derived_key); bool derive_public_key(const hash& derivation, size_t output_index, const hash& base, hash& derived_key);
void clear_crypto_cache();
} // namespace p2pool } // namespace p2pool

View file

@ -1055,6 +1055,8 @@ void p2pool::api_update_stats_mod()
void p2pool::api_update_block_found(const ChainMain* data) void p2pool::api_update_block_found(const ChainMain* data)
{ {
clear_crypto_cache();
if (!m_api) { if (!m_api) {
return; return;
} }

View file

@ -126,7 +126,7 @@ namespace std {
template<> template<>
struct hash<p2pool::hash> struct hash<p2pool::hash>
{ {
FORCEINLINE size_t operator()(const p2pool::hash& value) const FORCEINLINE size_t operator()(const p2pool::hash& value) const noexcept
{ {
uint64_t result = 0xcbf29ce484222325ull; uint64_t result = 0xcbf29ce484222325ull;
for (size_t i = 0; i < p2pool::HASH_SIZE; ++i) { for (size_t i = 0; i < p2pool::HASH_SIZE; ++i) {
@ -139,7 +139,7 @@ struct hash<p2pool::hash>
template<size_t N> template<size_t N>
struct hash<std::array<uint8_t, N>> struct hash<std::array<uint8_t, N>>
{ {
FORCEINLINE size_t operator()(const std::array<uint8_t, N>& value) const FORCEINLINE size_t operator()(const std::array<uint8_t, N>& value) const noexcept
{ {
uint64_t result = 0xcbf29ce484222325ull; uint64_t result = 0xcbf29ce484222325ull;
for (size_t i = 0; i < N; ++i) { for (size_t i = 0; i < N; ++i) {