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

Merge branch 'bugs-3859' into 'master'

[*] fixed big when events from old network were correctly verified and ignored static genesis event

See merge request !57
parents d68d678a bea3d1d1
No related branches found
No related tags found
1 merge request!57[*] fixed big when events from old network were correctly verified and ignored static genesis event
...@@ -69,6 +69,7 @@ typedef struct dap_chain_cs_dag_pvt { ...@@ -69,6 +69,7 @@ typedef struct dap_chain_cs_dag_pvt {
dap_chain_cs_dag_event_item_t * tx_events; dap_chain_cs_dag_event_item_t * tx_events;
dap_chain_cs_dag_event_item_t * events_treshold; dap_chain_cs_dag_event_item_t * events_treshold;
dap_chain_cs_dag_event_item_t * events_treshold_conflicted;
dap_chain_cs_dag_event_item_t * events_lasts_unlinked; dap_chain_cs_dag_event_item_t * events_lasts_unlinked;
} dap_chain_cs_dag_pvt_t; } dap_chain_cs_dag_pvt_t;
...@@ -260,9 +261,9 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t ...@@ -260,9 +261,9 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom;
// verification was already in s_chain_callback_atom_verify() // verification was already in s_chain_callback_atom_verify()
ret = l_dag->callback_cs_verify(l_dag,l_event); int ret_cs = l_dag->callback_cs_verify(l_dag,l_event);
if ( ret != 0 ){ if ( ret != 0 ){
log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret); log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret_cs);
return -2; return -2;
} }
dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t); dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
...@@ -272,7 +273,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t ...@@ -272,7 +273,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
// Put in main table or in the treshhold if not all the rest linked event are present // Put in main table or in the treshhold if not all the rest linked event are present
dap_chain_cs_dag_event_item_t * l_event_search = NULL; dap_chain_cs_dag_event_item_t * l_event_search = NULL;
dap_chain_cs_dag_event_item_t * l_events =( ret==0 ? PVT(l_dag)->events : PVT(l_dag)->events_treshold ); dap_chain_cs_dag_event_item_t * l_events =( (ret==0 && ret_cs == 0)? PVT(l_dag)->events : PVT(l_dag)->events_treshold );
pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ; pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ;
pthread_rwlock_wrlock( l_events_rwlock ); pthread_rwlock_wrlock( l_events_rwlock );
HASH_FIND(hh, l_events,&l_event_item->hash,sizeof (l_event_search->hash), l_event_search); HASH_FIND(hh, l_events,&l_event_item->hash,sizeof (l_event_search->hash), l_event_search);
...@@ -286,7 +287,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t ...@@ -286,7 +287,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
} }
HASH_ADD(hh, l_events,hash,sizeof (l_event_item->hash), l_event_item); HASH_ADD(hh, l_events,hash,sizeof (l_event_item->hash), l_event_item);
// save l_events to dag_pvt // save l_events to dag_pvt
if(ret==0) if(ret==0 && ret_cs == 0)
PVT(l_dag)->events = l_events; PVT(l_dag)->events = l_events;
else else
PVT(l_dag)->events_treshold = l_events; PVT(l_dag)->events_treshold = l_events;
...@@ -563,20 +564,25 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt ...@@ -563,20 +564,25 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt
{ {
dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom;
if (l_event->header.hash_count == 0){
if(s_seed_mode && !PVT(l_dag)->events)
//starting a new network and this is a genesis event
return 0;
if (l_event->header.hash_count == 0 && l_dag->is_static_genesis_event ){ if (l_dag->is_static_genesis_event ){
dap_chain_hash_fast_t l_event_hash; dap_chain_hash_fast_t l_event_hash;
dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash); dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash);
if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ){ if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ){
char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash);
char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash); char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash);
log_it(L_WARNING, "Wrong genesis block %s (staticly predefined %s)",l_event_hash_str, l_genesis_event_hash_str); log_it(L_WARNING, "Wrong genesis block %s (staticly predefined %s)",l_event_hash_str, l_genesis_event_hash_str);
DAP_DELETE(l_event_hash_str); DAP_DELETE(l_event_hash_str);
DAP_DELETE(l_genesis_event_hash_str); DAP_DELETE(l_genesis_event_hash_str);
return -22; return -22;
} }
return 0; return 0;
}
} }
int ret = l_dag->callback_cs_verify ( l_dag, l_event ); int ret = l_dag->callback_cs_verify ( l_dag, l_event );
...@@ -592,11 +598,14 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt ...@@ -592,11 +598,14 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt
DAP_DELETE(l_hash_str); DAP_DELETE(l_hash_str);
return 1; return 1;
} }
} }
return 0;
}else{
//event looks fine but we have no hash table yet and can't verify it's hashes
//so it goes into threshold
return 1;
} }
return 0;
}else { }else {
return ret; return ret;
} }
...@@ -634,14 +643,33 @@ void s_dag_events_lasts_delete_linked_with_event(dap_chain_cs_dag_t * a_dag, dap ...@@ -634,14 +643,33 @@ void s_dag_events_lasts_delete_linked_with_event(dap_chain_cs_dag_t * a_dag, dap
} }
typedef enum{
DAP_THRESHOLD_OK = 0,
DAP_THRESHOLD_NO_HASHES,
DAP_THRESHOLD_NO_HASHES_IN_MAIN,
DAP_THRESHOLD_CONFLICTING
} dap_dag_threshold_verification_res_t;
int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event) int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event)
{ {
bool l_is_events_all_hashes = true; bool l_is_events_all_hashes = true;
bool l_is_events_main_hashes = true; bool l_is_events_main_hashes = true;
if(a_event->header.hash_count == 0){
//looks like an alternative genesis event
return DAP_THRESHOLD_CONFLICTING;
}
for (size_t i = 0; i< a_event->header.hash_count; i++) { for (size_t i = 0; i< a_event->header.hash_count; i++) {
dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) a_event->hashes_n_datum_n_signs) + i; dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) a_event->hashes_n_datum_n_signs) + i;
dap_chain_cs_dag_event_item_t * l_event_search = NULL; dap_chain_cs_dag_event_item_t * l_event_search = NULL;
HASH_FIND(hh, PVT(a_dag)->events_treshold_conflicted,l_hash ,sizeof (*l_hash), l_event_search);
if ( l_event_search ){
//event is linked to event we consider conflicting
return DAP_THRESHOLD_CONFLICTING;
}
HASH_FIND(hh, PVT(a_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search); HASH_FIND(hh, PVT(a_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search);
if ( l_event_search == NULL ){ // If not found in events - search in treshhold if ( l_event_search == NULL ){ // If not found in events - search in treshhold
l_is_events_main_hashes = false; l_is_events_main_hashes = false;
...@@ -653,11 +681,11 @@ int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_da ...@@ -653,11 +681,11 @@ int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_da
} }
} }
if( l_is_events_all_hashes && l_is_events_main_hashes ){ if( l_is_events_all_hashes && l_is_events_main_hashes ){
return 0; return DAP_THRESHOLD_OK;
}else if ( ! l_is_events_all_hashes) { }else if ( ! l_is_events_all_hashes) {
return -1; return DAP_THRESHOLD_NO_HASHES;
}else { }else {
return 1; return DAP_THRESHOLD_NO_HASHES_IN_MAIN;
} }
} }
...@@ -672,12 +700,17 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag) ...@@ -672,12 +700,17 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag)
dap_chain_cs_dag_event_item_t * l_event_item = NULL, * l_event_item_tmp = NULL; dap_chain_cs_dag_event_item_t * l_event_item = NULL, * l_event_item_tmp = NULL;
HASH_ITER(hh,PVT(a_dag)->events_treshold,l_event_item, l_event_item_tmp){ HASH_ITER(hh,PVT(a_dag)->events_treshold,l_event_item, l_event_item_tmp){
dap_chain_cs_dag_event_t * l_event = l_event_item->event; dap_chain_cs_dag_event_t * l_event = l_event_item->event;
int ret = dap_chain_cs_dag_event_verify_hashes_with_treshold (a_dag,l_event); dap_dag_threshold_verification_res_t ret = dap_chain_cs_dag_event_verify_hashes_with_treshold (a_dag,l_event);
if ( ret == 0){ // All its hashes are in main table, move thats one too into it if ( ret == DAP_THRESHOLD_OK || ret == DAP_THRESHOLD_CONFLICTING ){ // All its hashes are in main table, move thats one too into it
pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock); pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock);
pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock); pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock);
HASH_DEL(PVT(a_dag)->events_treshold,l_event_item); HASH_DEL(PVT(a_dag)->events_treshold,l_event_item);
HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash), l_event_item);
if(ret == DAP_THRESHOLD_OK)
HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash), l_event_item);
else if(ret == DAP_THRESHOLD_CONFLICTING)
HASH_ADD(hh, PVT(a_dag)->events_treshold_conflicted, hash,sizeof (l_event_item->hash), l_event_item);
s_dag_events_lasts_delete_linked_with_event(a_dag, l_event); s_dag_events_lasts_delete_linked_with_event(a_dag, l_event);
} }
} }
......
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