diff --git a/modules/consensus/dag-poa/CMakeLists.txt b/modules/consensus/dag-poa/CMakeLists.txt index 4a78a37e527bf4d67eeebd2b11f8d9833747f269..f918a704c31b806b221c5b6cebd1b47cddc6a7bf 100644 --- a/modules/consensus/dag-poa/CMakeLists.txt +++ b/modules/consensus/dag-poa/CMakeLists.txt @@ -11,6 +11,6 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_CS_POA_SRCS} ${DAP_CHAIN_DAG_CS_POA_HEADERS}) -target_link_libraries(dap_chain_cs_dag_poa dap_core dap_crypto dap_chain dap_chain_cs_dag ) +target_link_libraries(dap_chain_cs_dag_poa dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) target_include_directories(dap_chain_cs_dag_poa INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) 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 6a7e51bb0af704a6d467fca1c5c613b1f6324ac1..4d5bf15f7be6323f6f48f6e0312f51e47182136f 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -43,6 +43,7 @@ #include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag_event.h" #include "dap_chain_cs_dag_poa.h" +#include "dap_chain_net_srv_stake.h" #include "dap_cert.h" @@ -306,12 +307,33 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( a_dag ) ); if ( a_dag_event->header.signs_count >= l_poa_pvt->auth_certs_count_verify ){ size_t l_verified = 0; - for ( uint16_t i = 0; i < a_dag_event->header.signs_count; i++ ){ - for ( uint16_t j = 0; j < l_poa_pvt->auth_certs_count; j++){ - if( dap_cert_compare_with_sign ( l_poa_pvt->auth_certs[j], - dap_chain_cs_dag_event_get_sign(a_dag_event,i) ) == 0 ) + for ( uint16_t i = 0; i < a_dag_event->header.signs_count; i++ ) { + dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0); + if ( l_sign == NULL){ + log_it(L_WARNING, "Event is NOT signed with anything"); + return -4; + } + for (uint16_t j = 0; j < l_poa_pvt->auth_certs_count; j++) { + if (dap_cert_compare_with_sign ( l_poa_pvt->auth_certs[j], l_sign) == 0) l_verified++; } + if (i == 0) { + dap_chain_hash_fast_t l_pkey_hash; + if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { + log_it(L_WARNING, "Event's sign has no any key"); + return -5; + } + dap_chain_addr_t l_addr = {}; + dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, &a_dag->chain->net_id); + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event); + if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; + if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) { + return -6; + } + } + } + } return l_verified >= l_poa_pvt->auth_certs_count_verify ? 0 : -1; }else diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt index 7b4a426675bc89fd898bc30f98622907f672a4a5..21638a18436e71592a70b85f75840bd5ec557c1b 100644 --- a/modules/consensus/dag-pos/CMakeLists.txt +++ b/modules/consensus/dag-pos/CMakeLists.txt @@ -11,6 +11,6 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_DAG_POS_SRCS} ${DAP_CHAIN_CS_DAG_POS_HEADERS}) -target_link_libraries(dap_chain_cs_dag_pos dap_core dap_crypto dap_chain dap_chain_cs_dag ) +target_link_libraries(dap_chain_cs_dag_pos dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) target_include_directories(dap_chain_cs_dag_pos INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index 33aa66b2a5e04285172e24ca2cad25fc532440c8..689e2dda83b53ce4e40b7b3f0404b74f26723a5c 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -30,7 +30,7 @@ #include "dap_chain_cs.h" #include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag_pos.h" - +#include "dap_chain_net_srv_stake.h" #include "dap_chain_ledger.h" #define LOG_TAG "dap_chain_cs_dag_pos" @@ -224,7 +224,7 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ dap_chain_addr_t l_addr = { 0 }; for ( size_t l_sig_pos=0; l_sig_pos < a_dag_event->header.signs_count; l_sig_pos++ ){ - dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event,0); + dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0); if ( l_sign == NULL){ log_it(L_WARNING, "Event is NOT signed with anything"); return -4; @@ -237,6 +237,15 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, &a_dag->chain->net_id); + if (l_sig_pos == 0) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event); + if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; + if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) { + return -6; + } + } + } /* dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(a_dag_event); // transaction include emission? diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index 27f803b8b2282fac25ba3b2af48ba84cbd451193..79bb415aaeab23a785d5b1c8f79987c23a713cc5 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -123,19 +123,10 @@ bool dap_chain_net_srv_stake_verificator(dap_chain_tx_out_cond_t *a_cond, dap_ch return false; } -bool dap_chain_net_srv_stake_validator(dap_chain_net_t *a_net, dap_chain_datum_tx_t *a_tx) +bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum_tx_t *a_tx) { - dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(a_tx, NULL, - TX_ITEM_TYPE_SIG, NULL); - dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_tx_sig); - dap_chain_hash_fast_t l_pkey_hash; - if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { // invalid tx - return false; - } - dap_chain_addr_t l_addr_to; - dap_chain_addr_fill(&l_addr_to, l_sign->header.type, &l_pkey_hash, &a_net->pub.id); dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(hh, s_srv_stake->itemlist, &l_addr_to, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, s_srv_stake->itemlist, a_addr, sizeof(dap_chain_addr_t), l_stake); if (l_stake == NULL) { // public key not delegated for this network return true; } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 112cd0a8b6c664f4ce54b5dbb97d1cf9975174cd..f43a37fd4caccb6c9307dd8ab025defc4044c3f1 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -1276,7 +1276,6 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) l_addr_str ); l_offset += l_sign_size; DAP_DELETE( l_addr_str); - dap_enc_key_delete(l_sign_key); } dap_chain_net_dump_datum(l_str_tmp, l_datum);