diff --git a/dap-sdk b/dap-sdk index e96283ddc24d41a307badd6365d82cf524685f79..a70e9212ad7f25ec8f1737c87fab6eaabc35c0c7 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit e96283ddc24d41a307badd6365d82cf524685f79 +Subproject commit a70e9212ad7f25ec8f1737c87fab6eaabc35c0c7 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 923b4109500f7cb0d533ec08a772e98f127607b3..4a195c08806a81215a1220b125f358c2994f45f4 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -456,10 +456,26 @@ enum dap_chain_poa_round_filter_stage { DAP_CHAIN_POA_ROUND_FILTER_STAGE_START, DAP_CHAIN_POA_ROUND_FILTER_STAGE_SIGNS, DAP_CHAIN_POA_ROUND_FILTER_STAGE_TS, - DAP_CHAIN_POA_ROUND_FILTER_STAGE_HASH, + DAP_CHAIN_POA_ROUND_FILTER_STAGE_MEM, DAP_CHAIN_POA_ROUND_FILTER_STAGE_MAX }; +#define DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE 1024 + +static void s_event_get_unique_mem_region(dap_chain_cs_dag_event_round_item_t *a_round_item, byte_t *a_mem_region) +{ + memset(a_mem_region, 0, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE); + dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t *)a_round_item->event_n_signs; + for (int n = 0; n < l_event->header.signs_count; n++) { + dap_sign_t *l_sign = dap_chain_cs_dag_event_get_sign(l_event, a_round_item->event_size, n); + size_t l_sign_size = 0; + byte_t *l_sign_mem = dap_sign_get_sign(l_sign, &l_sign_size); + size_t l_mem_size = MIN(l_sign_size, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE); + for (size_t i = 0; i < l_mem_size; i++) + a_mem_region[i] ^= l_sign_mem[i]; + } +} + static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t *a_dups, uint16_t a_max_signs_counts) { dap_chain_cs_dag_event_round_item_t *l_round_item; @@ -468,7 +484,8 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t return NULL; dap_list_t *l_dups = dap_list_copy(a_dups); uint64_t l_min_ts_update = (uint64_t)-1; - dap_hash_fast_t l_event_hash, l_winner_hash = {}; + byte_t l_event_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE], + l_winner_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE] = {}; enum dap_chain_poa_round_filter_stage l_stage = DAP_CHAIN_POA_ROUND_FILTER_STAGE_START; while (l_stage++ < DAP_CHAIN_POA_ROUND_FILTER_STAGE_MAX) { for (dap_list_t *it = l_dups; it; it = it->next) { @@ -485,16 +502,14 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t if (l_round_item->round_info.ts_update != l_min_ts_update) l_dups = dap_list_remove_link(l_dups, it); else { - dap_chain_cs_dag_event_calc_hash((dap_chain_cs_dag_event_t *)l_round_item->event_n_signs, - l_round_item->event_size, &l_event_hash); - if (memcmp(&l_winner_hash, &l_event_hash, sizeof(dap_hash_fast_t)) < 0) - l_winner_hash = l_event_hash; + s_event_get_unique_mem_region(l_round_item, l_event_mem_region); + if (memcmp(&l_winner_mem_region, &l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE) > 0) + memcpy(l_winner_mem_region, l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE); } break; - case DAP_CHAIN_POA_ROUND_FILTER_STAGE_HASH: - dap_chain_cs_dag_event_calc_hash((dap_chain_cs_dag_event_t *)l_round_item->event_n_signs, - l_round_item->event_size, &l_event_hash); - if (memcmp(&l_winner_hash, &l_event_hash, sizeof(dap_hash_fast_t))) + case DAP_CHAIN_POA_ROUND_FILTER_STAGE_MEM: + s_event_get_unique_mem_region(l_round_item, l_event_mem_region); + if (memcmp(&l_winner_mem_region, &l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE)) l_dups = dap_list_remove_link(l_dups, it); default: break; }