diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 4661961f05aa5b520fd808d34593a7b9d6600995..10306fb5a1b8db257aeb20e44ac7dd99bdad4dbe 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -792,39 +792,36 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ if (!l_poa_pvt->auto_confirmation) return 0; - dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)a_value; + dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t*)a_value; + dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t*)l_round_item->event_n_signs; size_t l_event_size = l_round_item->event_size; - dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t*)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); - if (!l_event) - return log_it(L_CRITICAL, "Memory allocation failed"), -1; - - if ( (dap_chain_cs_dag_event_sign_exists(l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key) - || dap_chain_cs_dag_event_round_sign_exists(l_round_item, l_poa_pvt->events_sign_cert->enc_key)) - && l_poa_pvt->auto_round_complete - && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, (char*)a_key) ) - { - dap_chain_cs_dag_poa_round_item_t l_event_item = { .datum_hash = l_round_item->round_info.datum_hash, .dag = a_dag }; - return DAP_DELETE(l_event), s_round_event_cs_done(&l_event_item), 0; - } - - size_t l_event_size_new = 0; - int ret = 0; - if ( !l_poa_pvt->callback_pre_sign || !l_poa_pvt->callback_pre_sign->callback - || !(ret = l_poa_pvt->callback_pre_sign->callback(a_dag->chain, l_event, l_event_size, - l_poa_pvt->callback_pre_sign->arg)) ) - { - l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key); - dap_chain_cs_dag_event_gdb_set(a_dag, (char*)a_key, l_event, l_event_size_new, l_round_item); - } else { // set sign for reject - l_round_item = DAP_DUP_SIZE(a_value, a_value_size); - if (dap_chain_cs_dag_event_round_sign_add(&l_round_item, a_value_size, l_poa_pvt->events_sign_cert->enc_key)) { - log_it(L_NOTICE,"Can't sign event %s, because sign rejected by pre_sign callback, ret code %d", a_key, ret); - l_round_item->round_info.reject_count++; - dap_chain_cs_dag_event_gdb_set(a_dag, (char*)a_key, l_event, l_event_size, l_round_item); + int l_ret = 0; + if ( dap_chain_cs_dag_event_sign_exists(l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key) ) { + if (l_poa_pvt->auto_round_complete && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, (char*)a_key) ) { + dap_chain_cs_dag_poa_round_item_t l_event_item = { .datum_hash = l_round_item->round_info.datum_hash, .dag = a_dag }; + return s_round_event_cs_done(&l_event_item), l_ret; + } else + return log_it(L_INFO, "Event %s is already signed by us", a_key), l_ret; + } else { + if ( !l_poa_pvt->callback_pre_sign + || !l_poa_pvt->callback_pre_sign->callback + || !(l_ret = l_poa_pvt->callback_pre_sign->callback(a_dag->chain, l_event, l_event_size, l_poa_pvt->callback_pre_sign->arg)) + ) { + l_event = DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); + if (( l_event_size = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key) )) + dap_chain_cs_dag_event_gdb_set(a_dag, (char*)a_key, l_event, l_event_size, l_round_item); + DAP_DELETE(l_event); + } else { + l_round_item = DAP_DUP_SIZE(a_value, a_value_size); + if ( dap_chain_cs_dag_event_round_sign_add(&l_round_item, a_value_size, l_poa_pvt->events_sign_cert->enc_key) ) { + log_it(L_NOTICE,"Can't sign event %s, because sign rejected by pre_sign callback, ret code %d", a_key, l_ret); + ++l_round_item->round_info.reject_count; + dap_chain_cs_dag_event_gdb_set(a_dag, (char*)a_key, l_event, l_event_size, l_round_item); + } + DAP_DELETE(l_round_item); } - DAP_DELETE(l_round_item); } - return DAP_DELETE(l_event), ret; + return l_ret; } /** diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index f89726a8330a77a48eb7ff8b83812c22ea743670..08faedc0afbc53580504eed5fc1493a6e1961e25 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -149,13 +149,7 @@ size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, s if (dap_chain_cs_dag_event_sign_exists(l_event, a_event_size, a_key)) { size_t l_pub_key_size = 0; uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); - dap_hash_fast_t l_pkey_hash = {}; - dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); - DAP_DELETE(l_pub_key); - char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_hash_fast_to_str(&l_pkey_hash, l_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); - log_it(L_DEBUG, "Sign from this key exists: %s", l_hash_str); - return 0; + return log_it(L_DEBUG, "Already signed with pkey %s", dap_get_data_hash_str(l_pub_key, l_pub_key_size).s), DAP_DELETE(l_pub_key), 0; } size_t l_event_size_excl_sign = dap_chain_cs_dag_event_calc_size_excl_signs(l_event, a_event_size); dap_sign_t *l_sign = dap_sign_create(a_key, l_event, l_event_size_excl_sign, 0); @@ -192,18 +186,18 @@ static bool s_sign_exists(uint8_t *a_pos, size_t a_len, dap_enc_key_t *a_key) bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, dap_enc_key_t *a_key) { - size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); - dap_chain_datum_t * l_datum = (dap_chain_datum_t*)(a_event->hashes_n_datum_n_signs + l_hashes_size); - size_t l_datum_size = dap_chain_datum_size(l_datum); - uint8_t *l_offset = a_event->hashes_n_datum_n_signs + l_hashes_size + l_datum_size; - size_t l_signs_size = a_event_size - sizeof(a_event->header) - l_hashes_size - l_datum_size; - return s_sign_exists(l_offset, l_signs_size, a_key); + size_t l_hashes_size = a_event->header.hash_count * sizeof(dap_chain_hash_fast_t); + dap_chain_datum_t *l_datum = (dap_chain_datum_t*)(a_event->hashes_n_datum_n_signs + l_hashes_size); + size_t l_datum_size = dap_chain_datum_size(l_datum); + return s_sign_exists(a_event->hashes_n_datum_n_signs + l_hashes_size + l_datum_size, + a_event_size - sizeof(a_event->header) - l_hashes_size - l_datum_size, + a_key); } bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, dap_enc_key_t *a_key) { - uint8_t *l_offset = a_round_item->event_n_signs + (size_t)a_round_item->event_size; - size_t l_signs_size = (size_t)a_round_item->data_size - (size_t)a_round_item->event_size; - return s_sign_exists(l_offset, l_signs_size, a_key); + return s_sign_exists(a_round_item->event_n_signs + a_round_item->event_size, + (size_t)(a_round_item->data_size - a_round_item->event_size), + a_key); } /**