2019-04-08 04:03:47 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <random>
|
2023-04-13 15:50:13 +02:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "service_node_rules.h"
|
2019-04-08 04:03:47 +02:00
|
|
|
|
|
|
|
namespace service_nodes {
|
2023-04-13 15:50:13 +02:00
|
|
|
inline constexpr uint64_t MAX_ID = UNASSIGNED_SWARM_ID - 1;
|
2021-04-19 04:43:17 +02:00
|
|
|
|
2023-04-13 15:50:13 +02:00
|
|
|
using swarm_snode_map_t = std::map<swarm_id_t, std::vector<crypto::public_key>>;
|
|
|
|
struct swarm_size {
|
|
|
|
swarm_id_t swarm_id;
|
|
|
|
size_t size;
|
|
|
|
};
|
|
|
|
struct excess_pool_snode {
|
|
|
|
crypto::public_key public_key;
|
|
|
|
swarm_id_t swarm_id;
|
|
|
|
};
|
2019-04-08 04:03:47 +02:00
|
|
|
|
2023-04-13 15:50:13 +02:00
|
|
|
uint64_t get_new_swarm_id(const swarm_snode_map_t& swarm_to_snodes);
|
2021-04-19 04:43:17 +02:00
|
|
|
|
2023-04-13 15:50:13 +02:00
|
|
|
void calc_swarm_changes(swarm_snode_map_t& swarm_to_snodes, uint64_t seed);
|
2019-04-08 04:03:47 +02:00
|
|
|
|
|
|
|
#ifdef UNIT_TEST
|
2023-04-13 15:50:13 +02:00
|
|
|
size_t calc_excess(const swarm_snode_map_t& swarm_to_snodes);
|
|
|
|
size_t calc_threshold(const swarm_snode_map_t& swarm_to_snodes);
|
|
|
|
crypto::public_key steal_from_excess_pool(swarm_snode_map_t& swarm_to_snodes, std::mt19937_64& mt);
|
|
|
|
void create_new_swarm_from_excess(swarm_snode_map_t& swarm_to_snodes, std::mt19937_64& mt);
|
|
|
|
void calc_swarm_sizes(
|
|
|
|
const swarm_snode_map_t& swarm_to_snodes, std::vector<swarm_size>& sorted_swarm_sizes);
|
|
|
|
void assign_snodes(
|
|
|
|
const std::vector<crypto::public_key>& snode_pubkeys,
|
|
|
|
swarm_snode_map_t& swarm_to_snodes,
|
|
|
|
std::mt19937_64& mt,
|
|
|
|
size_t percentile);
|
|
|
|
void get_excess_pool(
|
|
|
|
size_t threshold,
|
|
|
|
const swarm_snode_map_t& swarm_to_snodes,
|
|
|
|
std::vector<excess_pool_snode>& pool_snodes,
|
|
|
|
size_t& excess);
|
|
|
|
const excess_pool_snode& pick_from_excess_pool(
|
|
|
|
const std::vector<excess_pool_snode>& excess_pool, std::mt19937_64& mt);
|
|
|
|
void remove_excess_snode_from_swarm(
|
|
|
|
const excess_pool_snode& excess_snode, swarm_snode_map_t& swarm_to_snodes);
|
2019-04-08 04:03:47 +02:00
|
|
|
#endif
|
2023-04-13 15:50:13 +02:00
|
|
|
} // namespace service_nodes
|