Skip to content
Snippets Groups Projects
Commit 657bd2c7 authored by Roman Khlopkov's avatar Roman Khlopkov 🔜
Browse files

[+] Event validator for stake service

parent ac49315f
No related branches found
No related tags found
1 merge request!99features-3975+3977
......@@ -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)
......@@ -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
......
......@@ -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)
......@@ -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?
......
......@@ -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;
}
......
......@@ -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);
......
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