plebble
app.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_ab4c3f8b32c28ebe389cd176419697be221f06c33dafc174ba9b3c3cf56ff3fe
18 #define USGOV_ab4c3f8b32c28ebe389cd176419697be221f06c33dafc174ba9b3c3cf56ff3fe
19 
20 #include <us/gov/peer.h>
21 #include <us/gov/socket.h>
22 #include "evidence.h"
23 
24 #include <vector>
25 #include <cassert>
26 #include <thread>
27 #include <chrono>
28 #include <mutex>
29 #include <us/gov/crypto.h>
30 
31 namespace us { namespace gov {
32 namespace engine {
33  using namespace std;
34  using socket::datagram;
35  struct peer_t;
36  struct local_delta;
37  struct delta;
38  struct block;
39  struct pow_t;
40  struct daemon;
41  struct block;
42 
43  struct app {
46 
47  struct local_delta {
50  virtual ~local_delta() {}
51  static local_delta* create(int id);
52  static local_delta* create(istream&);
53  static local_delta* create(int appid, istream&);
54  static local_delta* create_prev(int appid, istream&);
55 
56  virtual void to_stream(ostream&) const=0;
57  virtual void from_stream(istream&)=0;
58  virtual void from_stream_prev(istream&)=0;
60  virtual void hash_data(hasher_t&) const=0;
61 // virtual void dump(ostream&os) const=0;
62 
63  virtual int app_id() const=0;
65  };
66 
67  struct delta {
68  delta() {}
69  virtual ~delta() {}
70  static delta* create(int id);
71  static delta* create(istream&);
72  static delta* create(int id,istream&);
73  static delta* create_prev(int id,istream&);
74  virtual uint64_t merge(local_delta* other);
75  virtual void end_merge()=0;
76  virtual void to_stream(ostream&) const=0;
77  uint64_t multiplicity{0};
78  };
79 
80  app(daemon&e):demon(e) {}
81  virtual ~app() {}
82  virtual int get_id() const=0;
83  virtual string get_name() const=0;
84  virtual void clear()=0;
85  virtual void import(const delta&, const pow_t&)=0;
86  virtual void save_db(ostream&) const=0;
87  virtual bool load_db(istream&)=0;
88  virtual bool load_db_prev(istream&)=0;
89  virtual bool process(const evidence&)=0;
90  virtual bool process_query(peer_t *, datagram*) { return false; }
92  virtual bool shell_command(istream&, ostream&);
93  static unsigned int get_seed();
94 
95 
96  struct chaininfo_t {
97  chaininfo_t():last_delta_imported(0) {}
99  };
102  };
103 
104  template<typename D>
105  struct average_merger {
106  void merge(D& v1, const D& v2) const {
107  v1+=v2;
108  }
109  void end_merge(D& v, const uint64_t& multiplicity) const {
110  double m=multiplicity;
111  v/=m;
112  }
113  };
114 
115  template<typename D>
117  void merge(const D& v) {
118  auto i=m.find(v);
119  if (i!=m.end()) {
120  ++i->second;
121  return;
122  }
123  m.emplace(v,1);
124  }
125 
126  void end_merge(D& v) {
127  const D* x=0;
128  uint64_t z=0;
129  for (auto& i:m) {
130  if (i.second>z) {
131  z=i.second;
132  x=&i.first;
133  }
134  }
135  if (likely(z!=0)) v=*x;
136  else v=0;
137  m.clear();
138  }
139 
140  unordered_map<D,uint64_t> m;
141  };
142 
143 
144 }}
145 }
146 
147 #endif
148 
us::gov::engine::app::local_delta::create
static local_delta * create(istream &)
us::gov::engine::app::delta::create
static delta * create(int id)
us::gov::engine::app::delta::create
static delta * create(istream &)
us::gov::engine::app::local_delta::~local_delta
virtual ~local_delta()
Definition: app.h:50
us::gov::engine::app::local_delta::hasher_t
app::hasher_t hasher_t
Definition: app.h:48
us::gov::engine::app::hasher_t
crypto::ripemd160 hasher_t
Definition: app.h:44
us::gov::engine::average_merger::merge
void merge(D &v1, const D &v2) const
Definition: app.h:106
evidence.h
us::gov::engine::app::local_delta::create_prev
static local_delta * create_prev(int appid, istream &)
us::gov::engine::pow_t
Definition: diff.h:62
us::gov::engine::app::get_seed
static unsigned int get_seed()
us::gov::engine::app::local_delta::hash_data_to_sign
virtual void hash_data_to_sign(crypto::ec::sigmsg_hasher_t &) const =0
us::gov::engine::app::chaininfo_t::chaininfo_t
chaininfo_t()
Definition: app.h:97
us::gov::engine::app::local_delta
Definition: app.h:47
us::gov::engine::majority_merger
Definition: app.h:116
us::gov::dfs::peer_t
relay::peer_t peer_t
Definition: daemon.h:31
us
Definition: daemon.h:22
us::gov::crypto::ripemd160::value_type
Definition: ripemd160.h:38
us::gov::engine::app::delta::delta
delta()
Definition: app.h:68
us::gov::engine::app::load_db_prev
virtual bool load_db_prev(istream &)=0
us::gov::engine::app::delta
Definition: app.h:67
us::gov::engine::app::delta::end_merge
virtual void end_merge()=0
us::gov::engine::app::local_delta::app_id
virtual int app_id() const =0
us::gov::engine::app::local_delta::hash_t
app::hash_t hash_t
Definition: app.h:49
us::gov::engine::majority_merger::merge
void merge(const D &v)
Definition: app.h:117
us::gov::engine::app::create_local_delta
virtual local_delta * create_local_delta()=0
us::gov::engine::app::load_db
virtual bool load_db(istream &)=0
us::gov::engine::app::chaininfo
static chaininfo_t chaininfo
Definition: app.h:100
us::gov::engine::average_merger
Definition: app.h:105
us::gov::engine::app::hash_t
hasher_t::value_type hash_t
Definition: app.h:45
us::gov::engine::app::local_delta::from_stream
virtual void from_stream(istream &)=0
us::gov::socket::datagram
Definition: datagram.h:44
us::gov::crypto::sha256
Definition: sha256.h:33
us::gov::engine::app::delta::create_prev
static delta * create_prev(int id, istream &)
us::gov::engine::peer_t
Definition: peer_t.h:27
us::gov::auth::daemon
id::daemon daemon
Definition: daemon.h:25
us::gov::engine::app::process_query
virtual bool process_query(peer_t *, datagram *)
Definition: app.h:90
us::gov::engine::app
Definition: app.h:43
crypto.h
us::gov::engine::app::save_db
virtual void save_db(ostream &) const =0
us::gov::engine::majority_merger::end_merge
void end_merge(D &v)
Definition: app.h:126
us::gov::engine::app::delta::create
static delta * create(int id, istream &)
us::gov::engine::app::chaininfo_t::last_delta_imported
hash_t last_delta_imported
Definition: app.h:98
us::gov::engine::majority_merger::m
unordered_map< D, uint64_t > m
Definition: app.h:140
us::gov::engine::app::delta::merge
virtual uint64_t merge(local_delta *other)
us::gov::engine::daemon
Definition: daemon.h:71
us::gov::engine::app::shell_command
virtual bool shell_command(istream &, ostream &)
us::gov::engine::app::delta::to_stream
virtual void to_stream(ostream &) const =0
us::gov::crypto::ripemd160
Definition: ripemd160.h:34
us::gov::engine::app::get_id
virtual int get_id() const =0
peer.h
us::gov::engine::app::local_delta::create
static local_delta * create(int id)
us::gov::engine::app::local_delta::hash_data
virtual void hash_data(hasher_t &) const =0
likely
#define likely(x)
Definition: likely.h:29
us::gov::engine::app::~app
virtual ~app()
Definition: app.h:81
std
Definition: app.h:380
us::gov::engine::app::app
app(daemon &e)
Definition: app.h:80
us::gov::engine::app::local_delta::from_stream_prev
virtual void from_stream_prev(istream &)=0
us::gov::engine::average_merger::end_merge
void end_merge(D &v, const uint64_t &multiplicity) const
Definition: app.h:109
us::gov::engine::app::local_delta::to_stream
virtual void to_stream(ostream &) const =0
socket.h
us::gov::engine::app::demon
daemon & demon
Definition: app.h:101
us::gov::engine::app::get_name
virtual string get_name() const =0
us::gov::relay::evidence
Definition: evidence.h:31
us::gov::engine::app::delta::~delta
virtual ~delta()
Definition: app.h:69
us::gov::engine::app::clear
virtual void clear()=0
us::gov::engine::app::process
virtual bool process(const evidence &)=0
us::gov::engine::app::local_delta::compute_hash
hash_t compute_hash() const
us::gov::engine::app::chaininfo_t
Definition: app.h:96
us::gov::engine::app::local_delta::create
static local_delta * create(int appid, istream &)