30 #ifndef ELECTRONEUM_VALIDATORS_H
31 #define ELECTRONEUM_VALIDATORS_H
33 #include <boost/algorithm/hex.hpp>
36 #include "include_base_utils.h"
37 #include "net/http_client.h"
38 #include "storages/http_abstract_invoke.h"
39 #include "storages/portable_storage.h"
42 #include "math_helper.h"
48 using namespace std::chrono;
49 using namespace boost::algorithm;
50 using namespace epee::math_helper;
83 Validator(
const string &publicKey, uint64_t startHeight, uint64_t endHeight,
string name =
"",
string domain =
"",
string page_link =
"");
86 return this->publicKey;
90 return this->startHeight;
94 return this->endHeight;
98 this->endHeight = end_height;
102 return height >= this->startHeight && (
height <= this->endHeight || this->endHeight == 0);
114 this->domain = domain;
122 this->page_link = page_link;
126 return this->page_link;
141 vector<std::unique_ptr<Validator>>
list;
144 string endpoint_addr =
"vl.electroneum.com";
145 string endpoint_port =
"80";
146 string testnet_endpoint_addr =
"vl.thesecurityteam.rocks";
147 string testnet_endpoint_port =
"80";
148 milliseconds endpoint_timeout = milliseconds(10000);
152 uint32_t timeout = 60*60*12;
153 uint32_t timeout_grace_period = this->timeout * 0.1;
156 bool testnet =
false;
160 void add(
const string &key, uint64_t startHeight, uint64_t endHeight,
string name =
"",
string domain =
"",
string page_link =
"");
161 void addOrUpdate(
const string &key, uint64_t startHeight, uint64_t endHeight,
string name =
"",
string domain =
"",
string page_link =
"");
162 void update(
const string &key, uint64_t endHeight,
string name =
"",
string domain =
"",
string page_link =
"");
163 std::unique_ptr<Validator> find(
const string &key);
164 bool exists(
const string &key);
170 testnet ? this->http_client.set_server(this->testnet_endpoint_addr, this->testnet_endpoint_port, boost::none) :
171 this->http_client.set_server(this->endpoint_addr, this->endpoint_port, boost::none);
172 this->testnet = testnet;
173 this->m_p2p = pprotocol;
178 all_of(this->list.begin(), this->list.end(), [&
height, &keys, &convert_to_byte](std::unique_ptr<Validator> &v) {
179 if (v->isWithinRange(height)) {
180 const string k = convert_to_byte ? unhex(v->getPublicKey()) : v->getPublicKey();
190 all_of(this->list.begin(), this->list.end(), [&key, &result](std::unique_ptr<Validator> &v) {
191 if (v->getPublicKey() == key) {
192 result = v->getValidatorInfo();
206 if (!get_http_json(
"/", res, this->http_client)) {
207 LOG_PRINT_L1(
"Unable to get validator_list json from " << this->endpoint_addr <<
":" << this->endpoint_port);
210 this->timeout = 60*60*24;
214 MGINFO(
"Validators list loaded from JSON endpoint! Refresh in 12 hours");
220 this->timeout = 60*60*1;
221 MGINFO(
"Validators list loaded from peers! Refresh in 1 hour");
227 LOG_PRINT_L1(
"Validator List Grace Period");
233 string v = m_db.get_validator_list();
235 this->timeout = 60*60*1;
238 MGINFO(
"Validators list loaded from database! Refresh in 1 hour");
256 return this->serialized_v_list;
261 load_t_from_json(res, v_list);
263 return validate_and_update(res, saveToDB, isEmergencyUpdate);
uint64_t height
Definition: blockchain.cpp:91
The BlockchainDB backing store interface declaration/contract.
Definition: blockchain_db.h:344
Definition: validators.h:72
uint64_t startHeight
Definition: validators.h:75
const string getPublicKey()
Definition: validators.h:85
string page_link
Definition: validators.h:79
void setPageLink(string page_link)
Definition: validators.h:121
uint64_t getStartHeight()
Definition: validators.h:89
void setDomain(string domain)
Definition: validators.h:113
uint64_t endHeight
Definition: validators.h:76
bool isWithinRange(uint64_t height)
Definition: validators.h:101
void setName(string name)
Definition: validators.h:105
string getName()
Definition: validators.h:109
string domain
Definition: validators.h:78
string publicKey
Definition: validators.h:74
Validator(const string &publicKey, uint64_t startHeight, uint64_t endHeight, string name="", string domain="", string page_link="")
uint64_t getEndHeight()
Definition: validators.h:93
string getdomain()
Definition: validators.h:117
Validator getValidatorInfo()
Definition: validators.h:129
string name
Definition: validators.h:77
string getPageLink()
Definition: validators.h:125
void setEndHeight(uint64_t end_height)
Definition: validators.h:97
Definition: validators.h:139
cryptonote::i_cryptonote_protocol * m_p2p
Definition: validators.h:158
void on_idle()
Definition: validators.h:278
list_update_outcome setValidatorsList(const string &v_list, bool saveToDB, bool isEmergencyUpdate=false)
Definition: validators.h:259
Validator getValidatorByKey(string key)
Definition: validators.h:188
string serialized_v_list
Definition: validators.h:149
bool isEnabled()
Definition: validators.h:270
cryptonote::BlockchainDB & m_db
Definition: validators.h:155
bool isValid()
Definition: validators.h:266
Validators(cryptonote::BlockchainDB &db, cryptonote::i_cryptonote_protocol *pprotocol, bool testnet)
Definition: validators.h:169
bool loadValidatorsList()
Definition: validators.h:199
string getSerializedValidatorList()
Definition: validators.h:250
vector< std::unique_ptr< Validator > > list
Definition: validators.h:141
void enable()
Definition: validators.h:274
once_a_time_seconds< 60, true > m_load_validators_interval
Definition: validators.h:154
vector< string > getApplicablePublicKeys(uint64_t height, bool convert_to_byte=false)
Definition: validators.h:176
uint64_t current_list_timestamp
Definition: validators.h:142
epee::net_utils::http::http_simple_client http_client
Definition: validators.h:143
time_t last_updated
Definition: validators.h:151
const char * name
Definition: simplewallet.cpp:400
ValidatorsState
Definition: validators.h:53
list_update_outcome
Definition: validators.h:61
Definition: validators.cpp:35
Definition: i2p_address.h:42
static void add(ge_p3 &p3, const ge_cached &other)
Definition: multiexp.cc:143
Definition: blockchain_ancestry.cpp:73
Definition: cryptonote_protocol_handler_common.h:43
Definition: validators_commands_defs.h:67
Definition: validators_commands_defs.h:72