diff --git a/CMakeLists.txt b/CMakeLists.txt index c45ab919d9b99920ddb3caa803ef1feb34a38bff..548290aa73b871cd58d60fb70f7ada700b95852d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 3.10) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "3.0-13") +set(CELLFRAME_SDK_NATIVE_VERSION "3.0-14") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(BUILD_CRYPTO_TESTS ON) diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h index 23d13c366641c28d3f6f0bae351bdc3f2c1a92b2..1fcbefa3d755c320c593654e3da1511e14977181 100755 --- a/dap-sdk/crypto/include/dap_sign.h +++ b/dap-sdk/crypto/include/dap_sign.h @@ -141,7 +141,7 @@ dap_multi_sign_t *dap_multi_sign_create(dap_multi_sign_params_t *a_params, const int dap_multi_sign_verify(dap_multi_sign_t *a_sign, const void *a_data, const size_t a_data_size); void dap_multi_sign_delete(dap_multi_sign_t *a_sign); -void dap_sign_get_information(dap_sign_t* a_sign, dap_string_t *a_str_out); +void dap_sign_get_information(dap_sign_t* a_sign, dap_string_t *a_str_out, const char *a_hash_out_type); #ifdef __cplusplus } diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index 7c64420b0b4202cb9cbf8d8a7a5a3e0332b0667b..d3de0d4a9dd5cdced24c9190ea51fe072a1a3471 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -28,6 +28,7 @@ #include "dap_strfuncs.h" #include "dap_hash.h" #include "dap_sign.h" +#include "dap_enc_base58.h" #include "dap_enc_bliss.h" #include "dap_enc_tesla.h" #include "dap_enc_picnic.h" @@ -861,14 +862,21 @@ void dap_multi_sign_delete(dap_multi_sign_t *a_sign) * @param a_sign Signature can be NULL * @param a_str_out The output string pointer */ -void dap_sign_get_information(dap_sign_t* a_sign, dap_string_t *a_str_out){ +void dap_sign_get_information(dap_sign_t* a_sign, dap_string_t *a_str_out, const char *a_hash_out_type) +{ dap_string_append_printf(a_str_out, "Signature: \n"); if (a_sign != NULL){ dap_chain_hash_fast_t l_hash_pkey; dap_string_append_printf(a_str_out, "\tType: %s\n", dap_sign_type_to_str(a_sign->header.type)); if(dap_sign_get_pkey_hash(a_sign, &l_hash_pkey)){ - dap_string_append_printf(a_str_out, "\tPublic key hash: %s\n", dap_chain_hash_fast_to_str_new(&l_hash_pkey)); + char *l_hash_str = NULL; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(&l_hash_pkey); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(&l_hash_pkey); + dap_string_append_printf(a_str_out, "\tPublic key hash: %s\n", l_hash_str); + DAP_DELETE(l_hash_str); } dap_string_append_printf(a_str_out, "\tPublic key size: %u\n" "\tSignature size: %u\n", diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index f4e006fcd2292c535b959dd0ae08e665687666af..9ad9af43ca97ada907fb4294fa6df99840d2c8f6 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -585,13 +585,6 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { if(!a_store_obj->key) { return -2; } - /*if (dap_fnmatch("*.del", a_store_obj->group, 0)) { - char *l_del_group = dap_strdup_printf("%s.del", a_store_obj->group); - pcdb_instance l_cdb_d = dap_cdb_get_db_by_group(l_del_group); - if (l_cdb_d) { - l_cdb_i->id = max(l_cdb_d->id, l_cdb_i->id); - } - }*/ cdb_record l_rec; l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key); int offset = 0; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index c8bae49ea6eaedd966a7fd5a18b2c87c2573602a..3d092719310f7567c03f5ba33e174556bb251fb5 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -836,9 +836,10 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) // State OFFLINE where we don't do anything case NET_STATE_OFFLINE: { // delete all links + l_net_pvt->links_connected_count = 0; dap_list_t *l_tmp = l_net_pvt->links; while (l_tmp) { - dap_list_t *l_next =l_tmp->next; + dap_list_t *l_next = l_tmp->next; ((dap_chain_node_client_t *)l_tmp->data)->keep_connection = false; dap_chain_node_client_close(l_tmp->data); DAP_DELETE(l_tmp); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index de5e8eea74501bd8db3a4ceb50f832696f75030f..d2810653a9b10cd519004dce83f6cc68d49e4b42 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -106,43 +106,54 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, HASH_ADD(hh, *a_tx_hash_processed, hash, sizeof(dap_chain_hash_fast_t), l_sht); (*l_tx_num)++; } - char *l_tx_hash_user_str; - char l_tx_hash_str[70]; - dap_chain_hash_fast_to_str(&l_tx_hash, l_tx_hash_str, 70); time_t l_ts_create = (time_t)a_datum->header.ts_created; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_tx_hash_user_str = dap_strdup(l_tx_hash_str); + char *l_hash_str = NULL; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_hash); else - l_tx_hash_user_str = dap_enc_base58_from_hex_str_to_str(l_tx_hash_str); + l_hash_str = dap_enc_base58_encode_hash_to_str(&l_tx_hash); dap_list_t *l_list_tx_any = dap_chain_datum_tx_items_get(a_datum, TX_ITEM_TYPE_TOKEN, NULL); if(a_ledger == NULL){ - dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str); + dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_hash_str); } else { char buf[50]; + const char *l_ticker; + if (l_list_tx_any) { + l_ticker = ((dap_chain_tx_token_t*)l_list_tx_any->data)->header.ticker; + } else { + l_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash); + } dap_string_append_printf(a_str_out, "transaction:%s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n", - l_list_tx_any ? " (emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf), - dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash)); + l_list_tx_any ? " (emit)" : "", l_hash_str, dap_ctime_r(&l_ts_create, buf), l_ticker); } - DAP_DELETE(l_tx_hash_user_str); + DAP_DELETE(l_hash_str); dap_list_free(l_list_tx_any); uint32_t l_tx_items_count = 0; uint32_t l_tx_items_size =a_datum->header.tx_items_size; - char *l_hash_str_tmp = NULL; char l_tmp_buf[70]; dap_sign_t *l_sign_tmp; dap_chain_hash_fast_t l_pkey_hash_tmp; + dap_hash_fast_t *l_hash_tmp = NULL; dap_pkey_t *l_pkey_tmp; while(l_tx_items_count < l_tx_items_size){ uint8_t *item = a_datum->tx_items + l_tx_items_count; size_t l_item_tx_size = dap_chain_datum_item_tx_get_size(item); switch(dap_chain_datum_tx_item_get_type(item)){ case TX_ITEM_TYPE_IN: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_in_t*)item)->header.tx_prev_hash); + l_hash_tmp = &((dap_chain_tx_in_t*)item)->header.tx_prev_hash; + if (dap_hash_fast_is_blank(l_hash_tmp)) { + l_hash_str = dap_strdup("BLANK"); + } else { + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + } dap_string_append_printf(a_str_out, "\t IN:\nTx_prev_hash: %s\n" "\t\t Tx_out_prev_idx: %u\n", - l_tx_hash_str, + l_hash_str, ((dap_chain_tx_in_t*)item)->header.tx_out_prev_idx); - DAP_DELETE(l_hash_str_tmp); + DAP_DELETE(l_hash_str); break; case TX_ITEM_TYPE_OUT: dap_string_append_printf(a_str_out, "\t OUT:\n" @@ -155,16 +166,26 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, dap_chain_addr_to_str(&((dap_chain_tx_out_t*)item)->addr)); break; case TX_ITEM_TYPE_TOKEN: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_token_t*)item)->header.token_emission_hash); + l_hash_tmp = &((dap_chain_tx_token_t*)item)->header.token_emission_hash; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); dap_string_append_printf(a_str_out, "\t TOKEN:\n" "\t\t ticker: %s \n" "\t\t token_emission_hash: %s\n" - "\t\t token_emission_chain_id: 0x%016"DAP_UINT64_FORMAT_x"\n", ((dap_chain_tx_token_t*)item)->header.ticker, l_hash_str_tmp, - ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64); - DAP_DELETE(l_hash_str_tmp); + "\t\t token_emission_chain_id: 0x%016"DAP_UINT64_FORMAT_x"\n", + ((dap_chain_tx_token_t*)item)->header.ticker, + l_hash_str, + ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64); + DAP_DELETE(l_hash_str); break; case TX_ITEM_TYPE_TOKEN_EXT: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_token_ext_t*)item)->header.ext_tx_hash); + l_hash_tmp = &((dap_chain_tx_token_ext_t*)item)->header.ext_tx_hash; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); dap_string_append_printf(a_str_out, "\t TOKEN EXT:\n" "\t\t Version: %u\n" "\t\t Ticker: %s\n" @@ -176,15 +197,15 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, ((dap_chain_tx_token_ext_t*)item)->header.ticker, ((dap_chain_tx_token_ext_t*)item)->header.ext_chain_id.uint64, ((dap_chain_tx_token_ext_t*)item)->header.ext_net_id.uint64, - l_hash_str_tmp, + l_hash_str, ((dap_chain_tx_token_ext_t*)item)->header.ext_tx_out_idx); - DAP_FREE(l_hash_str_tmp); + DAP_DELETE(l_hash_str); break; case TX_ITEM_TYPE_SIG: l_sign_tmp = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t*)item); dap_string_append_printf(a_str_out, "\t SIG:\n" "\t sig_size: %u\n", ((dap_chain_tx_sig_t*)item)->header.sig_size); - dap_sign_get_information(l_sign_tmp, a_str_out); + dap_sign_get_information(l_sign_tmp, a_str_out, a_hash_out_type); break; case TX_ITEM_TYPE_RECEIPT: dap_string_append_printf(a_str_out, "\t Receipt:\n" @@ -217,21 +238,24 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, sizeof(dap_sign_t)); dap_string_append_printf(a_str_out, "Exts:\n" " Provider:\n"); - dap_sign_get_information(l_provider, a_str_out); + dap_sign_get_information(l_provider, a_str_out, a_hash_out_type); dap_string_append_printf(a_str_out, " Client:\n"); - dap_sign_get_information(l_client, a_str_out); + dap_sign_get_information(l_client, a_str_out, a_hash_out_type); } else if (((dap_chain_datum_tx_receipt_t*)item)->exts_size == sizeof(dap_sign_t)) { dap_sign_t *l_provider = DAP_NEW_Z(dap_sign_t); memcpy(l_provider, ((dap_chain_datum_tx_receipt_t*)item)->exts_n_signs, sizeof(dap_sign_t)); dap_string_append_printf(a_str_out, "Exts:\n" " Provider:\n"); - dap_sign_get_information(l_provider, a_str_out); + dap_sign_get_information(l_provider, a_str_out, a_hash_out_type); } break; case TX_ITEM_TYPE_PKEY: l_pkey_tmp = (dap_pkey_t*)((dap_chain_tx_pkey_t*)item)->pkey; dap_hash_fast(l_pkey_tmp->pkey, l_pkey_tmp->header.size, &l_pkey_hash_tmp); - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&l_pkey_hash_tmp); + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash_tmp); dap_string_append_printf(a_str_out, "\t PKey: \n" "\t\t SIG type: %s\n" "\t\t SIG size: %u\n" @@ -245,18 +269,22 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, ((dap_chain_tx_pkey_t*)item)->seq_no, dap_pkey_type_to_str(l_pkey_tmp->header.type), l_pkey_tmp->header.size, - l_hash_str_tmp); - DAP_FREE(l_hash_str_tmp); + l_hash_str); + DAP_DELETE(l_hash_str); break; case TX_ITEM_TYPE_IN_COND: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_in_t*)item)->header.tx_prev_hash); + l_hash_tmp = &((dap_chain_tx_in_t*)item)->header.tx_prev_hash; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); dap_string_append_printf(a_str_out, "\t IN COND:\n\t\tReceipt_idx: %u\n" "\t\t Tx_prev_hash: %s\n" "\t\t Tx_out_prev_idx: %u\n", ((dap_chain_tx_in_cond_t*)item)->header.receipt_idx, - l_hash_str_tmp, + l_hash_str, ((dap_chain_tx_in_cond_t*)item)->header.tx_out_prev_idx); - DAP_FREE(l_hash_str_tmp); + DAP_DELETE(l_hash_str); break; case TX_ITEM_TYPE_OUT_COND: dap_string_append_printf(a_str_out, "\t OUT COND:\n" @@ -273,22 +301,26 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype)); switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash); - dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n" - "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" - "\t\t\t pkey: %s\n" - "\t\t\t max price: %s (%"DAP_UINT64_FORMAT_U") \n", - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32, - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64, - l_hash_str_tmp, - dap_chain_balance_to_coins(dap_chain_uint128_from( - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) - ), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); - DAP_FREE(l_hash_str_tmp); + l_hash_tmp = &((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash; + if (!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n" + "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" + "\t\t\t pkey: %s\n" + "\t\t\t max price: %s (%"DAP_UINT64_FORMAT_U") \n", + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32, + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64, + l_hash_str, + dap_chain_balance_to_coins(dap_chain_uint128_from( + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) + ), + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); + DAP_DELETE(l_hash_str); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE: - dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" + dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t addr: %s\n" "\t\t\t value: %Lf", ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, @@ -298,7 +330,7 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: - dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" + dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t token: %s\n" "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n", @@ -976,7 +1008,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) { char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address)); // filter for addr - if(dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { + if (a_filtr_addr_base58 && dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { break; } @@ -1096,7 +1128,7 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) const char * l_hash_out_type = NULL; dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); if(!l_hash_out_type) - l_hash_out_type = "base58"; + l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); return -1; @@ -1289,7 +1321,8 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return -2; } dap_chain_hash_fast_t *l_tx_hash = DAP_NEW(dap_chain_hash_fast_t); - if(dap_chain_hash_fast_from_str(l_tx_hash_str, l_tx_hash)){ + if (dap_chain_hash_fast_from_str(l_tx_hash_str, l_tx_hash) && + dap_enc_base58_hex_to_hash(l_tx_hash_str, l_tx_hash)) { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't get hash_fast from %s", l_tx_hash_str); return -2; }