Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (26)
Showing
with 1080 additions and 1131 deletions
Subproject commit d433979b5a48f7b0291e4ecf9d64aa67c9676782 Subproject commit 136957afc5eaa4d7ae3b830f1d169908e2a9e696
...@@ -276,6 +276,8 @@ struct legacy_sync_context *s_legacy_sync_context_create(dap_stream_ch_t *a_ch) ...@@ -276,6 +276,8 @@ struct legacy_sync_context *s_legacy_sync_context_create(dap_stream_ch_t *a_ch)
.state = DAP_CHAIN_CH_STATE_IDLE, .state = DAP_CHAIN_CH_STATE_IDLE,
.last_activity = dap_time_now() .last_activity = dap_time_now()
}; };
dap_stream_ch_uuid_t *l_uuid = DAP_DUP(&a_ch->uuid); dap_stream_ch_uuid_t *l_uuid = DAP_DUP(&a_ch->uuid);
if (!l_uuid) { if (!l_uuid) {
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
......
...@@ -721,7 +721,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d ...@@ -721,7 +721,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d
dap_hash_fast(l_femi, dap_chain_datum_emission_get_size((byte_t*)l_femi), &l_femi_hash); dap_hash_fast(l_femi, dap_chain_datum_emission_get_size((byte_t*)l_femi), &l_femi_hash);
dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_femi, dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_femi,
dap_chain_datum_emission_get_size((byte_t*)l_femi), dap_chain_datum_emission_get_size((byte_t*)l_femi),
&l_femi_hash, false), "Added first emission in ledger"); &l_femi_hash), "Added first emission in ledger");
//Second emi //Second emi
dap_chain_datum_token_emission_t *l_semi = dap_chain_datum_emission_create(l_value_second_emi, l_token_ticker, a_addr); dap_chain_datum_token_emission_t *l_semi = dap_chain_datum_emission_create(l_value_second_emi, l_token_ticker, a_addr);
l_semi = dap_chain_datum_emission_add_sign(a_cert->enc_key, l_semi); l_semi = dap_chain_datum_emission_add_sign(a_cert->enc_key, l_semi);
...@@ -729,7 +729,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d ...@@ -729,7 +729,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d
dap_hash_fast(l_semi, dap_chain_datum_emission_get_size((byte_t*)l_semi), &l_semi_hash); dap_hash_fast(l_semi, dap_chain_datum_emission_get_size((byte_t*)l_semi), &l_semi_hash);
int res =dap_ledger_token_emission_add(a_ledger, (byte_t*)l_semi, int res =dap_ledger_token_emission_add(a_ledger, (byte_t*)l_semi,
dap_chain_datum_emission_get_size((byte_t*)l_semi), dap_chain_datum_emission_get_size((byte_t*)l_semi),
&l_semi_hash, false); &l_semi_hash);
if (!res){ if (!res){
dap_fail("The total supply test failed because the second emission exceeded the total supply."); dap_fail("The total supply test failed because the second emission exceeded the total supply.");
} else { } else {
...@@ -816,7 +816,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, ...@@ -816,7 +816,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert,
dap_chain_hash_fast_t l_emi_hash = {0}; dap_chain_hash_fast_t l_emi_hash = {0};
dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash); dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash);
dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi), dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi),
&l_emi_hash, false) != 0, &l_emi_hash) != 0,
"Checking the impossibility of emission to an address not from the white list."); "Checking the impossibility of emission to an address not from the white list.");
//Emission in white list //Emission in white list
dap_chain_datum_token_emission_t *l_emi_whi = dap_chain_datum_emission_create( dap_chain_datum_token_emission_t *l_emi_whi = dap_chain_datum_emission_create(
...@@ -825,7 +825,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, ...@@ -825,7 +825,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert,
dap_chain_hash_fast_t l_emi_whi_hash = {0}; dap_chain_hash_fast_t l_emi_whi_hash = {0};
dap_hash_fast(l_emi_whi, dap_chain_datum_emission_get_size((uint8_t*)l_emi_whi), &l_emi_whi_hash); dap_hash_fast(l_emi_whi, dap_chain_datum_emission_get_size((uint8_t*)l_emi_whi), &l_emi_whi_hash);
dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_whi, dap_chain_datum_emission_get_size((byte_t*)l_emi_whi), dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_whi, dap_chain_datum_emission_get_size((byte_t*)l_emi_whi),
&l_emi_whi_hash, false), &l_emi_whi_hash),
"Can't add emission in white address"); "Can't add emission in white address");
dap_chain_datum_tx_t *l_btx_addr1 = dap_ledger_test_create_datum_base_tx(l_emi_whi, &l_emi_whi_hash, dap_chain_datum_tx_t *l_btx_addr1 = dap_ledger_test_create_datum_base_tx(l_emi_whi, &l_emi_whi_hash,
*l_addr_1->addr, a_cert); *l_addr_1->addr, a_cert);
...@@ -930,7 +930,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, ...@@ -930,7 +930,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert,
dap_chain_hash_fast_t l_emi_block_hash = {0}; dap_chain_hash_fast_t l_emi_block_hash = {0};
dap_hash_fast(l_emi_block, dap_chain_datum_emission_get_size((uint8_t*)l_emi_block), &l_emi_block_hash); dap_hash_fast(l_emi_block, dap_chain_datum_emission_get_size((uint8_t*)l_emi_block), &l_emi_block_hash);
dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_block, dap_chain_datum_emission_get_size((byte_t*)l_emi_block), dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_block, dap_chain_datum_emission_get_size((byte_t*)l_emi_block),
&l_emi_block_hash, false), &l_emi_block_hash),
"Test for emission rejection to an address from the prohibited list."); "Test for emission rejection to an address from the prohibited list.");
//Check emission at addr //Check emission at addr
dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_create( dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_create(
...@@ -939,7 +939,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, ...@@ -939,7 +939,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert,
dap_chain_hash_fast_t l_emi_hash = {0}; dap_chain_hash_fast_t l_emi_hash = {0};
dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash); dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash);
dap_assert(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi), dap_assert(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi),
&l_emi_hash, false), &l_emi_hash),
"Emission test for a non-blacklisted address."); "Emission test for a non-blacklisted address.");
dap_chain_datum_tx_t *l_btx_addr2 = dap_ledger_test_create_datum_base_tx(l_emi, &l_emi_hash, dap_chain_datum_tx_t *l_btx_addr2 = dap_ledger_test_create_datum_base_tx(l_emi, &l_emi_hash,
*l_addr_2->addr, a_cert); *l_addr_2->addr, a_cert);
...@@ -1020,7 +1020,7 @@ void dap_ledger_test_run(void){ ...@@ -1020,7 +1020,7 @@ void dap_ledger_test_run(void){
dap_hash_fast(l_emi, l_emi_size, &l_emi_hash); dap_hash_fast(l_emi, l_emi_size, &l_emi_hash);
int l_emi_check = dap_ledger_token_emission_add_check(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash); int l_emi_check = dap_ledger_token_emission_add_check(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash);
dap_assert_PIF(l_emi_check == 0, "check emission for add in ledger"); dap_assert_PIF(l_emi_check == 0, "check emission for add in ledger");
dap_assert_PIF(!dap_ledger_token_emission_add(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash, false), "Added emission in ledger"); dap_assert_PIF(!dap_ledger_token_emission_add(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash), "Added emission in ledger");
// Declarate delegated token // Declarate delegated token
dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section; dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section;
......
...@@ -75,8 +75,15 @@ typedef struct client_statistic_value{ ...@@ -75,8 +75,15 @@ typedef struct client_statistic_value{
} grace; } grace;
} client_statistic_value_t; } client_statistic_value_t;
typedef struct receipt_sign_waiting_args {
dap_stream_worker_t *worker;
dap_stream_ch_uuid_t uuid;
dap_chain_net_srv_usage_t *usage;
} receipt_sign_waiting_args_t;
static void s_stream_ch_new(dap_stream_ch_t* ch , void* arg); static void s_stream_ch_new(dap_stream_ch_t* ch , void* arg);
static void s_stream_ch_delete(dap_stream_ch_t* ch , void* arg); static void s_stream_ch_delete(dap_stream_ch_t* ch , void* arg);
static void s_start_receipt_timeout_timer(dap_chain_net_srv_usage_t *a_usage);
static bool s_stream_ch_packet_in(dap_stream_ch_t* ch , void* arg); static bool s_stream_ch_packet_in(dap_stream_ch_t* ch , void* arg);
static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg); static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg);
...@@ -236,6 +243,35 @@ static bool s_unban_client(dap_chain_net_srv_banlist_item_t *a_item) ...@@ -236,6 +243,35 @@ static bool s_unban_client(dap_chain_net_srv_banlist_item_t *a_item)
return false; return false;
} }
static bool s_receipt_timeout_handler(dap_chain_net_srv_usage_t *a_usage)
{
log_it(L_WARNING, "Waiting receipt signing from client timeout!");
if (a_usage->receipt_sign_req_cnt < RECEIPT_SIGN_MAX_ATTEMPT - 1){
// New attempt
a_usage->receipt_sign_req_cnt++;
log_it(L_WARNING, "Try to send receipt again. Attempt %d", a_usage->receipt_sign_req_cnt+1);
if (a_usage->is_waiting_first_receipt_sign ){
dap_stream_ch_pkt_write_unsafe(a_usage->client->ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST,
a_usage->receipt, a_usage->receipt->size);
return true;
} else if (a_usage->is_waiting_next_receipt_sign ){
dap_stream_ch_pkt_write_unsafe(a_usage->client->ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST,
a_usage->receipt_next, a_usage->receipt_next->size);
return true;
}
}
log_it(L_WARNING, "Receipt signing by client max attempt is reached!");
a_usage->receipt_sign_req_cnt = 0;
a_usage->is_waiting_first_receipt_sign = false;
a_usage->is_waiting_next_receipt_sign = false;
return false;
}
static void s_start_receipt_timeout_timer(dap_chain_net_srv_usage_t *a_usage)
{
a_usage->receipts_timeout_timer = dap_timerfd_start_on_worker(dap_worker_get_current(), 10000,
(dap_timerfd_callback_t)s_receipt_timeout_handler, a_usage);
}
/** /**
* @brief create string with usage service statistic * @brief create string with usage service statistic
* @return string with staticstic * @return string with staticstic
...@@ -324,6 +360,10 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_ ...@@ -324,6 +360,10 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_
l_err.net_id.uint64 = a_request->hdr.net_id.uint64; l_err.net_id.uint64 = a_request->hdr.net_id.uint64;
l_err.srv_uid.uint64 = a_request->hdr.srv_uid.uint64; l_err.srv_uid.uint64 = a_request->hdr.srv_uid.uint64;
char *l_user_key = dap_chain_hash_fast_to_str_new(&a_request->hdr.client_pkey_hash);
log_it(L_DEBUG, "Got service request from user %s", l_user_key);
DAP_DELETE(l_user_key);
if (dap_hash_fast_is_blank(&a_request->hdr.order_hash)){ if (dap_hash_fast_is_blank(&a_request->hdr.order_hash)){
log_it( L_ERROR, "No order hash in request."); log_it( L_ERROR, "No order hash in request.");
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND;
...@@ -334,6 +374,16 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_ ...@@ -334,6 +374,16 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_
return false; return false;
} }
if (dap_hash_fast_is_blank(&a_request->hdr.tx_cond)){
log_it( L_ERROR, "No transaction hash in request.");
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND;
if(a_ch)
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err));
if (l_srv && l_srv->callbacks.response_error)
l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err));
return false;
}
char l_order_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = {}; char l_order_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = {};
dap_chain_hash_fast_to_str(&a_request->hdr.order_hash, l_order_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); dap_chain_hash_fast_to_str(&a_request->hdr.order_hash, l_order_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
log_it(L_MSG, "Got order with hash %s.", l_order_hash_str); log_it(L_MSG, "Got order with hash %s.", l_order_hash_str);
...@@ -400,6 +450,7 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_ ...@@ -400,6 +450,7 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_
l_usage->net = l_net; l_usage->net = l_net;
l_usage->service = l_srv; l_usage->service = l_srv;
l_usage->client_pkey_hash = a_request->hdr.client_pkey_hash; l_usage->client_pkey_hash = a_request->hdr.client_pkey_hash;
l_usage->receipt_timeout_timer_start_callback = s_start_receipt_timeout_timer;
dap_chain_net_srv_price_t * l_price = NULL; dap_chain_net_srv_price_t * l_price = NULL;
bool l_specific_order_free = false; bool l_specific_order_free = false;
...@@ -541,9 +592,11 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -541,9 +592,11 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
HASH_FIND(hh, a_grace->usage->service->ban_list, &a_grace->usage->client_pkey_hash, sizeof(dap_chain_hash_fast_t), l_item); HASH_FIND(hh, a_grace->usage->service->ban_list, &a_grace->usage->client_pkey_hash, sizeof(dap_chain_hash_fast_t), l_item);
pthread_mutex_unlock(&a_grace->usage->service->banlist_mutex); pthread_mutex_unlock(&a_grace->usage->service->banlist_mutex);
if (l_item) { // client banned if (l_item) { // client banned
log_it(L_INFO, "Client pkey is banned!"); char *l_user_key = dap_chain_hash_fast_to_str_new(&a_grace->usage->client_pkey_hash);
log_it(L_DEBUG, "Client %s is banned!", l_user_key);
DAP_DELETE(l_user_key);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_BANNED_PKEY_HASH ; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_BANNED_PKEY_HASH ;
s_grace_error(a_grace, l_err);; s_grace_error(a_grace, l_err);
return false; return false;
} }
} }
...@@ -552,7 +605,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -552,7 +605,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
if (a_grace->usage->receipt){ // If it is repeated grace if (a_grace->usage->receipt){ // If it is repeated grace
char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&a_grace->usage->static_order_hash); char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&a_grace->usage->static_order_hash);
log_it(L_MSG, "Using price from order %s.", l_order_hash_str); char *l_user_key = dap_chain_hash_fast_to_str_new(&a_grace->usage->client_pkey_hash);
log_it(L_MSG, "Using price from order %s for user %s.", l_order_hash_str, l_user_key);
DAP_DELETE(l_order_hash_str); DAP_DELETE(l_order_hash_str);
l_price = a_grace->usage->price; l_price = a_grace->usage->price;
...@@ -566,6 +620,7 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -566,6 +620,7 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
if (!l_item) { if (!l_item) {
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
s_grace_error(a_grace, l_err); s_grace_error(a_grace, l_err);
DAP_DELETE(l_user_key);
return false; return false;
} }
l_item->grace = a_grace; l_item->grace = a_grace;
...@@ -576,7 +631,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -576,7 +631,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
pthread_mutex_unlock(&a_grace->usage->service->grace_mutex); pthread_mutex_unlock(&a_grace->usage->service->grace_mutex);
a_grace->timer = dap_timerfd_start_on_worker(a_grace->stream_worker->worker, a_grace->usage->service->grace_period * 1000, a_grace->timer = dap_timerfd_start_on_worker(a_grace->stream_worker->worker, a_grace->usage->service->grace_period * 1000,
(dap_timerfd_callback_t)s_grace_period_finish, l_item); (dap_timerfd_callback_t)s_grace_period_finish, l_item);
log_it(L_INFO, "Start grace timer %s.", a_grace->timer ? "successfuly." : "failed." ); log_it(L_INFO, "Start grace timer %s for user %s.", a_grace->timer ? "successfuly." : "failed.", l_user_key);
DAP_DELETE(l_user_key);
} else { // Else if first grace at service start } else { // Else if first grace at service start
dap_chain_net_srv_grace_usage_t *l_item = DAP_NEW_Z(dap_chain_net_srv_grace_usage_t); dap_chain_net_srv_grace_usage_t *l_item = DAP_NEW_Z(dap_chain_net_srv_grace_usage_t);
if (!l_item) { if (!l_item) {
...@@ -607,8 +663,9 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -607,8 +663,9 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
dap_hash_fast_to_str(&a_grace->usage->tx_cond_hash, l_hash_str, sizeof(l_hash_str)); dap_hash_fast_to_str(&a_grace->usage->tx_cond_hash, l_hash_str, sizeof(l_hash_str));
log_it(L_NOTICE, "Transaction %s can't be found. Start the grace period for %d seconds", l_hash_str, char *l_user_key = dap_chain_hash_fast_to_str_new(&a_grace->usage->client_pkey_hash);
a_grace->usage->service->grace_period); log_it(L_NOTICE, "Transaction %s can't be found. Start the grace period for %d seconds for user %s", l_hash_str,
a_grace->usage->service->grace_period, l_user_key);
if (a_grace->usage->service->callbacks.response_success) if (a_grace->usage->service->callbacks.response_success)
a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id, a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id,
...@@ -619,7 +676,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -619,7 +676,8 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
pthread_mutex_unlock(&a_grace->usage->service->grace_mutex); pthread_mutex_unlock(&a_grace->usage->service->grace_mutex);
a_grace->timer = dap_timerfd_start_on_worker(a_grace->stream_worker->worker, a_grace->usage->service->grace_period * 1000, a_grace->timer = dap_timerfd_start_on_worker(a_grace->stream_worker->worker, a_grace->usage->service->grace_period * 1000,
(dap_timerfd_callback_t)s_grace_period_finish, l_item); (dap_timerfd_callback_t)s_grace_period_finish, l_item);
log_it(L_INFO, "Start grace timer %s.", a_grace->timer ? "successfuly." : "failed." ); log_it(L_INFO, "Start grace timer %s for user %s.", a_grace->timer ? "successfuly." : "failed.", l_user_key );
DAP_DELETE(l_user_key);
} }
} }
...@@ -741,9 +799,11 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -741,9 +799,11 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
l_srv_session->limits_bytes = l_remain_service->limits_bytes; l_srv_session->limits_bytes = l_remain_service->limits_bytes;
break; break;
} }
char *l_user_key = dap_chain_hash_fast_to_str_new(&a_grace->usage->client_pkey_hash);
log_it(L_INFO, "User has %ld %s remain service. Start service without paying.", l_remain_service->limits_ts ? l_remain_service->limits_ts : l_remain_service->limits_bytes, dap_chain_srv_unit_enum_to_str(l_tx_out_cond->subtype.srv_pay.unit.enm)); log_it(L_INFO, "User %s has %ld %s remain service. Start service without paying.", l_user_key,
l_remain_service->limits_ts ? l_remain_service->limits_ts : l_remain_service->limits_bytes,
dap_chain_srv_unit_enum_to_str(l_tx_out_cond->subtype.srv_pay.unit.enm));
DAP_DELETE(l_user_key);
size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t ); size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t );
dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t,
l_success_size); l_success_size);
...@@ -763,7 +823,6 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -763,7 +823,6 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
// create and fill first receipt // create and fill first receipt
a_grace->usage->receipt = dap_chain_datum_tx_receipt_create( a_grace->usage->receipt = dap_chain_datum_tx_receipt_create(
a_grace->usage->service->uid, l_price->units_uid, l_price->units, l_price->value_datoshi, NULL, 0); a_grace->usage->service->uid, l_price->units_uid, l_price->units, l_price->value_datoshi, NULL, 0);
if (a_grace->usage->service->callbacks.response_success) if (a_grace->usage->service->callbacks.response_success)
a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id, a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id,
a_grace->usage->client, a_grace->usage->receipt, a_grace->usage->client, a_grace->usage->receipt,
...@@ -777,13 +836,19 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) ...@@ -777,13 +836,19 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
} }
} }
if (a_grace->usage->receipt_next){ if (a_grace->usage->receipt_next && !a_grace->usage->is_waiting_first_receipt_sign){
DAP_DEL_Z(a_grace->usage->receipt_next); DAP_DEL_Z(a_grace->usage->receipt_next);
a_grace->usage->receipt_next = dap_chain_net_srv_issue_receipt(a_grace->usage->service, a_grace->usage->price, NULL, 0); a_grace->usage->receipt_next = dap_chain_net_srv_issue_receipt(a_grace->usage->service, a_grace->usage->price, NULL, 0);
a_grace->usage->is_waiting_next_receipt_sign = true;
//start timeout timer
a_grace->usage->receipt_timeout_timer_start_callback(a_grace->usage);
}else{ }else{
a_grace->usage->receipt = dap_chain_net_srv_issue_receipt(a_grace->usage->service, a_grace->usage->price, NULL, 0); a_grace->usage->receipt = dap_chain_net_srv_issue_receipt(a_grace->usage->service, a_grace->usage->price, NULL, 0);
dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST, dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST,
a_grace->usage->receipt, a_grace->usage->receipt->size); a_grace->usage->receipt, a_grace->usage->receipt->size);
a_grace->usage->is_waiting_first_receipt_sign = true;
//start timeout timer
a_grace->usage->receipt_timeout_timer_start_callback(a_grace->usage);
} }
DAP_DELETE(a_grace->request); DAP_DELETE(a_grace->request);
DAP_DELETE(a_grace); DAP_DELETE(a_grace);
...@@ -880,8 +945,8 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -880,8 +945,8 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
if (error) { \ if (error) { \
l_err.code = error ; \ l_err.code = error ; \
s_grace_error(l_grace, l_err); \ s_grace_error(l_grace, l_err); \
} \ } else\
DAP_DELETE(l_grace); \ DAP_DELETE(l_grace); \
DAP_DELETE(a_grace_item); \ DAP_DELETE(a_grace_item); \
return false; \ return false; \
} \ } \
...@@ -1022,8 +1087,11 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -1022,8 +1087,11 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
l_srv_session->limits_bytes = l_remain_service->limits_bytes; l_srv_session->limits_bytes = l_remain_service->limits_bytes;
break; break;
} }
log_it(L_INFO, "User has %ld %s remain service. Start service without paying.", l_remain_service->limits_ts ? l_remain_service->limits_ts : l_remain_service->limits_bytes, dap_chain_srv_unit_enum_to_str(l_tx_out_cond->subtype.srv_pay.unit.enm)); char *l_user_key = dap_chain_hash_fast_to_str_new(&l_grace->usage->client_pkey_hash);
log_it(L_INFO, "User %s has %ld %s remain service. Start service without paying.", l_user_key,
l_remain_service->limits_ts ? l_remain_service->limits_ts : l_remain_service->limits_bytes,
dap_chain_srv_unit_enum_to_str(l_tx_out_cond->subtype.srv_pay.unit.enm));
DAP_DELETE(l_user_key);
size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t ); size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t );
dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t,
l_success_size); l_success_size);
...@@ -1043,7 +1111,7 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -1043,7 +1111,7 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
// create and fill limits and first receipt // create and fill limits and first receipt
l_grace->usage->receipt = dap_chain_datum_tx_receipt_create( l_grace->usage->receipt = dap_chain_datum_tx_receipt_create(
l_grace->usage->service->uid, l_price->units_uid, l_price->units, l_price->value_datoshi, NULL, 0); l_grace->usage->service->uid, l_price->units_uid, l_price->units, l_price->value_datoshi, NULL, 0);
// l_grace->usage->is_waiting_first_receipt_sign = true;
if (l_grace->usage->service->callbacks.response_success) if (l_grace->usage->service->callbacks.response_success)
l_grace->usage->service->callbacks.response_success(l_grace->usage->service, l_grace->usage->id, l_grace->usage->service->callbacks.response_success(l_grace->usage->service, l_grace->usage->id,
l_grace->usage->client, l_grace->usage->receipt, l_grace->usage->client, l_grace->usage->receipt,
...@@ -1065,6 +1133,9 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) ...@@ -1065,6 +1133,9 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item)
} else { } else {
log_it(L_INFO, "Send first receipt to sign"); log_it(L_INFO, "Send first receipt to sign");
l_grace->usage->receipt = dap_chain_net_srv_issue_receipt(l_grace->usage->service, l_grace->usage->price, NULL, 0); l_grace->usage->receipt = dap_chain_net_srv_issue_receipt(l_grace->usage->service, l_grace->usage->price, NULL, 0);
l_grace->usage->is_waiting_first_receipt_sign = true;
// start timeout timer
l_grace->usage->receipt_timeout_timer_start_callback(l_grace->usage);
if (l_grace->usage->receipt ) if (l_grace->usage->receipt )
dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST, dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST,
l_grace->usage->receipt, l_grace->usage->receipt->size); l_grace->usage->receipt, l_grace->usage->receipt->size);
...@@ -1255,6 +1326,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1255,6 +1326,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE: { // Check receipt sign and make tx if success case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE: { // Check receipt sign and make tx if success
dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active; dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active;
if (!l_usage->is_waiting_first_receipt_sign && !l_usage->is_waiting_next_receipt_sign){
break;
}
if (l_usage->receipts_timeout_timer){
log_it(L_INFO, "Delete receipt timeout timer.");
dap_timerfd_delete_unsafe(l_usage->receipts_timeout_timer);
l_usage->receipts_timeout_timer = NULL;
}
if (dap_chain_net_get_state(l_usage->net) == NET_STATE_OFFLINE) { if (dap_chain_net_get_state(l_usage->net) == NET_STATE_OFFLINE) {
log_it(L_ERROR, "Can't pay service because net %s is offline.", l_usage->net->pub.name); log_it(L_ERROR, "Can't pay service because net %s is offline.", l_usage->net->pub.name);
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE;
...@@ -1264,7 +1345,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1264,7 +1345,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
if (l_ch_pkt->hdr.data_size < sizeof(dap_chain_receipt_info_t)) { if (l_ch_pkt->hdr.data_size < sizeof(dap_chain_receipt_info_t)) {
log_it(L_ERROR, "Wrong sign response size, %u when expected at least %zu with smth", l_ch_pkt->hdr.data_size, log_it(L_ERROR, "Wrong sign response size, %u when expected at least %zu with smth", l_ch_pkt->hdr.data_size,
sizeof(dap_chain_receipt_info_t)); sizeof(dap_chain_receipt_info_t));
if ( l_usage->receipt_next ){ // If we have receipt next if ( l_usage->receipt_next && !l_usage->is_waiting_first_receipt_sign && l_usage->is_waiting_next_receipt_sign){ // If we have receipt next
DAP_DEL_Z(l_usage->receipt_next); DAP_DEL_Z(l_usage->receipt_next);
}else if (l_usage->receipt ){ // If we sign first receipt }else if (l_usage->receipt ){ // If we sign first receipt
DAP_DEL_Z(l_usage->receipt); DAP_DEL_Z(l_usage->receipt);
...@@ -1274,20 +1355,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1274,20 +1355,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
dap_chain_datum_tx_receipt_t * l_receipt = (dap_chain_datum_tx_receipt_t *) l_ch_pkt->data; dap_chain_datum_tx_receipt_t * l_receipt = (dap_chain_datum_tx_receipt_t *) l_ch_pkt->data;
size_t l_receipt_size = l_ch_pkt->hdr.data_size; size_t l_receipt_size = l_ch_pkt->hdr.data_size;
if (l_usage->is_grace && l_usage->receipt && !l_usage->receipt_next)
l_usage->is_grace = false;
bool l_is_found = false; bool l_is_found = false;
if ( l_usage->receipt_next ){ // If we have receipt next if ( l_usage->receipt_next && !l_usage->is_waiting_first_receipt_sign && l_usage->is_waiting_next_receipt_sign){ // If we have receipt next
if ( memcmp(&l_usage->receipt_next->receipt_info, &l_receipt->receipt_info,sizeof (l_receipt->receipt_info) )==0 ){ if ( memcmp(&l_usage->receipt_next->receipt_info, &l_receipt->receipt_info,sizeof (l_receipt->receipt_info) )==0 ){
l_is_found = true; l_is_found = true;
} }
}else if (l_usage->receipt ){ // If we sign first receipt }else if (l_usage->receipt){ // If we sign first receipt
if ( memcmp(&l_usage->receipt->receipt_info, &l_receipt->receipt_info,sizeof (l_receipt->receipt_info) )==0 ){ if ( memcmp(&l_usage->receipt->receipt_info, &l_receipt->receipt_info,sizeof (l_receipt->receipt_info) )==0 ){
l_is_found = true; l_is_found = true;
} }
} }
if ( !l_is_found || ! l_usage ){ if ( !l_is_found || ! l_usage ){
log_it(L_WARNING, "Can't find receipt in usages thats equal to response receipt"); log_it(L_WARNING, "Can't find receipt in usages thats equal to response receipt");
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND; l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND;
...@@ -1301,25 +1378,22 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1301,25 +1378,22 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
l_err.srv_uid.uint64 = l_usage->service->uid.uint64; l_err.srv_uid.uint64 = l_usage->service->uid.uint64;
dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; dap_chain_tx_out_cond_t *l_tx_out_cond = NULL;
if (!l_usage->is_grace) { if (! l_usage->tx_cond ){
if (! l_usage->tx_cond ){ log_it(L_WARNING, "No tx out in usage");
log_it(L_WARNING, "No tx out in usage"); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND ;
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND ; dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err) );
dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err) ); if (l_usage->service->callbacks.response_error)
if (l_usage->service->callbacks.response_error) l_usage->service->callbacks.response_error( l_usage->service, l_usage->id, l_usage->client,
l_usage->service->callbacks.response_error( l_usage->service, l_usage->id, l_usage->client, &l_err, sizeof (l_err) );
&l_err, sizeof (l_err) ); break;
break; }
} l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_usage->tx_cond, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, NULL );
l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_usage->tx_cond, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, NULL ); if ( ! l_tx_out_cond ){ // No condition output
if ( ! l_tx_out_cond ){ // No conditioned output l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_COND_OUT ;
l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_COND_OUT ; dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err) );
dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err) ); if (l_usage->service->callbacks.response_error)
if (l_usage->service->callbacks.response_error) l_usage->service->callbacks.response_error( l_usage->service, l_usage->id, l_usage->client,&l_err,sizeof (l_err) );
l_usage->service->callbacks.response_error( l_usage->service, l_usage->id, l_usage->client,&l_err,sizeof (l_err) ); break;
break;
}
} }
// get a second signature - from the client (first sign in server, second sign in client) // get a second signature - from the client (first sign in server, second sign in client)
dap_sign_t * l_receipt_sign = dap_chain_datum_tx_receipt_sign_get( l_receipt, l_receipt_size, 1); dap_sign_t * l_receipt_sign = dap_chain_datum_tx_receipt_sign_get( l_receipt, l_receipt_size, 1);
...@@ -1343,7 +1417,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1343,7 +1417,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
// Update actual receipt // Update actual receipt
bool l_is_first_sign = false; bool l_is_first_sign = false;
if (!l_usage->receipt_next && l_usage->receipt) { if (l_usage->receipt && (!l_usage->receipt_next || l_usage->is_waiting_first_receipt_sign)) {
DAP_DELETE(l_usage->receipt); DAP_DELETE(l_usage->receipt);
l_usage->receipt = DAP_DUP_SIZE(l_receipt, l_receipt_size); l_usage->receipt = DAP_DUP_SIZE(l_receipt, l_receipt_size);
if (!l_usage->receipt) { if (!l_usage->receipt) {
...@@ -1351,7 +1425,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1351,7 +1425,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
break; break;
} }
l_is_first_sign = true; l_is_first_sign = true;
l_usage->is_active = true; // l_usage->is_active = true;
} else if (l_usage->receipt_next) { } else if (l_usage->receipt_next) {
DAP_DELETE(l_usage->receipt_next); DAP_DELETE(l_usage->receipt_next);
l_usage->receipt_next = DAP_DUP_SIZE(l_receipt, l_receipt_size); l_usage->receipt_next = DAP_DUP_SIZE(l_receipt, l_receipt_size);
...@@ -1359,7 +1433,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1359,7 +1433,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
break; break;
} }
l_usage->is_active = true; // l_usage->is_active = true;
}
if (!l_usage->is_waiting_first_receipt_sign && l_usage->is_waiting_next_receipt_sign){
l_usage->is_waiting_next_receipt_sign = false;
}
if (l_usage->is_grace && l_usage->is_waiting_first_receipt_sign){
l_usage->is_waiting_first_receipt_sign = false;
l_usage->is_grace = false;
} }
// Store receipt if any problems with transactions // Store receipt if any problems with transactions
...@@ -1370,8 +1453,10 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1370,8 +1453,10 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
if (!l_usage->is_grace) { if (!l_usage->is_grace) {
// Form input transaction // Form input transaction
char *l_hash_str = dap_hash_fast_to_str_new(&l_usage->tx_cond_hash); char *l_hash_str = dap_hash_fast_to_str_new(&l_usage->tx_cond_hash);
log_it(L_NOTICE, "Trying create input tx cond from tx %s with active receipt", l_hash_str); char *l_user_key = dap_chain_hash_fast_to_str_new(&l_usage->client_pkey_hash);
log_it(L_NOTICE, "Trying create input tx cond from tx %s with active receipt for user %s", l_hash_str, l_user_key);
DAP_DEL_Z(l_hash_str); DAP_DEL_Z(l_hash_str);
DAP_DEL_Z(l_user_key);
int ret_status = 0; int ret_status = 0;
char *l_tx_in_hash_str = dap_chain_mempool_tx_create_cond_input(l_usage->net, &l_usage->tx_cond_hash, l_usage->price->wallet_addr, char *l_tx_in_hash_str = dap_chain_mempool_tx_create_cond_input(l_usage->net, &l_usage->tx_cond_hash, l_usage->price->wallet_addr,
l_usage->price->receipt_sign_cert->enc_key, l_usage->price->receipt_sign_cert->enc_key,
...@@ -1481,12 +1566,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1481,12 +1566,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
if (l_usage->is_grace) { if (l_usage->is_grace) {
char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
dap_hash_fast_to_str(&l_usage->tx_cond_hash, l_hash_str, sizeof(l_hash_str)); dap_hash_fast_to_str(&l_usage->tx_cond_hash, l_hash_str, sizeof(l_hash_str));
log_it(L_NOTICE, "Receipt is OK, but tx transaction %s %s. Start the grace period for %d seconds", l_hash_str, char *l_user_key = dap_chain_hash_fast_to_str_new(&l_usage->client_pkey_hash);
log_it(L_NOTICE, "Receipt is OK, but tx transaction %s %s. Start the grace period for %d seconds for user %s", l_hash_str,
l_usage->is_waiting_new_tx_cond ? "have no enough funds. New tx cond requested": "can't be found", l_usage->is_waiting_new_tx_cond ? "have no enough funds. New tx cond requested": "can't be found",
l_srv->grace_period); l_srv->grace_period, l_user_key);
DAP_DELETE(l_user_key);
} else { } else {
dap_hash_fast_to_str(&l_usage->tx_cond_hash, (char*)l_success->custom_data, DAP_CHAIN_HASH_FAST_STR_SIZE); dap_hash_fast_to_str(&l_usage->tx_cond_hash, (char*)l_success->custom_data, DAP_CHAIN_HASH_FAST_STR_SIZE);
log_it(L_NOTICE, "Receipt with client sign is accepted, start service providing"); char *l_user_key = dap_chain_hash_fast_to_str_new(&l_usage->client_pkey_hash);
log_it(L_NOTICE, "Receipt with client %s sign is accepted, start service providing", l_user_key);
DAP_DELETE(l_user_key);
} }
dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS, dap_stream_ch_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS,
...@@ -1606,6 +1695,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1606,6 +1695,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
} }
}else{ }else{
if (l_curr_grace_item){ if (l_curr_grace_item){
log_it(L_INFO, "Can't find tx in ledger. Waiting...");
l_curr_grace_item->grace->usage->tx_cond_hash = l_responce->hdr.tx_cond; l_curr_grace_item->grace->usage->tx_cond_hash = l_responce->hdr.tx_cond;
l_curr_grace_item->grace->request->hdr.tx_cond = l_responce->hdr.tx_cond; l_curr_grace_item->grace->request->hdr.tx_cond = l_responce->hdr.tx_cond;
pthread_mutex_lock(&l_srv->grace_mutex); pthread_mutex_lock(&l_srv->grace_mutex);
...@@ -1630,7 +1720,6 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) ...@@ -1630,7 +1720,6 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS, l_success, l_success_size); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS, l_success, l_success_size);
DAP_DELETE(l_success); DAP_DELETE(l_success);
} break; } break;
default: default:
log_it( L_WARNING, "Unknown packet type 0x%02X", l_ch_pkt->hdr.type); log_it( L_WARNING, "Unknown packet type 0x%02X", l_ch_pkt->hdr.type);
return false; return false;
......
...@@ -142,7 +142,6 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_test { ...@@ -142,7 +142,6 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_test {
uint8_t data[]; uint8_t data[];
} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t; } DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t;
size_t dap_stream_ch_chain_net_srv_pkt_data_write(dap_stream_ch_t *a_ch, size_t dap_stream_ch_chain_net_srv_pkt_data_write(dap_stream_ch_t *a_ch,
dap_chain_net_srv_uid_t a_srv_uid, uint32_t a_usage_id , dap_chain_net_srv_uid_t a_srv_uid, uint32_t a_usage_id ,
const void * a_data, size_t a_data_size); const void * a_data, size_t a_data_size);
......
...@@ -887,7 +887,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -887,7 +887,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total)); json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total));
json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL))); json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL)));
dap_chain_datum_token_flags_dump_to_json(json_obj_datum,l_token->header_private_update.flags); dap_chain_datum_token_flags_dump_to_json(json_obj_datum,l_token->header_private_decl.flags);
dap_datum_token_dump_tsd_to_json(json_obj_datum,l_token, l_token_size, a_hash_out_type); dap_datum_token_dump_tsd_to_json(json_obj_datum,l_token, l_token_size, a_hash_out_type);
size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size; size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size;
dap_chain_datum_token_certs_dump_to_json(json_obj_datum,l_token->tsd_n_signs + l_token->header_private_update.tsd_total_size, dap_chain_datum_token_certs_dump_to_json(json_obj_datum,l_token->tsd_n_signs + l_token->header_private_update.tsd_total_size,
...@@ -899,7 +899,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -899,7 +899,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
json_object_object_add(json_obj_datum,"auth signs valid",json_object_new_uint64(l_token->signs_valid)); json_object_object_add(json_obj_datum,"auth signs valid",json_object_new_uint64(l_token->signs_valid));
json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total)); json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total));
json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL))); json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL)));
dap_chain_datum_token_flags_dump_to_json(json_obj_datum, l_token->header_native_decl.flags); dap_chain_datum_token_flags_dump_to_json(json_obj_datum, l_token->header_native_decl.flags);
dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type); dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type);
size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_decl.tsd_total_size; size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_decl.tsd_total_size;
...@@ -926,7 +925,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -926,7 +925,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total)); json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total));
json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL))); json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL)));
dap_chain_datum_token_flags_dump_to_json(json_obj_datum, l_token->header_private_update.flags);
dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type); dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type);
size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size; size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size;
dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token->tsd_n_signs + l_token->header_private_update.tsd_total_size, dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token->tsd_n_signs + l_token->header_private_update.tsd_total_size,
...@@ -939,7 +937,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -939,7 +937,6 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total)); json_object_object_add(json_obj_datum,"auth signs total",json_object_new_uint64(l_token->signs_total));
json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL))); json_object_object_add(json_obj_datum,"total_supply",json_object_new_string(dap_uint256_to_char(l_token->total_supply, NULL)));
dap_chain_datum_token_flags_dump_to_json(json_obj_datum, l_token->header_native_update.flags);
dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type); dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token, l_token_size, a_hash_out_type);
size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_update.tsd_total_size; size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_update.tsd_total_size;
dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token->tsd_n_signs + l_token->header_native_update.tsd_total_size, dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token->tsd_n_signs + l_token->header_native_update.tsd_total_size,
...@@ -972,7 +969,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -972,7 +969,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
json_object_object_add(json_obj_datum,"coins", json_object_new_string(l_coins_str)); json_object_object_add(json_obj_datum,"coins", json_object_new_string(l_coins_str));
json_object_object_add(json_obj_datum,"value", json_object_new_string(l_value_str)); json_object_object_add(json_obj_datum,"value", json_object_new_string(l_value_str));
json_object_object_add(json_obj_datum,"ticker", json_object_new_string(l_emission->hdr.ticker)); json_object_object_add(json_obj_datum,"ticker", json_object_new_string(l_emission->hdr.ticker));
json_object_object_add(json_obj_datum,"type", json_object_new_string(c_dap_chain_datum_token_emission_type_str[l_emission->hdr.type])); json_object_object_add(json_obj_datum,"type", json_object_new_string(dap_chain_datum_emission_type_str(l_emission->hdr.type)));
json_object_object_add(json_obj_datum,"version", json_object_new_uint64(l_emission->hdr.version)); json_object_object_add(json_obj_datum,"version", json_object_new_uint64(l_emission->hdr.version));
json_object_object_add(json_obj_datum,"to addr", json_object_new_string(dap_chain_addr_to_str(&(l_emission->hdr.address)))); json_object_object_add(json_obj_datum,"to addr", json_object_new_string(dap_chain_addr_to_str(&(l_emission->hdr.address))));
...@@ -990,7 +987,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat ...@@ -990,7 +987,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat
break; break;
} }
dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size,
l_emission->data.type_auth.size - l_emission->data.type_auth.tsd_total_size, a_hash_out_type); l_emission->data.type_auth.tsd_n_signs_size - l_emission->data.type_auth.tsd_total_size, a_hash_out_type);
break; break;
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO:
json_object_object_add(json_obj_datum,"codename",json_object_new_string(l_emission->data.type_algo.codename)); json_object_object_add(json_obj_datum,"codename",json_object_new_string(l_emission->data.type_algo.codename));
......
...@@ -32,30 +32,31 @@ ...@@ -32,30 +32,31 @@
#define LOG_TAG "dap_chain_datum_token" #define LOG_TAG "dap_chain_datum_token"
const char *c_dap_chain_datum_token_emission_type_str[]={ struct datum_token_flag_struct {
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED] = "UNDEFINED", const char *key;
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH] = "AUTH", uint32_t val;
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO] = "ALGO",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER] = "OWNER",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT] = "SMART_CONTRACT"
}; };
const char *c_dap_chain_datum_token_flag_str[] = { static const struct datum_token_flag_struct s_flags_table[] = {
[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE] = "NONE", { "NO_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_NONE },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED] = "ALL_SENDER_BLOCKED", { "ALL_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED] = "ALL_SENDER_ALLOWED", { "ALL_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN] = "ALL_SENDER_FROZEN", { "ALL_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN] = "ALL_SENDER_UNFROZEN", { "ALL_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED] = "ALL_RECEIVER_BLOCKED", { "STATIC_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED] = "ALL_RECEIVER_ALLOWED", { "STATIC_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN] = "ALL_RECEIVER_FROZEN", { "STATIC_PERMISSIONS_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL },
[DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN] = "ALL_RECEIVER_UNFROZEN", { "STATIC_PERMISSIONS_DATUM_TYPE", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL] = "STATIC_ALL", { "STATIC_PERMISSIONS_TX_SENDER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS] = "STATIC_FLAGS", { "STATIC_PERMISSIONS_TX_RECEIVER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL] = "STATIC_PERMISSIONS_ALL", { "ALL_SENDER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE] = "STATIC_PERMISSIONS_DATUM_TYPE", { "ALL_SENDER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER] = "TATIC_PERMISSIONS_TX_SENDER", { "ALL_SENDER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED },
[DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER] = "STATIC_PERMISSIONS_TX_RECEIVER", { "ALL_SENDER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN },
{ "ALL_RECEIVER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED },
{ "ALL_RECEIVER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN },
{ "ALL_RECEIVER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED },
{ "ALL_RECEIVER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN }
}; };
/** /**
...@@ -113,7 +114,6 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial ...@@ -113,7 +114,6 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial
*l_token = (dap_chain_datum_token_t) { *l_token = (dap_chain_datum_token_t) {
.type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE, .type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE,
.subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE, .subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE,
.header_private_update.flags = l_token_old->header_private_update.flags,
.header_private_update.tsd_total_size = l_token_old->header_private_update.tsd_total_size, .header_private_update.tsd_total_size = l_token_old->header_private_update.tsd_total_size,
.header_private_update.decimals = l_token_old->header_private_update.decimals .header_private_update.decimals = l_token_old->header_private_update.decimals
}; };
...@@ -133,7 +133,6 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial ...@@ -133,7 +133,6 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial
*l_token = (dap_chain_datum_token_t) { *l_token = (dap_chain_datum_token_t) {
.type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE, .type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE,
.subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE, .subtype = DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE,
.header_native_update.flags = l_token_old->header_native_update.flags,
.header_native_update.tsd_total_size = l_token_old->header_native_update.tsd_total_size, .header_native_update.tsd_total_size = l_token_old->header_native_update.tsd_total_size,
.header_native_update.decimals = l_token_old->header_native_update.decimals .header_native_update.decimals = l_token_old->header_native_update.decimals
}; };
...@@ -176,29 +175,18 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial ...@@ -176,29 +175,18 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial
} }
/** /**
* @brief dap_chain_datum_token_flags_dump * @brief dap_chain_datum_token_flag_from_str
* @param a_str_out * @param a_str
* @param a_flags * @return
*/ */
void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags) uint32_t dap_chain_datum_token_flag_from_str(const char *a_str)
{ {
if(!a_flags){ if (a_str == NULL)
dap_string_append_printf(a_str_out, "%s\n", return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE;
c_dap_chain_datum_token_flag_str[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE]); for (uint16_t i = 0; i < sizeof(s_flags_table) / sizeof(struct datum_token_flag_struct); i++)
return; if (strcmp(s_flags_table[i].key, a_str) == 0)
} return s_flags_table[i].val;
bool is_first = true; return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED;
for ( uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){
if( a_flags & (1 << i) ){
if(is_first)
is_first = false;
else
dap_string_append_printf(a_str_out,", ");
dap_string_append_printf(a_str_out,"%s", c_dap_chain_datum_token_flag_str[BIT(i)]);
}
if(i == DAP_CHAIN_DATUM_TOKEN_FLAG_MAX)
dap_string_append_printf(a_str_out, "\n");
}
} }
/** /**
...@@ -208,23 +196,17 @@ void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags ...@@ -208,23 +196,17 @@ void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags
*/ */
void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags) void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags)
{ {
if(!a_flags){ if (!a_flags) {
json_object_object_add(json_obj_out, "flags", json_object_new_string(c_dap_chain_datum_token_flag_str[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE])); json_object_object_add(json_obj_out, "flags", json_object_new_string(dap_chain_datum_token_flag_to_str(DAP_CHAIN_DATUM_TOKEN_FLAG_NONE)));
return; return;
} }
json_object *l_array_flags = json_object_new_array(); json_object *l_array_flags = json_object_new_array();
for ( uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){ for (uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++)
if( a_flags & (1 << i) ){ if (a_flags & BIT(i))
json_object_array_add(l_array_flags, json_object_new_string(c_dap_chain_datum_token_flag_str[BIT(i)])); json_object_array_add(l_array_flags, json_object_new_string(dap_chain_datum_token_flag_to_str(BIT(i))));
}
}
json_object_object_add(json_obj_out, "flags", l_array_flags); json_object_object_add(json_obj_out, "flags", l_array_flags);
} }
/** /**
* @brief dap_chain_datum_token_certs_dump * @brief dap_chain_datum_token_certs_dump
* @param a_str_out * @param a_str_out
...@@ -359,16 +341,12 @@ size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial) ...@@ -359,16 +341,12 @@ size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial)
dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emission_serial, size_t *a_emission_size) dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emission_serial, size_t *a_emission_size)
{ {
assert(a_emission_serial); const size_t l_old_hdr_size = sizeof(struct dap_chain_emission_header_v0);
assert(a_emission_size); dap_return_val_if_fail(a_emission_serial && a_emission_size && *a_emission_size >= l_old_hdr_size, NULL);
if(!a_emission_serial || !a_emission_size || *a_emission_size < sizeof(struct dap_chain_emission_header_v0)) {
log_it(L_ERROR, "Invalid params in dap_chain_datum_emission_read");
return NULL;
}
dap_chain_datum_token_emission_t *l_emission = NULL; dap_chain_datum_token_emission_t *l_emission = NULL;
if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 0) { if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 0) {
size_t l_emission_size = *a_emission_size; size_t l_emission_size = *a_emission_size;
size_t l_old_hdr_size = sizeof(struct dap_chain_emission_header_v0);
size_t l_add_size = sizeof(l_emission->hdr) - l_old_hdr_size; size_t l_add_size = sizeof(l_emission->hdr) - l_old_hdr_size;
l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size + l_add_size); l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size + l_add_size);
if (!l_emission) { if (!l_emission) {
...@@ -383,16 +361,25 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi ...@@ -383,16 +361,25 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi
l_emission->hdr.value = dap_chain_uint256_from( l_emission->hdr.value = dap_chain_uint256_from(
((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64); ((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64);
l_emission_size += l_add_size; l_emission_size += l_add_size;
if (l_emission->hdr.type == DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH)
l_emission->data.type_auth.tsd_n_signs_size = l_emission_size - sizeof(dap_chain_datum_token_emission_t);
(*a_emission_size) = l_emission_size; (*a_emission_size) = l_emission_size;
} else { } else {
if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 1) {
l_emission->hdr.value = dap_chain_uint256_from(
((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64);
l_emission->hdr.version = 2;
}
if (*a_emission_size < sizeof(dap_chain_datum_token_emission_t)) {
log_it(L_WARNING, "Size of emission is %zu, less than header size %zu",
*a_emission_size, sizeof(dap_chain_datum_token_emission_t));
return NULL;
}
l_emission = DAP_DUP_SIZE(a_emission_serial, *a_emission_size); l_emission = DAP_DUP_SIZE(a_emission_serial, *a_emission_size);
if (!l_emission) { if (!l_emission) {
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
return NULL; return NULL;
} }
if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 1)
l_emission->hdr.value = dap_chain_uint256_from(
((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64);
} }
return l_emission; return l_emission;
} }
...@@ -408,7 +395,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_tsd(dap_chain_dat ...@@ -408,7 +395,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_tsd(dap_chain_dat
memcpy(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, l_tsd, l_tsd_size); memcpy(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, l_tsd, l_tsd_size);
DAP_DELETE(l_tsd); DAP_DELETE(l_tsd);
l_emission->data.type_auth.tsd_total_size += l_tsd_size; l_emission->data.type_auth.tsd_total_size += l_tsd_size;
l_emission->data.type_auth.size += l_tsd_size; l_emission->data.type_auth.tsd_n_signs_size += l_tsd_size;
return l_emission; return l_emission;
} }
...@@ -433,9 +420,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ ...@@ -433,9 +420,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_
return NULL; return NULL;
size_t l_signs_count = a_emission->data.type_auth.signs_count; size_t l_signs_count = a_emission->data.type_auth.signs_count;
size_t l_old_signs_size = a_emission->data.type_auth.size; size_t l_old_signs_size = a_emission->data.type_auth.tsd_n_signs_size;
if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) if (a_emission->data.type_auth.tsd_n_signs_size > a_emission->data.type_auth.tsd_total_size)
{ {
size_t l_pub_key_size = 0; size_t l_pub_key_size = 0;
dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size);
...@@ -449,7 +436,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ ...@@ -449,7 +436,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_
DAP_DELETE(l_pub_key); DAP_DELETE(l_pub_key);
} }
a_emission->data.type_auth.signs_count = 0; a_emission->data.type_auth.signs_count = 0;
a_emission->data.type_auth.size = 0; a_emission->data.type_auth.tsd_n_signs_size = 0;
dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(dap_chain_datum_token_emission_t) + a_emission->data.type_auth.tsd_total_size, 0); dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(dap_chain_datum_token_emission_t) + a_emission->data.type_auth.tsd_total_size, 0);
if (!l_new_sign) if (!l_new_sign)
return NULL; return NULL;
...@@ -460,7 +447,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ ...@@ -460,7 +447,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_
DAP_DELETE(l_new_sign); DAP_DELETE(l_new_sign);
l_old_signs_size += l_sign_size; l_old_signs_size += l_sign_size;
l_signs_count++; l_signs_count++;
l_ret->data.type_auth.size = l_old_signs_size; l_ret->data.type_auth.tsd_n_signs_size = l_old_signs_size;
l_ret->data.type_auth.signs_count = l_signs_count; l_ret->data.type_auth.signs_count = l_signs_count;
return l_ret; return l_ret;
} }
...@@ -473,7 +460,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_ ...@@ -473,7 +460,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_
if (!a_sign) if (!a_sign)
return NULL; return NULL;
if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) if (a_emission->data.type_auth.tsd_n_signs_size > a_emission->data.type_auth.tsd_total_size)
{ {
dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size);
for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) {
...@@ -490,9 +477,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_ ...@@ -490,9 +477,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_
size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission);
dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(a_sign)); dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(a_sign));
size_t l_sign_size = dap_sign_get_size(a_sign); size_t l_sign_size = dap_sign_get_size(a_sign);
memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, a_sign, l_sign_size); memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.tsd_n_signs_size, a_sign, l_sign_size);
l_ret->data.type_auth.size += l_sign_size; l_ret->data.type_auth.tsd_n_signs_size += l_sign_size;
l_ret->data.type_auth.signs_count++; l_ret->data.type_auth.signs_count++;
return l_ret; return l_ret;
} }
...@@ -503,12 +490,12 @@ dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t ...@@ -503,12 +490,12 @@ dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t
log_it(L_ERROR, "Parameters must be not-null!"); log_it(L_ERROR, "Parameters must be not-null!");
return NULL; return NULL;
} }
if (!a_emission->data.type_auth.signs_count || a_emission->data.type_auth.size <= a_emission->data.type_auth.tsd_total_size) { if (!a_emission->data.type_auth.signs_count || a_emission->data.type_auth.tsd_n_signs_size <= a_emission->data.type_auth.tsd_total_size) {
*a_signs_count = 0; *a_signs_count = 0;
log_it(L_INFO, "No signes found"); log_it(L_INFO, "No signes found");
return NULL; return NULL;
} }
size_t l_expected_size = a_emission->data.type_auth.size - a_emission->data.type_auth.tsd_total_size, l_actual_size = 0; size_t l_expected_size = a_emission->data.type_auth.tsd_n_signs_size - a_emission->data.type_auth.tsd_total_size, l_actual_size = 0;
/* First sign */ /* First sign */
dap_sign_t *l_sign = (dap_sign_t*)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); dap_sign_t *l_sign = (dap_sign_t*)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size);
size_t l_count, l_sign_size; size_t l_count, l_sign_size;
......
...@@ -59,6 +59,7 @@ dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_ ...@@ -59,6 +59,7 @@ dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_
l_ret->exts_size = a_ext_size; l_ret->exts_size = a_ext_size;
memcpy(l_ret->exts_n_signs, a_ext, a_ext_size); memcpy(l_ret->exts_n_signs, a_ext, a_ext_size);
} }
return l_ret; return l_ret;
} }
...@@ -68,6 +69,7 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu ...@@ -68,6 +69,7 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu
log_it(L_ERROR, "NULL receipt, can't add sign"); log_it(L_ERROR, "NULL receipt, can't add sign");
return NULL; return NULL;
} }
dap_sign_t *l_sign = dap_sign_create(a_key, &a_receipt->receipt_info, sizeof(a_receipt->receipt_info), 0); dap_sign_t *l_sign = dap_sign_create(a_key, &a_receipt->receipt_info, sizeof(a_receipt->receipt_info), 0);
size_t l_sign_size = l_sign ? dap_sign_get_size(l_sign) : 0; size_t l_sign_size = l_sign ? dap_sign_get_size(l_sign) : 0;
if (!l_sign || !l_sign_size) { if (!l_sign || !l_sign_size) {
...@@ -84,6 +86,7 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu ...@@ -84,6 +86,7 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu
memcpy((byte_t *)l_receipt + l_receipt->size, l_sign, l_sign_size); memcpy((byte_t *)l_receipt + l_receipt->size, l_sign, l_sign_size);
l_receipt->size += l_sign_size; l_receipt->size += l_sign_size;
DAP_DELETE(l_sign); DAP_DELETE(l_sign);
return l_receipt; return l_receipt;
} }
......
...@@ -108,13 +108,13 @@ typedef struct dap_chain_datum_token { ...@@ -108,13 +108,13 @@ typedef struct dap_chain_datum_token {
} DAP_ALIGN_PACKED header_native_decl; } DAP_ALIGN_PACKED header_native_decl;
// Private token update // Private token update
struct { struct {
uint16_t flags; // Token declaration flags uint16_t padding; // OLD token declaration flags
uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section
uint16_t decimals; uint16_t decimals;
} DAP_ALIGN_PACKED header_private_update; } DAP_ALIGN_PACKED header_private_update;
// native token update // native token update
struct { struct {
uint16_t flags; // Token declaration flags uint16_t padding; // OLD Token declaration flags
uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section
uint16_t decimals; uint16_t decimals;
} DAP_ALIGN_PACKED header_native_update; } DAP_ALIGN_PACKED header_native_update;
...@@ -169,70 +169,72 @@ typedef struct dap_chain_datum_token_tsd_delegate_from_stake_lock { ...@@ -169,70 +169,72 @@ typedef struct dap_chain_datum_token_tsd_delegate_from_stake_lock {
// Macros for token flags // Macros for token flags
/// ------- Global section flags -------- /// ------- Global section flags --------
// No any flags // No any flags
#define DAP_CHAIN_DATUM_TOKEN_FLAG_NONE 0x0000 #define DAP_CHAIN_DATUM_TOKEN_FLAG_NONE 0x0000
// Blocked all permissions, usefull issue it by default and then allow what you want to allow // Blocked all permissions, usefull issue it by default and then allow what you want to allow
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED BIT(1) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED BIT(1)
// Allowed all permissions if not blocked them. Be careful with this mode // Allowed all permissions if not blocked them. Be careful with this mode
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED BIT(2) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED BIT(2)
// All permissions are temprorary frozen // All permissions are temprorary frozen
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN BIT(3) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN BIT(3)
// Unfrozen permissions // Unfrozen permissions
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN BIT(4) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN BIT(4)
// Blocked all permissions, usefull issue it by default and then allow what you want to allow // Blocked all permissions, usefull issue it by default and then allow what you want to allow
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED BIT(5) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED BIT(5)
// Allowed all permissions if not blocked them. Be careful with this mode // Allowed all permissions if not blocked them. Be careful with this mode
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED BIT(6) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED BIT(6)
// All permissions are temprorary frozen // All permissions are temprorary frozen
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN BIT(7) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN BIT(7)
// Unfrozen permissions // Unfrozen permissions
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN BIT(8) #define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN BIT(8)
/// ------ Static configured flags /// ------ Static configured flags
// No token manipulations after declarations at all. Token declares staticly and can't variabed after // No token manipulations after declarations at all. Token declares staticly and can't variabed after
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL BIT(9) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL BIT(9)
// No token manipulations after declarations with flags. // No token manipulations after declarations with flags.
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS BIT(10) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS BIT(10)
// No all permissions lists manipulations after declarations // No all permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL BIT(11) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL BIT(11)
// No datum type permissions lists manipulations after declarations // No datum type permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE BIT(12) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE BIT(12)
// No tx sender permissions lists manipulations after declarations // No tx sender permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER BIT(13) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER BIT(13)
// No tx receiver permissions lists manipulations after declarations // No tx receiver permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER BIT(14) #define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER BIT(14)
// Maximal flag // Maximal flag
#define DAP_CHAIN_DATUM_TOKEN_FLAG_MAX BIT(15) #define DAP_CHAIN_DATUM_TOKEN_FLAG_MAX BIT(15)
#define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED 0xffff
extern const char *c_dap_chain_datum_token_flag_str[];
#define dap_chain_datum_token_flag_to_str(a) ((a<=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX) ? c_dap_chain_datum_token_flag_str[a] : "OUT_OF_RANGE")
#define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED 0xffff
// /** DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag)
// * @brief dap_chain_datum_token_flag_from_str {
// * @param a_str switch (a_flag) {
// * @return case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE";
// */ case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED";
// static inline uint16_t dap_chain_datum_token_flag_from_str(const char* a_str) case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED";
// { case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN";
// if (a_str == NULL) case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN";
// return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER";
default: return "UNKNOWN FLAG OR FLAGS GROUP";
}
}
// for (uint16_t i = DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; i <=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++ ){ uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
// if ( strcmp( a_str, c_dap_chain_datum_token_flag_str[i]) == 0 )
// return i;
// }
// return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED;
// }
/// -------- General tsd types ---- /// -------- General tsd types ----
// Flags set/unsed // Flags set/unsed
...@@ -257,142 +259,41 @@ extern const char *c_dap_chain_datum_token_flag_str[]; ...@@ -257,142 +259,41 @@ extern const char *c_dap_chain_datum_token_flag_str[];
// Description token // Description token
#define DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION 0x0028 #define DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION 0x0028
/// ------- Permissions list flags, grouped by update-remove-clear operations -------- /// ------- Permissions list flags, grouped by update-remove-clear operations --------
// Blocked datum types list add, remove or clear // Blocked datum types list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0007 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0007
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0008 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0008
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0009 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0009
// Allowed datum types list add, remove or clear // Allowed datum types list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012
//Allowed tx receiver addres list add, remove or clear //Allowed tx receiver addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE 0x0015 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE 0x0015
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR 0x0016 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR 0x0016
//Blocked tx receiver addres list add, remove or clear //Blocked tx receiver addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD 0x0017 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD 0x0017
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE 0x0018 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE 0x0018
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR 0x0019 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR 0x0019
//Allowed tx sender addres list add, remove or clear //Allowed tx sender addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD 0x0020 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD 0x0020
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE 0x0021 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE 0x0021
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR 0x0022 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR 0x0022
//Blocked tx sender addres list add, remove or clear //Blocked tx sender addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD 0x0023 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD 0x0023
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025
#define DAP_CHAIN_DATUM_NONCE_SIZE 64
typedef struct { char *key; uint64_t val; } t_datum_token_flag_struct;
// new__
static t_datum_token_flag_struct s_flags_table[] = {
{ "NO_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_NONE},
{ "ALL_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED},
{ "ALL_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN },
{ "ALL_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED},
{ "ALL_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN },
{ "STATIC_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL},
{ "STATIC_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS },
{ "STATIC_PERMISSIONS_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL },
{ "STATIC_PERMISSIONS_DATUM_TYPE", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE },
{ "STATIC_PERMISSIONS_TX_SENDER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER },
{ "STATIC_PERMISSIONS_TX_RECEIVER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER },
{ "ALL_SENDER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED},
{ "ALL_SENDER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN},
{ "ALL_SENDER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED},
{ "ALL_SENDER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN},
{ "ALL_RECEIVER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED},
{ "ALL_RECEIVER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN },
{ "ALL_RECEIVER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED},
{ "ALL_RECEIVER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN },
};
#define NKEYS (sizeof(s_flags_table)/sizeof(t_datum_token_flag_struct))
DAP_STATIC_INLINE int s_flag_code_from_str(const char *key)
{
uint64_t i;
for (i=0; i < NKEYS; i++) {
t_datum_token_flag_struct sym = s_flags_table[i];
if (strcmp(s_flags_table[i].key, key) == 0)
return s_flags_table[i].val;
}
return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED;
}
DAP_STATIC_INLINE char* s_flag_str_from_code(uint64_t code)
{
uint64_t i;
uint64_t flags_count = 0;
for (i=0; i < NKEYS; i++) {
t_datum_token_flag_struct sym = s_flags_table[i];
if (s_flags_table[i].val == code)
return s_flags_table[i].key;
}
// split multiple flags in string
char* s_multiple_flag = "";
for (i=0; i < NKEYS; i++) {
t_datum_token_flag_struct sym = s_flags_table[i];
if ((s_flags_table[i].val & code) > 0)
{
flags_count += 1;
if (flags_count > 1)
s_multiple_flag = dap_strjoin(";", s_multiple_flag, s_flags_table[i].key, (char*)NULL);
else
s_multiple_flag = dap_strjoin(NULL, s_multiple_flag, s_flags_table[i].key, (char*)NULL);
}
}
char* s_no_flags = "NO FLAGS";
if (flags_count > 0)
return s_multiple_flag;
else
return s_no_flags;
}
/** #define DAP_CHAIN_DATUM_NONCE_SIZE 64
* @brief dap_chain_datum_token_flag_from_str
* @param a_str
* @return
*/
DAP_STATIC_INLINE char *dap_chain_datum_str_token_flag_from_code(uint64_t code)
{
return s_flag_str_from_code(code);
}
/**
* @brief dap_chain_datum_token_flag_from_str
* @param a_str
* @return
*/
DAP_STATIC_INLINE uint16_t dap_chain_datum_token_flag_from_str(const char* a_str)
{
if (a_str == NULL)
return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE;
return s_flag_code_from_str(a_str);
}
// Get delegated ticker // Get delegated ticker
DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker) DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker)
...@@ -451,7 +352,7 @@ typedef struct dap_chain_datum_token_emission { ...@@ -451,7 +352,7 @@ typedef struct dap_chain_datum_token_emission {
char codename[32]; char codename[32];
} DAP_ALIGN_PACKED type_algo; } DAP_ALIGN_PACKED type_algo;
struct { struct {
uint64_t size; uint64_t tsd_n_signs_size;
uint64_t tsd_total_size; uint64_t tsd_total_size;
uint16_t signs_count; uint16_t signs_count;
} DAP_ALIGN_PACKED type_auth; } DAP_ALIGN_PACKED type_auth;
...@@ -501,12 +402,20 @@ typedef struct dap_chain_datum_token_emission { ...@@ -501,12 +402,20 @@ typedef struct dap_chain_datum_token_emission {
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_COMMISSION "COMMISSION" #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_COMMISSION "COMMISSION"
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_CROSSCHAIN "CROSSCHAIN" #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_CROSSCHAIN "CROSSCHAIN"
DAP_STATIC_INLINE const char *dap_chain_datum_emission_type_str(uint8_t a_type)
extern const char *c_dap_chain_datum_token_emission_type_str[]; {
switch (a_type) {
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: return "AUTH";
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: return "ALGO";
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: return "OWNER";
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: return "SMART_CONTRACT";
case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED:
default: return "UNDEFINED";
}
}
/// TDS op funcs /// TDS op funcs
dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size); dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size);
void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags);
void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags); void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags);
void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type); void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type);
void dap_chain_datum_token_certs_dump_to_json(json_object *a_json_obj_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type); void dap_chain_datum_token_certs_dump_to_json(json_object *a_json_obj_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type);
......
...@@ -872,7 +872,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ ...@@ -872,7 +872,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
return -1; return -1;
} }
if (l_event->header.round_id < a_dag->round_completed) { if (l_event->header.round_id < a_dag->round_completed) {
struct round_timer_arg *l_round_active; struct round_timer_arg *l_round_active = NULL;
uint64_t l_round_id = l_event->header.round_id; uint64_t l_round_id = l_event->header.round_id;
pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
HASH_FIND(hh, l_poa_pvt->active_rounds, &l_round_id, sizeof(uint64_t), l_round_active); HASH_FIND(hh, l_poa_pvt->active_rounds, &l_round_id, sizeof(uint64_t), l_round_active);
......
...@@ -1068,7 +1068,7 @@ static bool s_session_round_new(void *a_arg) ...@@ -1068,7 +1068,7 @@ static bool s_session_round_new(void *a_arg)
a_session->cur_round.all_validators = dap_list_copy_deep(l_validators, s_callback_list_form, NULL); a_session->cur_round.all_validators = dap_list_copy_deep(l_validators, s_callback_list_form, NULL);
dap_list_free_full(l_validators, NULL); dap_list_free_full(l_validators, NULL);
bool l_round_already_started = a_session->round_fast_forward; bool l_round_already_started = a_session->round_fast_forward;
dap_chain_esbocs_sync_item_t *l_item, *l_tmp; dap_chain_esbocs_sync_item_t *l_item = NULL, *l_tmp;
HASH_FIND(hh, a_session->sync_items, &a_session->cur_round.last_block_hash, sizeof(dap_hash_fast_t), l_item); HASH_FIND(hh, a_session->sync_items, &a_session->cur_round.last_block_hash, sizeof(dap_hash_fast_t), l_item);
if (l_item) { if (l_item) {
debug_if(PVT(a_session->esbocs)->debug, debug_if(PVT(a_session->esbocs)->debug,
...@@ -1307,7 +1307,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s ...@@ -1307,7 +1307,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s
if (dap_hash_fast_is_blank(l_candidate_hash)) if (dap_hash_fast_is_blank(l_candidate_hash))
s_session_attempt_new(a_session); s_session_attempt_new(a_session);
else { else {
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store);
if (l_store) { if (l_store) {
a_session->cur_round.attempt_candidate_hash = *l_candidate_hash; a_session->cur_round.attempt_candidate_hash = *l_candidate_hash;
...@@ -1340,7 +1340,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s ...@@ -1340,7 +1340,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s
} break; } break;
case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_FINISH: { case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_FINISH: {
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
HASH_FIND(hh, a_session->cur_round.store_items, &a_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store); HASH_FIND(hh, a_session->cur_round.store_items, &a_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store);
if (!l_store) { if (!l_store) {
log_it(L_ERROR, "No finish candidate found!"); log_it(L_ERROR, "No finish candidate found!");
...@@ -1458,7 +1458,7 @@ static void s_session_proc_state(void *a_arg) ...@@ -1458,7 +1458,7 @@ static void s_session_proc_state(void *a_arg)
break; break;
case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_SIGNS: case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_SIGNS:
if (l_time - l_session->ts_stage_entry >= PVT(l_session->esbocs)->round_attempt_timeout) { if (l_time - l_session->ts_stage_entry >= PVT(l_session->esbocs)->round_attempt_timeout) {
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
HASH_FIND(hh, l_session->cur_round.store_items, &l_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store); HASH_FIND(hh, l_session->cur_round.store_items, &l_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store);
if (!l_store) { if (!l_store) {
log_it(L_ERROR, "No round candidate found!"); log_it(L_ERROR, "No round candidate found!");
...@@ -1634,7 +1634,7 @@ static void s_session_candidate_precommit(dap_chain_esbocs_session_t *a_session, ...@@ -1634,7 +1634,7 @@ static void s_session_candidate_precommit(dap_chain_esbocs_session_t *a_session,
uint16_t l_cs_level = PVT(a_session->esbocs)->min_validators_count; uint16_t l_cs_level = PVT(a_session->esbocs)->min_validators_count;
byte_t *l_message_data = a_message->msg_n_sign; byte_t *l_message_data = a_message->msg_n_sign;
dap_chain_hash_fast_t *l_candidate_hash = &a_message->hdr.candidate_hash; dap_chain_hash_fast_t *l_candidate_hash = &a_message->hdr.candidate_hash;
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
const char *l_candidate_hash_str = NULL; const char *l_candidate_hash_str = NULL;
HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store);
if (!l_store) { if (!l_store) {
...@@ -1779,7 +1779,7 @@ void s_session_sync_queue_add(dap_chain_esbocs_session_t *a_session, dap_chain_e ...@@ -1779,7 +1779,7 @@ void s_session_sync_queue_add(dap_chain_esbocs_session_t *a_session, dap_chain_e
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
return; return;
} }
dap_chain_esbocs_sync_item_t *l_sync_item; dap_chain_esbocs_sync_item_t *l_sync_item = NULL;
HASH_FIND(hh, a_session->sync_items, &a_message->hdr.candidate_hash, sizeof(dap_hash_fast_t), l_sync_item); HASH_FIND(hh, a_session->sync_items, &a_message->hdr.candidate_hash, sizeof(dap_hash_fast_t), l_sync_item);
if (!l_sync_item) { if (!l_sync_item) {
DAP_NEW_Z_RET(l_sync_item, dap_chain_esbocs_sync_item_t, l_message_copy); DAP_NEW_Z_RET(l_sync_item, dap_chain_esbocs_sync_item_t, l_message_copy);
...@@ -2396,7 +2396,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain ...@@ -2396,7 +2396,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain
l_message->hdr.attempt_num, l_candidate_hash_str, l_candidate_size); l_message->hdr.attempt_num, l_candidate_hash_str, l_candidate_size);
} }
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store);
if (l_store) { if (l_store) {
const char *l_candidate_hash_str = dap_chain_hash_fast_to_str_static(l_candidate_hash); const char *l_candidate_hash_str = dap_chain_hash_fast_to_str_static(l_candidate_hash);
...@@ -2426,7 +2426,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain ...@@ -2426,7 +2426,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain
case DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE: case DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE:
case DAP_CHAIN_ESBOCS_MSG_TYPE_REJECT: { case DAP_CHAIN_ESBOCS_MSG_TYPE_REJECT: {
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
const char *l_candidate_hash_str = NULL; const char *l_candidate_hash_str = NULL;
bool l_approve = l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE; bool l_approve = l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE;
HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store);
...@@ -2493,7 +2493,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain ...@@ -2493,7 +2493,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain
break; break;
} }
dap_chain_esbocs_store_t *l_store; dap_chain_esbocs_store_t *l_store = NULL;
const char *l_candidate_hash_str = NULL; const char *l_candidate_hash_str = NULL;
HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store);
if (!l_store) { if (!l_store) {
...@@ -2939,15 +2939,18 @@ static dap_chain_datum_decree_t *s_esbocs_decree_set_emergency_validator(dap_cha ...@@ -2939,15 +2939,18 @@ static dap_chain_datum_decree_t *s_esbocs_decree_set_emergency_validator(dap_cha
return dap_chain_datum_decree_sign_in_cycle(&a_cert, l_decree, 1, NULL); return dap_chain_datum_decree_sign_in_cycle(&a_cert, l_decree, 1, NULL);
} }
static void s_print_emergency_validators(char **a_str_reply, dap_list_t *a_validator_addrs) static void s_print_emergency_validators(json_object *json_obj_out, dap_list_t *a_validator_addrs)
{ {
dap_string_t *l_str_out = dap_string_new("Current emergency validators list:\n"); json_object *json_arr_validators = json_object_new_array();
for (dap_list_t *it = a_validator_addrs; it; it = it->next) { size_t i=1;
for (dap_list_t *it = a_validator_addrs; it; it = it->next, i++) {
json_object *json_obj_validator = json_object_new_object();
dap_chain_addr_t *l_addr = it->data; dap_chain_addr_t *l_addr = it->data;
dap_string_append_printf(l_str_out, "%s\n", dap_chain_hash_fast_to_str_static(&l_addr->data.hash_fast)); json_object_object_add(json_obj_validator,"#", json_object_new_uint64(i));
json_object_object_add(json_obj_validator,"addr hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_addr->data.hash_fast)));
json_object_array_add(json_arr_validators, json_obj_validator);
} }
*a_str_reply = l_str_out->str; json_object_object_add(json_obj_out,"Current emergency validators list", json_arr_validators);
dap_string_free(l_str_out, false);
} }
/** /**
...@@ -2964,16 +2967,16 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) ...@@ -2964,16 +2967,16 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
int l_arg_index = 1; int l_arg_index = 1;
dap_chain_net_t *l_chain_net = NULL; dap_chain_net_t *l_chain_net = NULL;
dap_chain_t *l_chain = NULL; dap_chain_t *l_chain = NULL;
json_object **json_arr_reply = (json_object **)a_str_reply;
if (dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_chain_net,
CHAIN_TYPE_ANCHOR)) if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&l_arg_index, a_argc, a_argv, &l_chain, &l_chain_net,
CHAIN_TYPE_ANCHOR))
return -3; return -3;
const char *l_chain_type = dap_chain_get_cs_type(l_chain); const char *l_chain_type = dap_chain_get_cs_type(l_chain);
if (strcmp(l_chain_type, "esbocs")) { if (strcmp(l_chain_type, "esbocs")) {
dap_cli_server_cmd_set_reply_text(a_str_reply, dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR,"Type of chain \"%s\" is not block. Chain with current consensus \"%s\" is not supported by this command",
"Type of chain \"%s\" is not block. Chain with current consensus \"%s\" is not supported by this command",
l_chain->name, l_chain_type); l_chain->name, l_chain_type);
return -2; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR;
} }
dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain);
dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks);
...@@ -3017,73 +3020,82 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) ...@@ -3017,73 +3020,82 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
const char *l_cert_str = NULL; const char *l_cert_str = NULL;
dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str);
if (!l_cert_str) { if (!l_cert_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'min_validators_count' requires parameter -cert"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command 'min_validators_count' requires parameter -cert");
return -3; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR;
} }
l_poa_cert = dap_cert_find_by_name(l_cert_str); l_poa_cert = dap_cert_find_by_name(l_cert_str);
if (!l_poa_cert) { if (!l_poa_cert) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate not found"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR,"Specified certificate not found");
return -25; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR;
} }
if (!l_poa_cert->enc_key || !l_poa_cert->enc_key->priv_key_data) { if (!l_poa_cert->enc_key || !l_poa_cert->enc_key->priv_key_data) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate doesn't contain a private key"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR,"Specified certificate doesn't contain a private key");
return -26; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR;
} }
} else if (dap_cli_server_cmd_check_option(a_argv, l_arg_index, l_arg_index + 1, "show") > 0) } else if (dap_cli_server_cmd_check_option(a_argv, l_arg_index, l_arg_index + 1, "show") > 0)
l_subcommand_show = true; l_subcommand_show = true;
else else
dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNKNOWN,"Unrecognized subcommand '%s'", a_argv[l_arg_index]);
} }
int ret = 0; int ret = 0;
// Do subcommand action // Do subcommand action
switch (l_subcmd) { switch (l_subcmd) {
case SUBCMD_MIN_VALIDATORS_COUNT: { case SUBCMD_MIN_VALIDATORS_COUNT: {
if (!l_subcommand_show) { if (!l_subcommand_show) {
const char *l_value_str = NULL; const char *l_value_str = NULL;
dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-val_count", &l_value_str); dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-val_count", &l_value_str);
if (!l_value_str) { if (!l_value_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Command '%s' requires parameter -val_count", l_subcmd_strs[l_subcmd]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,"Command '%s' requires parameter -val_count", l_subcmd_strs[l_subcmd]);
return -9; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR;
} }
uint256_t l_value = dap_chain_balance_scan(l_value_str); uint256_t l_value = dap_chain_balance_scan(l_value_str);
if (IS_ZERO_256(l_value)) { if (IS_ZERO_256(l_value)) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized number in '-val_count' param"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR,"Unrecognized number in '-val_count' param");
return -10; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR;
} }
dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_min_validators_count( dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_min_validators_count(
l_chain_net, l_chain, l_value, l_poa_cert); l_chain_net, l_chain, l_value, l_poa_cert);
char *l_decree_hash_str = NULL; char *l_decree_hash_str = NULL;
if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) { if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Minimum validators count has been set." json_object * json_obj_out = json_object_new_object();
" Decree hash %s", l_decree_hash_str); json_object_object_add(json_obj_out,"status", json_object_new_string("Minimum validators count has been set"));
json_object_object_add(json_obj_out,"decree hash", json_object_new_string(l_decree_hash_str));
json_object_array_add(*json_arr_reply, json_obj_out);
DAP_DEL_MULTY(l_decree, l_decree_hash_str); DAP_DEL_MULTY(l_decree, l_decree_hash_str);
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Minimum validators count setting failed"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR,"Minimum validators count setting failed");
DAP_DEL_Z(l_decree); DAP_DEL_Z(l_decree);
return -21; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR;
} }
} else } else{
dap_cli_server_cmd_set_reply_text(a_str_reply, "Minimum validators count is %d", l_esbocs_pvt->min_validators_count); json_object * json_obj_out = json_object_new_object();
json_object_object_add(json_obj_out,"Minimum validators count", json_object_new_uint64(l_esbocs_pvt->min_validators_count));
json_object_array_add(*json_arr_reply, json_obj_out);
}
} break; } break;
case SUBCMD_CHECK_SIGNS_STRUCTURE: { case SUBCMD_CHECK_SIGNS_STRUCTURE: {
json_object * json_obj_out = json_object_new_object();
if (!l_subcommand_show) { if (!l_subcommand_show) {
dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_signs_check(l_chain_net, l_chain, l_subcommand_add, l_poa_cert); dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_signs_check(l_chain_net, l_chain, l_subcommand_add, l_poa_cert);
char *l_decree_hash_str = NULL; char *l_decree_hash_str = NULL;
if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) { if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Checking signs structure has been %s. Decree hash %s", json_object_object_add(json_obj_out,"Checking signs structure has been", l_subcommand_add ? json_object_new_string("enabled") : json_object_new_string("disabled"));
l_subcommand_add ? "enabled" : "disabled", l_decree_hash_str); json_object_object_add(json_obj_out,"Decree hash", json_object_new_string(l_decree_hash_str));
json_object_array_add(*json_arr_reply, json_obj_out);
DAP_DEL_MULTY(l_decree, l_decree_hash_str); DAP_DEL_MULTY(l_decree, l_decree_hash_str);
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Checking signs structure setting failed"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR,"Checking signs structure setting failed");
DAP_DEL_Z(l_decree); DAP_DEL_Z(l_decree);
return -21; json_object_put(json_obj_out);
return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR;
} }
} else } else{
dap_cli_server_cmd_set_reply_text(a_str_reply, "Checking signs structure is %s", l_esbocs_pvt->check_signs_structure ? json_object_object_add(json_obj_out,"Checking signs structure is", l_esbocs_pvt->check_signs_structure ? json_object_new_string("enabled") : json_object_new_string("disabled"));
"enabled" : "disabled"); json_object_array_add(*json_arr_reply, json_obj_out);
}
} break; } break;
case SUBCMD_EMERGENCY_VALIDATOR: { case SUBCMD_EMERGENCY_VALIDATOR: {
...@@ -3091,13 +3103,13 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) ...@@ -3091,13 +3103,13 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
const char *l_hash_str = NULL, *l_type_str = NULL; const char *l_hash_str = NULL, *l_type_str = NULL;
dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-pkey_hash", &l_hash_str); dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-pkey_hash", &l_hash_str);
if (!l_hash_str) { if (!l_hash_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Command '%s' requires parameter -pkey_hash", l_subcmd_strs[l_subcmd]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR,"Command '%s' requires parameter -pkey_hash", l_subcmd_strs[l_subcmd]);
return -9; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR;
} }
dap_hash_fast_t l_pkey_hash; dap_hash_fast_t l_pkey_hash;
if (dap_chain_hash_fast_from_str(l_hash_str, &l_pkey_hash)) { if (dap_chain_hash_fast_from_str(l_hash_str, &l_pkey_hash)) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid hash format in 'pkey_hash' param"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR,"Invalid hash format in 'pkey_hash' param");
return -10; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR;
} }
dap_sign_type_t l_sig_type = { .type = SIG_TYPE_DILITHIUM }; dap_sign_type_t l_sig_type = { .type = SIG_TYPE_DILITHIUM };
dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-sig_type", &l_type_str); dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-sig_type", &l_type_str);
...@@ -3106,21 +3118,27 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) ...@@ -3106,21 +3118,27 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_emergency_validator(l_chain_net, l_chain, &l_pkey_hash, l_sig_type, l_subcommand_add, l_poa_cert); dap_chain_datum_decree_t *l_decree = s_esbocs_decree_set_emergency_validator(l_chain_net, l_chain, &l_pkey_hash, l_sig_type, l_subcommand_add, l_poa_cert);
char *l_decree_hash_str = NULL; char *l_decree_hash_str = NULL;
if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) { if (l_decree && (l_decree_hash_str = s_esbocs_decree_put(l_decree, l_chain_net))) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Emergency validator %s has been %s. Decree hash %s", json_object * json_obj_out = json_object_new_object();
dap_chain_hash_fast_to_str_static(&l_pkey_hash), json_object_object_add(json_obj_out,"Emergency validator", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_pkey_hash)));
l_subcommand_add ? "added" : "deleted", l_decree_hash_str); json_object_object_add(json_obj_out,"status", l_subcommand_add ? json_object_new_string("added") : json_object_new_string("deleted"));
json_object_object_add(json_obj_out,"Decree hash", json_object_new_string(l_decree_hash_str));
json_object_array_add(*json_arr_reply, json_obj_out);
DAP_DEL_MULTY(l_decree, l_decree_hash_str); DAP_DEL_MULTY(l_decree, l_decree_hash_str);
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Emergency validator %s failed", l_subcommand_add ? "adding" : "deleting"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR,
"Emergency validator %s failed", l_subcommand_add ? "adding" : "deleting");
DAP_DEL_Z(l_decree); DAP_DEL_Z(l_decree);
return -21; return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR;
} }
} else } else{
s_print_emergency_validators((char **)a_str_reply, l_esbocs_pvt->emergency_validator_addrs); json_object * json_obj_out = json_object_new_object();
s_print_emergency_validators(json_obj_out, l_esbocs_pvt->emergency_validator_addrs);
json_object_array_add(*json_arr_reply, json_obj_out);
}
} break; } break;
default: default:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_SUB_ERR,"Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]);
} }
return ret; return ret;
} }
...@@ -219,6 +219,25 @@ typedef struct dap_chain_esbocs_block_collect{ ...@@ -219,6 +219,25 @@ typedef struct dap_chain_esbocs_block_collect{
dap_chain_cell_id_t cell_id; dap_chain_cell_id_t cell_id;
}dap_chain_esbocs_block_collect_t; }dap_chain_esbocs_block_collect_t;
typedef enum s_com_esbocs_err{
DAP_CHAIN_NODE_CLI_COM_ESBOCS_OK = 0,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_PARAM_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_CERT_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_PVT_KEY_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNREC_COM_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_MINVALSET_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHECKING_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_HASH_FORMAT_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_ADD_DEL_ERR,
DAP_CHAIN_NODE_CLI_COM_ESBOCS_SUB_ERR,
/* add custom codes here */
DAP_CHAIN_NODE_CLI_COM_ESBOCS_UNKNOWN /* MAX */
} s_com_esbocs_err_t;
#define DAP_CHAIN_ESBOCS(a) ((dap_chain_esbocs_t *)(a)->_inheritor) #define DAP_CHAIN_ESBOCS(a) ((dap_chain_esbocs_t *)(a)->_inheritor)
typedef enum dap_chain_block_autocollect_type { typedef enum dap_chain_block_autocollect_type {
......
...@@ -938,6 +938,9 @@ char *dap_chain_mempool_tx_create_cond(dap_chain_net_t *a_net, ...@@ -938,6 +938,9 @@ char *dap_chain_mempool_tx_create_cond(dap_chain_net_t *a_net,
uint256_t l_value_transfer = {}; // how many coins to transfer uint256_t l_value_transfer = {}; // how many coins to transfer
uint256_t l_value_need = {}; uint256_t l_value_need = {};
SUM_256_256(a_value, a_value_fee, &l_value_need); SUM_256_256(a_value, a_value_fee, &l_value_need);
if (l_net_fee_used) {
SUM_256_256(l_value_need, l_net_fee, &l_value_need);
}
// where to take coins for service // where to take coins for service
dap_chain_addr_t l_addr_from; dap_chain_addr_t l_addr_from;
dap_chain_addr_fill_from_key(&l_addr_from, a_key_from, a_net->pub.id); dap_chain_addr_fill_from_key(&l_addr_from, a_key_from, a_net->pub.id);
......
This diff is collapsed.
...@@ -181,6 +181,8 @@ typedef struct dap_chain_net_pvt{ ...@@ -181,6 +181,8 @@ typedef struct dap_chain_net_pvt{
dap_global_db_cluster_t *mempool_clusters; // List of chains mempools dap_global_db_cluster_t *mempool_clusters; // List of chains mempools
dap_global_db_cluster_t *orders_cluster; dap_global_db_cluster_t *orders_cluster;
dap_global_db_cluster_t *nodes_cluster; dap_global_db_cluster_t *nodes_cluster;
dap_global_db_cluster_t *nodes_states;
dap_global_db_cluster_t *common_orders;
// Block sign rewards history // Block sign rewards history
struct block_reward *rewards; struct block_reward *rewards;
...@@ -385,6 +387,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t *a_net, dap_chain_net_state_t a_ne ...@@ -385,6 +387,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t *a_net, dap_chain_net_state_t a_ne
log_it(L_ERROR, "Can't create permanent link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_permalink_info->node_addr)); log_it(L_ERROR, "Can't create permanent link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_permalink_info->node_addr));
continue; continue;
} }
PVT(a_net)->state = NET_STATE_LINKS_CONNECTING;
} }
if (a_new_state == NET_STATE_ONLINE) if (a_new_state == NET_STATE_ONLINE)
dap_chain_esbocs_start_timer(a_net->pub.id); dap_chain_esbocs_start_timer(a_net->pub.id);
...@@ -472,7 +475,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net ...@@ -472,7 +475,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net
&l_announce, sizeof(l_announce)); &l_announce, sizeof(l_announce));
} }
static bool s_net_check_link_is_premanent(dap_chain_net_t *a_net, dap_stream_node_addr_t a_addr) static bool s_net_check_link_is_permanent(dap_chain_net_t *a_net, dap_stream_node_addr_t a_addr)
{ {
dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
for (uint16_t i = 0; i < l_net_pvt->permanent_links_count; i++) { for (uint16_t i = 0; i < l_net_pvt->permanent_links_count; i++) {
...@@ -495,7 +498,7 @@ static bool s_link_manager_callback_disconnected(dap_link_t *a_link, uint64_t a_ ...@@ -495,7 +498,7 @@ static bool s_link_manager_callback_disconnected(dap_link_t *a_link, uint64_t a_
// func work // func work
dap_chain_net_t *l_net = dap_chain_net_by_id((dap_chain_net_id_t){.uint64 = a_net_id}); dap_chain_net_t *l_net = dap_chain_net_by_id((dap_chain_net_id_t){.uint64 = a_net_id});
dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
bool l_link_is_permanent = s_net_check_link_is_premanent(l_net, a_link->addr); bool l_link_is_permanent = s_net_check_link_is_permanent(l_net, a_link->addr);
log_it(L_INFO, "%s."NODE_ADDR_FP_STR" can't connect for now. %s", l_net ? l_net->pub.name : "(unknown)" , log_it(L_INFO, "%s."NODE_ADDR_FP_STR" can't connect for now. %s", l_net ? l_net->pub.name : "(unknown)" ,
NODE_ADDR_FP_ARGS_S(a_link->addr), NODE_ADDR_FP_ARGS_S(a_link->addr),
l_link_is_permanent ? "Setting reconnection pause for it." : "Dropping it."); l_link_is_permanent ? "Setting reconnection pause for it." : "Dropping it.");
...@@ -1795,7 +1798,18 @@ void dap_chain_net_delete(dap_chain_net_t *a_net) ...@@ -1795,7 +1798,18 @@ void dap_chain_net_delete(dap_chain_net_t *a_net)
// Synchronously going to offline state // Synchronously going to offline state
PVT(a_net)->state = PVT(a_net)->state_target = NET_STATE_OFFLINE; PVT(a_net)->state = PVT(a_net)->state_target = NET_STATE_OFFLINE;
s_net_states_proc(a_net); s_net_states_proc(a_net);
dap_chain_net_item_t *l_net_item; dap_global_db_cluster_t *l_mempool = PVT(a_net)->mempool_clusters;
while (l_mempool) {
dap_global_db_cluster_t *l_next = l_mempool->next;
dap_global_db_cluster_delete(l_mempool);
l_mempool = l_next;
}
dap_global_db_cluster_delete(PVT(a_net)->orders_cluster);
dap_global_db_cluster_delete(PVT(a_net)->nodes_cluster);
dap_global_db_cluster_delete(PVT(a_net)->nodes_states);
dap_global_db_cluster_delete(PVT(a_net)->common_orders);
dap_chain_net_item_t *l_net_item = NULL;
HASH_FIND(hh, s_net_items, a_net->pub.name, strlen(a_net->pub.name), l_net_item); HASH_FIND(hh, s_net_items, a_net->pub.name, strlen(a_net->pub.name), l_net_item);
if (l_net_item) { if (l_net_item) {
HASH_DEL(s_net_items, l_net_item); HASH_DEL(s_net_items, l_net_item);
...@@ -2133,6 +2147,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) ...@@ -2133,6 +2147,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx)
for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) { for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) {
if (l_chain->callback_load_from_gdb) { if (l_chain->callback_load_from_gdb) {
l_ledger_flags &= ~DAP_LEDGER_MAPPED; l_ledger_flags &= ~DAP_LEDGER_MAPPED;
l_ledger_flags |= DAP_LEDGER_THRESHOLD_ENABLED;
continue; continue;
} }
if (!l_chain->callback_get_poa_certs) if (!l_chain->callback_get_poa_certs)
...@@ -2176,6 +2191,8 @@ bool s_net_load(void *a_arg) ...@@ -2176,6 +2191,8 @@ bool s_net_load(void *a_arg)
// load chains // load chains
dap_chain_t *l_chain = l_net->pub.chains; dap_chain_t *l_chain = l_net->pub.chains;
clock_t l_chain_load_start_time;
l_chain_load_start_time = clock();
while (l_chain) { while (l_chain) {
l_net->pub.fee_value = uint256_0; l_net->pub.fee_value = uint256_0;
l_net->pub.fee_addr = c_dap_chain_addr_blank; l_net->pub.fee_addr = c_dap_chain_addr_blank;
...@@ -2199,30 +2216,25 @@ bool s_net_load(void *a_arg) ...@@ -2199,30 +2216,25 @@ bool s_net_load(void *a_arg)
} else } else
log_it(L_WARNING, "No purge callback for chain %s, can't reload it with correct order", l_chain->name); log_it(L_WARNING, "No purge callback for chain %s, can't reload it with correct order", l_chain->name);
} }
if (l_chain->callback_atom_add_from_treshold) {
while (l_chain->callback_atom_add_from_treshold(l_chain, NULL))
log_it(L_DEBUG, "Added atom from treshold");
}
} else { } else {
//dap_chain_save_all( l_chain ); //dap_chain_save_all( l_chain );
log_it (L_NOTICE, "Initialized chain files"); log_it (L_NOTICE, "Initialized chain files");
} }
l_chain->atom_num_last = 0; l_chain->atom_num_last = 0;
time_t l_chain_load_time_taken = clock() - l_chain_load_start_time;
double time_taken = ((double)l_chain_load_time_taken)/CLOCKS_PER_SEC; // in seconds
log_it(L_NOTICE, "[%s] Chain [%s] processing took %f seconds", l_chain->net_name, l_chain->name, time_taken);
l_chain = l_chain->next; l_chain = l_chain->next;
} }
// Process thresholds if any l_net_pvt->load_mode = false;
bool l_processed; dap_leger_load_end(l_net->pub.ledger);
do {
l_processed = false;
DL_FOREACH(l_net->pub.chains, l_chain) {
if (l_chain->callback_atom_add_from_treshold) {
while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) {
log_it(L_DEBUG, "Added atom from treshold");
l_processed = true;
}
}
}
} while (l_processed);
// Do specific role actions post-chain created // Do specific role actions post-chain created
l_net_pvt->state_target = NET_STATE_OFFLINE; l_net_pvt->state_target = NET_STATE_OFFLINE;
switch ( l_net_pvt->node_role.enums ) { switch ( l_net_pvt->node_role.enums ) {
case NODE_ROLE_ROOT_MASTER:{ case NODE_ROLE_ROOT_MASTER:{
// Set to process everything in datum pool // Set to process everything in datum pool
...@@ -2263,8 +2275,6 @@ bool s_net_load(void *a_arg) ...@@ -2263,8 +2275,6 @@ bool s_net_load(void *a_arg)
log_it(L_INFO,"Light node role established"); log_it(L_INFO,"Light node role established");
} }
l_net_pvt->load_mode = false;
l_net_pvt->balancer_type = dap_config_get_item_bool_default(l_net->pub.config, "general", "use_dns_links", false); l_net_pvt->balancer_type = dap_config_get_item_bool_default(l_net->pub.config, "general", "use_dns_links", false);
...@@ -2277,7 +2287,7 @@ bool s_net_load(void *a_arg) ...@@ -2277,7 +2287,7 @@ bool s_net_load(void *a_arg)
dap_global_db_instance_get_default(), dap_global_db_instance_get_default(),
l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0), l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0),
l_gdb_groups_mask, DAP_CHAIN_NET_MEMPOOL_TTL, true, l_gdb_groups_mask, DAP_CHAIN_NET_MEMPOOL_TTL, true,
DAP_GDB_MEMBER_ROLE_USER, l_chain == l_net->pub.chains ? DAP_GDB_MEMBER_ROLE_GUEST : DAP_GDB_MEMBER_ROLE_USER,
DAP_CLUSTER_TYPE_EMBEDDED); DAP_CLUSTER_TYPE_EMBEDDED);
if (!l_cluster) { if (!l_cluster) {
log_it(L_ERROR, "Can't initialize mempool cluster for network %s", l_net->pub.name); log_it(L_ERROR, "Can't initialize mempool cluster for network %s", l_net->pub.name);
...@@ -2302,9 +2312,22 @@ bool s_net_load(void *a_arg) ...@@ -2302,9 +2312,22 @@ bool s_net_load(void *a_arg)
} }
dap_chain_net_add_auth_nodes_to_cluster(l_net, l_net_pvt->orders_cluster); dap_chain_net_add_auth_nodes_to_cluster(l_net, l_net_pvt->orders_cluster);
DAP_DELETE(l_gdb_groups_mask); DAP_DELETE(l_gdb_groups_mask);
// node states cluster // Common orders cluster
l_gdb_groups_mask = dap_strdup_printf("%s.orders", l_net->pub.gdb_groups_prefix);
l_net_pvt->common_orders = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0),
l_gdb_groups_mask, 72, true,
DAP_GDB_MEMBER_ROLE_USER,
DAP_CLUSTER_TYPE_EMBEDDED);
if (!l_net_pvt->common_orders) {
log_it(L_ERROR, "Can't initialize orders cluster for network %s", l_net->pub.name);
goto ret;
}
dap_chain_net_add_auth_nodes_to_cluster(l_net, l_net_pvt->common_orders);
DAP_DELETE(l_gdb_groups_mask);
// Node states cluster
l_gdb_groups_mask = dap_strdup_printf("%s.nodes.states", l_net->pub.gdb_groups_prefix); l_gdb_groups_mask = dap_strdup_printf("%s.nodes.states", l_net->pub.gdb_groups_prefix);
dap_global_db_cluster_add( l_net_pvt->nodes_states = dap_global_db_cluster_add(
dap_global_db_instance_get_default(), dap_global_db_instance_get_default(),
l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0), l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0),
l_gdb_groups_mask, 0, true, l_gdb_groups_mask, 0, true,
......
...@@ -131,7 +131,7 @@ static int s_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_d ...@@ -131,7 +131,7 @@ static int s_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_d
return -122; return -122;
} }
decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL;
HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree); HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree);
if (l_sought_decree && l_sought_decree->decree) { if (l_sought_decree && l_sought_decree->decree) {
log_it(L_WARNING, "Decree with hash %s is already present", dap_hash_fast_to_str_static(a_decree_hash)); log_it(L_WARNING, "Decree with hash %s is already present", dap_hash_fast_to_str_static(a_decree_hash));
...@@ -243,7 +243,7 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d ...@@ -243,7 +243,7 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d
return -108; return -108;
} }
decree_table_t **l_decrees = dap_chain_net_get_decrees(l_net), *l_new_decree; decree_table_t **l_decrees = dap_chain_net_get_decrees(l_net), *l_new_decree = NULL;
HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_new_decree); HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_new_decree);
if (!l_new_decree) { if (!l_new_decree) {
l_new_decree = DAP_NEW_Z(decree_table_t); l_new_decree = DAP_NEW_Z(decree_table_t);
...@@ -327,7 +327,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa ...@@ -327,7 +327,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa
{ {
if (!a_net || !a_decree_hash) if (!a_net || !a_decree_hash)
return -1; return -1;
decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL;
HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree); HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree);
if (!l_sought_decree) if (!l_sought_decree)
return -2; return -2;
...@@ -337,7 +337,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa ...@@ -337,7 +337,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa
dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_hash, bool *is_applied) dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_hash, bool *is_applied)
{ {
decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL;
HASH_FIND(hh, *l_decrees, a_hash, sizeof(dap_hash_fast_t), l_sought_decree); HASH_FIND(hh, *l_decrees, a_hash, sizeof(dap_hash_fast_t), l_sought_decree);
return ( !l_sought_decree || !l_sought_decree->decree ) return ( !l_sought_decree || !l_sought_decree->decree )
? NULL ? NULL
......
...@@ -268,12 +268,6 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d ...@@ -268,12 +268,6 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d
return false; return false;
} }
int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, a_datum, &l_datum_hash); int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, a_datum, &l_datum_hash);
if (l_verify_datum != 0 &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NOT_ENOUGH_SIGNS &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE)
return true;
if (!l_verify_datum if (!l_verify_datum
#ifdef DAP_TPS_TEST #ifdef DAP_TPS_TEST
|| l_verify_datum == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS || l_verify_datum == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS
...@@ -282,6 +276,12 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d ...@@ -282,6 +276,12 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d
{ {
a_chain->callback_add_datums(a_chain, &a_datum, 1); a_chain->callback_add_datums(a_chain, &a_datum, 1);
} }
if (l_verify_datum != 0 &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NOT_ENOUGH_SIGNS &&
l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE)
return true;
return false; return false;
} }
......
...@@ -396,6 +396,7 @@ static int s_node_info_list_with_reply(dap_chain_net_t *a_net, dap_chain_node_ad ...@@ -396,6 +396,7 @@ static int s_node_info_list_with_reply(dap_chain_net_t *a_net, dap_chain_node_ad
*/ */
int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
{ {
json_object **json_arr_reply = (json_object **)a_str_reply;
enum { enum {
CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ,
CMD_DELETE, CMD_DROP, CMD_GET_KEYS, CMD_GROUP_LIST CMD_DELETE, CMD_DROP, CMD_GET_KEYS, CMD_GROUP_LIST
...@@ -425,28 +426,21 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -425,28 +426,21 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
switch (cmd_name) { switch (cmd_name) {
case CMD_NAME_CELL: case CMD_NAME_CELL:
{ {
if(!arg_index || a_argc < 3) { if(!arg_index || a_argc < 3) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "parameters are not valid"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "parameters are not valid");
return -1; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
dap_chain_t * l_chain = NULL; dap_chain_t * l_chain = NULL;
dap_chain_net_t * l_net = NULL; dap_chain_net_t * l_net = NULL;
if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net, if (dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net, CHAIN_TYPE_INVALID) < 0)
CHAIN_TYPE_INVALID) < 0) return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
return -11;
const char *l_cell_str = NULL, *l_chain_str = NULL; const char *l_cell_str = NULL, *l_chain_str = NULL;
// find cell and chain // find cell and chain
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-cell", &l_cell_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-cell", &l_cell_str);
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str);
// Check for chain
if(!l_chain_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'chain' to be valid", a_argv[0]);
return -12;
}
int arg_index_n = ++arg_index; int arg_index_n = ++arg_index;
// find command (add, delete, etc) as second parameter only // find command (add, delete, etc) as second parameter only
int cmd_num = CMD_NONE; int cmd_num = CMD_NONE;
...@@ -466,51 +460,62 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -466,51 +460,62 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
// add new node to global_db // add new node to global_db
case CMD_ADD: case CMD_ADD:
if(!arg_index || a_argc < 7) { if(!arg_index || a_argc < 7) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameters"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR, "invalid parameters");
return -1; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_cell_id); dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_cell_id);
int l_ret = (int)dap_chain_cell_file_update(l_cell); int l_ret = (int)dap_chain_cell_file_update(l_cell);
if(l_ret > 0) if ( l_ret > 0 )
dap_cli_server_cmd_set_reply_text(a_str_reply, "cell added successfully"); {
json_object* json_obj_name = json_object_new_object();
json_object_object_add(json_obj_name, "comand status", json_object_new_string("cell added successfully"));
json_object_array_add(*json_arr_reply, json_obj_name);
}
else else
dap_cli_server_cmd_set_reply_text(a_str_reply, "can't create file for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_CREATE_CELL_ERR, "can't create file for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )",
l_cell->id.uint64,l_cell->file_storage_path); l_cell->id.uint64,l_cell->file_storage_path);
dap_chain_cell_close(l_cell); dap_chain_cell_close(l_cell);
return l_ret; return l_ret;
//case CMD_NONE: //case CMD_NONE:
default: default:
dap_cli_server_cmd_set_reply_text(a_str_reply, "command %s not recognized", a_argv[1]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_COMMAND_ERR, "command %s not recognized", a_argv[1]);
return -1; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_COMMAND_ERR;
} }
} }
} }
case CMD_FLUSH: case CMD_FLUSH:
{ {
json_object* json_obj_flush = NULL;
int res_flush = dap_global_db_flush_sync(); int res_flush = dap_global_db_flush_sync();
switch (res_flush) { switch (res_flush) {
case 0: case 0:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Commit data base and filesystem caches to disk completed.\n\n"); json_obj_flush = json_object_new_object();
json_object_object_add(json_obj_flush, "command status", json_object_new_string("Commit data base and filesystem caches to disk completed.\n\n"));
json_object_array_add(*json_arr_reply, json_obj_flush);
break; break;
case -1: case -1:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Couldn't open db directory. Can't init cdb\n" dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_OPEN_DIR,
"Reboot the node.\n\n"); "Couldn't open db directory. Can't init cdb\n"
"Reboot the node.\n\n");
break; break;
case -2: case -2:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't init cdb\n" dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_DB,
"Reboot the node.\n\n"); "Couldn't open db directory. Can't init cdb\n"
"Reboot the node.\n\n");
break; break;
case -3: case -3:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't init sqlite\n" dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_INIT_SQL,
"Reboot the node.\n\n"); "Can't init sqlite\n"
"Reboot the node.\n\n");
break; break;
default: default:
dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't commit data base caches to disk completed.\n" dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_CAN_NOT_COMMIT_TO_DISK,
"Reboot the node.\n\n"); "Can't commit data base caches to disk completed.\n"
"Reboot the node.\n\n");
break; break;
} }
return 0; return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} }
case CMD_RECORD: case CMD_RECORD:
{ {
...@@ -518,8 +523,8 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -518,8 +523,8 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
SUMCMD_GET, SUMCMD_PIN, SUMCMD_UNPIN SUMCMD_GET, SUMCMD_PIN, SUMCMD_UNPIN
}; };
if(!arg_index || a_argc < 3) { if(!arg_index || a_argc < 3) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "parameters are not valid"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid");
return -1; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
int arg_index_n = ++arg_index; int arg_index_n = ++arg_index;
int l_subcmd; int l_subcmd;
...@@ -536,8 +541,9 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -536,8 +541,9 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
l_subcmd = SUMCMD_UNPIN; l_subcmd = SUMCMD_UNPIN;
} }
else{ else{
dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand '%s' not recognized, available subcommands are 'get', 'pin' or 'unpin'", a_argv[2]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -1; "Subcommand '%s' not recognized, available subcommands are 'get', 'pin' or 'unpin'", a_argv[2]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
// read record from database // read record from database
const char *l_key = NULL; const char *l_key = NULL;
...@@ -548,12 +554,13 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -548,12 +554,13 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
size_t l_value_len = 0; size_t l_value_len = 0;
bool l_is_pinned = false; bool l_is_pinned = false;
dap_nanotime_t l_ts =0; dap_nanotime_t l_ts =0;
uint8_t *l_value =dap_global_db_get_sync(l_group, l_key, &l_value_len, &l_is_pinned, &l_ts); uint8_t *l_value = dap_global_db_get_sync(l_group, l_key, &l_value_len, &l_is_pinned, &l_ts);
if(!l_value || !l_value_len) { if(!l_value || !l_value_len) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Record not found\n\n"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND,
return -1; "Record not found\n\n");
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND;
} }
json_object* json_obj_rec = json_object_new_object();
int l_ret = 0; int l_ret = 0;
// prepare record information // prepare record information
switch (l_subcmd) { switch (l_subcmd) {
...@@ -565,48 +572,54 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -565,48 +572,54 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
if(!l_value_str) { if(!l_value_str) {
log_it(L_CRITICAL, "%s", c_error_memory_alloc); log_it(L_CRITICAL, "%s", c_error_memory_alloc);
DAP_DELETE(l_value); DAP_DELETE(l_value);
return -1; json_object_put(json_obj_rec);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_MEMORY_ERR;
} }
json_object_object_add(json_obj_rec, "command status", json_object_new_string("Commit data base and filesystem caches to disk completed."));
size_t ret = dap_bin2hex(l_value_str, l_value, l_value_len); size_t ret = dap_bin2hex(l_value_str, l_value, l_value_len);
dap_cli_server_cmd_set_reply_text(a_str_reply, "Record found\n" json_object_object_add(json_obj_rec, "command status", json_object_new_string("Record found"));
"lenght:\t%zu byte\n" json_object_object_add(json_obj_rec, "lenght(byte)", json_object_new_uint64(l_value_len));
"hash:\t%s\n" json_object_object_add(json_obj_rec, "hash", json_object_new_string(l_hash_str));
"pinned:\t%s\n" json_object_object_add(json_obj_rec, "pinned", l_is_pinned ? json_object_new_string("Yes") : json_object_new_string("No") );
"value:\t0x%s\n\n", l_value_len, l_hash_str, l_is_pinned ? "Yes" : "No", l_value_str); json_object_object_add(json_obj_rec, "value", json_object_new_string(l_value_str));
DAP_DELETE(l_value_str); DAP_DELETE(l_value_str);
break; break;
} }
case SUMCMD_PIN: // Pin record case SUMCMD_PIN: // Pin record
{ {
if(l_is_pinned){ if(l_is_pinned){
dap_cli_server_cmd_set_reply_text(a_str_reply, "record already pinned"); json_object_object_add(json_obj_rec, "pinned status", json_object_new_string("record already pinned"));
break; break;
} }
if(dap_global_db_set_sync( l_group, l_key, l_value, l_value_len, true) ==0 ){ if(dap_global_db_set_sync( l_group, l_key, l_value, l_value_len, true) ==0 ){
dap_cli_server_cmd_set_reply_text(a_str_reply, "record successfully pinned"); json_object_object_add(json_obj_rec, "pinned status", json_object_new_string("record successfully pinned"));
} }
else{ else{
dap_cli_server_cmd_set_reply_text(a_str_reply, "can't pin the record"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_PINED,
l_ret = -2; "can't pin the record");
l_ret = -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_PINED;
} }
break; break;
} }
case SUMCMD_UNPIN: // Unpin record case SUMCMD_UNPIN: // Unpin record
{ {
if(!l_is_pinned) { if(!l_is_pinned) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "record already unpinned"); json_object_object_add(json_obj_rec, "unpinned status", json_object_new_string("record already unpinned"));
break; break;
} }
if(dap_global_db_set_sync(l_group,l_key, l_value, l_value_len, false) == 0 ) { if(dap_global_db_set_sync(l_group,l_key, l_value, l_value_len, false) == 0 ) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "record successfully unpinned"); json_object_object_add(json_obj_rec, "unpinned status", json_object_new_string("record successfully unpinned"));
} }
else { else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "can't unpin the record"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_UNPINED,
l_ret = -2; "can't unpin the record");
l_ret = -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_UNPINED;
} }
break; break;
} }
} }
json_object_array_add(*json_arr_reply, json_obj_rec);
DAP_DELETE(l_value); DAP_DELETE(l_value);
return l_ret; return l_ret;
} }
...@@ -614,52 +627,59 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -614,52 +627,59 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
{ {
const char *l_group_str = NULL; const char *l_group_str = NULL;
const char *l_key_str = NULL; const char *l_key_str = NULL;
const char *l_value_str = NULL; const char *l_value_str = NULL;
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str);
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str);
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str);
if(!l_group_str) { if (!l_group_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -120; "%s requires parameter 'group' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if(!l_key_str) { if (!l_key_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -121; "%s requires parameter 'key' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if(!l_value_str) { if (!l_value_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'value' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -122; "%s requires parameter 'value' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if (!dap_global_db_set_sync(l_group_str, l_key_str, l_value_str, strlen(l_value_str) +1 , false)) { if (!dap_global_db_set_sync(l_group_str, l_key_str, l_value_str, strlen(l_value_str) +1 , false)) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Data has been successfully written to the database"); json_object* json_obj_write = json_object_new_object();
return 0; json_object_object_add(json_obj_write, "write status", json_object_new_string("Data has been successfully written to the database"));
json_object_array_add(*json_arr_reply, json_obj_write);
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Data writing is failed"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_WRITING_FILED,
return -124; "Data writing is failed");
} }
} }
case CMD_READ: case CMD_READ:
{ {
const char *l_group_str = NULL; const char *l_group_str = NULL;
const char *l_key_str = NULL; const char *l_key_str = NULL;
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str);
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str);
if(!l_group_str) { if(!l_group_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -120; "%s requires parameter 'group' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if(!l_key_str) { if(!l_key_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -122; "%s requires parameter 'key' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
size_t l_out_len = 0; size_t l_out_len = 0;
...@@ -675,22 +695,26 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -675,22 +695,26 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
dap_nanotime_to_str_rfc822(l_ts_str, sizeof(l_ts_str), l_ts); dap_nanotime_to_str_rfc822(l_ts_str, sizeof(l_ts_str), l_ts);
char *l_value_hexdump = dap_dump_hex(l_value_out, l_out_len); char *l_value_hexdump = dap_dump_hex(l_value_out, l_out_len);
if (l_value_hexdump) { if (l_value_hexdump) {
json_object* json_obj_read = json_object_new_object();
dap_cli_server_cmd_set_reply_text(a_str_reply, "\n\"%s : %s\"\nTime: %s\nValue len: %zu\nValue hex:\n\n%s", json_object_object_add(json_obj_read, "group", json_object_new_string(l_group_str));
l_group_str, l_key_str, l_ts_str, l_out_len, l_value_hexdump); json_object_object_add(json_obj_read, "key", json_object_new_string(l_key_str));
json_object_object_add(json_obj_read, "time", json_object_new_string(l_ts_str));
json_object_object_add(json_obj_read, "value len", json_object_new_uint64(l_out_len));
json_object_object_add(json_obj_read, "value hex", json_object_new_string(l_value_hexdump));
json_object_array_add(*json_arr_reply, json_obj_read);
DAP_DELETE(l_value_hexdump); DAP_DELETE(l_value_hexdump);
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "\n\"%s : %s\"\nTime: %s\nNo value\n", dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_TIME_NO_VALUE,
"\n\"%s : %s\"\nTime: %s\nNo value\n",
l_group_str, l_key_str, l_ts_str); l_group_str, l_key_str, l_ts_str);
} }
DAP_DELETE(l_value_out); DAP_DELETE(l_value_out);
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "\nRecord \"%s : %s\" not found\n", dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_RECORD_NOT_FOUND,
"\nRecord \"%s : %s\" not found\n",
l_group_str, l_key_str); l_group_str, l_key_str);
} }
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
return 0;
} }
case CMD_DELETE: case CMD_DELETE:
{ {
...@@ -701,19 +725,23 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -701,19 +725,23 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str);
if(!l_group_str) { if(!l_group_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,
return -120; "%s requires parameter 'group' to be valid", a_argv[0]);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if(!l_key_str) { if(!l_key_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "No key provided, entire table %s will be altered", l_group_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_KEY_PROVIDED,
"No key provided, entire table %s will be altered", l_group_str);
size_t l_objs_count = 0; size_t l_objs_count = 0;
dap_global_db_obj_t* l_obj = dap_global_db_get_all_sync(l_group_str, &l_objs_count); dap_global_db_obj_t* l_obj = dap_global_db_get_all_sync(l_group_str, &l_objs_count);
if (!l_obj || !l_objs_count) if (!l_obj || !l_objs_count)
{ {
dap_cli_server_cmd_set_reply_text(a_str_reply, "No data in group %s.", l_group_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP,
return -124; "No data in group %s.", l_group_str);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP;
} }
size_t i, j = 0; size_t i, j = 0;
for (i = 0; i < l_objs_count; ++i) { for (i = 0; i < l_objs_count; ++i) {
...@@ -724,16 +752,25 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -724,16 +752,25 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
} }
} }
dap_global_db_objs_delete(l_obj, l_objs_count); dap_global_db_objs_delete(l_obj, l_objs_count);
dap_cli_server_cmd_set_reply_text(a_str_reply, "Removed %lu of %lu records in table %s", j, i, l_group_str); json_object* json_obj_del = json_object_new_object();
return 0; json_object_object_add(json_obj_del, "Removed records", json_object_new_uint64(j));
json_object_object_add(json_obj_del, "of records", json_object_new_uint64(i));
json_object_object_add(json_obj_del, "in table", json_object_new_string(l_group_str));
json_object_array_add(*json_arr_reply, json_obj_del);
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} }
if (!dap_global_db_del(l_group_str, l_key_str, NULL, NULL)) { if (!dap_global_db_del(l_group_str, l_key_str, NULL, NULL)) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s was deleted successfuly", l_key_str, l_group_str); json_object* json_obj_del = json_object_new_object();
return 0; json_object_object_add(json_obj_del, "Record key", json_object_new_string(l_key_str));
json_object_object_add(json_obj_del, "Group name", json_object_new_string(l_group_str));
json_object_object_add(json_obj_del, "status", json_object_new_string("deleted"));
json_object_array_add(*json_arr_reply, json_obj_del);
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DELETE_FAILD,
return -122; "Record with key %s in group %s deleting failed", l_group_str, l_key_str);
return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DELETE_FAILD;
} }
} }
case CMD_DROP: case CMD_DROP:
...@@ -742,17 +779,19 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -742,17 +779,19 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str);
if(!l_group_str) { if(!l_group_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]);
return -120; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
if (!dap_global_db_del_sync(l_group_str, NULL)) if (!dap_global_db_del_sync(l_group_str, NULL))
{ {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Dropped table %s", l_group_str); json_object* json_obj_drop = json_object_new_object();
return 0; json_object_object_add(json_obj_drop, "Dropped table", json_object_new_string(l_group_str));
json_object_array_add(*json_arr_reply, json_obj_drop);
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} else { } else {
dap_cli_server_cmd_set_reply_text(a_str_reply, "Failed to drop table %s", l_group_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DROP_FAILED,"Failed to drop table %s", l_group_str);
return -122; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_DROP_FAILED;
} }
} }
case CMD_GET_KEYS: case CMD_GET_KEYS:
...@@ -761,8 +800,8 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -761,8 +800,8 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str);
if(!l_group_str) { if(!l_group_str) {
dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"%s requires parameter 'group' to be valid", a_argv[0]);
return -120; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
size_t l_objs_count = 0; size_t l_objs_count = 0;
...@@ -770,37 +809,49 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -770,37 +809,49 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply)
if (!l_obj || !l_objs_count) if (!l_obj || !l_objs_count)
{ {
dap_cli_server_cmd_set_reply_text(a_str_reply, "No data in group %s.", l_group_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP,"No data in group %s.", l_group_str);
return -124; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP;
} }
dap_string_t *l_ret_str = dap_string_new(NULL); json_object* json_arr_keys = json_object_new_array();
json_object* json_obj_keys = NULL;
for(size_t i = 0; i < l_objs_count; i++) { for(size_t i = 0; i < l_objs_count; i++) {
char l_ts[64] = { '\0' }; char l_ts[64] = { '\0' };
dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_obj[i].timestamp); dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_obj[i].timestamp);
dap_string_append_printf(l_ret_str, "\t%s, %s\n", l_obj[i].key, l_ts); json_obj_keys = json_object_new_object();
json_object_object_add(json_obj_keys, "key", json_object_new_string(l_obj[i].key));
json_object_object_add(json_obj_keys, "time", json_object_new_string(l_ts));
json_object_array_add(json_arr_keys, json_obj_keys);
} }
dap_global_db_objs_delete(l_obj, l_objs_count); dap_global_db_objs_delete(l_obj, l_objs_count);
dap_cli_server_cmd_set_reply_text(a_str_reply, "Keys list for group \"%s:\n\n%s\n", l_group_str, l_ret_str->str);
dap_string_free(l_ret_str, true); json_object* json_keys_list = json_object_new_object();
return 0; json_object_object_add(json_keys_list, "group name", json_object_new_string(l_group_str));
json_object_object_add(json_keys_list, "keys list", json_arr_keys);
json_object_array_add(*json_arr_reply, json_keys_list);
return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} }
case CMD_GROUP_LIST: { case CMD_GROUP_LIST: {
dap_string_t *l_ret_str = dap_string_new(NULL); json_object* json_group_list = json_object_new_object();
dap_list_t *l_group_list = dap_global_db_driver_get_groups_by_mask("*"); dap_list_t *l_group_list = dap_global_db_driver_get_groups_by_mask("*");
size_t l_count = 0; size_t l_count = 0;
json_object* json_arr_group = json_object_new_array();
json_object* json_obj_list = NULL;
for (dap_list_t *l_list = l_group_list; l_list; l_list = dap_list_next(l_list), ++l_count) { for (dap_list_t *l_list = l_group_list; l_list; l_list = dap_list_next(l_list), ++l_count) {
dap_string_append_printf(l_ret_str, "\t%-40s : %zu records\n", (char*)l_list->data, json_obj_list = json_object_new_object();
dap_global_db_driver_count((char*)l_list->data, c_dap_global_db_driver_hash_blank, false)); json_object_object_add(json_obj_list, (char*)l_list->data,
} json_object_new_uint64(dap_global_db_driver_count((char*)l_list->data, c_dap_global_db_driver_hash_blank, false)));
dap_cli_server_cmd_set_reply_text(a_str_reply, "Group list:\n%sTotal count: %zu\n", l_ret_str->str, l_count); json_object_array_add(json_arr_group, json_obj_list);
dap_string_free(l_ret_str, true); }
json_object_object_add(json_group_list, "group list", json_arr_group);
json_object_object_add(json_group_list, "total count", json_object_new_uint64(l_count));
json_object_array_add(*json_arr_reply, json_group_list);
dap_list_free(l_group_list); dap_list_free(l_group_list);
return 0; return DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK;
} }
default: default:
dap_cli_server_cmd_set_reply_text(a_str_reply, "parameters are not valid"); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR,"parameters are not valid");
return -1; return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_PARAM_ERR;
} }
} }
...@@ -1800,7 +1851,6 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; ...@@ -1800,7 +1851,6 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
} }
dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL;
//dap_string_t *l_string_ret = dap_string_new(NULL);
dap_chain_wallet_t *l_wallet = NULL; dap_chain_wallet_t *l_wallet = NULL;
dap_chain_addr_t *l_addr = NULL; dap_chain_addr_t *l_addr = NULL;
...@@ -1928,6 +1978,27 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; ...@@ -1928,6 +1978,27 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
size_t l_l_addr_tokens_size = 0; size_t l_l_addr_tokens_size = 0;
char **l_l_addr_tokens = NULL; char **l_l_addr_tokens = NULL;
dap_ledger_addr_get_token_ticker_all(l_ledger, l_addr, &l_l_addr_tokens, &l_l_addr_tokens_size); dap_ledger_addr_get_token_ticker_all(l_ledger, l_addr, &l_l_addr_tokens, &l_l_addr_tokens_size);
if (l_wallet) {
//Get sign for wallet
json_object *l_jobj_sings = NULL;
dap_chain_wallet_internal_t *l_w_internal = DAP_CHAIN_WALLET_INTERNAL(l_wallet);
if (l_w_internal->certs_count == 1) {
l_jobj_sings = json_object_new_string(dap_enc_get_type_name(l_w_internal->certs[0]->enc_key->type));
} else {
dap_string_t *l_str_signs = dap_string_new("");
for (size_t i = 0; i < l_w_internal->certs_count; i++) {
dap_string_append_printf(l_str_signs, "%s%s",
dap_enc_get_type_name(l_w_internal->certs[i]->enc_key->type),
((i + 1) == l_w_internal->certs_count) ? "" : ", ");
}
l_jobj_sings = json_object_new_string(l_str_signs->str);
dap_string_free(l_str_signs, true);
}
json_object_object_add(json_obj_wall, "signs", l_jobj_sings);
} else {
json_object_object_add(json_obj_wall, "signs",
json_object_new_string(dap_sign_type_to_str(l_addr->sig_type)));
}
if(l_l_addr_tokens_size <= 0) if(l_l_addr_tokens_size <= 0)
json_object_object_add(json_obj_wall, "balance", json_object_new_string("0")); json_object_object_add(json_obj_wall, "balance", json_object_new_string("0"));
json_object * j_arr_balance= json_object_new_array(); json_object * j_arr_balance= json_object_new_array();
...@@ -2110,7 +2181,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; ...@@ -2110,7 +2181,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
"sig_multi_chained. You must specify at least two more " "sig_multi_chained. You must specify at least two more "
"signatures other than sig_multi_chained.\n" "signatures other than sig_multi_chained.\n"
"After sig_multi_chained, you must specify two more signatures " "After sig_multi_chained, you must specify two more signatures "
"from the list: %s", dap_cert_get_str_recommended_sign()); "from the list:\n%s", dap_cert_get_str_recommended_sign());
json_object_put(json_arr_out); json_object_put(json_arr_out);
return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR;
} }
...@@ -2817,7 +2888,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -2817,7 +2888,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
dap_list_free(l_list_sig_item); dap_list_free(l_list_sig_item);
dap_list_t *l_list_in_reward = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_REWARD, NULL); dap_list_t *l_list_in_reward = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_REWARD, NULL);
if (l_list_in_reward) { if (l_list_in_reward) {
json_object *l_obj_in_reward_arary = json_object_new_array(); /*json_object *l_obj_in_reward_arary = json_object_new_array();
if (!l_obj_in_reward_arary) { if (!l_obj_in_reward_arary) {
dap_list_free(l_list_in_reward); dap_list_free(l_list_in_reward);
json_object_put(l_jobj_datum); json_object_put(l_jobj_datum);
...@@ -2844,7 +2915,8 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -2844,7 +2915,8 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
} }
json_object_array_add(l_obj_in_reward_arary, l_jobj_block_hash); json_object_array_add(l_obj_in_reward_arary, l_jobj_block_hash);
DAP_DELETE(l_block_hash); DAP_DELETE(l_block_hash);
} }*/
dap_list_free(l_list_in_reward);
} else { } else {
json_object *l_jobj_addr_from = json_object_new_string(dap_chain_addr_to_str(&l_addr_from)); json_object *l_jobj_addr_from = json_object_new_string(dap_chain_addr_to_str(&l_addr_from));
if (!l_jobj_addr_from) { if (!l_jobj_addr_from) {
...@@ -2987,20 +3059,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -2987,20 +3059,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
} }
if (l_dist_addr) { if (l_dist_addr) {
json_object *l_jobj_addr = json_object_new_string(dap_chain_addr_to_str(l_dist_addr));
if (!l_jobj_addr) {
json_object_put(l_jobj_to_list);
json_object_put(l_jobj_change_list);
json_object_put(l_jobj_to_from_emi);
json_object_put(l_jobj_fee_list);
json_object_put(l_jobj_money);
json_object_put(l_jobj_datum);
json_object_put(l_jobj_datums);
json_object_put(l_obj_chain);
dap_global_db_objs_delete(l_objs, l_objs_count);
dap_json_rpc_allocation_error;
return;
}
if (!datum_is_accepted_addr && l_wallet_addr) { if (!datum_is_accepted_addr && l_wallet_addr) {
datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr); datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr);
} }
...@@ -3010,7 +3068,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -3010,7 +3068,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
json_object_put(l_jobj_change_list); json_object_put(l_jobj_change_list);
json_object_put(l_jobj_to_from_emi); json_object_put(l_jobj_to_from_emi);
json_object_put(l_jobj_fee_list); json_object_put(l_jobj_fee_list);
json_object_put(l_jobj_addr);
json_object_put(l_jobj_money); json_object_put(l_jobj_money);
json_object_put(l_jobj_datum); json_object_put(l_jobj_datum);
json_object_put(l_jobj_datums); json_object_put(l_jobj_datums);
...@@ -3036,7 +3093,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -3036,7 +3093,6 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
json_object_put(l_jobj_change_list); json_object_put(l_jobj_change_list);
json_object_put(l_jobj_to_from_emi); json_object_put(l_jobj_to_from_emi);
json_object_put(l_jobj_fee_list); json_object_put(l_jobj_fee_list);
json_object_put(l_jobj_addr);
json_object_put(l_jobj_money); json_object_put(l_jobj_money);
json_object_put(l_jobj_datum); json_object_put(l_jobj_datum);
json_object_put(l_jobj_datums); json_object_put(l_jobj_datums);
...@@ -3055,7 +3111,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a ...@@ -3055,7 +3111,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
else else
json_object_array_add(l_jobj_change_list, l_jobj_f); json_object_array_add(l_jobj_change_list, l_jobj_f);
} else { } else {
json_object_object_add(l_jobj_f, "addr", l_jobj_addr); json_object_object_add(l_jobj_f, "addr", json_object_new_string(dap_chain_addr_to_str(l_dist_addr)));
json_object_array_add(l_jobj_to_list, l_jobj_f); json_object_array_add(l_jobj_to_list, l_jobj_f);
} }
} else { } else {
...@@ -4119,7 +4175,7 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st ...@@ -4119,7 +4175,7 @@ static int s_parse_common_token_decl_arg(int a_argc, char ** a_argv, void **a_st
return 0; return 0;
} }
static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void **a_str_reply, dap_sdk_cli_params* a_params) static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void **a_str_reply, dap_sdk_cli_params* a_params, bool a_update_token)
{ {
dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-flags", &a_params->ext.flags); dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-flags", &a_params->ext.flags);
dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-total_signs_valid", &a_params->ext.total_signs_valid); dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-total_signs_valid", &a_params->ext.total_signs_valid);
...@@ -4141,19 +4197,58 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** ...@@ -4141,19 +4197,58 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void **
char ** l_str_flags = NULL; char ** l_str_flags = NULL;
a_params->ext.parsed_tsd_size = 0; a_params->ext.parsed_tsd_size = 0;
if (a_params->ext.flags){ // Flags if (!a_update_token) {
l_str_flags = dap_strsplit(a_params->ext.flags,",",0xffff ); if (a_params->ext.flags){ // Flags
while (l_str_flags && *l_str_flags){ l_str_flags = dap_strsplit(a_params->ext.flags,",",0xffff );
uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags); while (l_str_flags && *l_str_flags){
if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){ uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags);
dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){
return -20; dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags);
} return -20;
l_flags |= l_flag; // if we have multiple flags }
l_str_flags++; l_flags |= l_flag; // if we have multiple flags
l_str_flags++;
}
}
a_params->ext.parsed_flags = l_flags;
} else {
const char *l_set_flags = NULL;
const char *l_unset_flags = NULL;
dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-flag_set", &l_set_flags);
dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-flag_unset", &l_unset_flags);
if (l_set_flags) {
l_str_flags = dap_strsplit(l_set_flags,",",0xffff );
while (l_str_flags && *l_str_flags){
uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags);
if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){
dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags);
return -20;
}
l_flags |= l_flag; // if we have multiple flags
l_str_flags++;
}
dap_tsd_t *l_flag_set_tsd = dap_tsd_create_scalar(DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS, l_flags);
l_flags = 0;
l_tsd_list = dap_list_append(l_tsd_list, l_flag_set_tsd);
l_tsd_total_size += dap_tsd_size(l_flag_set_tsd);
}
if (l_unset_flags) {
l_str_flags = dap_strsplit(l_unset_flags,",",0xffff );
while (l_str_flags && *l_str_flags){
uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags);
if (l_flag == DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED ){
dap_cli_server_cmd_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags);
return -20;
}
l_flags |= l_flag; // if we have multiple flags
l_str_flags++;
}
dap_tsd_t *l_flag_unset_tsd = dap_tsd_create_scalar(DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS, l_flags);
l_flags = 0;
l_tsd_list = dap_list_append(l_tsd_list, l_flag_unset_tsd);
l_tsd_total_size += dap_tsd_size(l_flag_unset_tsd);
} }
} }
a_params->ext.parsed_flags = l_flags;
const char* l_new_certs_str = NULL; const char* l_new_certs_str = NULL;
const char* l_remove_signs = NULL; const char* l_remove_signs = NULL;
...@@ -4233,7 +4328,7 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, void **a_str_rep ...@@ -4233,7 +4328,7 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, void **a_str_rep
if (l_parse_params) if (l_parse_params)
return l_parse_params; return l_parse_params;
l_parse_params = s_parse_additional_token_decl_arg(a_argc,a_argv,a_str_reply,a_params); l_parse_params = s_parse_additional_token_decl_arg(a_argc,a_argv,a_str_reply,a_params, a_update_token);
if (l_parse_params) if (l_parse_params)
return l_parse_params; return l_parse_params;
...@@ -4730,7 +4825,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -4730,7 +4825,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply)
if (l_params->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE) { if (l_params->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE) {
log_it(L_DEBUG,"Prepared TSD sections for CF20 token on %zd total size", l_params->ext.tsd_total_size); log_it(L_DEBUG,"Prepared TSD sections for CF20 token on %zd total size", l_params->ext.tsd_total_size);
snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
l_datum_token->header_native_update.flags = l_params->ext.parsed_flags; // l_datum_token->header_native_update.flags = l_params->ext.parsed_flags;
l_datum_token->total_supply = l_total_supply; l_datum_token->total_supply = l_total_supply;
l_datum_token->signs_valid = l_signs_emission; l_datum_token->signs_valid = l_signs_emission;
l_datum_token->header_native_update.tsd_total_size = l_params->ext.tsd_total_size; l_datum_token->header_native_update.tsd_total_size = l_params->ext.tsd_total_size;
...@@ -4739,7 +4834,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) ...@@ -4739,7 +4834,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply)
} else { // if (l_params->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE) { } else { // if (l_params->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE) {
log_it(L_DEBUG,"Prepared TSD sections for private token on %zd total size", l_params->ext.tsd_total_size); log_it(L_DEBUG,"Prepared TSD sections for private token on %zd total size", l_params->ext.tsd_total_size);
snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
l_datum_token->header_private_update.flags = l_params->ext.parsed_flags; // l_datum_token->header_private_update.flags = l_params->ext.parsed_flags;
l_datum_token->total_supply = l_total_supply; l_datum_token->total_supply = l_total_supply;
l_datum_token->signs_valid = l_signs_emission; l_datum_token->signs_valid = l_signs_emission;
l_datum_token->header_private_update.tsd_total_size = l_params->ext.tsd_total_size; l_datum_token->header_private_update.tsd_total_size = l_params->ext.tsd_total_size;
......
...@@ -943,7 +943,7 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) ...@@ -943,7 +943,7 @@ int com_ledger(int a_argc, char ** a_argv, void **reply)
if(l_cmd == CMD_LIST){ if(l_cmd == CMD_LIST){
enum {SUBCMD_NONE, SUBCMD_LIST_COIN, SUB_CMD_LIST_LEDGER_THRESHOLD, SUB_CMD_LIST_LEDGER_BALANCE, SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH}; enum {SUBCMD_NONE, SUBCMD_LIST_COIN, SUB_CMD_LIST_LEDGER_THRESHOLD, SUB_CMD_LIST_LEDGER_BALANCE, SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH};
int l_sub_cmd = SUBCMD_NONE; int l_sub_cmd = SUBCMD_NONE;
dap_chain_hash_fast_t l_tx_threshold_hash; dap_chain_hash_fast_t l_tx_threshold_hash = {};
const char *l_limit_str = NULL; const char *l_limit_str = NULL;
const char *l_offset_str = NULL; const char *l_offset_str = NULL;
if (dap_cli_server_cmd_find_option_val(a_argv, 2, 3, "coins", NULL )) if (dap_cli_server_cmd_find_option_val(a_argv, 2, 3, "coins", NULL ))
...@@ -981,21 +981,21 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) ...@@ -981,21 +981,21 @@ int com_ledger(int a_argc, char ** a_argv, void **reply)
dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR, "Can't get ledger for net %s", l_net_str); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR, "Can't get ledger for net %s", l_net_str);
return DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR; return DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR;
} }
if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD){ if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD) {
json_object* json_obj_out = dap_ledger_threshold_info(l_ledger, l_limit, l_offset); json_object* json_obj_out = dap_ledger_threshold_info(l_ledger, l_limit, l_offset, NULL);
if (json_obj_out){ if (json_obj_out){
json_object_array_add(*json_arr_reply, json_obj_out); json_object_array_add(*json_arr_reply, json_obj_out);
} }
return 0; return 0;
} }
if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH){ if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH) {
json_object *json_obj_out = dap_ledger_threshold_hash_info(l_ledger, &l_tx_threshold_hash, l_limit, l_offset); json_object *json_obj_out = dap_ledger_threshold_info(l_ledger, 0, 0, &l_tx_threshold_hash);
if (json_obj_out){ if (json_obj_out){
json_object_array_add(*json_arr_reply, json_obj_out); json_object_array_add(*json_arr_reply, json_obj_out);
} }
return 0; return 0;
} }
if (l_sub_cmd == SUB_CMD_LIST_LEDGER_BALANCE){ if (l_sub_cmd == SUB_CMD_LIST_LEDGER_BALANCE) {
json_object *json_obj_out = dap_ledger_balance_info(l_ledger, l_limit, l_offset); json_object *json_obj_out = dap_ledger_balance_info(l_ledger, l_limit, l_offset);
if (json_obj_out){ if (json_obj_out){
json_object_array_add(*json_arr_reply, json_obj_out); json_object_array_add(*json_arr_reply, json_obj_out);
......
...@@ -49,7 +49,7 @@ static char s_root_alias[] = "dnsroot"; ...@@ -49,7 +49,7 @@ static char s_root_alias[] = "dnsroot";
* @return 0 if success, else return error code * @return 0 if success, else return error code
*/ */
int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) { int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) {
dap_dns_zone_hash_t *new_zone; dap_dns_zone_hash_t *new_zone = NULL;
HASH_FIND_STR(s_dns_server->hash_table, zone, new_zone); HASH_FIND_STR(s_dns_server->hash_table, zone, new_zone);
if (new_zone == NULL) { // zone is not present if (new_zone == NULL) { // zone is not present
DAP_NEW_Z_RET_VAL(new_zone, dap_dns_zone_hash_t, DNS_ERROR_FAILURE, NULL); DAP_NEW_Z_RET_VAL(new_zone, dap_dns_zone_hash_t, DNS_ERROR_FAILURE, NULL);
...@@ -66,7 +66,7 @@ int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) { ...@@ -66,7 +66,7 @@ int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) {
* @return 0 if success, else return error code * @return 0 if success, else return error code
*/ */
int dap_dns_zone_unregister(char *zone) { int dap_dns_zone_unregister(char *zone) {
dap_dns_zone_hash_t *asked_zone; dap_dns_zone_hash_t *asked_zone = NULL;
HASH_FIND_STR(s_dns_server->hash_table, zone, asked_zone); HASH_FIND_STR(s_dns_server->hash_table, zone, asked_zone);
if (asked_zone == NULL) { if (asked_zone == NULL) {
return DNS_ERROR_NAME; return DNS_ERROR_NAME;
...@@ -83,7 +83,7 @@ int dap_dns_zone_unregister(char *zone) { ...@@ -83,7 +83,7 @@ int dap_dns_zone_unregister(char *zone) {
* @return Callback for registered DNS zone, else return NULL * @return Callback for registered DNS zone, else return NULL
*/ */
dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) { dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) {
dap_dns_zone_hash_t *asked_zone; dap_dns_zone_hash_t *asked_zone = NULL;
HASH_FIND_STR(s_dns_server->hash_table, hostname, asked_zone); HASH_FIND_STR(s_dns_server->hash_table, hostname, asked_zone);
if (asked_zone == NULL) { if (asked_zone == NULL) {
if (!strcmp(hostname, &s_root_alias[0])) { if (!strcmp(hostname, &s_root_alias[0])) {
......