diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 116609a436e7cf9509034c5563991eeb4cac0444..4762d843621b0144ea08ae96470f56031ceffbee 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -101,6 +101,7 @@ typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, si typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); typedef uint256_t (*dap_chain_callback_get_minimum_fee)(dap_chain_t *a_chain); +typedef dap_enc_key_t* (*dap_chain_callback_get_signing_certificate)(dap_chain_t *a_chain); typedef void (*dap_chain_callback_load_from_gdb)(dap_chain_t *a_chain); @@ -183,6 +184,7 @@ typedef struct dap_chain { dap_chain_callback_set_min_validators_count callback_set_min_validators_count; dap_chain_callback_get_minimum_fee callback_get_minimum_fee; + dap_chain_callback_get_signing_certificate callback_get_signing_certificate; dap_chain_callback_load_from_gdb callback_load_from_gdb; diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index b24ce59faadcf1f4e5ff7d19de234e333c19bf4a..c66e3cbb689f0c63b6114fd3f32bd72398ee3e10 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -54,6 +54,8 @@ #include "dap_stream_ch_chain_net_pkt.h" #include "dap_stream_ch_chain_net.h" +#include "dap_chain_net_srv_stake_pos_delegate.h" + #define LOG_TAG "dap_stream_ch_chain_net" static void s_stream_ch_new(dap_stream_ch_t* ch, void* arg); @@ -316,8 +318,81 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) memcpy( &l_session_data->addr_remote,l_addr_new,sizeof (*l_addr_new) ); DAP_DELETE(l_addr_new); } - } - break; + } break; + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{ + log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST"); + dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); + if ( l_net == NULL){ + char l_err_str[]="ERROR_NET_INVALID_ID"; + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , + l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str)); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + log_it(L_ERROR, "Invalid net id in packet"); + } else { + dap_chain_net_srv_order_t * l_orders = NULL; + dap_enc_key_t * enc_key_pvt = NULL; + dap_chain_t *l_chain = NULL; + DL_FOREACH(l_net->pub.chains, l_chain) + if((enc_key_pvt = l_chain->callback_get_signing_certificate(l_chain))) + break; + dap_sign_t *l_sign = NULL; + size_t sign_s = 0; + size_t l_orders_num = 0; + dap_stream_ch_chain_rnd_t *send = NULL; + dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } }; + dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; + uint256_t l_price_min = {}; + uint256_t l_price_max = {}; + uint8_t flags = 0; + + if(enc_key_pvt) + { + flags = flags | F_CERT;//faund sert + l_sign = dap_sign_create(enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data, + l_ch_chain_net_pkt_data_size, 0); + if(l_sign) + { + sign_s = dap_sign_get_size(l_sign); + flags = flags | D_SIGN;//data signed + } + else + flags = flags & ~D_SIGN;//data doesn't sign + } + else + flags = flags & ~F_CERT;//Specified certificate not found + + send = DAP_NEW_Z_SIZE(dap_stream_ch_chain_rnd_t,sizeof(dap_stream_ch_chain_rnd_t)+sign_s); +#ifdef DAP_VERSION + strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version)); +#endif + send->header.sign_size = sign_s; + //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10); + flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC; + + dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid, + l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num); + flags = l_orders_num ? flags | F_ORDR : flags & ~F_ORDR; + bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", true ); + bool auto_update = dap_config_get_item_bool_default( g_config, "general", "auto_update", true ); + flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN; + flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT; + send->header.flags = flags; + //add sign + if(sign_s) + memcpy(send->sign,l_sign,sign_s); + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY , + l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_stream_ch_chain_rnd_t)+sign_s); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + if(l_sign) + DAP_DELETE(l_sign); + DAP_DELETE(send); + } + }break; + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{ + log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY"); + + dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); + }break; } if(l_ch_chain_net->notify_callback) l_ch_chain_net->notify_callback(l_ch_chain_net,l_ch_pkt->hdr.type, l_ch_chain_net_pkt, diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net.h index 16bcfed44d388fd91a4e1fce25eabbd0ad3e147c..caf3267e84c35bf8dee1b8614a4f4273d656a880 100644 --- a/modules/channel/chain-net/include/dap_stream_ch_chain_net.h +++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net.h @@ -41,6 +41,26 @@ typedef struct dap_stream_ch_chain_net { void *notify_callback_arg; } dap_stream_ch_chain_net_t; +typedef struct dap_stream_ch_chain_rnd{ + struct{ + /// node Version + uint8_t version[32]; + /// autoproc status + uint8_t flags;//0 bit -autoproc; 1 bit - find order; 2 bit - auto online; 3 bit - auto update; 6 bit - data sign; 7 bit - find cert; + uint32_t sign_size; + //uint8_t data[10]; + }DAP_ALIGN_PACKED header; + byte_t sign[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_rnd_t; + +#define A_PROC 0x01 +#define F_ORDR 0x02 +#define A_ONLN 0x04 +#define A_UPDT 0x08 +#define D_SIGN 0x40 +#define F_CERT 0x80 + + #define DAP_STREAM_CH_CHAIN_NET(a) ((dap_stream_ch_chain_net_t *) ((a)->internal) ) uint8_t dap_stream_ch_chain_net_get_id(); diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h index 00272aa590527c701904d697a884c567d3f6ef04..79c1c92cd881aea81330892ad35c3e5b4d566e70 100644 --- a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h +++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h @@ -38,6 +38,10 @@ #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST 0x17 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE 0x18 + +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31 + #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_DBG 0x99 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 3f19d1919044d8ef002a0e16f3135b7aa0beb446..198ec5660159c00f82dcce60eef9a80a12858f1e 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -56,6 +56,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t **a_block_ptr, size_t a_block_size); static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t *a_block, size_t a_block_size); static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain); +static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain); static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value); static int s_cli_esbocs(int argc, char ** argv, char **str_reply); @@ -141,6 +142,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); a_chain->callback_get_minimum_fee = s_callback_get_minimum_fee; + a_chain->callback_get_signing_certificate = s_callback_get_sign_key; l_esbocs_pvt->debug = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "consensus_debug", false); l_esbocs_pvt->poa_mode = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "poa_mode", false); @@ -307,6 +309,15 @@ static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain) return l_esbocs_pvt->minimum_fee; } +static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain) +{ + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); + dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); + + return l_esbocs_pvt->blocks_sign_key; +} + static void s_callback_delete(dap_chain_cs_blocks_t *a_blocks) { dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(a_blocks); diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index 0aaee8578e296a9718e1651fcdc3a980127caf93..a4582e4cf05f1301ba2ac46a95363f0a4ddab178 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -1,3 +1,5 @@ +#pragma once + #include "dap_timerfd.h" #include "dap_chain.h" #include "dap_chain_block.h" diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index b52edf182d25c58f722b9df06f8af934ddf60abc..ef1e975c918041cc2f502d39b3d8238d3c7b0e66 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -617,7 +617,8 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) const char *l_addr_base58 = NULL; const char *l_wallet_name = NULL; const char *l_net_str = NULL; - const char *l_tx_hash_str = NULL; + const char *l_chain_str = NULL; + const char *l_tx_hash_str = NULL; dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index ccb7c9d18f32e9ce7c3cb39d6e61d97df1576cd8..2a24fc167989273398781cac30b94a59b9e34a79 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -329,6 +329,18 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c pthread_mutex_lock(&l_node_client->wait_mutex); break; } + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY: { + if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) { + l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data; + } + pthread_mutex_lock(&l_node_client->wait_mutex); + l_node_client->callbacks_arg = a_pkt_net->data; + l_node_client->state = NODE_CLIENT_STATE_VALID_READY; + dap_cond_signal(l_node_client->wait_cond); + pthread_mutex_unlock(&l_node_client->wait_mutex); + break; + + } break; default:; } } diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h index 9951f2fa70ff6ac806c51fcfc3e9002d520e96f8..7c3bf9d657e13f350f0d2fe137e2e413381b30ea 100644 --- a/modules/net/include/dap_chain_node_client.h +++ b/modules/net/include/dap_chain_node_client.h @@ -48,6 +48,7 @@ typedef enum dap_chain_node_client_state { NODE_CLIENT_STATE_SYNC_CHAINS_RVRS = 112, NODE_CLIENT_STATE_SYNCED = 120, NODE_CLIENT_STATE_CHECKED = 130, + NODE_CLIENT_STATE_VALID_READY = 140, } dap_chain_node_client_state_t; typedef enum dap_chain_node_sync_status { diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index 00fb5d4805d51069131fd7bf6867533ed2e48af4..d9d5f2bccc661608dec2e19a96171ca54276ba82 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -35,6 +35,11 @@ #include "dap_chain_cs_block_poa.h" #include "dap_chain_cs_dag_poa.h" #include "dap_chain_net_srv_stake_pos_delegate.h" +#include "dap_stream_ch_chain_net.h" +#include "rand/dap_rand.h" +#include "dap_chain_node_client.h" +#include "dap_stream_ch_chain_net_pkt.h" +#include "dap_chain_node_cli_cmd.h" #define LOG_TAG "dap_chain_net_srv_stake" @@ -84,7 +89,9 @@ int dap_chain_net_srv_stake_pos_delegate_init() "\tInvalidate requested delegated stake transaction by hash or cert name or cert pkey hash within net name and" " return m-tokens to specified wallet (if any)\n" "srv_stake min_value -net <net_name> -cert <cert_name> -value <value>" - "\tSets the minimum stake value" + "\tSets the minimum stake value\n" + "srv_stake check -net <net_name> -tx <tx_hash>" + "\tCheck remote validator" ); s_srv_stake = DAP_NEW_Z(dap_chain_net_srv_stake_t); @@ -1149,10 +1156,133 @@ static int callback_compare_tx_list(const void * a_datum1, const void * a_datum2 return -1; } +void dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, + dap_hash_fast_t *a_tx_hash, int a_time_connect, int a_time_respone,char **a_str_reply) +{ + char *l_key = NULL; + size_t l_node_info_size = 0; + uint8_t l_test_data[1024] = {0}; + dap_chain_node_client_t *l_node_client = NULL; + dap_chain_node_info_t *l_remote_node_info = NULL; + dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_net->pub.name); + dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, a_tx_hash); + dap_chain_node_addr_t *l_signer_node_addr = NULL; + + int l_prev_cond_idx = 0; + dap_chain_tx_out_cond_t *l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_tx, + DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_prev_cond_idx); + if (!l_tx_out_cond) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Requested conditional transaction has no requires conditional output"); + log_it(L_WARNING, "Requested conditional transaction has no requires conditional output"); + return; + } + l_signer_node_addr = &l_tx_out_cond->subtype.srv_stake_pos_delegate.signer_node_addr; + + l_key = dap_chain_node_addr_to_hash_str(l_signer_node_addr); + if(!l_key) + { + dap_cli_server_cmd_set_reply_text(a_str_reply, "can't calculate hash of addr"); + log_it(L_WARNING, "can't calculate hash of addr"); + return; + } + + // read node + l_remote_node_info = (dap_chain_node_info_t *) dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key, &l_node_info_size, NULL, NULL); + + if(!l_remote_node_info) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "node not found in base"); + log_it(L_WARNING, "node not found in base"); + DAP_DELETE(l_key); + return; + } + + size_t node_info_size_must_be = dap_chain_node_info_get_size(l_remote_node_info); + if(node_info_size_must_be != l_node_info_size) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "node has bad size in base=%zu (must be %zu)", l_node_info_size, + node_info_size_must_be); + log_it(L_WARNING, "node has bad size in base=%zu (must be %zu)", l_node_info_size, node_info_size_must_be); + DAP_DELETE(l_remote_node_info); + DAP_DELETE(l_key); + return; + } + DAP_DELETE(l_key); + // start connect + l_node_client = dap_chain_node_client_connect_channels(a_net,l_remote_node_info,"N"); + if(!l_node_client) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "can't connect"); + DAP_DELETE(l_remote_node_info); + return; + } + // wait connected + size_t rc = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_ESTABLISHED, a_time_connect); + if (rc) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node"); + // clean client struct + dap_chain_node_client_close_mt(l_node_client); + DAP_DELETE(l_remote_node_info); + return; + } + log_it(L_NOTICE, "Stream connection established"); + + uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); + dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id); + + randombytes(l_test_data, sizeof(l_test_data)); + rc = dap_stream_ch_chain_net_pkt_write(l_ch_chain, + DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST, + a_net->pub.id, + l_test_data, sizeof(l_test_data)); + if (rc == 0) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST packet"); + log_it(L_WARNING, "Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST packet"); + dap_chain_node_client_close_mt(l_node_client); + DAP_DELETE(l_remote_node_info); + return; + } + + rc = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_VALID_READY, a_time_respone); + if (!rc) { + dap_stream_ch_chain_rnd_t *validators_data = (dap_stream_ch_chain_rnd_t*)l_node_client->callbacks_arg; + dap_sign_t *l_sign = NULL; + bool l_sign_correct = false; + if(validators_data->header.sign_size){ + l_sign = (dap_sign_t*)(l_node_client->callbacks_arg + sizeof(dap_stream_ch_chain_rnd_t)); + dap_hash_fast_t l_sign_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash); + l_sign_correct = dap_hash_fast_compare(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr.data.hash_fast, &l_sign_pkey_hash); + if (l_sign_correct) + l_sign_correct = dap_sign_verify_all(l_sign, validators_data->header.sign_size, l_test_data, sizeof(l_test_data)); + } + bool l_overall_correct = l_sign_correct && validators_data->header.flags == 0xCF; + dap_cli_server_cmd_set_reply_text(a_str_reply, + "-------------------------------------------------\n" + "VERSION \t | %s \n" + "AUTO_PROC \t | %s \n" + "ORDER \t\t | %s \n" + "AUTO_ONLINE \t | %s \n" + "AUTO_UPDATE \t | %s \n" + "DATA_SIGNED \t | %s \n" + "FOUND CERT \t | %s\n" + "SIGN CORRECT \t | %s\n" + "SUMMARY \t | %s\n", + validators_data->header.version, + (validators_data->header.flags & A_PROC)?"true":"false", + (validators_data->header.flags & F_ORDR)?"true":"false", + (validators_data->header.flags & A_ONLN)?"true":"false", + (validators_data->header.flags & A_UPDT)?"true":"false", + (validators_data->header.flags & D_SIGN)?"true":"false", + (validators_data->header.flags & F_CERT)?"true":"false", + l_sign_correct ? "true":"false", + l_overall_correct ? "Validator ready" : "There are unresolved issues"); + } + dap_chain_node_client_close_mt(l_node_client); + DAP_DELETE(l_remote_node_info); +} + static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) { enum { - CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE,CMD_test + CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE, CMD_CHECK }; int l_arg_index = 1; @@ -1188,13 +1318,36 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "min_value", NULL)) { l_cmd_num = CMD_MIN_VALUE; } - else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "test_com", NULL)) { - l_cmd_num = CMD_test; + else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "check", NULL)) { + l_cmd_num = CMD_CHECK; } switch (l_cmd_num) { - case CMD_test: - { + case CMD_CHECK: + { + const char * l_netst = NULL; + const char * str_tx_hash = NULL; + dap_chain_net_t * l_net = NULL; + dap_hash_fast_t l_tx = {}; + + dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_netst); + dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &str_tx_hash); + l_net = dap_chain_net_by_name(l_netst); + if (!l_net) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_netst); + return -1; + } + + if (!str_tx_hash) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command check requires parameter -tx"); + return -2; + } + if (dap_chain_hash_fast_from_str(str_tx_hash, &l_tx)){ + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't get hash_fast from %s", str_tx_hash); + return -3; + } + + dap_chain_net_srv_stake_check_validator(l_net, &l_tx, 7000, 10000, a_str_reply); } break; diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h index 08bee56dbc3d942fa945013fcfce2cd831cc20d4..3fc8c55f17e0102ea54b9ed1c92a5baca7889634 100644 --- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h @@ -80,5 +80,8 @@ void dap_chain_net_srv_stake_get_fee_validators_str(dap_chain_net_t *a_net, dap_ int dap_chain_net_srv_stake_load_cache(dap_chain_net_t *a_net); void dap_chain_net_srv_stake_purge(dap_chain_net_t *a_net); +void dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, + dap_hash_fast_t *a_tx_hash, int a_time_connect, int a_time_respone, char **a_str_reply); + dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t *a_net, dap_hash_fast_t *a_stake_tx_hash, dap_cert_t *a_cert);