plebble
daemon.h
Go to the documentation of this file.
1 /*
2 -------------------------------------------------------------------------------
3  PLEBBLE
4 -------------------------------------------------------------------------------
5  Copyright (C) 2019-2020 KATLAS Technology. (http://katlastechnology.com)
6  Copyright (C) 2017-2020 Marcos Mayorga. (mm@mm-studios.com)
7 
8  This file is part of our Plebble(R) Platform.
9 
10  The code below cannot be copied, used for any purpose other than the one
11  agreed and/or distributed without the express permission of
12  KATLAS Technology.
13 -------------------------------------------------------------------------------
14 
15 
16 */
17 #ifndef USGOV_bf993116c1d89300316c0dd4fa2ef165d5b9128da89d33c44cfe50e95622fce8
18 #define USGOV_bf993116c1d89300316c0dd4fa2ef165d5b9128da89d33c44cfe50e95622fce8
19 
20 #include <us/gov/auth/daemon.h>
21 #include <us/gov/crypto/ec.h>
22 #include <us/gov/socket/client.h>
23 #include <vector>
24 #include <thread>
25 #include <iostream>
26 #include <random>
27 #include <algorithm>
28 #include <sstream>
29 #include <chrono>
30 #include <cassert>
31 #include "peer_t.h"
32 #include <functional>
33 #include <tuple>
34 #include <unordered_set>
35 #include <atomic>
36 #include <us/gov/bgtask.h>
37 #include <us/gov/config.h>
38 
39 namespace us { namespace gov {
40 namespace peer {
41  using namespace std;
42  using socket::datagram;
43  struct daemon;
44 
45  struct mezzanine: bgtask {
46  typedef bgtask b;
47  mezzanine(daemon*);
49  };
50 
52  typedef auth::daemon b;
53  typedef peer::mezzanine t;
56  typedef keys::pub_t pub_t;
58 
59  daemon();
60  daemon(uint16_t port, uint16_t pport, uint8_t edges, uint8_t devices, uint8_t workers);
61  ~daemon() override;
62  void dump(const string& prefix, ostream&) const;
63  void visit(const function<void(socket::client&)>& visitor);
64  vector<pair<uint32_t,uint16_t>> list_neighbours() const;
65  vector<pair<uint32_t,uint16_t>> list_dev_neighbours() const;
66  void purge_idle();
67  ko start() override;
68  ko wait_ready(const chrono::system_clock::time_point& deadline) const override;
69  void stop() override;
70  void join() override;
71  bool is_active() const { return t::is_active(); }
72  inline void wakeup() { b::wakeup(); }
73  inline bool isup() const { return b::isup(); }
74  void wait();
75  void dump_random_nodes(size_t num, ostream&os) const;
76  bool lookup_node(const hash_t& p, ostream& os) const;
77  void on_destroy(client&) override;
78  bool process_work(socket::peer_t *p, datagram*d) override;
79  virtual void remote_port(const crypto::ec::keys::pub_t&, uint16_t port) {};
81 
82  struct account_t {
83  account_t() {} // fields contain garbage. think efficiency before initializing them for no reason other than your obssession of keeping everything under over-control.
84  account_t(uint32_t net_address, uint16_t port, uint16_t seen);
85  account_t(const account_t& other);
86  account_t& operator =(int zero);
87  bool operator == (const account_t& other) const;
88  account_t& operator = (const account_t& other);
89  void to_stream(ostream& os) const;
90  void from_stream(istream& os);
91  void from_stream_prev(istream& os);
92  void dump(ostream&) const;
95  void dump_as_seeds(ostream&) const;
96  ko check() const;
97 
98  uint32_t net_address;
99  uint16_t port;
100  uint16_t seen;
101  //int8_t distance{-1}; //0 closed, >0 ms roundtrip latency;
102  };
103 
104  struct nodes_t: map<hash_t,account_t> {
107  void to_stream(ostream& os) const;
108  void from_stream(istream& os);
109  void from_stream_prev(istream& os);
110  void dump(const string& prefix, ostream&) const;
113  void dump_as_seeds(ostream&) const;
115  static ko check(const hash_t& id, const account_t&);
116  };
117 
118  struct grid_t:vector<client*> {
119  grid_t(): bi(end()) {}
120  bool add(client&, bool check_unique);
121  bool ended(client*);
122  void dump(ostream&) const;
123  void watch(ostream&) const;
124  socket::client* prepare_worker_send(unordered_set<const socket::client*>& visited);
125  bool find(const hash_t&) const;
126  int num_edges_minage(int secs_old) const;
127 
128  iterator bi;
129  mutable mutex mx;
130 
131  struct faillog_t:deque<string> {
132  mutable mutex mx;
133  void add(uint32_t a, uint16_t p);
134  void dump(ostream& os) const;
135  };
137  };
138 
139  #ifdef CFG_TOPOLOGY_MESH
140  virtual bool wait_rnd_before_start() const { return true; }
141  #endif
142 
143  //------ ring/mesh implementations
145  void run();
146  void onwakeup();
147  //----/- ring/mesh implementations
148 
154  void grid_setcur();
156  client* grid_connect(uint32_t netaddr, uint16_t port);
157  bool grid_connect_test(peer::peer_t*p, uint32_t netaddr, uint16_t port,ostream& os);
158  inline nodes_t& get_nodes() { return nodes; }
159  inline const nodes_t& get_nodes() const { return nodes; }
160 
161  client* cli{nullptr};
162  mutable mutex mx_nodes;
163  mutex mx_hall;
167  uint8_t edges;
169  private:
171 
172  public:
173  condition_variable cv;
175  chrono::system_clock::time_point tlo;
176  bool force_seeds{false};
178  };
179 
180 }
181 }}
182 
183 #endif
184 
us::gov::peer::daemon::add_seed_node
ko add_seed_node(const pair< uint32_t, uint16_t > &)
us::gov::peer::daemon::edges
uint8_t edges
Definition: daemon.h:167
us::gov::peer::daemon::account_t::hash_data
void hash_data(crypto::ripemd160 &) const
us::gov::peer::daemon::seed_nodes
nodes_t seed_nodes
Definition: daemon.h:165
us::gov::peer::daemon::grid_t::bi
iterator bi
Definition: daemon.h:128
us::gov::peer::daemon::account_t::hash_data_to_sign
void hash_data_to_sign(crypto::ec::sigmsg_hasher_t &) const
us::gov::peer::daemon::mx_hall
mutex mx_hall
Definition: daemon.h:163
us::gov::peer::daemon::cv
condition_variable cv
Definition: daemon.h:173
bgtask.h
us::gov::peer::daemon::list_neighbours
vector< pair< uint32_t, uint16_t > > list_neighbours() const
us::gov::peer::daemon::hash_t
pub_t::hash_t hash_t
Definition: daemon.h:57
us::gov::peer::daemon::lookup_node
bool lookup_node(const hash_t &p, ostream &os) const
us::gov::peer::daemon::grid_t::find
bool find(const hash_t &) const
us::gov::peer::daemon::wakeup
void wakeup()
Definition: daemon.h:72
us::gov::socket::client
Definition: client.h:44
us::gov::peer::daemon::nodes_t::hash_data
void hash_data(crypto::ripemd160 &) const
us.ko
Definition: ko.java:20
us::gov::peer::daemon::purge_idle
void purge_idle()
us::gov::peer::daemon::on_destroy
void on_destroy(client &) override
us
Definition: daemon.h:22
us::gov::crypto::ripemd160::value_type
Definition: ripemd160.h:38
us::gov::peer::daemon::grid_t::faillog_t
Definition: daemon.h:131
us::gov::peer::mezzanine::b
bgtask b
Definition: daemon.h:46
us::gov::peer::daemon::nodes_t::to_stream
void to_stream(ostream &os) const
us::gov::peer::daemon::nodes_t::from_stream
void from_stream(istream &os)
us::gov::peer::daemon::list_dev_neighbours
vector< pair< uint32_t, uint16_t > > list_dev_neighbours() const
us::gov::peer::daemon::dump_random_nodes
void dump_random_nodes(size_t num, ostream &os) const
us::gov::peer::daemon::account_t::dump
void dump(ostream &) const
us::gov::peer::daemon::run
void run()
us::gov::peer::daemon::disconnect_one
void disconnect_one()
us::gov::peer::daemon::grid
grid_t grid
Definition: daemon.h:168
us::gov::peer::daemon::remote_port
virtual void remote_port(const crypto::ec::keys::pub_t &, uint16_t port)
Definition: daemon.h:79
us::gov::peer::daemon::account_t::check
ko check() const
us.tuple
Definition: tuple.java:19
us::gov::peer::daemon::grid_dev
grid_t grid_dev
Definition: daemon.h:177
us::gov::peer::daemon::set_nodes
void set_nodes(const vector< pair< hash_t, pair< uint32_t, uint16_t >>> &)
us::gov::crypto::ec::keys::pub_t
Definition: ec.h:44
us::gov::peer::daemon::test_connectivity
void test_connectivity()
us::gov::peer::daemon::tlo
chrono::system_clock::time_point tlo
Definition: daemon.h:175
us::gov::peer::daemon::wait_ready
ko wait_ready(const chrono::system_clock::time_point &deadline) const override
us::gov::peer::daemon::account_t::seen
uint16_t seen
Definition: daemon.h:100
us::gov::socket::datagram
Definition: datagram.h:44
us::gov::peer::daemon::grid_t::watch
void watch(ostream &) const
us::gov::crypto::sha256
Definition: sha256.h:33
us::gov::peer::daemon::grid_t::dump
void dump(ostream &) const
us::gov::peer::daemon::grid_t::faillog_t::mx
mutex mx
Definition: daemon.h:132
us::gov::peer::daemon::daemon
daemon(uint16_t port, uint16_t pport, uint8_t edges, uint8_t devices, uint8_t workers)
us::gov::peer::daemon::grid_t::num_edges_minage
int num_edges_minage(int secs_old) const
us::gov::peer::daemon::account_t::account_t
account_t(uint32_t net_address, uint16_t port, uint16_t seen)
us::gov::peer::daemon::nodes_t::index_type
hash_t index_type
Definition: daemon.h:106
us::gov::peer::daemon::grid_t::prepare_worker_send
socket::client * prepare_worker_send(unordered_set< const socket::client * > &visited)
us::gov::peer::daemon::is_active
bool is_active() const
Definition: daemon.h:71
us::gov::peer::daemon::account_t::port
uint16_t port
Definition: daemon.h:99
us::gov::peer::daemon::grid_connect_test
bool grid_connect_test(peer::peer_t *p, uint32_t netaddr, uint16_t port, ostream &os)
us::gov::peer::daemon::mx_nodes
mutex mx_nodes
Definition: daemon.h:162
us::gov::peer::daemon::get_nodes
nodes_t & get_nodes()
Definition: daemon.h:158
us::gov::peer::daemon::~daemon
~daemon() override
us::gov::peer::daemon::nodes_t
Definition: daemon.h:104
us::gov::peer::daemon::nodes_t::collect_as_wallet_endpoints
void collect_as_wallet_endpoints(vector< tuple< hash_t, uint32_t, uint16_t >> &) const
us::gov::peer::peer_t
Definition: peer_t.h:38
us::gov::id::daemon
Definition: daemon.h:28
us::gov::peer::daemon::get_nodes
const nodes_t & get_nodes() const
Definition: daemon.h:159
us::gov::peer::daemon::account_t
Definition: daemon.h:82
peer_t.h
us::gov::peer::daemon::add_seed_node_
ko add_seed_node_(const pair< uint32_t, uint16_t > &)
us::gov::peer::daemon::b
auth::daemon b
Definition: daemon.h:52
us::gov::peer::daemon::t
peer::mezzanine t
Definition: daemon.h:53
us::gov::peer::daemon::nodes_t::account_type
account_t account_type
Definition: daemon.h:105
us::gov::peer::daemon::join
void join() override
us::gov::peer::daemon::process_work
bool process_work(socket::peer_t *p, datagram *d) override
us::gov::peer::daemon::account_t::account_t
account_t()
Definition: daemon.h:83
us::gov::peer::daemon::account_t::to_stream
void to_stream(ostream &os) const
us::gov::peer::daemon::pub_t
keys::pub_t pub_t
Definition: daemon.h:56
us::gov::crypto::ripemd160
Definition: ripemd160.h:34
us::gov::peer::daemon::wait
void wait()
us::gov::peer::daemon::visit
void visit(const function< void(socket::client &)> &visitor)
us::gov::peer::daemon::add_node_
ko add_node_(const pair< hash_t, pair< uint32_t, uint16_t >> &)
us::gov::peer::daemon::account_t::net_address
uint32_t net_address
Definition: daemon.h:98
us::gov::peer::daemon::set_seed_nodes
void set_seed_nodes(const vector< pair< uint32_t, uint16_t >> &)
us::gov::peer::daemon::isup
bool isup() const
Definition: daemon.h:73
us::gov::socket::peer_t
Definition: peer_t.h:28
us::gov::peer::daemon::grid_t::ended
bool ended(client *)
std
Definition: app.h:380
us::gov::peer::daemon::myself
hash_t myself
Definition: daemon.h:174
us::gov::peer::daemon::account_t::from_stream
void from_stream(istream &os)
us::gov::peer::daemon::mx_seed_nodes
mutex mx_seed_nodes
Definition: daemon.h:166
us::gov::crypto::ec::keys
Definition: ec.h:43
us::gov::peer::daemon::grid_t::faillog_t::add
void add(uint32_t a, uint16_t p)
us::gov::peer::daemon::daemon
daemon()
config.h
us::gov::peer::daemon::grid_connect
client * grid_connect(uint32_t netaddr, uint16_t port)
us::gov::peer::mezzanine::d
daemon * d
Definition: daemon.h:48
us::gov::peer::daemon::stop
void stop() override
us::gov::peer::daemon::nodes_t::dump
void dump(const string &prefix, ostream &) const
us::gov::peer::daemon::keys
crypto::ec::keys keys
Definition: daemon.h:55
us::gov::peer::daemon::account_t::dump_as_seeds
void dump_as_seeds(ostream &) const
daemon.h
us::gov::peer::mezzanine
Definition: daemon.h:45
us::gov::peer::daemon::account_t::from_stream_prev
void from_stream_prev(istream &os)
us::gov::peer::daemon::dump
void dump(const string &prefix, ostream &) const
us::gov::peer::daemon::grid_t::faillog
faillog_t faillog
Definition: daemon.h:136
us::gov::peer::daemon::account_t::account_t
account_t(const account_t &other)
us::gov::peer::daemon::grid_t::add
bool add(client &, bool check_unique)
us::gov::peer::daemon::grid_t::grid_t
grid_t()
Definition: daemon.h:119
us.pair
Definition: pair.java:19
us::gov::peer::daemon::grid_t::mx
mutex mx
Definition: daemon.h:129
ec.h
us::gov::peer::daemon::nodes_t::from_stream_prev
void from_stream_prev(istream &os)
us::gov::peer::daemon::grid_rotate
void grid_rotate(nodes_t &)
us::gov::peer::daemon::nodes_t::dump_as_seeds
void dump_as_seeds(ostream &) const
us::gov::peer::daemon
Definition: daemon.h:51
us::gov::peer::daemon::grid_t
Definition: daemon.h:118
client.h
us::gov::peer::daemon::nodes
nodes_t nodes
Definition: daemon.h:170
us::gov::peer::daemon::client
socket::client client
Definition: daemon.h:54
us::gov::peer::daemon::grid_setcur
void grid_setcur()
us::gov::peer::daemon::nodes_t::hash_data_to_sign
void hash_data_to_sign(crypto::ec::sigmsg_hasher_t &) const
us::gov::peer::daemon::hall
nodes_t hall
Definition: daemon.h:164
us::gov::bgtask
Definition: bgtask.h:31
us::gov::peer::daemon::start
ko start() override
us::gov::peer::daemon::grid_t::faillog_t::dump
void dump(ostream &os) const
us::gov::peer::daemon::onwakeup
void onwakeup()
us::gov::peer::daemon::nodes_t::check
static ko check(const hash_t &id, const account_t &)