Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (56)
Showing
with 993 additions and 493 deletions
Subproject commit 59705ae76ca20b8ac1b8269ae67aa847ec73dfa9 Subproject commit dffb76d321e837c98157a691e7e9e352bb921511
...@@ -680,15 +680,19 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not ...@@ -680,15 +680,19 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
* @param a_atom_hash * @param a_atom_hash
* @return * @return
*/ */
bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cell_id) bool dap_chain_get_atom_last_hash_num(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, dap_hash_fast_t *a_atom_hash, uint64_t *a_atom_num)
{ {
dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id, false); dap_return_val_if_fail(a_atom_hash || a_atom_num, false);
dap_chain_atom_ptr_t *l_ptr_list = a_chain->callback_atom_iter_get_lasts(l_iter, NULL, NULL); dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id, NULL);
DAP_DEL_Z(l_ptr_list); if (!l_iter)
*a_atom_hash = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0}; return false;
bool l_ret = l_iter->cur_hash; a_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_LAST, NULL);
if (a_atom_hash)
*a_atom_hash = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0};
if (a_atom_num)
*a_atom_num = l_iter->cur_num;
a_chain->callback_atom_iter_delete(l_iter); a_chain->callback_atom_iter_delete(l_iter);
return l_ret; return true;
} }
struct chain_thread_notifier { struct chain_thread_notifier {
...@@ -716,13 +720,13 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato ...@@ -716,13 +720,13 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato
dap_chain_t *l_chain = a_chain_cell->chain; dap_chain_t *l_chain = a_chain_cell->chain;
if (a_new_atom_hash) { // Atom is new and need to be distributed for the net if (a_new_atom_hash) { // Atom is new and need to be distributed for the net
dap_cluster_t *l_net_cluster = dap_cluster_find(dap_cluster_guuid_compose(l_chain->net_id.uint64, 0)); dap_cluster_t *l_net_cluster = dap_cluster_find(dap_guuid_compose(l_chain->net_id.uint64, 0));
if (l_net_cluster) { if (l_net_cluster) {
size_t l_pkt_size = a_atom_size + sizeof(dap_chain_ch_pkt_t); size_t l_pkt_size = a_atom_size + sizeof(dap_chain_ch_pkt_t);
dap_chain_ch_pkt_t *l_pkt = dap_chain_ch_pkt_new(l_chain->net_id.uint64, l_chain->id.uint64, dap_chain_ch_pkt_t *l_pkt = dap_chain_ch_pkt_new(l_chain->net_id.uint64, l_chain->id.uint64,
a_chain_cell->id.uint64, a_atom, a_atom_size); a_chain_cell->id.uint64, a_atom, a_atom_size);
if (l_pkt) { if (l_pkt) {
dap_gossip_msg_issue(l_net_cluster, DAP_STREAM_CH_CHAIN_ID, l_pkt, l_pkt_size, a_new_atom_hash); dap_gossip_msg_issue(l_net_cluster, DAP_CHAIN_CH_ID, l_pkt, l_pkt_size, a_new_atom_hash);
DAP_DELETE(l_pkt); DAP_DELETE(l_pkt);
} }
} }
......
...@@ -347,12 +347,12 @@ ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell, const void *a_atom, ...@@ -347,12 +347,12 @@ ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell, const void *a_atom,
pthread_rwlock_unlock(&a_cell->storage_rwlock); pthread_rwlock_unlock(&a_cell->storage_rwlock);
return -4; return -4;
} }
dap_chain_atom_iter_t *l_atom_iter = a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id, 0); dap_chain_atom_iter_t *l_atom_iter = a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id, NULL);
dap_chain_atom_ptr_t l_atom; dap_chain_atom_ptr_t l_atom;
uint64_t l_atom_size = 0; uint64_t l_atom_size = 0;
for (l_atom = a_cell->chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); for (l_atom = a_cell->chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size);
l_atom && l_atom_size; l_atom && l_atom_size;
l_atom = a_cell->chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) l_atom = a_cell->chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_NEXT, &l_atom_size))
{ {
if (s_file_atom_add(a_cell, l_atom, l_atom_size)) { if (s_file_atom_add(a_cell, l_atom, l_atom_size)) {
l_err = true; l_err = true;
......
This diff is collapsed.
...@@ -35,7 +35,7 @@ size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint ...@@ -35,7 +35,7 @@ size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint
const void * a_data, size_t a_data_size) const void * a_data, size_t a_data_size)
{ {
dap_chain_ch_pkt_t *l_chain_pkt = dap_chain_ch_pkt_new(a_net_id, a_chain_id, a_cell_id, a_data, a_data_size); dap_chain_ch_pkt_t *l_chain_pkt = dap_chain_ch_pkt_new(a_net_id, a_chain_id, a_cell_id, a_data, a_data_size);
size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size); size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, dap_chain_ch_pkt_get_size(l_chain_pkt));
DAP_DELETE(l_chain_pkt); DAP_DELETE(l_chain_pkt);
return l_ret; return l_ret;
} }
...@@ -47,10 +47,11 @@ dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, ...@@ -47,10 +47,11 @@ dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id,
dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size);
if (l_chain_pkt) { if (l_chain_pkt) {
*l_chain_pkt = (dap_chain_ch_pkt_t) { *l_chain_pkt = (dap_chain_ch_pkt_t) {
.hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .hdr = { .version = DAP_CHAIN_CH_PKT_VERSION,
.data_size = a_data_size, .data_size = a_data_size,
.net_id.uint64 = a_net_id, .net_id.uint64 = a_net_id,
.cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } .cell_id.uint64 = a_cell_id,
.chain_id.uint64 = a_chain_id }
}; };
if (a_data_size && a_data) if (a_data_size && a_data)
memcpy(l_chain_pkt->data, a_data, a_data_size); memcpy(l_chain_pkt->data, a_data, a_data_size);
...@@ -79,7 +80,7 @@ size_t dap_chain_ch_pkt_write_mt(dap_stream_worker_t *a_worker, dap_stream_ch_uu ...@@ -79,7 +80,7 @@ size_t dap_chain_ch_pkt_write_mt(dap_stream_worker_t *a_worker, dap_stream_ch_uu
? DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size) ? DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size)
: DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); : DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size);
*l_chain_pkt = (dap_chain_ch_pkt_t){ *l_chain_pkt = (dap_chain_ch_pkt_t){
.hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } .hdr = { .version = DAP_CHAIN_CH_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
}; };
if (a_data_size && a_data) if (a_data_size && a_data)
...@@ -100,7 +101,7 @@ size_t dap_chain_ch_pkt_write_multi_mt(dap_stream_ch_cachet_t *a_links, size_t a ...@@ -100,7 +101,7 @@ size_t dap_chain_ch_pkt_write_multi_mt(dap_stream_ch_cachet_t *a_links, size_t a
? DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size) ? DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size)
: DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); : DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size);
*l_chain_pkt = (dap_chain_ch_pkt_t){ *l_chain_pkt = (dap_chain_ch_pkt_t){
.hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } .hdr = { .version = DAP_CHAIN_CH_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
}; };
if (a_data_size && a_data) if (a_data_size && a_data)
...@@ -141,7 +142,7 @@ size_t dap_chain_ch_pkt_write_inter(dap_events_socket_t * a_es_input, dap_stream ...@@ -141,7 +142,7 @@ size_t dap_chain_ch_pkt_write_inter(dap_events_socket_t * a_es_input, dap_stream
size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size; size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size;
dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size ); dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size );
*l_chain_pkt = (dap_chain_ch_pkt_t){ *l_chain_pkt = (dap_chain_ch_pkt_t){
.hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } .hdr = { .version = DAP_CHAIN_CH_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
}; };
if (a_data_size && a_data) if (a_data_size && a_data)
......
...@@ -45,13 +45,12 @@ typedef const void * dap_chain_atom_ptr_t; ...@@ -45,13 +45,12 @@ typedef const void * dap_chain_atom_ptr_t;
// Atomic element iterator // Atomic element iterator
typedef struct dap_chain_atom_iter { typedef struct dap_chain_atom_iter {
dap_chain_t *chain; dap_chain_t *chain;
dap_chain_cell_id_t cell_id;
void *cur_item;
dap_chain_atom_ptr_t cur; dap_chain_atom_ptr_t cur;
size_t cur_size; size_t cur_size;
dap_chain_hash_fast_t *cur_hash; dap_chain_hash_fast_t *cur_hash;
dap_chain_cell_id_t cell_id; uint64_t cur_num;
bool with_treshold;
bool found_in_treshold;
void *cur_item;
} dap_chain_atom_iter_t; } dap_chain_atom_iter_t;
typedef struct dap_chain_datum_iter { typedef struct dap_chain_datum_iter {
...@@ -75,6 +74,13 @@ static const char* const dap_chain_atom_verify_res_str[] = { ...@@ -75,6 +74,13 @@ static const char* const dap_chain_atom_verify_res_str[] = {
[ATOM_MOVE_TO_THRESHOLD] = "thresholded" [ATOM_MOVE_TO_THRESHOLD] = "thresholded"
}; };
typedef enum dap_chain_iter_op {
DAP_CHAIN_ITER_OP_FIRST,
DAP_CHAIN_ITER_OP_LAST,
DAP_CHAIN_ITER_OP_NEXT,
DAP_CHAIN_ITER_OP_PREV
} dap_chain_iter_op_t;
typedef dap_chain_t* (*dap_chain_callback_new_t)(void); typedef dap_chain_t* (*dap_chain_callback_new_t)(void);
typedef void (*dap_chain_callback_t)(dap_chain_t *); typedef void (*dap_chain_callback_t)(dap_chain_t *);
...@@ -86,9 +92,11 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai ...@@ -86,9 +92,11 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai
typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t); typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t);
typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void); typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void);
typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t, bool); typedef dap_chain_atom_iter_t * (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, dap_hash_fast_t *a_hash_from);
typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t); typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_t)(dap_chain_atom_iter_t *a_iter, dap_chain_iter_op_t a_operation, size_t *a_atom_size);
typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*); typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t *a_iter, dap_hash_fast_t *a_atom_hash, size_t *a_atom_size);
typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_by_num_t)(dap_chain_atom_iter_t *a_iter, uint64_t a_atom_num);
typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t *);
typedef dap_chain_datum_iter_t * (*dap_chain_datum_callback_iter_create_t)(dap_chain_t *); typedef dap_chain_datum_iter_t * (*dap_chain_datum_callback_iter_create_t)(dap_chain_t *);
typedef dap_chain_datum_t * (*dap_chain_datum_callback_iter_get_first_t)(dap_chain_datum_iter_t *); typedef dap_chain_datum_t * (*dap_chain_datum_callback_iter_get_first_t)(dap_chain_datum_iter_t *);
...@@ -98,7 +106,6 @@ typedef void (*dap_chain_datum_callback_iter_delete_t)(dap_chain_datum_iter_t *) ...@@ -98,7 +106,6 @@ typedef void (*dap_chain_datum_callback_iter_delete_t)(dap_chain_datum_iter_t *)
typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * ); typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * );
typedef dap_time_t (*dap_chain_callback_atom_get_timestamp_t)(dap_chain_atom_ptr_t); typedef dap_time_t (*dap_chain_callback_atom_get_timestamp_t)(dap_chain_atom_ptr_t);
typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_t *,size_t*);
typedef dap_chain_datum_t * (*dap_chain_callback_datum_find_by_hash_t)(dap_chain_t *, dap_chain_hash_fast_t *, dap_chain_hash_fast_t *, int *); typedef dap_chain_datum_t * (*dap_chain_callback_datum_find_by_hash_t)(dap_chain_t *, dap_chain_hash_fast_t *, dap_chain_hash_fast_t *, int *);
typedef dap_chain_atom_ptr_t (*dap_chain_callback_block_find_by_hash_t)(dap_chain_t * ,dap_chain_hash_fast_t *, size_t *); typedef dap_chain_atom_ptr_t (*dap_chain_callback_block_find_by_hash_t)(dap_chain_t * ,dap_chain_hash_fast_t *, size_t *);
...@@ -106,9 +113,6 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_block_find_by_hash_t)(dap_chai ...@@ -106,9 +113,6 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_block_find_by_hash_t)(dap_chai
typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t* ,size_t**); typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t* ,size_t**);
typedef size_t (*dap_chain_callback_add_datums_t)(dap_chain_t * , dap_chain_datum_t **, size_t ); typedef size_t (*dap_chain_callback_add_datums_t)(dap_chain_t * , dap_chain_datum_t **, size_t );
typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t * ,size_t*);
typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t *);
typedef void (*dap_chain_callback_notify_t)(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size); //change in chain happened typedef void (*dap_chain_callback_notify_t)(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size); //change in chain happened
typedef uint64_t (*dap_chain_callback_get_count)(dap_chain_t *a_chain); typedef uint64_t (*dap_chain_callback_get_count)(dap_chain_t *a_chain);
...@@ -116,6 +120,7 @@ typedef dap_list_t *(*dap_chain_callback_get_list)(dap_chain_t *a_chain, size_t ...@@ -116,6 +120,7 @@ typedef dap_list_t *(*dap_chain_callback_get_list)(dap_chain_t *a_chain, size_t
typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, size_t *a_auth_certs_count, uint16_t *count_verify); typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, size_t *a_auth_certs_count, uint16_t *count_verify);
typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value);
typedef uint256_t (*dap_chain_callback_get_minimum_fee)(dap_chain_t *a_chain); typedef uint256_t (*dap_chain_callback_get_minimum_fee)(dap_chain_t *a_chain);
typedef uint256_t (*dap_chain_callback_get_collectiong_level)(dap_chain_t *a_chain);
typedef dap_enc_key_t* (*dap_chain_callback_get_signing_certificate)(dap_chain_t *a_chain); typedef dap_enc_key_t* (*dap_chain_callback_get_signing_certificate)(dap_chain_t *a_chain);
typedef void (*dap_chain_callback_load_from_gdb)(dap_chain_t *a_chain); typedef void (*dap_chain_callback_load_from_gdb)(dap_chain_t *a_chain);
typedef uint256_t (*dap_chain_callback_calc_reward)(dap_chain_t *a_chain, dap_hash_fast_t *a_block_hash, dap_pkey_t *a_block_sign_pkey); typedef uint256_t (*dap_chain_callback_calc_reward)(dap_chain_t *a_chain, dap_hash_fast_t *a_block_hash, dap_pkey_t *a_block_sign_pkey);
...@@ -171,22 +176,20 @@ typedef struct dap_chain { ...@@ -171,22 +176,20 @@ typedef struct dap_chain {
dap_chain_callback_add_datums_t callback_add_datums; dap_chain_callback_add_datums_t callback_add_datums;
dap_chain_callback_atom_get_hdr_size_t callback_atom_get_hdr_static_size; // Get atom header's size dap_chain_callback_atom_get_hdr_size_t callback_atom_get_hdr_static_size; // Get atom header's size
dap_chain_callback_atom_iter_create_t callback_atom_iter_create;
dap_chain_callback_atom_iter_create_from_t callback_atom_iter_create_from;
dap_chain_callback_atom_iter_get_first_t callback_atom_iter_get_first;
dap_chain_callback_atom_get_datum_t callback_atom_get_datums; dap_chain_callback_atom_get_datum_t callback_atom_get_datums;
dap_chain_callback_atom_get_timestamp_t callback_atom_get_timestamp; dap_chain_callback_atom_get_timestamp_t callback_atom_get_timestamp;
dap_chain_callback_atom_iter_find_by_hash_t callback_atom_find_by_hash; dap_chain_callback_atom_iter_find_by_hash_t callback_atom_find_by_hash;
dap_chain_callback_atom_iter_get_by_num_t callback_atom_get_by_num;
dap_chain_callback_datum_find_by_hash_t callback_datum_find_by_hash; dap_chain_callback_datum_find_by_hash_t callback_datum_find_by_hash;
dap_chain_callback_block_find_by_hash_t callback_block_find_by_tx_hash; dap_chain_callback_block_find_by_hash_t callback_block_find_by_tx_hash;
dap_chain_callback_atom_iter_get_next_t callback_atom_iter_get_next; dap_chain_callback_atom_iter_create_t callback_atom_iter_create;
dap_chain_callback_atom_iter_get_atoms_t callback_atom_iter_get_links; dap_chain_callback_atom_iter_get_t callback_atom_iter_get;
dap_chain_callback_atom_iter_get_atoms_t callback_atom_iter_get_lasts;
dap_chain_callback_atom_iter_delete_t callback_atom_iter_delete; dap_chain_callback_atom_iter_delete_t callback_atom_iter_delete;
// WRN: No iterator used or changed with it
dap_chain_callback_atom_iter_get_atoms_t callback_atom_iter_get_links;
dap_chain_callback_get_count callback_count_tx; dap_chain_callback_get_count callback_count_tx;
dap_chain_callback_get_list callback_get_txs; dap_chain_callback_get_list callback_get_txs;
...@@ -197,6 +200,7 @@ typedef struct dap_chain { ...@@ -197,6 +200,7 @@ typedef struct dap_chain {
dap_chain_callback_get_poa_certs callback_get_poa_certs; dap_chain_callback_get_poa_certs callback_get_poa_certs;
dap_chain_callback_set_min_validators_count callback_set_min_validators_count; dap_chain_callback_set_min_validators_count callback_set_min_validators_count;
dap_chain_callback_get_minimum_fee callback_get_minimum_fee; dap_chain_callback_get_minimum_fee callback_get_minimum_fee;
dap_chain_callback_get_collectiong_level callback_get_collectiong_level;
dap_chain_callback_get_signing_certificate callback_get_signing_certificate; dap_chain_callback_get_signing_certificate callback_get_signing_certificate;
dap_chain_callback_calc_reward callback_calc_reward; dap_chain_callback_calc_reward callback_calc_reward;
dap_chain_callback_load_from_gdb callback_load_from_gdb; dap_chain_callback_load_from_gdb callback_load_from_gdb;
...@@ -258,7 +262,11 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net ...@@ -258,7 +262,11 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net
void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_delete(dap_chain_t * a_chain);
void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg);
dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cell_id); bool dap_chain_get_atom_last_hash_num(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, dap_hash_fast_t *a_atom_hash, uint64_t *a_atom_num);
DAP_STATIC_INLINE bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, dap_hash_fast_t *a_atom_hash)
{
return dap_chain_get_atom_last_hash_num(a_chain, a_cell_id, a_atom_hash, NULL);
}
ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash); ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash);
int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name); int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name);
const char* dap_chain_get_path(dap_chain_t *a_chain); const char* dap_chain_get_path(dap_chain_t *a_chain);
......
...@@ -33,26 +33,45 @@ ...@@ -33,26 +33,45 @@
#include "uthash.h" #include "uthash.h"
#include "dap_global_db_cluster.h" #include "dap_global_db_cluster.h"
#define DAP_CHAIN_NODE_SYNC_TIMEOUT 60 // sec #define DAP_SYNC_TICKS_PER_SECOND 10
#define DAP_SYNC_TICKS_PER_SECOND 10
typedef enum dap_chain_ch_state {
DAP_CHAIN_CH_STATE_IDLE = 0,
DAP_CHAIN_CH_STATE_WAITING,
DAP_CHAIN_CH_STATE_UPDATE_GLOBAL_DB_REMOTE, // Downloadn GDB hashtable from remote
DAP_CHAIN_CH_STATE_UPDATE_GLOBAL_DB, // Update GDB hashtable to remote
DAP_CHAIN_CH_STATE_SYNC_GLOBAL_DB,
DAP_CHAIN_CH_STATE_UPDATE_CHAINS_REMOTE, // Update chains hashtable from remote
DAP_CHAIN_CH_STATE_UPDATE_CHAINS, // Update chains hashtable to remote
DAP_CHAIN_CH_STATE_SYNC_CHAINS,
DAP_CHAIN_CH_STATE_ERROR
} dap_chain_ch_state_t;
typedef enum dap_chain_ch_error_type {
DAP_CHAIN_CH_ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS,
DAP_CHAIN_CH_ERROR_INCORRECT_SYNC_SEQUENCE,
DAP_CHAIN_CH_ERROR_SYNC_TIMEOUT,
DAP_CHAIN_CH_ERROR_CHAIN_PKT_DATA_SIZE,
DAP_CHAIN_CH_ERROR_NET_INVALID_ID,
DAP_CHAIN_CH_ERROR_CHAIN_NOT_FOUND,
DAP_CHAIN_CH_ERROR_ATOM_NOT_FOUND,
DAP_CHAIN_CH_ERROR_UNKNOWN_CHAIN_PKT_TYPE,
DAP_CHAIN_CH_ERROR_GLOBAL_DB_INTERNAL_NOT_SAVED,
DAP_CHAIN_CH_ERROR_NET_IS_OFFLINE,
DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY,
DAP_CHAIN_CH_ERROR_INTERNAL
} dap_chain_ch_error_type_t;
typedef struct dap_chain_ch dap_chain_ch_t; typedef struct dap_chain_ch dap_chain_ch_t;
typedef void (*dap_chain_ch_callback_packet_t)(dap_chain_ch_t*, uint8_t a_pkt_type, typedef void (*dap_chain_ch_callback_packet_t)(dap_chain_ch_t*, uint8_t a_pkt_type,
dap_chain_ch_pkt_t *a_pkt, size_t a_pkt_data_size, dap_chain_ch_pkt_t *a_pkt, size_t a_pkt_data_size,
void * a_arg); void * a_arg);
typedef struct dap_chain_atom_item{
dap_chain_hash_fast_t atom_hash;
dap_chain_atom_ptr_t atom;
size_t atom_size;
UT_hash_handle hh;
} dap_chain_atom_item_t;
typedef struct dap_chain_pkt_item { typedef struct dap_chain_pkt_item {
uint64_t pkt_data_size; uint64_t pkt_data_size;
byte_t *pkt_data; byte_t *pkt_data;
} dap_chain_pkt_item_t; } dap_chain_pkt_item_t;
typedef struct dap_chain_ch_hash_item{ typedef struct dap_chain_ch_hash_item {
dap_hash_fast_t hash; dap_hash_fast_t hash;
uint32_t size; uint32_t size;
UT_hash_handle hh; UT_hash_handle hh;
...@@ -61,8 +80,12 @@ typedef struct dap_chain_ch_hash_item{ ...@@ -61,8 +80,12 @@ typedef struct dap_chain_ch_hash_item{
typedef struct dap_chain_ch { typedef struct dap_chain_ch {
void *_inheritor; void *_inheritor;
dap_timerfd_t *sync_timer;
void *sync_context;
// Legacy section //
int state;
dap_chain_ch_state_t state;
uint64_t stats_request_atoms_processed; uint64_t stats_request_atoms_processed;
uint64_t stats_request_gdb_processed; uint64_t stats_request_gdb_processed;
...@@ -72,26 +95,23 @@ typedef struct dap_chain_ch { ...@@ -72,26 +95,23 @@ typedef struct dap_chain_ch {
// request section // request section
dap_chain_atom_iter_t *request_atom_iter; dap_chain_atom_iter_t *request_atom_iter;
//dap_db_log_list_t *request_db_log; // list of global db records //dap_db_log_list_t *request_db_log; // list of global db records
dap_chain_ch_sync_request_t request; dap_chain_ch_sync_request_old_t request;
dap_chain_ch_pkt_hdr_t request_hdr; dap_chain_ch_pkt_hdr_t request_hdr;
dap_list_t *request_db_iter; dap_list_t *request_db_iter;
int timer_shots; uint32_t timer_shots;
dap_timerfd_t *activity_timer; dap_timerfd_t *activity_timer;
int sent_breaks; int sent_breaks;
dap_chain_ch_callback_packet_t callback_notify_packet_out;
dap_chain_ch_callback_packet_t callback_notify_packet_in;
void *callback_notify_arg;
} dap_chain_ch_t; } dap_chain_ch_t;
#define DAP_STREAM_CH_CHAIN(a) ((dap_chain_ch_t *) ((a)->internal) ) #define DAP_CHAIN_CH(a) ((dap_chain_ch_t *) ((a)->internal) )
#define DAP_STREAM_CH(a) ((dap_stream_ch_t *)((a)->_inheritor)) #define DAP_STREAM_CH(a) ((dap_stream_ch_t *)((a)->_inheritor))
#define DAP_CHAIN_PKT_EXPECT_SIZE 7168 #define DAP_CHAIN_PKT_EXPECT_SIZE 7168
#define DAP_STREAM_CH_CHAIN_ID 'C' #define DAP_CHAIN_CH_ID 'C'
int dap_chain_ch_init(void); int dap_chain_ch_init(void);
void dap_chain_ch_deinit(void); void dap_chain_ch_deinit(void);
void dap_chain_ch_timer_start(dap_chain_ch_t *a_ch_chain); void dap_chain_ch_timer_start(dap_chain_ch_t *a_ch_chain);
void dap_chain_ch_reset_unsafe(dap_chain_ch_t *a_ch_chain);
void dap_stream_ch_write_error_unsafe(dap_stream_ch_t *a_ch, uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id, dap_chain_ch_error_type_t a_error);
...@@ -36,68 +36,91 @@ ...@@ -36,68 +36,91 @@
#include "dap_stream_ch.h" #include "dap_stream_ch.h"
#define DAP_STREAM_CH_CHAIN_PKT_VERSION 0x02 #define DAP_CHAIN_CH_PKT_VERSION 0x02
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ 0x05 //Legacy
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START 0x25 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_CHAINS_REQ 0x05
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS 0x35 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_CHAINS_START 0x25
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_END 0x45 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_CHAINS 0x35
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN 0x20 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_CHAINS_END 0x45
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN 0x01 #define DAP_CHAIN_CH_PKT_TYPE_FIRST_CHAIN 0x20
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS 0x03 #define DAP_CHAIN_CH_PKT_TYPE_SYNCED_CHAINS 0x03
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ 0x06 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_GLOBAL_DB_REQ 0x06
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_START 0x26 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_GLOBAL_DB_START 0x26
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB 0x36 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_GLOBAL_DB 0x36
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END 0x46 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_GLOBAL_DB_END 0x46
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB 0x21 #define DAP_CHAIN_CH_PKT_TYPE_FIRST_GLOBAL_DB 0x21
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB 0x11 #define DAP_CHAIN_CH_PKT_TYPE_GLOBAL_DB 0x11
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB 0x13 #define DAP_CHAIN_CH_PKT_TYPE_SYNCED_GLOBAL_DB 0x13
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_DELETE 0xda #define DAP_CHAIN_CH_PKT_TYPE_DELETE 0xda
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT 0xfe #define DAP_CHAIN_CH_PKT_TYPE_TIMEOUT 0xfe
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR 0xff #define DAP_CHAIN_CH_PKT_TYPE_ERROR 0xff
// Stable
#define DAP_CHAIN_CH_PKT_TYPE_CHAIN_REQ 0x80
#define DAP_CHAIN_CH_PKT_TYPE_CHAIN_MISS 0x69
#define DAP_CHAIN_CH_PKT_TYPE_CHAIN 0x01
#define DAP_CHAIN_CH_PKT_TYPE_CHAIN_SUMMARY 0x81
#define DAP_CHAIN_CH_PKT_TYPE_CHAIN_ACK 0x82
#define DAP_CHAIN_CH_PKT_TYPE_SYNCED_CHAIN 0x88
// TSD sections // TSD sections
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_TSD 0x15 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_CHAINS_TSD 0x15
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_TSD 0x16 #define DAP_CHAIN_CH_PKT_TYPE_UPDATE_GLOBAL_DB_TSD 0x16
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_TSD_PROTO 0x0001 // Protocol version
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_TSD_COUNT 0x0002 // Items count
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_TSD_HASH_LAST 0x0003 // Hash of last(s) item
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_TSD_HASH_FIRST 0x0004 // Hash of first(s) item
#define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_TSD_LAST_ID 0x0100 // Last ID of GDB synced group
typedef enum dap_chain_ch_state{
CHAIN_STATE_IDLE=0,
CHAIN_STATE_WAITING,
CHAIN_STATE_UPDATE_GLOBAL_DB_REMOTE, // Downloadn GDB hashtable from remote
CHAIN_STATE_UPDATE_GLOBAL_DB, // Update GDB hashtable to remote
CHAIN_STATE_SYNC_GLOBAL_DB,
CHAIN_STATE_UPDATE_CHAINS_REMOTE, // Update chains hashtable from remote
CHAIN_STATE_UPDATE_CHAINS, // Update chains hashtable to remote
CHAIN_STATE_SYNC_CHAINS,
CHAIN_STATE_SYNC_ALL
} dap_chain_ch_state_t;
#define DAP_CHAIN_CH_PKT_TYPE_UPDATE_TSD_PROTO 0x0001 // Protocol version
#define DAP_CHAIN_CH_PKT_TYPE_UPDATE_TSD_COUNT 0x0002 // Items count
#define DAP_CHAIN_CH_PKT_TYPE_UPDATE_TSD_HASH_LAST 0x0003 // Hash of last(s) item
#define DAP_CHAIN_CH_PKT_TYPE_UPDATE_TSD_HASH_FIRST 0x0004 // Hash of first(s) item
#define DAP_CHAIN_CH_PKT_TYPE_UPDATE_TSD_LAST_ID 0x0100 // Last ID of GDB synced group
// *** Legacy *** //
typedef struct dap_chain_ch_update_element{ typedef struct dap_chain_ch_update_element{
dap_hash_fast_t hash; dap_hash_fast_t hash;
uint32_t size; uint32_t size;
} DAP_ALIGN_PACKED dap_chain_ch_update_element_t; } DAP_ALIGN_PACKED dap_chain_ch_update_element_t;
typedef struct dap_chain_ch_sync_request{ typedef struct dap_chain_ch_sync_request_old {
dap_chain_node_addr_t node_addr; // Requesting node's address dap_chain_node_addr_t node_addr; // Requesting node's address
dap_chain_hash_fast_t hash_from; dap_chain_hash_fast_t hash_from;
dap_chain_hash_fast_t hash_to; // unused byte_t unused[96];
uint64_t id_start; } DAP_ALIGN_PACKED dap_chain_ch_sync_request_old_t;
uint64_t id_end; // unused
static const char* c_dap_chain_ch_pkt_type_str[]={
[DAP_CHAIN_CH_PKT_TYPE_CHAIN] = "DAP_CHAIN_CH_PKT_TYPE_CHAIN",
[DAP_CHAIN_CH_PKT_TYPE_GLOBAL_DB] = "DAP_CHAIN_CH_PKT_TYPE_GLOBAL_DB",
[DAP_CHAIN_CH_PKT_TYPE_SYNCED_CHAINS] = "DAP_CHAIN_CH_PKT_TYPE_SYNCED_CHAINS",
[DAP_CHAIN_CH_PKT_TYPE_SYNCED_GLOBAL_DB] = "DAP_CHAIN_CH_PKT_TYPE_SYNCED_GLOBAL_DB",
[DAP_CHAIN_CH_PKT_TYPE_ERROR] = "DAP_CHAIN_CH_PKT_TYPE_ERROR"
};
// *** Active *** //
typedef struct dap_chain_ch_sync_request {
dap_chain_hash_fast_t hash_from;
uint64_t num_from;
} DAP_ALIGN_PACKED dap_chain_ch_sync_request_t; } DAP_ALIGN_PACKED dap_chain_ch_sync_request_t;
typedef struct dap_chain_ch_summary {
uint64_t num_cur;
uint64_t num_last;
byte_t reserved[128];
} DAP_ALIGN_PACKED dap_chain_ch_summary_t;
typedef struct dap_chain_ch_miss_info {
dap_hash_fast_t missed_hash;
dap_hash_fast_t last_hash;
uint64_t last_num;
} DAP_ALIGN_PACKED dap_chain_ch_miss_info_t;
typedef struct dap_chain_ch_pkt_hdr { typedef struct dap_chain_ch_pkt_hdr {
uint8_t version; uint8_t version;
uint8_t padding[3]; uint8_t num_hi;
uint16_t num_lo;
uint32_t data_size; uint32_t data_size;
dap_chain_net_id_t net_id; dap_chain_net_id_t net_id;
dap_chain_id_t chain_id; dap_chain_id_t chain_id;
...@@ -109,14 +132,7 @@ typedef struct dap_chain_ch_pkt { ...@@ -109,14 +132,7 @@ typedef struct dap_chain_ch_pkt {
uint8_t data[]; uint8_t data[];
} DAP_ALIGN_PACKED dap_chain_ch_pkt_t; } DAP_ALIGN_PACKED dap_chain_ch_pkt_t;
static const char* c_dap_chain_ch_pkt_type_str[]={ DAP_STATIC_INLINE size_t dap_chain_ch_pkt_get_size(dap_chain_ch_pkt_t *a_pkt) { return sizeof(dap_chain_ch_pkt_hdr_t) + a_pkt->hdr.data_size; }
[DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN] = "DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN",
[DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB] = "DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB",
[DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS] = "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS",
[DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB] = "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB",
[DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR] = "DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR"
};
dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id, dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id,
const void *a_data, size_t a_data_size); const void *a_data, size_t a_data_size);
...@@ -160,7 +176,7 @@ inline static DAP_PRINTF_ATTR(5, 6) size_t dap_chain_ch_pkt_write_error_unsafe(d ...@@ -160,7 +176,7 @@ inline static DAP_PRINTF_ATTR(5, 6) size_t dap_chain_ch_pkt_write_error_unsafe(d
va_start(l_va, a_err_string_format); va_start(l_va, a_err_string_format);
vsnprintf(l_str, l_size,a_err_string_format, l_va); vsnprintf(l_str, l_size,a_err_string_format, l_va);
va_end(l_va); va_end(l_va);
return dap_chain_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, return dap_chain_ch_pkt_write_unsafe(a_ch, DAP_CHAIN_CH_PKT_TYPE_ERROR,
a_net_id, a_chain_id, a_cell_id, l_str, l_size); a_net_id, a_chain_id, a_cell_id, l_str, l_size);
} }
return 0; return 0;
...@@ -190,7 +206,7 @@ static inline size_t dap_chain_ch_pkt_write_error_inter(dap_events_socket_t *a_e ...@@ -190,7 +206,7 @@ static inline size_t dap_chain_ch_pkt_write_error_inter(dap_events_socket_t *a_e
va_start(l_va, a_err_string_format); va_start(l_va, a_err_string_format);
vsnprintf(l_str, l_size, a_err_string_format, l_va); vsnprintf(l_str, l_size, a_err_string_format, l_va);
va_end(l_va); va_end(l_va);
return dap_chain_ch_pkt_write_inter(a_es_input, a_ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, return dap_chain_ch_pkt_write_inter(a_es_input, a_ch_uuid, DAP_CHAIN_CH_PKT_TYPE_ERROR,
a_net_id, a_chain_id, a_cell_id, l_str, l_size); a_net_id, a_chain_id, a_cell_id, l_str, l_size);
} }
return 0; return 0;
......
...@@ -77,7 +77,7 @@ typedef struct client_statistic_value{ ...@@ -77,7 +77,7 @@ typedef struct client_statistic_value{
static void s_stream_ch_new(dap_stream_ch_t* ch , void* arg); static void s_stream_ch_new(dap_stream_ch_t* ch , void* arg);
static void s_stream_ch_delete(dap_stream_ch_t* ch , void* arg); static void s_stream_ch_delete(dap_stream_ch_t* ch , void* arg);
static void s_stream_ch_packet_in(dap_stream_ch_t* ch , void* arg); static bool s_stream_ch_packet_in(dap_stream_ch_t* ch , void* arg);
static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg); static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg);
static bool s_unban_client(dap_chain_net_srv_banlist_item_t *a_item); static bool s_unban_client(dap_chain_net_srv_banlist_item_t *a_item);
...@@ -158,7 +158,7 @@ static inline void s_grace_error(dap_chain_net_srv_grace_t *a_grace, dap_stream_ ...@@ -158,7 +158,7 @@ static inline void s_grace_error(dap_chain_net_srv_grace_t *a_grace, dap_stream_
int dap_stream_ch_chain_net_srv_init(dap_chain_net_srv_t *a_srv) int dap_stream_ch_chain_net_srv_init(dap_chain_net_srv_t *a_srv)
{ {
log_it(L_NOTICE,"Chain network services channel initialized"); log_it(L_NOTICE,"Chain network services channel initialized");
dap_stream_ch_proc_add(DAP_STREAM_CH_NET_SRV_ID, s_stream_ch_new,s_stream_ch_delete,s_stream_ch_packet_in,s_stream_ch_packet_out); dap_stream_ch_proc_add(DAP_STREAM_CH_NET_SRV_ID, s_stream_ch_new,s_stream_ch_delete, s_stream_ch_packet_in, s_stream_ch_packet_out);
pthread_mutex_init(&a_srv->grace_mutex, NULL); pthread_mutex_init(&a_srv->grace_mutex, NULL);
return 0; return 0;
...@@ -874,6 +874,7 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -874,6 +874,7 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
l_err.code = error ; \ l_err.code = error ; \
s_grace_error(l_grace, l_err); \ s_grace_error(l_grace, l_err); \
} \ } \
DAP_DELETE(l_grace); \
DAP_DELETE(a_grace_item); \ DAP_DELETE(a_grace_item); \
return false; \ return false; \
} \ } \
...@@ -1042,7 +1043,6 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -1042,7 +1043,6 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
sizeof(dap_chain_datum_tx_receipt_t) + l_grace->usage->receipt->size + l_grace->usage->receipt->exts_size); sizeof(dap_chain_datum_tx_receipt_t) + l_grace->usage->receipt->size + l_grace->usage->receipt->exts_size);
DAP_DELETE(l_success); DAP_DELETE(l_success);
} }
DAP_DELETE(l_grace);
DAP_DELETE(l_remain_service); DAP_DELETE(l_remain_service);
RET_WITH_DEL_A_GRACE(0); RET_WITH_DEL_A_GRACE(0);
} }
...@@ -1157,11 +1157,11 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -1157,11 +1157,11 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
* @param ch * @param ch
* @param arg * @param arg
*/ */
void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
{ {
dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg; dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg;
if (!l_ch_pkt) if (!l_ch_pkt)
return; return false;
dap_chain_net_srv_stream_session_t *l_srv_session = NULL; dap_chain_net_srv_stream_session_t *l_srv_session = NULL;
if (a_ch) { if (a_ch) {
l_srv_session = a_ch->stream && a_ch->stream->session ? a_ch->stream->session->_inheritor : NULL; l_srv_session = a_ch->stream && a_ch->stream->session ? a_ch->stream->session->_inheritor : NULL;
...@@ -1169,13 +1169,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1169,13 +1169,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
if (!l_srv_session) { if (!l_srv_session) {
log_it( L_ERROR, "Not defined service session, switching off packet input process"); log_it( L_ERROR, "Not defined service session, switching off packet input process");
dap_stream_ch_set_ready_to_read_unsafe(a_ch, false); dap_stream_ch_set_ready_to_read_unsafe(a_ch, false);
return; return false;
} }
dap_stream_ch_chain_net_srv_t * l_ch_chain_net_srv = DAP_STREAM_CH_CHAIN_NET_SRV(a_ch); dap_stream_ch_chain_net_srv_t * l_ch_chain_net_srv = DAP_STREAM_CH_CHAIN_NET_SRV(a_ch);
if (l_ch_chain_net_srv->notify_callback) { if (l_ch_chain_net_srv->notify_callback) {
l_ch_chain_net_srv->notify_callback(l_ch_chain_net_srv, l_ch_pkt->hdr.type, l_ch_pkt, l_ch_chain_net_srv->notify_callback_arg); l_ch_chain_net_srv->notify_callback(l_ch_chain_net_srv, l_ch_pkt->hdr.type, l_ch_pkt, l_ch_chain_net_srv->notify_callback_arg);
return; // It's a client behind this return false; // It's a client behind this
} }
dap_stream_ch_chain_net_srv_pkt_error_t l_err = { }; dap_stream_ch_chain_net_srv_pkt_error_t l_err = { };
switch (l_ch_pkt->hdr.type) { switch (l_ch_pkt->hdr.type) {
...@@ -1187,7 +1187,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1187,7 +1187,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
log_it(L_WARNING, "Wrong request size %u, must be %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.data_size, l_request_size, l_ch_pkt->hdr.seq_id); log_it(L_WARNING, "Wrong request size %u, must be %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.data_size, l_request_size, l_ch_pkt->hdr.seq_id);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE;
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
break; return false;
} }
dap_chain_hash_fast_t l_data_hash; dap_chain_hash_fast_t l_data_hash;
dap_hash_fast(l_request->data, l_request->data_size, &l_data_hash); dap_hash_fast(l_request->data, l_request->data_size, &l_data_hash);
...@@ -1195,13 +1195,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1195,13 +1195,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
log_it(L_WARNING, "Wrong hash [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.seq_id); log_it(L_WARNING, "Wrong hash [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.seq_id);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH;
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
break; return false;
} }
if(l_request->data_size_recv > UINT_MAX) { if(l_request->data_size_recv > UINT_MAX) {
log_it(L_WARNING, "Too large payload %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id); log_it(L_WARNING, "Too large payload %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE;
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
break; return false;
} }
/* No need for bare copying, resend it back modified */ /* No need for bare copying, resend it back modified */
if (l_request->data_size_recv) { if (l_request->data_size_recv) {
...@@ -1233,7 +1233,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1233,7 +1233,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST: { //Service request case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST: { //Service request
if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){ if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){
log_it( L_WARNING, "Wrong request size, less than minimum"); log_it( L_WARNING, "Wrong request size, less than minimum");
break; return false;
} }
dap_stream_ch_chain_net_srv_pkt_request_t *l_request = (dap_stream_ch_chain_net_srv_pkt_request_t*)l_ch_pkt->data; dap_stream_ch_chain_net_srv_pkt_request_t *l_request = (dap_stream_ch_chain_net_srv_pkt_request_t*)l_ch_pkt->data;
l_ch_chain_net_srv->srv_uid.uint64 = l_request->hdr.srv_uid.uint64; l_ch_chain_net_srv->srv_uid.uint64 = l_request->hdr.srv_uid.uint64;
...@@ -1246,7 +1246,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1246,7 +1246,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
if (dap_chain_net_get_state(l_usage->net) == NET_STATE_OFFLINE) { if (dap_chain_net_get_state(l_usage->net) == NET_STATE_OFFLINE) {
log_it(L_ERROR, "Can't pay service because net %s is offline.", l_usage->net->pub.name); log_it(L_ERROR, "Can't pay service because net %s is offline.", l_usage->net->pub.name);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE;
break; return false;
} }
if (l_ch_pkt->hdr.data_size < sizeof(dap_chain_receipt_info_t)) { if (l_ch_pkt->hdr.data_size < sizeof(dap_chain_receipt_info_t)) {
...@@ -1336,7 +1336,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1336,7 +1336,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
l_usage->receipt = DAP_DUP_SIZE(l_receipt, l_receipt_size); l_usage->receipt = DAP_DUP_SIZE(l_receipt, l_receipt_size);
if (!l_usage->receipt) { if (!l_usage->receipt) {
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
return; break;
} }
l_is_first_sign = true; l_is_first_sign = true;
l_usage->is_active = true; l_usage->is_active = true;
...@@ -1345,7 +1345,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1345,7 +1345,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
l_usage->receipt_next = DAP_DUP_SIZE(l_receipt, l_receipt_size); l_usage->receipt_next = DAP_DUP_SIZE(l_receipt, l_receipt_size);
if (!l_usage->receipt_next) { if (!l_usage->receipt_next) {
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
return; break;
} }
l_usage->is_active = true; l_usage->is_active = true;
} }
...@@ -1378,7 +1378,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1378,7 +1378,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
if (!l_grace) { if (!l_grace) {
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
DAP_DELETE(l_tx_in_hash_str); DAP_DELETE(l_tx_in_hash_str);
return; break;
} }
UNUSED(l_grace); UNUSED(l_grace);
// Parse the request // Parse the request
...@@ -1387,7 +1387,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1387,7 +1387,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
DAP_DEL_Z(l_grace) DAP_DEL_Z(l_grace)
DAP_DELETE(l_tx_in_hash_str); DAP_DELETE(l_tx_in_hash_str);
return; break;
} }
l_grace->request->hdr.net_id = l_usage->net->pub.id; l_grace->request->hdr.net_id = l_usage->net->pub.id;
dap_stpcpy(l_grace->request->hdr.token, l_usage->token_ticker); dap_stpcpy(l_grace->request->hdr.token, l_usage->token_ticker);
...@@ -1408,7 +1408,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1408,7 +1408,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
if (!l_grace) { if (!l_grace) {
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
DAP_DELETE(l_tx_in_hash_str); DAP_DELETE(l_tx_in_hash_str);
return; return true;
} }
// Parse the request // Parse the request
l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t));
...@@ -1416,7 +1416,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1416,7 +1416,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
DAP_DEL_Z(l_grace) DAP_DEL_Z(l_grace)
DAP_DELETE(l_tx_in_hash_str); DAP_DELETE(l_tx_in_hash_str);
return; return true;
} }
l_grace->request->hdr.net_id = l_usage->net->pub.id; l_grace->request->hdr.net_id = l_usage->net->pub.id;
dap_stpcpy(l_grace->request->hdr.token, l_usage->token_ticker); dap_stpcpy(l_grace->request->hdr.token, l_usage->token_ticker);
...@@ -1537,6 +1537,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1537,6 +1537,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
}else{ }else{
log_it(L_ERROR, "Wrong error response size, %u when expected %zu", l_ch_pkt->hdr.data_size, log_it(L_ERROR, "Wrong error response size, %u when expected %zu", l_ch_pkt->hdr.data_size,
sizeof ( dap_stream_ch_chain_net_srv_pkt_error_t) ); sizeof ( dap_stream_ch_chain_net_srv_pkt_error_t) );
return false;
} }
} break; } break;
case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_RESPONSE:{ case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_RESPONSE:{
...@@ -1600,18 +1601,22 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) ...@@ -1600,18 +1601,22 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
l_success_size); l_success_size);
if(!l_success) { if(!l_success) {
log_it(L_CRITICAL, "Memory allocation error"); log_it(L_CRITICAL, "Memory allocation error");
return; break;
} }
l_success->hdr.usage_id = l_usage->id; l_success->hdr.usage_id = l_usage->id;
l_success->hdr.net_id.uint64 = l_usage->net->pub.id.uint64; l_success->hdr.net_id.uint64 = l_usage->net->pub.id.uint64;
l_success->hdr.srv_uid.uint64 = l_usage->service->uid.uint64; l_success->hdr.srv_uid.uint64 = l_usage->service->uid.uint64;
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS, l_success, l_success_size); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS, l_success, l_success_size);
DAP_DELETE(l_success); DAP_DELETE(l_success);
}break; } break;
default: log_it( L_WARNING, "Unknown packet type 0x%02X", l_ch_pkt->hdr.type);
default:
log_it( L_WARNING, "Unknown packet type 0x%02X", l_ch_pkt->hdr.type);
return false;
} }
if(l_ch_chain_net_srv->notify_callback) if(l_ch_chain_net_srv->notify_callback)
l_ch_chain_net_srv->notify_callback(l_ch_chain_net_srv, l_ch_pkt->hdr.type, l_ch_pkt, l_ch_chain_net_srv->notify_callback_arg); l_ch_chain_net_srv->notify_callback(l_ch_chain_net_srv, l_ch_pkt->hdr.type, l_ch_pkt, l_ch_chain_net_srv->notify_callback_arg);
return true;
} }
/** /**
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
static void s_stream_ch_new(dap_stream_ch_t* ch, void* arg); static void s_stream_ch_new(dap_stream_ch_t* ch, void* arg);
static void s_stream_ch_delete(dap_stream_ch_t* ch, void* arg); static void s_stream_ch_delete(dap_stream_ch_t* ch, void* arg);
static void s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg); static bool s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg);
/** /**
* @brief dap_stream_ch_chain_net_init * @brief dap_stream_ch_chain_net_init
...@@ -68,7 +68,7 @@ static void s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg); ...@@ -68,7 +68,7 @@ static void s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg);
int dap_stream_ch_chain_net_init() int dap_stream_ch_chain_net_init()
{ {
log_it(L_NOTICE, "Chain network channel initialized"); log_it(L_NOTICE, "Chain network channel initialized");
dap_stream_ch_proc_add(DAP_STREAM_CH_NET_ID, s_stream_ch_new, s_stream_ch_delete, dap_stream_ch_proc_add(DAP_STREAM_CH_CHAIN_NET_ID, s_stream_ch_new, s_stream_ch_delete,
s_stream_ch_packet_in, NULL); s_stream_ch_packet_in, NULL);
return 0; return 0;
...@@ -110,7 +110,7 @@ void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg) ...@@ -110,7 +110,7 @@ void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg)
* @param ch * @param ch
* @param arg * @param arg
*/ */
void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
{ {
dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch); dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch);
if(l_ch_chain_net) { if(l_ch_chain_net) {
...@@ -119,23 +119,18 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) ...@@ -119,23 +119,18 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
char *l_data_hash_str; char *l_data_hash_str;
dap_get_data_hash_str_static(l_ch_pkt->data, l_ch_pkt->hdr.data_size, l_data_hash_str); dap_get_data_hash_str_static(l_ch_pkt->data, l_ch_pkt->hdr.data_size, l_data_hash_str);
log_it(L_ATT, "Receive test data packet with hash %s", l_data_hash_str); log_it(L_ATT, "Receive test data packet with hash %s", l_data_hash_str);
return; return false;
} }
if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_pkt_t)) { if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_pkt_t)) {
log_it(L_WARNING, "Too small stream channel N packet size %u (header size %zu)", log_it(L_WARNING, "Too small stream channel N packet size %u (header size %zu)",
l_ch_pkt->hdr.data_size, sizeof(dap_stream_ch_chain_net_pkt_t)); l_ch_pkt->hdr.data_size, sizeof(dap_stream_ch_chain_net_pkt_t));
return; return false;
} }
dap_stream_ch_chain_net_pkt_t *l_ch_chain_net_pkt = (dap_stream_ch_chain_net_pkt_t *)l_ch_pkt->data; dap_stream_ch_chain_net_pkt_t *l_ch_chain_net_pkt = (dap_stream_ch_chain_net_pkt_t *)l_ch_pkt->data;
if (l_ch_chain_net_pkt->hdr.data_size + sizeof(dap_stream_ch_chain_net_pkt_t) > l_ch_pkt->hdr.data_size) { if (l_ch_chain_net_pkt->hdr.data_size + sizeof(dap_stream_ch_chain_net_pkt_t) > l_ch_pkt->hdr.data_size) {
log_it(L_WARNING, "Too small stream channel N packet size %u (expected at least %zu)", log_it(L_WARNING, "Too small stream channel N packet size %u (expected at least %zu)",
l_ch_pkt->hdr.data_size, l_ch_chain_net_pkt->hdr.data_size + sizeof(dap_stream_ch_chain_net_pkt_t)); l_ch_pkt->hdr.data_size, l_ch_chain_net_pkt->hdr.data_size + sizeof(dap_stream_ch_chain_net_pkt_t));
return; return false;
}
if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR) {
char *l_err_str = (char *)l_ch_chain_net_pkt->data;
log_it(L_WARNING, "Stream channel N for network communication got error on other side: %s", l_err_str);
return;
} }
dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain_net_pkt->hdr.net_id); dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain_net_pkt->hdr.net_id);
if (!l_net) { if (!l_net) {
...@@ -143,7 +138,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) ...@@ -143,7 +138,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
char l_err_str[] = "ERROR_NET_INVALID_ID"; char l_err_str[] = "ERROR_NET_INVALID_ID";
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str));
return; return false;
}
if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR) {
char *l_err_str = (char *)l_ch_chain_net_pkt->data;
log_it(L_WARNING, "Stream channel N for network communication got error on other side: %s", l_err_str);
if (a_ch->stream->authorized) {
assert(!dap_stream_node_addr_is_blank(&a_ch->stream->node));
dap_link_manager_accounting_link_in_net(l_net->pub.id.uint64, &a_ch->stream->node, false);
}
return false;
} }
uint16_t l_acl_idx = dap_chain_net_get_acl_idx(l_net); uint16_t l_acl_idx = dap_chain_net_get_acl_idx(l_net);
uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1; uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1;
...@@ -153,30 +157,42 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) ...@@ -153,30 +157,42 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
char l_err_str[] = "ERROR_NET_NOT_AUTHORIZED"; char l_err_str[] = "ERROR_NET_NOT_AUTHORIZED";
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str));
return; return false;
}
if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) {
char l_err_str[] = "ERROR_NET_IS_OFFLINE";
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR,
l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str));
return false;
} }
/*if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) {
s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
"ERROR_NET_IS_OFFLINE");
a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
return;
}*/
switch (l_ch_pkt->hdr.type) { switch (l_ch_pkt->hdr.type) {
case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE: case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE:
case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK:
if (!a_ch->stream->authorized) {
log_it(L_WARNING, "Trying to announce net from not authorized stream");
char l_err_str[] = "ERROR_STREAM_NOT_AUTHORIZED";
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str));
break;
}
assert(!dap_stream_node_addr_is_blank(&a_ch->stream->node)); assert(!dap_stream_node_addr_is_blank(&a_ch->stream->node));
dap_accounting_downlink_in_net(l_net->pub.id.uint64, &a_ch->stream->node); dap_link_manager_accounting_link_in_net(l_net->pub.id.uint64, &a_ch->stream->node, true);
if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE)
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK,
l_ch_chain_net_pkt->hdr.net_id, NULL, 0);
break; break;
// received ping request - > send pong request
// received ping request - > send pong request
case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING: case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING:
//log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PING"); //log_it(L_INFO, "Get CHAIN_CH_NET_PKT_TYPE_PING");
dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG, dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG,
l_ch_chain_net_pkt->hdr.net_id,NULL, 0); l_ch_chain_net_pkt->hdr.net_id,NULL, 0);
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
break; break;
// receive pong request -> send nothing // receive pong request -> send nothing
case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG: case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG:
//log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PONG"); //log_it(L_INFO, "Get CHAIN_CH_NET_PKT_TYPE_PONG");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
break; break;
...@@ -277,7 +293,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) ...@@ -277,7 +293,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
default: default:
log_it(L_ERROR, "Unknown paket type %hhu", l_ch_pkt->hdr.type); log_it(L_ERROR, "Unknown paket type %hhu", l_ch_pkt->hdr.type);
break; return false;
} }
if(l_ch_chain_net->notify_callback) if(l_ch_chain_net->notify_callback)
...@@ -285,4 +301,5 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) ...@@ -285,4 +301,5 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg)
l_ch_chain_net_pkt->hdr.data_size, l_ch_chain_net->notify_callback_arg); l_ch_chain_net_pkt->hdr.data_size, l_ch_chain_net->notify_callback_arg);
} }
return true;
} }
...@@ -61,7 +61,7 @@ typedef struct dap_chain_ch_validator_test{ ...@@ -61,7 +61,7 @@ typedef struct dap_chain_ch_validator_test{
#define D_SIGN 0x40//data signed #define D_SIGN 0x40//data signed
#define F_CERT 0x80//faund sert #define F_CERT 0x80//faund sert
#define DAP_STREAM_CH_NET_ID 'N' #define DAP_STREAM_CH_CHAIN_NET_ID 'N'
#define DAP_STREAM_CH_CHAIN_NET(a) ((dap_stream_ch_chain_net_t *) ((a)->internal) ) #define DAP_STREAM_CH_CHAIN_NET(a) ((dap_stream_ch_chain_net_t *) ((a)->internal) )
dap_chain_node_addr_t dap_stream_ch_chain_net_from_session_data_extract_node_addr(uint32_t a_session_id); dap_chain_node_addr_t dap_stream_ch_chain_net_from_session_data_extract_node_addr(uint32_t a_session_id);
......
...@@ -32,17 +32,18 @@ ...@@ -32,17 +32,18 @@
#define DAP_STREAM_CH_CHAIN_NET_PKT_VERSION 1 #define DAP_STREAM_CH_CHAIN_NET_PKT_VERSION 1
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x01 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x01
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING 0x02 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING 0x02
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG 0x03 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG 0x03
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE 0x44 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE 0x44
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK 0x45
#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff
typedef struct stream_ch_chain_net_pkt_hdr { typedef struct stream_ch_chain_net_pkt_hdr {
uint8_t version; uint8_t version;
......
...@@ -10,7 +10,7 @@ if(BUILD_CELLFRAME_SDK_TESTS) ...@@ -10,7 +10,7 @@ if(BUILD_CELLFRAME_SDK_TESTS)
add_subdirectory(tests) add_subdirectory(tests)
endif() endif()
target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain_net)
target_include_directories(${PROJECT_NAME} PUBLIC include/ ) target_include_directories(${PROJECT_NAME} PUBLIC include/ )
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/json-c) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/json-c)
......
...@@ -134,7 +134,7 @@ void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_tok ...@@ -134,7 +134,7 @@ void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_tok
} }
case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD: case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD:
if(l_tsd->size >= sizeof(dap_pkey_t)) { if(l_tsd->size >= sizeof(dap_pkey_t)) {
char *l_hash_str; const char *l_hash_str;
dap_pkey_t *l_pkey = (dap_pkey_t*)l_tsd->data; dap_pkey_t *l_pkey = (dap_pkey_t*)l_tsd->data;
dap_hash_fast_t l_hf = { }; dap_hash_fast_t l_hf = { };
if (!dap_pkey_get_hash(l_pkey, &l_hf)) { if (!dap_pkey_get_hash(l_pkey, &l_hf)) {
...@@ -152,7 +152,7 @@ void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_tok ...@@ -152,7 +152,7 @@ void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_tok
case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE: case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE:
if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){
char *l_hash_str = (!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash")) const char *l_hash_str = (!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash"))
? dap_chain_hash_fast_to_str_static((dap_chain_hash_fast_t*) l_tsd->data) ? dap_chain_hash_fast_to_str_static((dap_chain_hash_fast_t*) l_tsd->data)
: dap_enc_base58_encode_hash_to_str_static((dap_chain_hash_fast_t*) l_tsd->data); : dap_enc_base58_encode_hash_to_str_static((dap_chain_hash_fast_t*) l_tsd->data);
dap_string_append_printf(a_str_out,"total_pkeys_remove: %s\n", l_hash_str); dap_string_append_printf(a_str_out,"total_pkeys_remove: %s\n", l_hash_str);
...@@ -400,7 +400,7 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, ...@@ -400,7 +400,7 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum,
if (l_in_item && dap_hash_fast_is_blank(&l_in_item->header.tx_prev_hash)) if (l_in_item && dap_hash_fast_is_blank(&l_in_item->header.tx_prev_hash))
l_is_first = true; l_is_first = true;
char l_tmp_buf[DAP_TIME_STR_SIZE]; char l_tmp_buf[DAP_TIME_STR_SIZE];
char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(a_tx_hash) ? dap_enc_base58_encode_hash_to_str_static(a_tx_hash)
: dap_chain_hash_fast_to_str_static(a_tx_hash); : dap_chain_hash_fast_to_str_static(a_tx_hash);
dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, a_datum->header.ts_created); dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, a_datum->header.ts_created);
...@@ -677,7 +677,7 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, ...@@ -677,7 +677,7 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum,
} break; } break;
case TX_ITEM_TYPE_VOTE:{ case TX_ITEM_TYPE_VOTE:{
dap_chain_tx_vote_t *l_vote_item = (dap_chain_tx_vote_t *)item; dap_chain_tx_vote_t *l_vote_item = (dap_chain_tx_vote_t *)item;
char *l_hash_str = dap_chain_hash_fast_to_str_static(&l_vote_item->voting_hash); const char *l_hash_str = dap_chain_hash_fast_to_str_static(&l_vote_item->voting_hash);
dap_string_append_printf(a_str_out, "\t VOTE: \n" dap_string_append_printf(a_str_out, "\t VOTE: \n"
"\t Voting hash: %s\n" "\t Voting hash: %s\n"
"\t Vote answer idx: %"DAP_UINT64_FORMAT_U"\n", l_hash_str, l_vote_item->answer_idx); "\t Vote answer idx: %"DAP_UINT64_FORMAT_U"\n", l_hash_str, l_vote_item->answer_idx);
...@@ -715,7 +715,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c ...@@ -715,7 +715,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
} }
dap_hash_fast_t l_datum_hash; dap_hash_fast_t l_datum_hash;
dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_datum_hash); dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_datum_hash);
char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(&l_datum_hash) ? dap_enc_base58_encode_hash_to_str_static(&l_datum_hash)
: dap_chain_hash_fast_to_str_static(&l_datum_hash); : dap_chain_hash_fast_to_str_static(&l_datum_hash);
switch (a_datum->header.type_id) { switch (a_datum->header.type_id) {
......
...@@ -83,7 +83,7 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign ...@@ -83,7 +83,7 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign
dap_string_append_printf(a_str_out, "<CORRUPTED - can't calc hash>\n"); dap_string_append_printf(a_str_out, "<CORRUPTED - can't calc hash>\n");
continue; continue;
} }
char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash) ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash)
: dap_chain_hash_fast_to_str_static(&l_pkey_hash); : dap_chain_hash_fast_to_str_static(&l_pkey_hash);
dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str,
......
...@@ -245,7 +245,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree ...@@ -245,7 +245,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
} }
dap_hash_fast_t *l_stake_tx = /*{ }; dap_hash_fast_t *l_stake_tx = /*{ };
_dap_tsd_get_scalar(l_tsd, &l_stake_tx);*/ _dap_tsd_get_object(l_tsd, dap_hash_fast_t); _dap_tsd_get_scalar(l_tsd, &l_stake_tx);*/ _dap_tsd_get_object(l_tsd, dap_hash_fast_t);
char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex") const char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(l_stake_tx) ? dap_enc_base58_encode_hash_to_str_static(l_stake_tx)
: dap_chain_hash_fast_to_str_static(l_stake_tx); : dap_chain_hash_fast_to_str_static(l_stake_tx);
dap_string_append_printf(a_str_out, "\tStake tx: %s\n", l_stake_tx_hash); dap_string_append_printf(a_str_out, "\tStake tx: %s\n", l_stake_tx_hash);
...@@ -269,7 +269,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree ...@@ -269,7 +269,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
_dap_tsd_get_scalar(l_tsd, &l_stake_addr_signing);*/ _dap_tsd_get_object(l_tsd, dap_chain_addr_t); _dap_tsd_get_scalar(l_tsd, &l_stake_addr_signing);*/ _dap_tsd_get_object(l_tsd, dap_chain_addr_t);
dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", dap_chain_addr_to_str(l_stake_addr_signing)); dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", dap_chain_addr_to_str(l_stake_addr_signing));
dap_chain_hash_fast_t l_pkey_signing = l_stake_addr_signing->data.hash_fast; dap_chain_hash_fast_t l_pkey_signing = l_stake_addr_signing->data.hash_fast;
char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex") const char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(&l_pkey_signing) ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_signing)
: dap_chain_hash_fast_to_str_static(&l_pkey_signing); : dap_chain_hash_fast_to_str_static(&l_pkey_signing);
dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str); dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str);
...@@ -341,7 +341,7 @@ void dap_chain_datum_decree_certs_dump(dap_string_t * a_str_out, byte_t * a_sign ...@@ -341,7 +341,7 @@ void dap_chain_datum_decree_certs_dump(dap_string_t * a_str_out, byte_t * a_sign
continue; continue;
} }
char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash) ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash)
: dap_chain_hash_fast_to_str_static(&l_pkey_hash); : dap_chain_hash_fast_to_str_static(&l_pkey_hash);
dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str,
......
...@@ -282,7 +282,7 @@ void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_data_ ...@@ -282,7 +282,7 @@ void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_data_
continue; continue;
} }
char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash) ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash)
: dap_chain_hash_fast_to_str_static(&l_pkey_hash); : dap_chain_hash_fast_to_str_static(&l_pkey_hash);
......
...@@ -150,6 +150,32 @@ dap_chain_tx_voting_t *dap_chain_datum_tx_item_voting_create(void) ...@@ -150,6 +150,32 @@ dap_chain_tx_voting_t *dap_chain_datum_tx_item_voting_create(void)
return l_item; return l_item;
} }
const char *s_tx_voting_get_answer_text_by_idx(dap_chain_datum_tx_t *a_tx, uint64_t a_idx) {
dap_list_t *l_answers_list = NULL;
size_t l_anwers_count = 0;
dap_list_t* l_tsd_list = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_TSD, NULL);
dap_list_t* l_temp = l_tsd_list;
while (l_temp){
dap_tsd_t* l_tsd = (dap_tsd_t *)((dap_chain_tx_tsd_t*)l_temp->data)->tsd;
if (l_tsd->type == VOTING_TSD_TYPE_ANSWER) {
char *l_buf_string = DAP_NEW_Z_SIZE(char, l_tsd->size + 1);
memcpy(l_buf_string, l_tsd->data, l_tsd->size);
l_buf_string[l_tsd->size] = '\0';
l_answers_list = dap_list_append(l_answers_list, l_buf_string);
l_anwers_count++;
}
l_temp = l_temp->next;
}
dap_list_free(l_tsd_list);
if (l_anwers_count < a_idx) {
dap_list_free_full(l_answers_list, NULL);
return NULL;
}
char *l_ret = dap_strdup(dap_list_nth_data(l_answers_list, a_idx));
dap_list_free_full(l_answers_list, NULL);
return l_ret;
}
json_object *dap_chain_datum_tx_item_voting_tsd_to_json(dap_chain_datum_tx_t* a_tx) json_object *dap_chain_datum_tx_item_voting_tsd_to_json(dap_chain_datum_tx_t* a_tx)
{ {
if (!a_tx) if (!a_tx)
...@@ -210,14 +236,31 @@ dap_chain_tx_vote_t *dap_chain_datum_tx_item_vote_create(dap_chain_hash_fast_t * ...@@ -210,14 +236,31 @@ dap_chain_tx_vote_t *dap_chain_datum_tx_item_vote_create(dap_chain_hash_fast_t *
return l_item; return l_item;
} }
json_object *dap_chain_datum_tx_item_vote_to_json(dap_chain_tx_vote_t *a_vote) const char *s_get_vote_answer_text(dap_hash_fast_t *a_vote, uint64_t a_idx, dap_ledger_t *a_ledger) {
dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(a_ledger, a_vote);
if (!l_tx || !a_ledger) {
return NULL;
}
return s_tx_voting_get_answer_text_by_idx(l_tx, a_idx);
}
json_object *dap_chain_datum_tx_item_vote_to_json(dap_chain_tx_vote_t *a_vote, dap_ledger_t *a_ledger)
{ {
json_object *l_object = json_object_new_object(); json_object *l_object = json_object_new_object();
char *l_voting_hash_str = dap_hash_fast_to_str_new(&a_vote->voting_hash); char *l_voting_hash_str = dap_hash_fast_to_str_new(&a_vote->voting_hash);
json_object *l_voting_hash = json_object_new_string(l_voting_hash_str); json_object *l_voting_hash = json_object_new_string(l_voting_hash_str);
DAP_DELETE(l_voting_hash_str); DAP_DELETE(l_voting_hash_str);
json_object *l_answer_idx = json_object_new_uint64(a_vote->answer_idx); json_object *l_answer_idx = json_object_new_uint64(a_vote->answer_idx);
const char *l_answer_text_str = s_get_vote_answer_text(&a_vote->voting_hash, a_vote->answer_idx, a_ledger);
json_object *l_answer_text = NULL;
if (!l_answer_text_str) {
l_answer_text = json_object_new_string("{UNDEFINED}");
} else {
l_answer_text = json_object_new_string(l_answer_text_str);
DAP_DELETE(l_answer_text_str);
}
json_object_object_add(l_object, "votingHash", l_voting_hash); json_object_object_add(l_object, "votingHash", l_voting_hash);
json_object_object_add(l_object, "answer_idx", l_answer_idx); json_object_object_add(l_object, "answer_idx", l_answer_idx);
json_object_object_add(l_object, "answer_text", l_answer_text);
return l_object; return l_object;
} }
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "dap_chain_common.h" #include "dap_chain_common.h"
#include "dap_chain_datum_tx.h" #include "dap_chain_datum_tx.h"
#include "dap_chain_datum_tx_items.h" #include "dap_chain_datum_tx_items.h"
#include "dap_chain_ledger.h"
#include "dap_time.h" #include "dap_time.h"
#include "dap_list.h" #include "dap_list.h"
#include "dap_tsd.h" #include "dap_tsd.h"
...@@ -87,4 +88,4 @@ json_object *dap_chain_datum_tx_item_voting_tsd_to_json(dap_chain_datum_tx_t* a_ ...@@ -87,4 +88,4 @@ json_object *dap_chain_datum_tx_item_voting_tsd_to_json(dap_chain_datum_tx_t* a_
dap_chain_tx_vote_t *dap_chain_datum_tx_item_vote_create(dap_chain_hash_fast_t *a_voting_hash, uint64_t *a_answer_idx); dap_chain_tx_vote_t *dap_chain_datum_tx_item_vote_create(dap_chain_hash_fast_t *a_voting_hash, uint64_t *a_answer_idx);
json_object *dap_chain_datum_tx_item_vote_to_json(dap_chain_tx_vote_t *a_vote); json_object *dap_chain_datum_tx_item_vote_to_json(dap_chain_tx_vote_t *a_vote, dap_ledger_t *a_ledger);
...@@ -76,6 +76,7 @@ typedef struct dap_chain_cs_dag_poa_pvt { ...@@ -76,6 +76,7 @@ typedef struct dap_chain_cs_dag_poa_pvt {
uint32_t confirmations_timeout; // wait signs over min value (auth_certs_count_verify) uint32_t confirmations_timeout; // wait signs over min value (auth_certs_count_verify)
uint32_t wait_sync_before_complete; uint32_t wait_sync_before_complete;
dap_chain_cs_dag_poa_presign_callback_t *callback_pre_sign; dap_chain_cs_dag_poa_presign_callback_t *callback_pre_sign;
dap_interval_timer_t mempool_timer;
} dap_chain_cs_dag_poa_pvt_t; } dap_chain_cs_dag_poa_pvt_t;
#define PVT(a) ((dap_chain_cs_dag_poa_pvt_t *) a->_pvt ) #define PVT(a) ((dap_chain_cs_dag_poa_pvt_t *) a->_pvt )
...@@ -694,6 +695,26 @@ static bool s_callback_sync_all_on_start(dap_global_db_instance_t *a_dbi, int a_ ...@@ -694,6 +695,26 @@ static bool s_callback_sync_all_on_start(dap_global_db_instance_t *a_dbi, int a_
return false; return false;
} }
static void s_round_changes_notify(dap_store_obj_t *a_obj, void *a_arg)
{
dap_chain_cs_dag_t *l_dag = (dap_chain_cs_dag_t *)a_arg;
assert(l_dag);
dap_chain_net_t *l_net = dap_chain_net_by_id(l_dag->chain->net_id);
log_it(L_DEBUG, "%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",
l_net->pub.name, l_dag->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len);
if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) {
if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) // check key for round increment, if no than process event
s_callback_event_round_sync(l_dag, a_obj->type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len);
else
log_it(L_INFO, "Global round ID: %lu", *(uint64_t*)a_obj->value);
}
}
static void s_timer_process_callback(void *a_arg)
{
dap_chain_node_mempool_process_all((dap_chain_t *)a_arg, false);
}
/** /**
* @brief create callback load certificate for event signing for specific chain * @brief create callback load certificate for event signing for specific chain
* path to certificate iw written to chain config file in dag_poa section * path to certificate iw written to chain config file in dag_poa section
...@@ -714,10 +735,25 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c ...@@ -714,10 +735,25 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
log_it(L_NOTICE,"Loaded \"%s\" certificate to sign poa event", l_events_sign_cert); log_it(L_NOTICE,"Loaded \"%s\" certificate to sign poa event", l_events_sign_cert);
} }
dap_chain_net_t *l_cur_net = dap_chain_net_by_name(a_chain->net_name); dap_chain_net_t *l_net = dap_chain_net_by_name(a_chain->net_name);
dap_chain_node_role_t l_role = dap_chain_net_get_role(l_cur_net); assert(l_net);
dap_global_db_cluster_t *l_dag_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), NULL,
dap_guuid_compose(l_net->pub.id.uint64, DAP_CHAIN_CLUSTER_ID_DAG),
l_dag->gdb_group_events_round_new, 900, true,
DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_ROLE_AUTONOMIC);
dap_global_db_cluster_add_notify_callback(l_dag_cluster, s_round_changes_notify, l_dag);
dap_chain_net_add_auth_nodes_to_cluster(l_net, l_dag_cluster);
dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_dag_cluster->links_cluster);
byte_t *l_current_round = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL);
l_dag->round_current = l_current_round ? *(uint64_t*)l_current_round : 0;
DAP_DELETE(l_current_round);
log_it(L_INFO, "Current round id %"DAP_UINT64_FORMAT_U, l_dag->round_current);
PVT(l_poa)->mempool_timer = dap_interval_timer_create(15000, s_timer_process_callback, a_chain);
dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net);
if (l_role.enums == NODE_ROLE_ROOT_MASTER || l_role.enums == NODE_ROLE_ROOT) { if (l_role.enums == NODE_ROLE_ROOT_MASTER || l_role.enums == NODE_ROLE_ROOT) {
l_dag->callback_cs_event_round_sync = s_callback_event_round_sync;
l_dag->round_completed = l_dag->round_current++; l_dag->round_completed = l_dag->round_current++;
log_it(L_MSG, "Round complete ID %"DAP_UINT64_FORMAT_U", current ID %"DAP_UINT64_FORMAT_U, l_dag->round_completed, l_dag->round_current); log_it(L_MSG, "Round complete ID %"DAP_UINT64_FORMAT_U", current ID %"DAP_UINT64_FORMAT_U, l_dag->round_completed, l_dag->round_current);
dap_global_db_get_all(l_dag->gdb_group_events_round_new, 0, s_callback_sync_all_on_start, l_dag); dap_global_db_get_all(l_dag->gdb_group_events_round_new, 0, s_callback_sync_all_on_start, l_dag);
...@@ -738,6 +774,8 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag) ...@@ -738,6 +774,8 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag)
if ( l_poa->_pvt ) { if ( l_poa->_pvt ) {
dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( l_poa ); dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( l_poa );
dap_interval_timer_delete(l_poa_pvt->mempool_timer);
if ( l_poa_pvt->auth_certs ) if ( l_poa_pvt->auth_certs )
DAP_DELETE ( l_poa_pvt->auth_certs); DAP_DELETE ( l_poa_pvt->auth_certs);
......