Skip to content
Snippets Groups Projects
Commit e2cb0b6e authored by dmitriy.gerasimov's avatar dmitriy.gerasimov
Browse files

[*] DAG callbacks

parent 95c55df3
No related branches found
No related tags found
No related merge requests found
.gitignore 100644 → 100755
File mode changed from 100644 to 100755
CMakeLists.txt 100644 → 100755
File mode changed from 100644 to 100755
LICENSE 100644 → 100755
File mode changed from 100644 to 100755
README.md 100644 → 100755
File mode changed from 100644 to 100755
dap_chain_cs_dag.c 100644 → 100755
...@@ -22,20 +22,46 @@ ...@@ -22,20 +22,46 @@
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdint.h> #include <stdint.h>
#include <uthash.h>
#include "dap_common.h" #include "dap_common.h"
#include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag.h"
#define LOG_TAG "dap_chain_cs_dag" #define LOG_TAG "dap_chain_cs_dag"
typedef struct dap_chain_cs_dag_event_item {
dap_chain_hash_fast_t hash;
dap_chain_cs_dag_event_t *event;
UT_hash_handle hh;
} dap_chain_cs_dag_event_item_t;
typedef struct dap_chain_cs_dag_pvt { typedef struct dap_chain_cs_dag_pvt {
uint8_t padding; dap_chain_cs_dag_event_item_t * events;
dap_chain_cs_dag_event_item_t * events_round_new;
dap_chain_cs_dag_event_item_t * events_round_prev_lasts;
} dap_chain_cs_dag_pvt_t; } dap_chain_cs_dag_pvt_t;
#define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt ) #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
static int s_chain_callback_element_add(dap_chain_t * a_chain, void * a_data, size_t a_data_size);// Accept new element in chain // Atomic element organization callbacks
static int s_chain_callback_element_get_first(dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ); // Get the fisrt element from chain static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t *);// Accept new event in dag
static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ); // Get the next element from chain from the current one static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t *);// Verify new event in dag
static size_t s_chain_callback_atom_get_size(dap_chain_atom_t *);// Get dag event size
static size_t s_chain_callback_atom_get_static_hdr_size(dap_chain_t *);// Get dag event header size
static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); // Get the fisrt event from dag
static dap_chain_atom_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag
static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag
static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag
// Datum ops
static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain );
static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_iter );
static dap_chain_datum_t* s_chain_callback_datum_iter_get_first( dap_chain_datum_iter_t * a_datum_iter ); // Get the fisrt datum from dag
static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter ); // Get the next datum from dag
/** /**
* @brief dap_chain_cs_dag_init * @brief dap_chain_cs_dag_init
...@@ -43,6 +69,8 @@ static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_d ...@@ -43,6 +69,8 @@ static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_d
*/ */
int dap_chain_cs_dag_init() int dap_chain_cs_dag_init()
{ {
dap_chain_class_add( "dag", dap_chain_cs_dag_new );
return 0; return 0;
} }
...@@ -66,9 +94,25 @@ void dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) ...@@ -66,9 +94,25 @@ void dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
l_chain_cs_dag->chain = a_chain; l_chain_cs_dag->chain = a_chain;
a_chain->callback_delete = dap_chain_cs_dag_delete; a_chain->callback_delete = dap_chain_cs_dag_delete;
a_chain->callback_element_add = s_chain_callback_element_add; // Accept new element in chain
a_chain->callback_element_get_first = s_chain_callback_element_get_first; // Get the fisrt element from chain // Atom element callbacks
a_chain->callback_element_get_next = s_chain_callback_element_get_next; // Get the next element from chain from the current one a_chain->callback_atom_add = s_chain_callback_atom_add ; // Accept new element in chain
a_chain->callback_atom_verify = s_chain_callback_atom_add ; // Verify new element in chain
a_chain->callback_atom_get_size = s_chain_callback_atom_get_size; // Get dag event size
a_chain->callback_atom_get_static_hdr_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size
a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create;
a_chain->callback_atom_iter_delete = s_chain_callback_atom_iter_delete;
a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain
a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one
// Datum operations callbacks
a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create
a_chain->callback_datum_iter_delete = s_chain_callback_datum_iter_delete; // Datum iterator delete
a_chain->callback_datum_iter_get_first = s_chain_callback_datum_iter_get_first; // Get the fisrt datum from chain
a_chain->callback_datum_iter_get_next = s_chain_callback_datum_iter_get_next; // Get the next datum from chain from the current one
// Others
a_chain->_inheritor = l_chain_cs_dag; a_chain->_inheritor = l_chain_cs_dag;
log_it (L_NOTICE, "DAG chain initialized"); log_it (L_NOTICE, "DAG chain initialized");
...@@ -92,36 +136,124 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) ...@@ -92,36 +136,124 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
} }
/** /**
* @brief s_chain_callback_element_add Accept new element in chain * @brief s_chain_callback_atom_add Accept new event in dag
* @param a_chain * @param a_chain DAG object
* @param a_data * @param a_atom
* @param a_data_size * @return 0 if verified and added well, otherwise if not
*/ */
static int s_chain_callback_element_add(dap_chain_t * a_chain, void * a_data, size_t a_data_size) static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a_atom)
{ {
return -1; // TODO return -1; // TODO
} }
/** /**
* @brief s_chain_callback_element_get_first Get the fisrt element from chain * @brief s_chain_callback_atom_verify Verify atomic element
* @param a_chain * @param a_chain
* @param a_data * @param a_atom
* @param a_data_size * @return
* @return 0 if ok
*/ */
static int s_chain_callback_element_get_first(dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ) static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t * a_atom)
{ {
return -1; // TODO return -1; // TODO
} }
/** /**
* @brief s_chain_callback_element_get_next Get the next element from chain from the current one * @brief s_chain_callback_atom_get_size Get size of atomic element
* @param a_atom
* @return
*/
static size_t s_chain_callback_atom_get_size(dap_chain_atom_t * a_atom)
{
return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom);
}
/**
* @brief s_chain_callback_atom_get_static_hdr_size
* @param a_chain * @param a_chain
* @param a_data * @return
* @param a_data_size
* @return 0 if ok
*/ */
static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ) static size_t s_chain_callback_atom_get_static_hdr_size(dap_chain_t * a_chain)
{ {
return -1; // TODO return sizeof (dap_chain_class_dag_event_hdr_t);
}
/**
* @brief s_chain_callback_atom_iter_create Create atomic element iterator
* @param a_chain
* @return
*/
static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_atom_iter_get_first Get the first dag event
* @param a_atom_iter
* @return
*/
static dap_chain_atom_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_atom_iter_get_next Get the next dag event
* @param a_atom_iter
* @return
*/
static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_atom_iter_delete Delete dag event iterator
* @param a_atom_iter
*/
static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter )
{
// TODO
}
/**
* @brief s_chain_callback_datum_iter_create Create datum iterator
* @param a_chain
* @return
*/
static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_datum_iter_get_first Get the first datum
* @param a_datum_iter
* @return
*/
static dap_chain_datum_t* s_chain_callback_datum_iter_get_first(dap_chain_datum_iter_t * a_datum_iter )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_datum_iter_get_next Get the next dag event datum
* @param a_datum_iter
* @return
*/
static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter )
{
return NULL; // TODO
}
/**
* @brief s_chain_callback_datum_iter_delete Delete dag event datum iterator
* @param a_datum_iter
*/
static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_datum_iter )
{
// TODO
} }
File mode changed from 100644 to 100755
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
#include "dap_common.h" #include "dap_common.h"
#include "dap_enc_key.h" #include "dap_enc_key.h"
#include "dap_hash.h"
#include "dap_chain_sign.h" #include "dap_chain_sign.h"
#include "dap_chain_datum.h" #include "dap_chain_datum.h"
#include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag.h"
#include "dap_chain_cs_dag_event.h" #include "dap_chain_cs_dag_event.h"
......
...@@ -27,16 +27,19 @@ ...@@ -27,16 +27,19 @@
#include "dap_chain_common.h" #include "dap_chain_common.h"
#include "dap_chain_datum.h" #include "dap_chain_datum.h"
#include "dap_chain_sign.h" #include "dap_chain_sign.h"
#include "dap_hash.h"
typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
typedef struct dap_chain_cs_dag_event { typedef struct dap_chain_class_dag_event_hdr {
struct {
uint8_t version; uint8_t version;
uint64_t timestamp; uint64_t timestamp;
uint16_t hash_count; // Number of hashes uint16_t hash_count; // Number of hashes
uint16_t signs_count; // Number of signs nested with event uint16_t signs_count; // Number of signs nested with event
} header; } dap_chain_class_dag_event_hdr_t;
typedef struct dap_chain_cs_dag_event {
dap_chain_class_dag_event_hdr_t header;
uint8_t hashes_n_signs_n_datum[]; // Hashes, signes and datum uint8_t hashes_n_signs_n_datum[]; // Hashes, signes and datum
} dap_chain_cs_dag_event_t; } dap_chain_cs_dag_event_t;
...@@ -49,3 +52,33 @@ void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ ...@@ -49,3 +52,33 @@ void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event); dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event);
dap_chain_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number); dap_chain_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number);
/**
* @brief dap_chain_cs_dag_event_calc_size
* @param a_event
* @return
*/
static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event)
{
size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
uint8_t * l_signs = a_event->hashes_n_signs_n_datum
+l_hashes_size;
uint16_t l_signs_offset = 0;
uint16_t l_signs_passed;
for ( l_signs_passed=0; l_signs_passed < a_event->header.signs_count; l_signs_passed++){
dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_signs+l_signs_offset;
l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header);
}
dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_signs+l_signs_offset;
return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum->header.data_size;
}
/**
* @brief dap_chain_cs_dag_event_calc_hash
* @param a_event
* @param a_event_hash
*/
static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,dap_chain_hash_fast_t * a_event_hash)
{
dap_hash_fast(a_event, dap_chain_cs_dag_event_calc_size (a_event) , a_event_hash);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment