diff --git a/.gitignore b/.gitignore index e97c609120476289487b69ea8f5b1a53eeaab3bc..3420055ff2b5d17db4c10b82f92d09f7b3533026 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Prerequisites build/* +cmake-build-*/ build_stretch/* test/build *.txt.user @@ -67,4 +68,9 @@ Makefile cmake_install.cmake # Editor's temp files -*~ \ No newline at end of file +*~ +.idea/ + +# OS files +.DS_Store + diff --git a/3rdparty/cuttdb/CMakeLists.txt b/3rdparty/cuttdb/CMakeLists.txt index 85118d55603a3f1ca1ff87cf1975ad36a793c625..8cf9f34ac98198a42100658743882ac0b31a3bba 100755 --- a/3rdparty/cuttdb/CMakeLists.txt +++ b/3rdparty/cuttdb/CMakeLists.txt @@ -29,7 +29,7 @@ add_library(${PROJECT_NAME} STATIC ${cuttdb_src} ${cuttdb_h}) set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C) set_target_properties(${PROJECT_NAME} PROPERTIES COMPILER_LANGUAGE C) -set_target_properties(dap_cuttdb PROPERTIES LINKER_LANGUAGE C) +set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C) target_link_libraries(${PROJECT_NAME}) diff --git a/3rdparty/json-c-darwin/CMakeLists.txt b/3rdparty/json-c-darwin/CMakeLists.txt index 087c1f19bbd2e2854807660f25f0f5be4633145b..455c70f283a430a482d5350b6a8e9e0fceddecdf 100644 --- a/3rdparty/json-c-darwin/CMakeLists.txt +++ b/3rdparty/json-c-darwin/CMakeLists.txt @@ -5,4 +5,4 @@ file(GLOB JSON_C_SRCS FILES *.c) file(GLOB JSON_C_HEADERS FILES *.h) add_library(${PROJECT_NAME} STATIC ${JSON_C_SRCS} ${JSON_C_HEADERS}) -target_include_directories(json-c PUBLIC . ) +target_include_directories(${PROJECT_NAME} PUBLIC . ) diff --git a/3rdparty/json-c/CMakeLists.txt b/3rdparty/json-c/CMakeLists.txt index 087c1f19bbd2e2854807660f25f0f5be4633145b..455c70f283a430a482d5350b6a8e9e0fceddecdf 100644 --- a/3rdparty/json-c/CMakeLists.txt +++ b/3rdparty/json-c/CMakeLists.txt @@ -5,4 +5,4 @@ file(GLOB JSON_C_SRCS FILES *.c) file(GLOB JSON_C_HEADERS FILES *.h) add_library(${PROJECT_NAME} STATIC ${JSON_C_SRCS} ${JSON_C_HEADERS}) -target_include_directories(json-c PUBLIC . ) +target_include_directories(${PROJECT_NAME} PUBLIC . ) diff --git a/3rdparty/monero_crypto/CMakeLists.txt b/3rdparty/monero_crypto/CMakeLists.txt index 34af01cb61fa4499f5fa863e4e87d835447432f7..8b18872212178b42ad5fa354d383e561caec5f15 100755 --- a/3rdparty/monero_crypto/CMakeLists.txt +++ b/3rdparty/monero_crypto/CMakeLists.txt @@ -384,7 +384,7 @@ endif() add_library(${PROJECT_NAME} STATIC ${monero_crypto_sources}) -target_include_directories(monero_crypto INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) diff --git a/CMakeLists.txt b/CMakeLists.txt index 489778264cdd06011a861d071d0795a99d453722..efe32c7df4701740435185f10fabd5b06eb7bfab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,22 @@ set(CMAKE_C_STANDARD 11) set(CELLFRAME_SDK_NATIVE_VERSION "3.1-0") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") + +if(NOT DEFINED ${CELLFRAME_MODULES}) + include (cmake/OS_Detection.cmake) + if (WIN32) + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange") + elseif(BSD) + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange") + elseif(DARWIN) + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange") + elseif(ANDROID) + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange") + elseif(LINUX) + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange modules-dynamic srv-vpn") + endif() +endif() + message("Cellframe modules: ${CELLFRAME_MODULES}") if (CELLFRAME_MODULES MATCHES "modules-dynamic") diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt index 9a6f3fa6394bd90cbc3d3d93c2aae300b843a209..f1b30e0ed0b169065f03f9b01d38c9ae34a4d3c9 100644 --- a/dap-sdk/CMakeLists.txt +++ b/dap-sdk/CMakeLists.txt @@ -1,4 +1,4 @@ -set(DAP_SDK_NATIVE_VERSION "2.2-2") +set(DAP_SDK_NATIVE_VERSION "2.3-0") # We switch off SSL until its not switched on back if(DAPSDK_MODULES MATCHES "ssl-support") diff --git a/dap-sdk/core/src/dap_strfuncs.c b/dap-sdk/core/src/dap_strfuncs.c index c95ff68bb8aa653fa4004d0c1f9f86f1dd997a88..08b7058d71bfc1fd22c3656f41dc049d01b8e8e8 100755 --- a/dap-sdk/core/src/dap_strfuncs.c +++ b/dap-sdk/core/src/dap_strfuncs.c @@ -312,7 +312,7 @@ char* dap_strdup_vprintf(const char *a_format, va_list a_args) * @return char* a newly-allocated string holding the result */ -char* dap_strdup_printf(const char *a_format, ...) +DAP_PRINTF_ATTR(1,2) char* dap_strdup_printf(const char *a_format, ...) { char *l_buffer; va_list l_args; diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c index 4b9d0e35a417f366e8e95f35f8b5a94a00eb0f40..f813c276d6c9b3d1b66f57a20bc04ca374bf1bd2 100755 --- a/dap-sdk/crypto/src/dap_cert.c +++ b/dap-sdk/crypto/src/dap_cert.c @@ -82,11 +82,13 @@ int dap_cert_init() } /** - * @brief dap_cert_parse_str_list - * @param a_certs_str - * @param a_certs - * @param a_certs_size_t - * @return summary size for signatures of all certs in list + * @brief + * parse list of certificate from config file (if it is presented) + * in current implementation this function is used when node certificate (node-addr.dcert) is not generated + * @param a_certs_str const char * string with certificate name (node-addr) + * @param a_certs dap_cert_t *** array with certificates + * @param a_certs_size size of certificate + * @return size_t */ size_t dap_cert_parse_str_list(const char * a_certs_str, dap_cert_t *** a_certs, size_t * a_certs_size) { @@ -134,10 +136,11 @@ size_t dap_cert_parse_str_list(const char * a_certs_str, dap_cert_t *** a_certs, /** - * @brief dap_cert_sign_output_size - * @param a_cert - * @param a_size_wished - * @return + * @brief + * simply call dap_sign_create_output_unserialized_calc_size( a_cert->enc_key,a_size_wished) + * @param a_cert dap_cert_t * certificate object + * @param a_size_wished wished data size (don't used in current implementation) + * @return size_t */ size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished) { @@ -160,12 +163,13 @@ size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished) }*/ /** - * @brief dap_cert_sign - * @param a_cert - * @param a_data - * @param a_data_size - * @param a_output_size_wished - * @return + * @brief + * sign data by encryption key from certificate + * @param a_cert dap_cert_t * certificate object + * @param a_data data for signing + * @param a_data_size data size + * @param a_output_size_wished wished data size (don't used in current implementation) + * @return dap_sign_t* */ dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data , size_t a_data_size, size_t a_output_size_wished ) @@ -176,10 +180,11 @@ dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data } /** - * @brief dap_cert_add_cert_sign - * @param a_cert - * @param a_cert_signer - * @return + * @brief + * sign certificate with another certificate (a_cert->signs) + * @param a_cert dap_cert_t certificate object + * @param a_cert_signer dap_cert_t certificate object, which signs a_cert + * @return int */ int dap_cert_add_cert_sign(dap_cert_t * a_cert, dap_cert_t * a_cert_signer) { @@ -196,10 +201,13 @@ int dap_cert_add_cert_sign(dap_cert_t * a_cert, dap_cert_t * a_cert_signer) /** - * @brief dap_cert_generate_mem - * @param a_cert_name - * @param a_key_type - * @return + * @brief generate certificate in memory with specified seed + * + * @param a_cert_name const char * name of certificate + * @param a_key_type dap_enc_key_type_t key type + * @param a_seed const void* seed for certificate generation + * @param a_seed_size size_t size of seed + * @return dap_cert_t* */ dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_key_type_t a_key_type, const void* a_seed, size_t a_seed_size) @@ -222,10 +230,11 @@ dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_k } /** - * @brief dap_cert_generate_mem - * @param a_cert_name - * @param a_key_type - * @return + * @brief generate certificate in memory + * + * @param a_cert_name const char * certificate name + * @param a_key_type encryption key type + * @return dap_cert_t* */ dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t a_key_type) { @@ -233,11 +242,12 @@ dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t } /** - * @brief dap_cert_generate - * @param a_cert_name - * @param a_file_path - * @param a_key_type - * @return + * @brief generate certificate and save it to file + * + * @param a_cert_name const char * certificate name + * @param a_file_path const char * path to certificate file + * @param a_key_type dap_enc_key_type_t key_type + * @return dap_cert_t* */ dap_cert_t * dap_cert_generate(const char * a_cert_name , const char * a_file_path,dap_enc_key_type_t a_key_type ) @@ -259,7 +269,8 @@ dap_cert_t * dap_cert_generate(const char * a_cert_name /** * @brief dap_cert_delete_by_name - * @param a_cert_name + * delete certificate object, finding by name + * @param a_cert_name const char * certificate name */ void dap_cert_delete_by_name(const char * a_cert_name) { @@ -271,8 +282,9 @@ void dap_cert_delete_by_name(const char * a_cert_name) } /** - * @brief dap_cert_find_by_name - * @param a_cert_name + * @brief + * find certificate by name in path, which is configured ca_folders parameter in chain config + * @param a_cert_name const char * * @return */ dap_cert_t * dap_cert_find_by_name(const char * a_cert_name) @@ -313,7 +325,8 @@ dap_list_t *dap_cert_get_all_mem() /** * @brief dap_cert_new - * @param a_name + * create certificate object with specified name + * @param a_name const char * * @return */ dap_cert_t * dap_cert_new(const char * a_name) @@ -332,7 +345,8 @@ dap_cert_t * dap_cert_new(const char * a_name) /** * @brief s_cert_delete - * @param a_cert + * delete certificate object + * @param a_cert dap_cert_t * */ void dap_cert_delete(dap_cert_t * a_cert) { @@ -354,9 +368,10 @@ void dap_cert_delete(dap_cert_t * a_cert) /** * @brief dap_cert_add_file - * @param a_cert_name - * @param a_folder_path - * @return + * load certificate file from folder (specified in chain config) + * @param a_cert_name const char * certificate name + * @param a_folder_path const char * certificate path + * @return dap_cert_t */ dap_cert_t * dap_cert_add_file(const char * a_cert_name,const char *a_folder_path) { @@ -378,9 +393,11 @@ dap_cert_t * dap_cert_add_file(const char * a_cert_name,const char *a_folder_pat } /** - * @brief dap_cert_save_to_folder - * @param a_cert - * @param a_file_dir_path + * @brief save certitificate to folder + * + * @param a_cert dap_cert_t * certiticate object + * @param a_file_dir_path const char * path to directory with certificate + * @return int */ int dap_cert_save_to_folder(dap_cert_t * a_cert, const char *a_file_dir_path) { @@ -396,8 +413,10 @@ int dap_cert_save_to_folder(dap_cert_t * a_cert, const char *a_file_dir_path) /** * @brief dap_cert_to_pkey - * @param a_cert - * @return + * get public key from certificate + * dap_pkey_from_enc_key( a_cert->enc_key ) + * @param a_cert dap_cert_t certificate object + * @return dap_pkey_t */ dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert) { @@ -408,10 +427,11 @@ dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert) } /** - * @brief dap_cert_compare_with_sign - * @param a_cert - * @param a_sign - * @return + * @brief + * compare certificate encryption key with key, which was used for event or block signing + * @param a_cert dap_cert_t * certificate object + * @param a_sign dap_sign_t * dap_sign_t object (signed block or event) + * @return int */ int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign) { @@ -434,8 +454,8 @@ int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign) /** - * @brief dap_cert_count_cert_sign - * @param a_cert + * @brief Certificates signatures chain size + * @param a_cert dap_cert_t certificate object * @return */ size_t dap_cert_count_cert_sign(dap_cert_t * a_cert) @@ -448,8 +468,8 @@ size_t dap_cert_count_cert_sign(dap_cert_t * a_cert) /** - * @brief dap_cert_dump - * @param a_cert + * @brief show certificate information + * @param a_cert dap_cert_t certificate object */ void dap_cert_dump(dap_cert_t * a_cert) { @@ -491,8 +511,10 @@ void dap_cert_dump(dap_cert_t * a_cert) } /** - * @brief dap_cert_get_folder - * @param a_folder_path + * @brief get certificate folder path + * usage example: dap_cert_get_folder(0) + * @param a_n_folder_path + * @return const char* */ const char* dap_cert_get_folder(int a_n_folder_path) { @@ -511,8 +533,9 @@ const char* dap_cert_get_folder(int a_n_folder_path) /** - * @brief dap_cert_add_folder - * @param a_folder_path + * @brief load certificates from specified folder + * + * @param a_folder_path const char * */ void dap_cert_add_folder(const char *a_folder_path) { @@ -551,6 +574,15 @@ void dap_cert_add_folder(const char *a_folder_path) log_it(L_WARNING, "Can't add folder %s to cert manager",a_folder_path); } +/** + * @brief + * + * @param a_key const char * + * @param a_type dap_cert_metadata_type_t + * @param a_value void * + * @param a_value_size size_t + * @return dap_cert_metadata_t* + */ dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type_t a_type, void *a_value, size_t a_value_size) { if (!a_key || a_type > DAP_CERT_META_CUSTOM || (!a_value && a_value_size)) { @@ -568,12 +600,13 @@ dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type } /** - * @brief dap_cert_add_meta Add metadata to certificate - * @param a_cert - * @param a_key - * @param a_type - * @param a_value - * @param a_value_size + * @brief Add metadata to certificate + * action for command "cellframe-node cert add_metadata <cert name> <key:type:length:value>" + * @param a_cert dap_cert_t * certificate object + * @param a_key const char * key + * @param a_type dap_cert_metadata_type_t type + * @param a_value void * value + * @param a_value_size size_t length */ void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, void *a_value, size_t a_value_size) { @@ -588,6 +621,15 @@ void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_ } } +/** + * @brief Add metadata to certificate with additional value modification + * + * @param a_cert dap_cert_t * certificate object + * @param a_key const char * key + * @param a_type dap_cert_metadata_type_t type + * @param a_value void * value + * @param a_value_size size_t length + */ void dap_cert_add_meta_scalar(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, uint64_t a_value, size_t a_value_size) { void *l_value; @@ -627,15 +669,24 @@ void dap_cert_add_meta_scalar(dap_cert_t *a_cert, const char *a_key, dap_cert_me } /** - * @brief dap_cert_get_meta - * @param a_cert - * @param a_field + * @brief get specified metadata from certificate + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return dap_cert_metadata_t* */ dap_cert_metadata_t *dap_cert_get_meta(dap_cert_t *a_cert, const char *a_field) { return dap_binary_tree_search(a_cert->metadata, a_field); } +/** + * @brief get specified metadata from certificate in string (DAP_CERT_META_STRING) format + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return char* + */ char *dap_cert_get_meta_string(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -649,6 +700,14 @@ char *dap_cert_get_meta_string(dap_cert_t *a_cert, const char *a_field) return strndup((char *)&l_meta->value[0], l_meta->length); } +/** + * @brief get metadata from certificate with boolean (DAP_CERT_META_BOOL) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return true + * @return false + */ bool dap_cert_get_meta_bool(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -665,6 +724,13 @@ bool dap_cert_get_meta_bool(dap_cert_t *a_cert, const char *a_field) return *(bool *)&l_meta->value[0]; } +/** + * @brief get metadata from certificate with int (DAP_CERT_META_INT) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return int + */ int dap_cert_get_meta_int(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -681,6 +747,13 @@ int dap_cert_get_meta_int(dap_cert_t *a_cert, const char *a_field) return *(int *)&l_meta->value[0]; } +/** + * @brief get metadata from certificate with datetime (DAP_CERT_META_DATETIME) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return time_t + */ time_t dap_cert_get_meta_time(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -697,6 +770,13 @@ time_t dap_cert_get_meta_time(dap_cert_t *a_cert, const char *a_field) return *(time_t *)&l_meta->value[0]; } +/** + * @brief get metadata from certificate with datetime (DAP_CERT_META_DATETIME_PERIOD) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return time_t + */ time_t dap_cert_get_meta_period(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -713,6 +793,13 @@ time_t dap_cert_get_meta_period(dap_cert_t *a_cert, const char *a_field) return *(time_t *)&l_meta->value[0]; } +/** + * @brief get metadata from certificate with dap_sign_t (DAP_CERT_META_SIGN) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @return dap_sign_t* + */ dap_sign_t *dap_cert_get_meta_sign(dap_cert_t *a_cert, const char *a_field) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -730,6 +817,14 @@ dap_sign_t *dap_cert_get_meta_sign(dap_cert_t *a_cert, const char *a_field) return l_ret; } +/** + * @brief get metadata from certificate with custom (DAP_CERT_META_CUSTOM) type + * + * @param a_cert dap_cert_t * certificate object + * @param a_field const char * field, which will be gotten from metadata + * @param a_meta_size_out size_t size of recieved data + * @return void* + */ void *dap_cert_get_meta_custom(dap_cert_t *a_cert, const char *a_field, size_t *a_meta_size_out) { dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field); @@ -748,8 +843,9 @@ void *dap_cert_get_meta_custom(dap_cert_t *a_cert, const char *a_field, size_t * /** * @brief dap_cert_deinit + * empty function */ void dap_cert_deinit() { -} +} \ No newline at end of file diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index dd1625e88f0215082e14f7330ec070a28b8e8b66..2582d4b1c3a29452a9c377a8c96ef986ae510074 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -38,7 +38,13 @@ //static dap_sign_t * s_sign_null = NULL; static bliss_signature_t s_sign_bliss_null = {0}; -// calc signature size +/** + * @brief get signature size (different for specific crypto algorithm) + * + * @param a_key dap_enc_key_t * encryption key object + * @param a_output_wish_size size_t output size + * @return size_t + */ size_t dap_sign_create_output_unserialized_calc_size(dap_enc_key_t * a_key, size_t a_output_wish_size ) { (void)a_output_wish_size; @@ -60,8 +66,8 @@ size_t dap_sign_create_output_unserialized_calc_size(dap_enc_key_t * a_key, size /** - * @brief dap_sign_type_from_key_type - * @param a_key_type + * @brief get sign type (dap_sign_type_t) type from key type (dap_enc_key_type_t) + * @param a_key_type dap_enc_key_type_t key type * @return */ dap_sign_type_t dap_sign_type_from_key_type( dap_enc_key_type_t a_key_type) @@ -79,9 +85,9 @@ dap_sign_type_t dap_sign_type_from_key_type( dap_enc_key_type_t a_key_type) } /** - * @brief dap_sign_type_to_key_type - * @param a_chain_sign_type - * @return + * @brief convert chain sign type (dap_sign_type_t) to encryption key type (dap_enc_key_type_t) + * @param a_chain_sign_type dap_enc_key_type_t signature type + * @return dap_enc_key_type_t */ dap_enc_key_type_t dap_sign_type_to_key_type(dap_sign_type_t a_chain_sign_type) { @@ -97,9 +103,10 @@ dap_enc_key_type_t dap_sign_type_to_key_type(dap_sign_type_t a_chain_sign_type /** - * @brief dap_sign_type_to_str - * @param a_chain_sign_type - * @return + * @brief convert sign type (dap_sign_type_t) to string format + * [sig_bliss,sig_tesla,sig_picnic,sig_dil,sig_multi2,sig_multi] + * @param a_chain_sign_type sign type dap_sign_type_t + * @return const char* */ const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type) { @@ -116,9 +123,10 @@ const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type) } /** - * @brief dap_pkey_type_from_sign - * @param a_pkey_type - * @return + * @brief convert public key type (dap_pkey_type_t) to dap_sign_type_t type + * + * @param a_pkey_type dap_pkey_type_t key type + * @return dap_sign_type_t */ dap_sign_type_t dap_pkey_type_from_sign( dap_pkey_type_t a_pkey_type) { @@ -136,9 +144,10 @@ dap_sign_type_t dap_pkey_type_from_sign( dap_pkey_type_t a_pkey_type) /** - * @brief dap_sign_type_from_str - * @param a_type_str - * @return + * @brief convert string to dap_sign_type_t type + * + * @param a_type_str const char * algorithm type [sig_bliss,sig_tesla,sig_picnic,sig_dil,sig_multi2,sig_multi] + * @return dap_sign_type_t */ dap_sign_type_t dap_sign_type_from_str(const char * a_type_str) { @@ -162,12 +171,14 @@ dap_sign_type_t dap_sign_type_from_str(const char * a_type_str) } /** - * @brief dap_sign_create_output - * @param a_key - * @param a_data - * @param a_data_size - * @param a_output [in/out] - * @return + * @brief encrypt data + * call a_key->enc_na or dap_enc_sig_bliss_get_sign + * @param a_key dap_enc_key_t key object + * @param a_data const void * data + * @param a_data_size const size_t size of data + * @param a_output void * output buffer + * @param a_output_size size_t size of output buffer + * @return int */ static int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, const size_t a_data_size, void * a_output, size_t *a_output_size) @@ -194,12 +205,13 @@ static int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, con } /** - * @brief dap_sign_create - * @param a_key - * @param a_data - * @param a_data_size - * @param a_output_wish_size - * @return + * @brief sign data with specified key + * + * @param a_key dap_enc_key_t key object + * @param a_data const void * buffer with data + * @param a_data_size const size_t buffer size + * @param a_output_wish_size size_t output buffer size + * @return dap_sign_t* */ dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data, const size_t a_data_size, size_t a_output_wish_size) @@ -243,14 +255,16 @@ dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data, } return NULL; } + /** - * @brief dap_sign_pack - * @param a_key - * @param a_sign_ser - * @param a_sign_ser_size - * @param a_pkey - * @param a_pub_key_size - * @return dap_sign_t* + * @brief create signed object header (dap_sign_t) from variables + * + * @param a_key dap_enc_key_t key object + * @param a_sign_ser signed data buffer + * @param a_sign_ser_size buffer size + * @param a_pkey public key + * @param a_pub_key_size pulic key size + * @return dap_sign_t* */ dap_sign_t * dap_sign_pack(dap_enc_key_t *a_key, const void * a_sign_ser, const size_t a_sign_ser_size, const void * a_pkey, const size_t a_pub_key_size) { @@ -266,10 +280,11 @@ dap_sign_t * dap_sign_pack(dap_enc_key_t *a_key, const void * a_sign_ser, const } /** - * @brief dap_sign_get_sign - * @param a_sign - * @param a_sign_out - * @return + * @brief + * get a_sign->pkey_n_sign + a_sign->header.sign_pkey_size + * @param a_sign dap_sign_t object (header + raw signature data) + * @param a_sign_out a_sign->header.sign_size + * @return uint8_t* */ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out) { @@ -281,10 +296,11 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out) } /** - * @brief dap_sign_get_pkey - * @param a_sign - * @param a_pub_key_out - * @return + * @brief get a_sign->pkey_n_sign and a_sign->header.sign_pkey_size (optionally) + * + * @param a_sign dap_sign_t sign object + * @param a_pub_key_out [option] output pointer to a_sign->header.sign_pkey_size + * @return uint8_t* */ uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out) { @@ -296,10 +312,12 @@ uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out) } /** - * @brief dap_sign_get_pkey_hash - * @param a_sign - * @param a_sign_hash - * @return + * @brief get SHA3 hash of buffer (a_sign), storing in output buffer a_sign_hash + * + * @param a_sign input buffer + * @param a_sign_hash output buffer + * @return true + * @return false */ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_hash) { @@ -314,7 +332,14 @@ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_h return dap_hash_fast( a_sign->pkey_n_sign,a_sign->header.sign_pkey_size,a_sign_hash ); } - +/** + * @brief verify, if a_sign->header.sign_pkey_size and a_sign->header.sign_size bigger, then a_max_key_size + * + * @param a_sign signed data object + * @param a_max_key_size max size of key + * @return true + * @return false + */ bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size) { if (a_sign->header.sign_pkey_size > a_max_key_size) @@ -325,9 +350,10 @@ bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size) } /** - * @brief dap_sign_to_enc_key - * @param a_chain_sign - * @return + * @brief get deserealized pub key from dap_sign_t + * + * @param a_chain_sign dap_sign_t object + * @return dap_enc_key_t* */ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) { @@ -343,10 +369,10 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) } /** - * @brief dap_sign_verify - * @param a_chain_sign - * @param a_data - * @param a_data_size + * @brief dap_sign_verify data signature + * @param a_chain_sign dap_sign_t a_chain_sign object + * @param a_data const void * buffer with data + * @param a_data_size const size_t buffer size * @return 1 valid signature, 0 invalid signature, -1 unsupported sign type */ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size) @@ -403,8 +429,12 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t return l_ret; } + /** - * Get size of struct dap_sign_t + * @brief Get size of struct dap_sign_t + * + * @param a_chain_sign dap_sign_t object + * @return size_t */ size_t dap_sign_get_size(dap_sign_t * a_chain_sign) { diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c index d992fe2d8ec45b19c64b2f9581ff6a9cfdad7db0..d9d364beaf5d2bb1c498295604df628dcb1548f2 100644 --- a/dap-sdk/net/client/dap_client.c +++ b/dap-sdk/net/client/dap_client.c @@ -177,6 +177,46 @@ uint16_t dap_client_get_uplink_port_unsafe(dap_client_t * a_client) return DAP_CLIENT_PVT(a_client)->uplink_port; } +/** + * @brief dap_client_set_auth_cert + * @param a_client + * @param a_chain_net_name + * @param a_option + */ +void dap_client_set_auth_cert(dap_client_t *a_client, const char *a_chain_net_name) +{ + const char *l_auth_hash_str = NULL; + + if(a_client == NULL || a_chain_net_name == NULL){ + log_it(L_ERROR,"Chain-net is NULL for dap_client_set_auth_cert"); + return; + } + + char *l_path = dap_strdup_printf("network/%s", a_chain_net_name); + if (!l_path) { + log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__); + return; + } + + dap_config_t *l_cfg = dap_config_open(l_path); + free(l_path); + if (!l_cfg) { + log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__); + return; + } + + dap_cert_t *l_cert = dap_cert_find_by_name(dap_config_get_item_str(l_cfg, "general", "auth_cert")); + if (!l_cert) { + dap_config_close(l_cfg); + log_it(L_ERROR,"l_cert is NULL by dap_cert_find_by_name"); + return; + } + dap_client_set_auth_cert_unsafe(a_client, l_cert); + + //dap_cert_delete(l_cert); + dap_config_close(l_cfg); +} + void dap_client_set_auth_cert_unsafe(dap_client_t * a_client, dap_cert_t *a_cert) { if(a_client == NULL){ diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h index 8457e838b7cfd55a0c0ca6eabdce765d5d20e815..0173b8cc673cb8db251c47f18b0bf3f78b308cb0 100644 --- a/dap-sdk/net/client/include/dap_client.h +++ b/dap-sdk/net/client/include/dap_client.h @@ -139,6 +139,7 @@ dap_stream_ch_t * dap_client_get_stream_ch_unsafe(dap_client_t * a_client, uint8 const char * dap_client_get_stream_id(dap_client_t * a_client); void dap_client_set_active_channels_unsafe (dap_client_t * a_client, const char * a_active_channels); void dap_client_set_auth_cert_unsafe(dap_client_t * a_client, dap_cert_t *a_cert); +void dap_client_set_auth_cert(dap_client_t *a_client, const char *a_chain_net_name); dap_client_stage_t dap_client_get_stage(dap_client_t * a_client); dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client); diff --git a/modules/chain/CMakeLists.txt b/modules/chain/CMakeLists.txt index 2c8a19c4eccc17aa4e1b6d4ec75d6af4ca321061..fc43ed57b2c79b37f3089e46a481d739373c15c3 100644 --- a/modules/chain/CMakeLists.txt +++ b/modules/chain/CMakeLists.txt @@ -10,7 +10,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_SRCS} ${DAP_CHAIN_HEADERS}) #find_package(PkgConfig REQUIRED) #pkg_search_module(GLIB REQUIRED glib-2.0) -target_link_libraries(dap_chain dap_core dap_chain_common dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS}) -target_include_directories(dap_chain INTERFACE . include/ ${GLIB_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} dap_core dap_chain_common dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS}) +target_include_directories(${PROJECT_NAME} INTERFACE . include/ ${GLIB_INCLUDE_DIRS}) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 2fad608e9886a178a77c7fcd4d3053db41318cf0..edda63085b9aa08e4508c50ef460ee9ffd2a5bfa 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -209,9 +209,9 @@ void dap_chain_delete(dap_chain_t * a_chain) * @param a_atom_size * @return */ -dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size) +dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size, dap_chain_cell_id_t a_cell_id) { - dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id); dap_chain_atom_ptr_t l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size); a_chain->callback_atom_iter_delete(l_iter); return l_ret; @@ -580,10 +580,10 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not * @param a_atom_hash * @return */ -bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash) +bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash, dap_chain_cell_id_t a_cell_id) { bool l_ret = false; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id); dap_chain_atom_ptr_t * l_lasts_atom; size_t l_lasts_atom_count=0; size_t* l_lasts_atom_size =NULL; diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 833697d368db7f3974aa6c173f9dcf68256b67e8..5d8756db08e9c0b3192169a873a21f218cf8613f 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -297,7 +297,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s // if no atom provided in arguments, we flush all the atoms in given chain size_t l_atom_size = a_atom_size ? a_atom_size : 0; size_t l_total_wrote_bytes = 0, l_count = 0; - dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain); + dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id); if (!a_atom) { fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET); } diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 40899a1088a99ad4a96319f4ab98ebdbd0e30ef3..6925d627291f1202e534e3f0040bdb36412dec0a 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -47,6 +47,7 @@ typedef struct dap_chain_atom_iter{ dap_chain_t * chain; dap_chain_atom_ptr_t cur; dap_chain_hash_fast_t *cur_hash; + dap_chain_cell_id_t cell_id; size_t cur_size; void * cur_item; void * _inheritor; @@ -70,7 +71,7 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t); typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void); -typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t * ); +typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t); typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t); typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*); typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * ); @@ -185,5 +186,5 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); -dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); -bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash); +dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size, dap_chain_cell_id_t a_cell_id); +bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash, dap_chain_cell_id_t a_cell_id); diff --git a/modules/channel/chain-net-srv/CMakeLists.txt b/modules/channel/chain-net-srv/CMakeLists.txt index 5b511f0528c7cf6bc52c5139b7f2fe72464d2458..99175488200aa2962f42c06c1e8628b57a8731b2 100644 --- a/modules/channel/chain-net-srv/CMakeLists.txt +++ b/modules/channel/chain-net-srv/CMakeLists.txt @@ -6,7 +6,7 @@ file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_HDRS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_NET_SRV_SRCS} ${DAP_STREAM_CH_CHAIN_NET_SRV_HDRS}) -target_link_libraries(dap_stream_ch_chain_net_srv dap_core dap_crypto dap_chain_common dap_chain dap_chain_mempool dap_chain_net dap_chain_net_srv dap_server_core dap_stream dap_stream_ch dap_stream_ch_chain dap_stream_ch_chain_net) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain_common dap_chain dap_chain_mempool dap_chain_net dap_chain_net_srv dap_server_core dap_stream dap_stream_ch dap_stream_ch_chain dap_stream_ch_chain_net) -target_include_directories(dap_stream_ch_chain_net_srv INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/channel/chain-net/CMakeLists.txt b/modules/channel/chain-net/CMakeLists.txt index 90b038e903c5cc5eb25487fbe19ba0d5ba7c1861..c7166b01ad46da9f45d0921c93ecac3a75e952af 100644 --- a/modules/channel/chain-net/CMakeLists.txt +++ b/modules/channel/chain-net/CMakeLists.txt @@ -6,9 +6,9 @@ file(GLOB DAP_STREAM_CH_CHAIN_NET_HDRS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_NET_SRCS} ${DAP_STREAM_CH_CHAIN_NET_HDRS}) -target_link_libraries(dap_stream_ch_chain_net dap_core dap_crypto dap_stream dap_stream_ch dap_stream_ch_chain +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch dap_stream_ch_chain dap_chain_net) -target_include_directories(dap_stream_ch_chain_net INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src) diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index c54f1ae14aa4f12b7c27117565461b329b8e8736..26ad6039af414d7ecac28bf899e8c6c095ddad43 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -299,7 +299,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_err_str,sizeof (l_err_str)); dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); } else { - dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_net, &l_net->pub.cell_id ); + dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_ch_chain_net_pkt->hdr.net_id); dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE , l_ch_chain_net_pkt->hdr.net_id, l_addr_new, sizeof (*l_addr_new)); dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); diff --git a/modules/channel/chain/CMakeLists.txt b/modules/channel/chain/CMakeLists.txt index 048805b30881b55e65ca563fe723cdeb1c492d6c..e5a850a5c789c625579eae5b7a10a7b34a78f699 100644 --- a/modules/channel/chain/CMakeLists.txt +++ b/modules/channel/chain/CMakeLists.txt @@ -6,8 +6,8 @@ file(GLOB DAP_STREAM_CH_CHAIN_HDRS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_SRCS} ${DAP_STREAM_CH_CHAIN_HDRS}) -target_link_libraries(dap_stream_ch_chain dap_core dap_crypto dap_chain dap_stream dap_stream_ch) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_stream dap_stream_ch) -target_include_directories(dap_stream_ch_chain INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src) diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 85bcc06fe19016aafcf0adff7d61d053a83d17e8..006c0cbc372571a976aabc7167a90de6b342fdde 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -288,7 +288,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); assert(l_chain); //pthread_rwlock_rdlock(&l_chain->atoms_rwlock); - l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain); + l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id); size_t l_first_size = 0; dap_chain_atom_ptr_t l_iter = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size); if (l_iter && l_first_size) { @@ -478,7 +478,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) uint64_t l_atom_copy_size = l_pkt_item->pkt_data_size; dap_hash_fast(l_atom_copy, l_atom_copy_size, &l_atom_hash); size_t l_atom_size = 0; - if (dap_chain_get_atom_by_hash(l_chain, &l_atom_hash, &l_atom_size)) { + if (dap_chain_get_atom_by_hash(l_chain, &l_atom_hash, &l_atom_size, l_sync_request->request_hdr.cell_id)) { if (s_debug_more){ char l_atom_hash_str[72] = {'\0'}; dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); @@ -1035,7 +1035,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(s_debug_more) log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016"DAP_UINT64_FORMAT_X, l_chain->name, l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64); - l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain); + l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id); l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL); memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t)); dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START, @@ -1276,7 +1276,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_chain_sync_request_t l_request={}; dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); if( l_chain){ - dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from); // Move away from i/o reactor to callback processor + dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from, l_chain_pkt->hdr.cell_id); // Move away from i/o reactor to callback processor if( dap_log_level_get()<= L_INFO){ char l_hash_from_str[70]={[0]='\0'}; dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1); diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt index 1a4670336869329ba4f7dff0936354b4ad674119..7689148fe4e70b39da308ebeb5a88cb3f1bc875b 100644 --- a/modules/common/CMakeLists.txt +++ b/modules/common/CMakeLists.txt @@ -6,5 +6,5 @@ file(GLOB DAP_CHAIN_COMMON_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_COMMON_SRCS} ${DAP_CHAIN_COMMON_HEADERS}) -target_link_libraries(dap_chain_common dap_core dap_crypto ) -target_include_directories(dap_chain_common PUBLIC include/ ) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto ) +target_include_directories(${PROJECT_NAME} PUBLIC include/ ) diff --git a/modules/consensus/block-poa/CMakeLists.txt b/modules/consensus/block-poa/CMakeLists.txt index d54c77b2d6de9a7bded5e2f4413b1791d87fb394..086591aba66c41d3e17a19d4b725cb1fea19e9a5 100644 --- a/modules/consensus/block-poa/CMakeLists.txt +++ b/modules/consensus/block-poa/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_BLOCK_CS_POA_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POA_SRCS} ${DAP_CHAIN_BLOCK_CS_POA_HEADERS}) -target_link_libraries(dap_chain_cs_block_poa dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake) -target_include_directories(dap_chain_cs_block_poa INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/block-pos/CMakeLists.txt b/modules/consensus/block-pos/CMakeLists.txt index 2417e6529e529168867e0f383b60606f07463e1a..587d3b2d0219d463bef78a67f7d2ed8dfc62016f 100644 --- a/modules/consensus/block-pos/CMakeLists.txt +++ b/modules/consensus/block-pos/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_CS_BLOCK_POS_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_BLOCK_POS_SRCS} ${DAP_CHAIN_CS_BLOCK_POS_HEADERS}) -target_link_libraries(dap_chain_cs_block_pos dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake) -target_include_directories(dap_chain_cs_block_pos INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/block-pow/CMakeLists.txt b/modules/consensus/block-pow/CMakeLists.txt index 334d6eb6a932e22561749a8c14863ac1f7ca81d2..9f3cc01638bae46853fde94ac5cf5fe0a237561e 100644 --- a/modules/consensus/block-pow/CMakeLists.txt +++ b/modules/consensus/block-pow/CMakeLists.txt @@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_BLOCK_CS_POW_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POW_SRCS} ${DAP_CHAIN_BLOCK_CS_POW_HEADERS}) -target_link_libraries(dap_chain_cs_block_pow dap_core dap_crypto dap_chain dap_chain_cs_block ) -target_include_directories(dap_chain_block_cs_pow INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_block ) +target_include_directories(${PROJECT_NAME} INTERFACE .) diff --git a/modules/consensus/dag-poa/CMakeLists.txt b/modules/consensus/dag-poa/CMakeLists.txt index 12a35ad6a4d8dbf26282473857fc694eb38d5ce6..457d52f9abf7243c6903838c650ec0b595d85a51 100644 --- a/modules/consensus/dag-poa/CMakeLists.txt +++ b/modules/consensus/dag-poa/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_DAG_CS_POA_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_CS_POA_SRCS} ${DAP_CHAIN_DAG_CS_POA_HEADERS}) -target_link_libraries(dap_chain_cs_dag_poa dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) -target_include_directories(dap_chain_cs_dag_poa INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index ef2ef81218e97053e8e3bc658673289036518f8b..6b763948e957d283f07c21107deffb15819687d2 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -352,14 +352,13 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size) { dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POA(a_dag), NULL); - dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name ); dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag); if ( PVT(l_poa)->events_sign_cert == NULL){ log_it(L_ERROR, "Can't sign event with events_sign_cert in [dag-poa] section"); return NULL; } if ( s_seed_mode || (a_hashes && a_hashes_count) ){ - dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new( a_dag->chain->id, l_net->pub.cell_id, a_datum, + dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new( a_dag->chain->id, a_dag->chain->cells->id, a_datum, PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count,a_event_size); return l_event; }else diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt index 8b8dff9976790e5c248009bed61dd6736fe6b216..33b2032af8fdda1b7e8f751d0c06ebb0899b0e00 100644 --- a/modules/consensus/dag-pos/CMakeLists.txt +++ b/modules/consensus/dag-pos/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_CS_DAG_POS_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_DAG_POS_SRCS} ${DAP_CHAIN_CS_DAG_POS_HEADERS}) -target_link_libraries(dap_chain_cs_dag_pos dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) -target_include_directories(dap_chain_cs_dag_pos INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index 5a98adfca649e6f5c3350516aebe572741f40bcb..72e5876bf81ac50f72f8c5bc5ee13cf57c9a6b4a 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -27,6 +27,7 @@ #include "dap_common.h" #include "dap_string.h" #include "dap_strfuncs.h" +#include "dap_chain_cell.h" #include "dap_chain_cs.h" #include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag_pos.h" @@ -204,7 +205,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a return NULL; } if(a_datum || (a_hashes && a_hashes_count)) { - dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, l_net->pub.cell_id, a_datum, + dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_datum, PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size); return l_event; } else diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 41ca84f3ce86d6a9a90036a053d600d9a035036f..415910ef4d43c9b4cb2e4f153d464d3d13cec7c3 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -33,6 +33,7 @@ #include "dap_strfuncs.h" #include "dap_config.h" #include "dap_hash.h" +#include "dap_chain_cell.h" #include "dap_chain_ledger.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_driver.h" @@ -70,7 +71,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Verify new event in gdb static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get gdb event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id); static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, dap_chain_atom_ptr_t a, size_t a_atom_size); @@ -96,7 +97,11 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain /** - * Stub for consensus + * @brief stub for consensus + * + * @param a_chain chain object + * @param a_chain_cfg chain config object + * @return int */ static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { @@ -119,14 +124,14 @@ int dap_chain_gdb_init(void) } /** - * @brief s_history_callback_notify - * @param a_arg - * @param a_op_code - * @param a_prefix - * @param a_group - * @param a_key - * @param a_value - * @param a_value_len + * @brief if current network in ONLINE state send to all connected node + * executes, when you add data to gdb chain (class=gdb in chain config) + * @param a_arg arguments. Can be network object (dap_chain_net_t) + * @param a_op_code object type (f.e. l_net->type from dap_store_obj) + * @param a_group group, for example "chain-gdb.home21-network.chain-F" + * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93 + * @param a_value buffer with data + * @param a_value_len buffer size */ static void s_history_callback_notify(void * a_arg, const char a_op_code, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size) @@ -141,15 +146,22 @@ static void s_history_callback_notify(void * a_arg, const char a_op_code, const } } +/** + * @brief set PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true + * + * @param a_chain dap_chain_t object + */ static void s_dap_chain_gdb_callback_purge(dap_chain_t *a_chain) { PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true; } /** - * @brief dap_chain_gdb_new - * @param a_chain - * @param a_chain_cfg + * @brief configure chain gdb + * Set atom element callbacks + * @param a_chain dap_chain_t chain object + * @param a_chain_cfg dap_config_t config object + * @return int */ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { @@ -165,12 +177,11 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_gdb_priv->chain = a_chain; if(!l_gdb_priv->celled){ - l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016llX",l_net->pub.name, + l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name, a_chain->id.uint64); }else { - // here is not work because dap_chain_net_load() not yet fully performed - l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016llX.cell-%016llX",l_net->pub.name, - a_chain->id.uint64, l_net->pub.cell_id.uint64); + l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X".cell-%016"DAP_UINT64_FORMAT_X,l_net->pub.name, + a_chain->id.uint64, a_chain->cells->id.uint64); } // Add group prefix that will be tracking all changes @@ -208,9 +219,9 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) } /** - * @brief dap_chain_cs_gdb_delete - * @param a_chain - * @return + * @brief clear dap_chain_gdb_t object + * + * @param a_chain dap_chain_t chain object */ void dap_chain_gdb_delete(dap_chain_t * a_chain) { @@ -224,9 +235,10 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain) } /** - * @brief dap_chain_gdb_get_group - * @param a_chain - * @return group name for ledger + * @brief get group name for ledger + * + * @param a_chain dap_chain_t * chain object + * @return const char* */ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) { @@ -257,9 +269,11 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) }*/ /** - * Load ledger from mempool - * - * return 0 if OK otherwise negative error code + * @brief Load ledger from mempool + * + * @param a_gdb_group a_gdb_group char gdb group name + * @param a_chain chain dap_chain_t object + * @return int return 0 if OK otherwise negative error code */ int dap_chain_gdb_ledger_load(char *a_gdb_group, dap_chain_t *a_chain) { @@ -276,10 +290,12 @@ int dap_chain_gdb_ledger_load(char *a_gdb_group, dap_chain_t *a_chain) } /** - * @brief s_chain_callback_datums_add - * @param a_chain - * @param a_datums - * @param a_datums_size + * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array + * + * @param a_chain dap_chain_t chain object (f.e. plasma) + * @param a_datums dap_chain_datum array with dap_chain_datum objects + * @param a_datums_count object counts in datums array + * @return size_t */ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count) @@ -291,6 +307,15 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain return a_datums_count; } +/** + * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array only if chain contains specific group (chain-gdb.home21-network.chain-F) + * + * @param a_chain dap_chain_t chain object (f.e. plasma) + * @param a_datums dap_chain_datum array with dap_chain_datum objects + * @param a_datums_count object counts in datums array + * @param a_group group name + * @return size_t + */ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count, const char *a_group) { @@ -300,10 +325,12 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain } /** - * @brief s_chain_callback_datums_add - * @param a_chain - * @param a_datums - * @param a_datums_size + * @brief add atom to DB + * + * @param a_chain chaon object + * @param a_atom pointer to atom + * @param a_atom_size atom size + * @return dap_chain_atom_verify_res_t */ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { @@ -359,10 +386,12 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha } /** - * @brief s_chain_callback_atom_verify Verify atomic element - * @param a_chain - * @param a_atom - * @return + * @brief Verify atomic element (currently simply return ATOM_ACCEPT) + * + * @param a_chain chain object + * @param a_atom pointer to atom + * @param a_atom_size size of atom + * @return dap_chain_atom_verify_res_t */ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { @@ -374,9 +403,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ /** - * @brief s_chain_callback_atom_get_static_hdr_size - * @param a_chain - * @return + * @brief return size of dap_chain_datum_t l_datum_null->header + * + * @return size_t */ static size_t s_chain_callback_atom_get_static_hdr_size() { @@ -385,22 +414,26 @@ static size_t s_chain_callback_atom_get_static_hdr_size() } /** - * @brief s_chain_callback_atom_iter_create Create atomic element iterator - * @param a_chain - * @return + * @brief Create atomic element iterator + * + * @param a_chain dap_chain_t a_chain + * @return dap_chain_atom_iter_t* */ -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain) +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_iter->chain = a_chain; + l_iter->cell_id = a_cell_id; return l_iter; } /** - * @brief s_chain_callback_atom_iter_create_from - * @param a_chain - * @param a_atom - * @return + * @brief create atom object (dap_chain_atom_iter_t) + * + * @param a_chain chain object + * @param a_atom pointer to atom + * @param a_atom_size size of atom + * @return dap_chain_atom_iter_t* */ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) @@ -413,8 +446,9 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t } /** - * @brief s_chain_callback_atom_iter_delete Delete dag event iterator - * @param a_atom_iter + * @brief Delete dag event iterator + * execute DAP_DELETE(a_atom_iter) + * @param a_atom_iter dap_chain_atom_iter_t object */ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter) { @@ -422,11 +456,12 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite } /** - * @brief s_chain_callback_atom_iter_find_by_hash - * @details Searchs by datum data hash, not for datum's hash itself - * @param a_atom_iter - * @param a_atom_hash - * @return + * @brief get dap_chain_atom_ptr_t object form database by hash + * @details Searchs by datum data hash, not for datum's hash itself + * @param a_atom_iter dap_chain_atom_iter_t atom object + * @param a_atom_hash dap_chain_hash_fast_t atom hash + * @param a_atom_size size of atom object + * @return dap_chain_atom_ptr_t */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size) @@ -442,9 +477,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at } /** - * @brief s_chain_callback_atom_iter_get_first Get the first dag event - * @param a_atom_iter - * @return + * @brief Get the first dag event from database + * + * @param a_atom_iter ap_chain_atom_iter_t object + * @param a_atom_size a_atom_size atom size + * @return dap_chain_atom_ptr_t */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size) { @@ -467,9 +504,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ } /** - * @brief s_chain_callback_atom_iter_get_next Get the next dag event - * @param a_atom_iter - * @return + * @brief Get the next dag event from database + * + * @param a_atom_iter dap_chain_atom_iter_t + * @param a_atom_size size_t a_atom_size + * @return dap_chain_atom_ptr_t */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size) { @@ -491,10 +530,12 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i } /** - * @brief s_chain_callback_atom_iter_get_links - * @param a_atom_iter - * @param a_links_size_ptr - * @return + * @brief return null in current implementation + * + * @param a_atom_iter + * @param a_links_size_ptr + * @param a_links_sizes_ptr + * @return dap_chain_atom_ptr_t* */ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, size_t * a_links_size_ptr, size_t **a_links_sizes_ptr) @@ -506,10 +547,12 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom } /** - * @brief s_chain_callback_atom_iter_get_lasts - * @param a_atom_iter - * @param a_lasts_size_ptr - * @return + * @brief return null in current implementation + * + * @param a_atom_iter + * @param a_lasts_size_ptr + * @param a_links_sizes_ptr + * @return dap_chain_atom_ptr_t* */ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, size_t * a_lasts_size_ptr, size_t **a_links_sizes_ptr) @@ -520,6 +563,14 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom return NULL; } +/** + * @brief get new datum object from atom + * + * @param a_atom atom object + * @param a_atom_size atom size + * @param a_datums_count count of datums + * @return dap_chain_datum_t** + */ static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count) { UNUSED(a_atom_size); diff --git a/modules/dht/CMakeLists.txt b/modules/dht/CMakeLists.txt index bbdec344aedccb617eb268dd679fd2f88e308f85..d1c37c570e7f993b87413a06d65d8b27488caa7a 100644 --- a/modules/dht/CMakeLists.txt +++ b/modules/dht/CMakeLists.txt @@ -13,6 +13,6 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DHT_SRC} ${DAP_CHAIN_DHT_HDR}) target_link_libraries(${PROJECT_NAME} ${DAP_CHAIN_DHT_LIBS}) -target_include_directories(dap_chain_dht INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/global-db/CMakeLists.txt b/modules/global-db/CMakeLists.txt index 1be3f9836b5bc6c6cb5ab89e00c59cc274fc1214..1d22fa8fc7419a150c632feda51d79d4085baf46 100644 --- a/modules/global-db/CMakeLists.txt +++ b/modules/global-db/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_GLOBAL_DB_SRC} ${DAP_CHAIN_GLOBAL target_link_libraries(${PROJECT_NAME} ${DAP_CHAIN_GLOBAL_DB_LIBS}) -target_include_directories(dap_chain_global_db INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src) diff --git a/modules/mempool/CMakeLists.txt b/modules/mempool/CMakeLists.txt index f2d0ede23294b502d943b706cbcc2273f1242944..b337f93df4d86b0d331ad9c9ba7cbaed078a5d21 100644 --- a/modules/mempool/CMakeLists.txt +++ b/modules/mempool/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_MEMPOOL_HDR include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_MEMPOOL_SRC} ${DAP_CHAIN_MEMPOOL_HDR}) -target_link_libraries(dap_chain_mempool dap_http_server dap_client dap_chain_net dap_chain_global_db dap_core) -target_include_directories(dap_chain_mempool INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_http_server dap_client dap_chain_net dap_chain_global_db dap_core) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/mining/CMakeLists.txt b/modules/mining/CMakeLists.txt index 3e4e88edd39b4acd5e3154d799278b2d20b83112..5950015428d51b7a2359c33fdfe4241b75508844 100644 --- a/modules/mining/CMakeLists.txt +++ b/modules/mining/CMakeLists.txt @@ -12,7 +12,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CRYPTO_SRCS} ${DAP_CHAIN_CRYPTO_H target_include_directories(dap_chain_crypto INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) -target_link_libraries(dap_chain_crypto dap_core dap_crypto dap_chain monero_crypto) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain monero_crypto) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index e2548f03a57de335cf8b54a4f443304c0bb15b17..ac3dbf15c4ef6ae3f5a052ae48b077c7fcdcb362 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -341,7 +341,8 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj); dap_store_obj_free(l_obj, 1); dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); - dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {}; + dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t){}; + dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){}; pthread_rwlock_rdlock(&PVT(l_net)->rwlock); for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; @@ -349,7 +350,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c if (l_stream_worker) continue; dap_stream_ch_chain_pkt_write_mt(l_stream_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64, - l_chain_id.uint64, l_net->pub.cell_id.uint64, l_data_out, + l_chain_id.uint64, l_cell_id.uint64, l_data_out, sizeof(dap_store_obj_pkt_t) + l_data_out->data_size); } pthread_rwlock_unlock(&PVT(l_net)->rwlock); @@ -1962,8 +1963,6 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) NODE_ADDR_FP_ARGS(l_node_addr), l_net_pvt->node_info->hdr.links_number, l_net_pvt->node_info->hdr.cell_id.uint64); - // save cell_id - l_net->pub.cell_id.uint64 = l_net_pvt->node_info->hdr.cell_id.uint64; } } else{ diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index c4f73594b6b4d1e1a59d7f398fb2c398b29eab27..bf92f61f6bd6b2d22c27bf859fa61800f06bb324 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -51,32 +51,31 @@ /** * Generate node address by shard id */ -dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * a_net,dap_chain_cell_id_t *shard_id) +dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id) { - if(!shard_id) - return NULL; - dap_chain_node_addr_t *a_addr = DAP_NEW_Z(dap_chain_node_addr_t); - dap_chain_hash_fast_t a_hash; - dap_hash_fast(shard_id, sizeof(dap_chain_cell_id_t), &a_hash); + dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t); + dap_chain_hash_fast_t l_hash; + dap_hash_fast(&a_net_id, sizeof(dap_chain_net_id_t), &l_hash); // first 4 bytes is last 4 bytes of shard id hash - memcpy(a_addr->raw, a_hash.raw + sizeof(a_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); + memcpy(l_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); // last 4 bytes is random - randombytes(a_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); + randombytes(l_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); // for LITTLE_ENDIAN (Intel), do nothing, otherwise swap bytes - a_addr->uint64 = le64toh(a_addr->uint64); // a_addr->raw the same a_addr->uint64 - return a_addr; + l_addr->uint64 = le64toh(l_addr->uint64); // l_addr->raw the same l_addr->uint64 + return l_addr; } /** * Check the validity of the node address by cell id */ -bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *shard_id) +bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_addr) { - bool ret = false; - if(!addr || !shard_id) - ret= false; - - return ret; + if (!a_addr || !a_net) + return false; + dap_chain_hash_fast_t l_hash; + dap_hash_fast(&a_net->pub.id, sizeof(dap_chain_net_id_t), &l_hash); + // first 4 bytes is last 4 bytes of shard id hash + return !memcmp(a_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); } /** @@ -225,7 +224,7 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha return node_info; }*/ -bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum) +int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum) { bool l_need_process = false; for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) { @@ -235,21 +234,18 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t } } if (!l_need_process) - return false; + return -1; if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data; dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL); // Is not it a base transaction? if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) { if (a_role.enums == NODE_ROLE_ROOT) { - return false; + return -1; } } } - if (a_chain->callback_add_datums(a_chain, &a_datum, 1) != 1) { - return false; - } - return true; + return (int)a_chain->callback_add_datums(a_chain, &a_datum, 1); } static bool s_mempool_auto = false; @@ -291,12 +287,13 @@ bool dap_chain_node_mempool_autoproc_init() dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if (l_objs_size) { for (size_t i = 0; i < l_objs_size; i++) { - // Delete processed objects - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); if (!l_objs[i].value_len) continue; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; - dap_chain_node_mempool_process(l_chain, l_role, l_datum); + if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) > 0) { + // Delete processed objects + dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + } } dap_chain_global_db_objs_delete(l_objs, l_objs_size); } @@ -333,7 +330,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c if (!strcmp(a_group, l_gdb_group_str)) { dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value; dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net); - if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { + if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) > 0) { dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str); } } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index a910f232d0b3e19084e0a30cf8dec5588e492fde..7fb56397a1f65f2911732a3eb67ff22b72b94d63 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -27,6 +27,7 @@ #include <pthread.h> #include "dap_chain_wallet.h" +#include "dap_chain_cell.h" #include "dap_common.h" #include "dap_enc_base58.h" #include "dap_strfuncs.h" @@ -508,250 +509,260 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, bool l_tx_hash_found = false; dap_tx_data_t *l_tx_data_hash = NULL; - // load transactions - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - size_t l_atom_size = 0; - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + dap_chain_cell_t *l_cell = a_chain->cells; + do { + // load transactions + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + size_t l_atom_size = 0; + dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + + while(l_atom && l_atom_size) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_atom; + if(!l_datum && (l_datum->header.type_id != DAP_CHAIN_DATUM_TX && l_datum->header.type_id != DAP_CHAIN_DATUM_256_TX ) ) { + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + continue; + } - while(l_atom && l_atom_size) { - dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_atom; - if(!l_datum && (l_datum->header.type_id != DAP_CHAIN_DATUM_TX && l_datum->header.type_id != DAP_CHAIN_DATUM_256_TX ) ) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; - } + bool l_type_256 = false; - bool l_type_256 = false; + if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX ) + l_type_256 = true; - if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX ) - l_type_256 = true; + dap_tx_data_t *l_tx_data = NULL; - dap_tx_data_t *l_tx_data = NULL; + // transaction + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; - // transaction - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; + // find Token items - present in emit transaction + // dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); - // find Token items - present in emit transaction - // dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); + dap_list_t *l_list_tx_token; + if ( l_type_256 ) // 256 + l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_TOKEN, NULL); + else + l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); - dap_list_t *l_list_tx_token; - if ( l_type_256 ) // 256 - l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_TOKEN, NULL); - else - l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); + // find OUT items + // dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - // find OUT items - // dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); + dap_list_t *l_list_out_items; + if ( l_type_256 ) // 256 + l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL); + else + l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - dap_list_t *l_list_out_items; - if ( l_type_256 ) // 256 - l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL); - else - l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - - dap_list_t *l_list_tmp = l_list_out_items; - while(l_list_tmp) { - - const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; - - // save OUT item l_tx_out - only for first OUT item - if(!l_tx_data) { - // save tx hash - l_tx_data = DAP_NEW_Z(dap_tx_data_t); - dap_chain_hash_fast_t l_tx_hash; - dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); - memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); - if ( l_type_256 ) // 256 - memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); - else - memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t)); - - dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str, - sizeof(l_tx_data->tx_hash_str)); - //l_tx_data->pos_num = l_count; - //l_tx_data->datum = l_datum; - l_tx_data->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_atom_size); - memcpy(l_tx_data->datum, l_datum, l_atom_size); - // save token name - if(l_list_tx_token) { - dap_chain_tx_token_t *tk = l_list_tx_token->data; - memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker)); - } - // take token from prev out item - else { + dap_list_t *l_list_tmp = l_list_out_items; - // find IN items - dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); - dap_list_t *l_list_tmp_in = l_list_in_items; - // find token_ticker in prev OUT items - while(l_list_tmp_in) { - const dap_chain_tx_in_t *l_tx_in = - (const dap_chain_tx_in_t*) l_list_tmp_in->data; - dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; + while(l_list_tmp) { - //find prev OUT item - dap_tx_data_t *l_tx_data_prev = NULL; - HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), - l_tx_data_prev); - if(l_tx_data_prev != NULL) { - // fill token in l_tx_data from prev transaction - if(l_tx_data) { - // get token from prev tx - memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, - sizeof(l_tx_data->token_ticker)); - break; + const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; + const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; + + // save OUT item l_tx_out - only for first OUT item + if(!l_tx_data) { + // save tx hash + l_tx_data = DAP_NEW_Z(dap_tx_data_t); + dap_chain_hash_fast_t l_tx_hash; + dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); + memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); + if ( l_type_256 ) // 256 + memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); + else + memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t)); + + dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str, + sizeof(l_tx_data->tx_hash_str)); + //l_tx_data->pos_num = l_count; + //l_tx_data->datum = l_datum; + l_tx_data->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_atom_size); + memcpy(l_tx_data->datum, l_datum, l_atom_size); + // save token name + if(l_list_tx_token) { + dap_chain_tx_token_t *tk = l_list_tx_token->data; + memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker)); + } + else { + + // find IN items + dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); + dap_list_t *l_list_tmp_in = l_list_in_items; + // find token_ticker in prev OUT items + while(l_list_tmp_in) { + const dap_chain_tx_in_t *l_tx_in = + (const dap_chain_tx_in_t*) l_list_tmp_in->data; + dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; + + //find prev OUT item + dap_tx_data_t *l_tx_data_prev = NULL; + HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), + l_tx_data_prev); + if(l_tx_data_prev != NULL) { + // fill token in l_tx_data from prev transaction + if(l_tx_data) { + // get token from prev tx + memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, + sizeof(l_tx_data->token_ticker)); + break; + } + l_list_tmp_in = dap_list_next(l_list_tmp_in); } - l_list_tmp_in = dap_list_next(l_list_tmp_in); } + if(l_list_in_items) + dap_list_free(l_list_in_items); } - if(l_list_in_items) - dap_list_free(l_list_in_items); + HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data); } - HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data); + l_list_tmp = dap_list_next(l_list_tmp); } - l_list_tmp = dap_list_next(l_list_tmp); - } - if(l_list_out_items) - dap_list_free(l_list_out_items); - // calc hash - dap_chain_hash_fast_t l_tx_hash; - dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); - // search tx with a_tx_hash - if(!dap_hash_fast_compare(a_tx_hash, &l_tx_hash)) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; - } - // found a_tx_hash now - - // transaction time - if(l_tx->header.ts_created > 0) { - time_t rawtime = (time_t) l_tx->header.ts_created; - struct tm l_timeinfo = {0}; - localtime_r(&rawtime, &l_timeinfo); - dap_string_append_printf(l_str_out, " %s", asctime(&l_timeinfo)); - } + if(l_list_out_items) + dap_list_free(l_list_out_items); - // find all OUT items in transaction - if ( l_type_256 ) - l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL); - else - l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - l_list_tmp = l_list_out_items; - while(l_list_tmp) { - const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; - //dap_tx_data_t *l_tx_data_prev = NULL; - - const char *l_token_str = NULL; - if(l_tx_data) - l_token_str = l_tx_data->token_ticker; - char *l_dst_to_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : - (l_tx_out_256) ? dap_chain_addr_to_str(&l_tx_out_256->addr) : NULL; - - if(l_tx_out || l_tx_out_256) { - if ( l_type_256 ) // 256 - dap_string_append_printf(l_str_out, " OUT 256_t item %s %s to %s\n", - dap_chain_u256tostr(l_tx_out_256->header.value), - dap_strlen(l_token_str) > 0 ? l_token_str : "?", - l_dst_to_str ? l_dst_to_str : "?" - ); - else - dap_string_append_printf(l_str_out, " OUT item %"DAP_UINT64_FORMAT_U" %s to %s\n", - l_tx_out->header.value, - dap_strlen(l_token_str) > 0 ? l_token_str : "?", - l_dst_to_str ? l_dst_to_str : "?" - ); - } - DAP_DELETE(l_dst_to_str); - l_list_tmp = dap_list_next(l_list_tmp); - } - // find all IN items in transaction - dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); - l_list_tmp = l_list_in_items; - // find cur addr in prev OUT items - while(l_list_tmp) { - const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_tmp->data; - dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; - char l_tx_hash_str[70]; - char *tx_hash_base58_str = NULL; - if(!dap_hash_fast_is_blank(&tx_prev_hash)){ - tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); - dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); + // calc hash + dap_chain_hash_fast_t l_tx_hash; + dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); + // search tx with a_tx_hash + if(!dap_hash_fast_compare(a_tx_hash, &l_tx_hash)) { + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + continue; } - else{ - strcpy(l_tx_hash_str, "Null"); - tx_hash_base58_str = dap_strdup("Null"); + // found a_tx_hash now + + // transaction time + if(l_tx->header.ts_created > 0) { + time_t rawtime = (time_t) l_tx->header.ts_created; + struct tm l_timeinfo = {0}; + localtime_r(&rawtime, &l_timeinfo); + dap_string_append_printf(l_str_out, " %s", asctime(&l_timeinfo)); } - if(!dap_strcmp(a_hash_out_type,"hex")) - dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", l_tx_hash_str); + + // find all OUT items in transaction + if ( l_type_256 ) + l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL); else - dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", tx_hash_base58_str); - DAP_DELETE(tx_hash_base58_str); - - //find prev OUT item - dap_tx_data_t *l_tx_data_prev = NULL; - HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); - if(l_tx_data_prev != NULL) { - - dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); - dap_chain_datum_tx_t *l_tx_prev = - l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; - - if ( l_type_256 ) { // 256 - // find OUT items in prev datum - dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, - TX_ITEM_TYPE_256_OUT, NULL); - // find OUT item for IN item; - dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, - l_tx_in->header.tx_out_prev_idx); - dap_chain_256_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? (dap_chain_256_tx_out_t*)l_list_out_prev_item->data : NULL; - // print value from prev out item - dap_string_append_printf(l_str_out, " prev OUT 256_t item value=%s", - l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value) : "0"); - } else { - dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, - TX_ITEM_TYPE_OUT, NULL); - dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, - l_tx_in->header.tx_out_prev_idx); - dap_chain_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : NULL; - dap_string_append_printf(l_str_out, " prev OUT item value=%"DAP_UINT64_FORMAT_U, - l_tx_prev_out ? l_tx_prev_out->header.value : 0); + l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); + l_list_tmp = l_list_out_items; + + while(l_list_tmp) { + const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; + const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; + //dap_tx_data_t *l_tx_data_prev = NULL; + + const char *l_token_str = NULL; + if(l_tx_data) + l_token_str = l_tx_data->token_ticker; + char *l_dst_to_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : + (l_tx_out_256) ? dap_chain_addr_to_str(&l_tx_out_256->addr) : NULL; + + if(l_tx_out || l_tx_out_256) { + if ( l_type_256 ) // 256 + dap_string_append_printf(l_str_out, " OUT 256_t item %s %s to %s\n", + dap_chain_u256tostr(l_tx_out_256->header.value), + dap_strlen(l_token_str) > 0 ? l_token_str : "?", + l_dst_to_str ? l_dst_to_str : "?" + ); + else + dap_string_append_printf(l_str_out, " OUT item %"DAP_UINT64_FORMAT_U" %s to %s\n", + l_tx_out->header.value, + dap_strlen(l_token_str) > 0 ? l_token_str : "?", + l_dst_to_str ? l_dst_to_str : "?" + ); } + DAP_DELETE(l_dst_to_str); + l_list_tmp = dap_list_next(l_list_tmp); } - dap_string_append_printf(l_str_out, "\n"); - l_list_tmp = dap_list_next(l_list_tmp); - } - if(l_list_tx_token) - dap_list_free(l_list_tx_token); - if(l_list_out_items) - dap_list_free(l_list_out_items); - if(l_list_in_items) - dap_list_free(l_list_in_items); - l_tx_hash_found = true; - break; - - // go to next transaction - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - //l_atom_size = a_chain->callback_atom_get_size(l_atom); - } - a_chain->callback_atom_iter_delete(l_atom_iter); - - // delete hashes - dap_tx_data_t *l_iter_current, *l_item_tmp; - HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) - { - HASH_DEL(l_tx_data_hash, l_iter_current); - // delete datum - DAP_DELETE(l_iter_current->datum); - // delete struct - DAP_DELETE(l_iter_current); - } + // find all IN items in transaction + dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); + l_list_tmp = l_list_in_items; + // find cur addr in prev OUT items + while(l_list_tmp) { + const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_tmp->data; + dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; + char l_tx_hash_str[70]; + char *tx_hash_base58_str = NULL; + if(!dap_hash_fast_is_blank(&tx_prev_hash)){ + tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); + dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); + + } + else{ + strcpy(l_tx_hash_str, "Null"); + tx_hash_base58_str = dap_strdup("Null"); + } + if(!dap_strcmp(a_hash_out_type,"hex")) + dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", l_tx_hash_str); + else + dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", tx_hash_base58_str); + DAP_DELETE(tx_hash_base58_str); + + + //find prev OUT item + dap_tx_data_t *l_tx_data_prev = NULL; + HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); + if(l_tx_data_prev != NULL) { + + dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); + dap_chain_datum_tx_t *l_tx_prev = + l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; + + if ( l_type_256 ) { // 256 + // find OUT items in prev datum + dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, + TX_ITEM_TYPE_256_OUT, NULL); + // find OUT item for IN item; + dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, + l_tx_in->header.tx_out_prev_idx); + dap_chain_256_tx_out_t *l_tx_prev_out = + l_list_out_prev_item ? (dap_chain_256_tx_out_t*)l_list_out_prev_item->data : NULL; + // print value from prev out item + dap_string_append_printf(l_str_out, " prev OUT 256_t item value=%s", + l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value) : "0"); + } else { + dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, + TX_ITEM_TYPE_OUT, NULL); + dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, + l_tx_in->header.tx_out_prev_idx); + dap_chain_tx_out_t *l_tx_prev_out = + l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : NULL; + dap_string_append_printf(l_str_out, " prev OUT item value=%"DAP_UINT64_FORMAT_U, + l_tx_prev_out ? l_tx_prev_out->header.value : 0); + + } + } + dap_string_append_printf(l_str_out, "\n"); + l_list_tmp = dap_list_next(l_list_tmp); + } + + if(l_list_tx_token) + dap_list_free(l_list_tx_token); + if(l_list_out_items) + dap_list_free(l_list_out_items); + if(l_list_in_items) + dap_list_free(l_list_in_items); + l_tx_hash_found = true; + break; + + // go to next transaction + //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); + //l_atom_size = a_chain->callback_atom_get_size(l_atom); + } + a_chain->callback_atom_iter_delete(l_atom_iter); + + // delete hashes + dap_tx_data_t *l_iter_current, *l_item_tmp; + HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) + { + HASH_DEL(l_tx_data_hash, l_iter_current); + // delete datum + DAP_DELETE(l_iter_current->datum); + // delete struct + DAP_DELETE(l_iter_current); + } + l_cell = l_cell->hh.next; + } while (l_cell); // if no history if(!l_str_out->len) @@ -775,185 +786,140 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_string_t *l_str_out = dap_string_new(NULL); dap_tx_data_t *l_tx_data_hash = NULL; - // load transactions - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - size_t l_atom_size=0; - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); - if (!l_atom) { - return NULL; - } - - while(l_atom && l_atom_size) { - size_t l_datums_count =0; - dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums ? a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : - NULL; - if (! l_datums){ - log_it(L_WARNING,"Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); - break; + dap_chain_cell_t *l_cell = a_chain->cells; + do { + // load transactions + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + size_t l_atom_size=0; + dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + if (!l_atom) { + return NULL; } - for (size_t d=0; d< l_datums_count; d++){ - dap_chain_datum_t *l_datum = l_datums && l_datums_count ? l_datums[d] :NULL; - if(!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; - } - // transaction - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; - dap_list_t *l_records_out = NULL; - // transaction time - char *l_time_str = NULL; - { - if(l_tx->header.ts_created > 0) { - time_t rawtime = (time_t) l_tx->header.ts_created; - struct tm * timeinfo; - timeinfo = localtime(&rawtime); - if(timeinfo) - l_time_str = dap_strdup(asctime(timeinfo)); - } - else - l_time_str = dap_strdup(" "); + while(l_atom && l_atom_size) { + size_t l_datums_count =0; + dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums ? a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : + NULL; + if (! l_datums){ + log_it(L_WARNING,"Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); + break; } - // find Token items - present in emit transaction - dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); - - // list of dap_tx_data_t*; info about OUT item in current transaction - dap_list_t *l_list_out_info = NULL; - - // find OUT items - dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - dap_list_t *l_list_out_items_tmp = l_list_out_items; - while(l_list_out_items_tmp) { - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_out_items_tmp->data; - // save OUT item l_tx_out + for (size_t d=0; d< l_datums_count; d++){ + dap_chain_datum_t *l_datum = l_datums && l_datums_count ? l_datums[d] :NULL; + if(!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + continue; + } + // transaction + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; + dap_list_t *l_records_out = NULL; + // transaction time + char *l_time_str = NULL; { - // save tx hash - // info about OUT item in current transaction - dap_tx_data_t *l_tx_data = DAP_NEW_Z(dap_tx_data_t); - dap_chain_hash_fast_t l_tx_hash; - dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); - memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); - memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); - dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str, sizeof(l_tx_data->tx_hash_str)); - l_tx_data->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_atom_size); - memcpy(l_tx_data->datum, l_datum, l_atom_size); - // save token name - if(l_tx_data && l_list_tx_token) { - dap_chain_tx_token_t *tk = l_list_tx_token->data; - memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker)); + if(l_tx->header.ts_created > 0) { + time_t rawtime = (time_t) l_tx->header.ts_created; + struct tm * timeinfo; + timeinfo = localtime(&rawtime); + if(timeinfo) + l_time_str = dap_strdup(asctime(timeinfo)); } - HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data); - - // save OUT items to list - l_records_out = dap_list_append(l_records_out, (void*) l_tx_out); - // save info about OUT items to list - l_list_out_info = dap_list_append(l_list_out_info, (void*) l_tx_data); + else + l_time_str = dap_strdup(" "); } - l_list_out_items_tmp = dap_list_next(l_list_out_items_tmp); - } - - // find IN items - dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); - dap_list_t *l_list_in_items_tmp = l_list_in_items; - // find cur addr in prev OUT items - //bool l_is_use_all_cur_out = false; - { - while(l_list_in_items_tmp) { - const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items_tmp->data; - dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; - - //find prev OUT item - dap_tx_data_t *l_tx_data_prev = NULL; - HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); - if(l_tx_data_prev != NULL) { - // fill token in all l_tx_data from prev transaction - - dap_list_t *l_list_out_info_tmp = l_list_out_info; - while(l_list_out_info_tmp) { - dap_tx_data_t *l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data) { - // get token from prev tx - memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, - sizeof(l_tx_data->token_ticker)); - dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); - dap_chain_datum_tx_t *l_tx_prev = - l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; - - // find OUT items in prev datum - dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, - TX_ITEM_TYPE_OUT, NULL); - // find OUT item for IN item; - dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, - l_tx_in->header.tx_out_prev_idx); - dap_chain_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? - (dap_chain_tx_out_t*) l_list_out_prev_item->data : - NULL; - if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) - l_tx_data->is_use_all_cur_out = true; - } - l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); + // find Token items - present in emit transaction + dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL); + + // list of dap_tx_data_t*; info about OUT item in current transaction + dap_list_t *l_list_out_info = NULL; + + // find OUT items + dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); + dap_list_t *l_list_out_items_tmp = l_list_out_items; + while(l_list_out_items_tmp) { + const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_out_items_tmp->data; + // save OUT item l_tx_out + { + // save tx hash + // info about OUT item in current transaction + dap_tx_data_t *l_tx_data = DAP_NEW_Z(dap_tx_data_t); + dap_chain_hash_fast_t l_tx_hash; + dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); + memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); + memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); + dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str, sizeof(l_tx_data->tx_hash_str)); + l_tx_data->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_atom_size); + memcpy(l_tx_data->datum, l_datum, l_atom_size); + // save token name + if(l_tx_data && l_list_tx_token) { + dap_chain_tx_token_t *tk = l_list_tx_token->data; + memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker)); } + HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data); + + // save OUT items to list + l_records_out = dap_list_append(l_records_out, (void*) l_tx_out); + // save info about OUT items to list + l_list_out_info = dap_list_append(l_list_out_info, (void*) l_tx_data); } - l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp); + l_list_out_items_tmp = dap_list_next(l_list_out_items_tmp); } - // find prev OUT items for IN items - dap_list_t *l_list_in_items2_tmp = l_list_in_items; // go to begin of list - while(l_list_in_items2_tmp) { - const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items2_tmp->data; - dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; - // if first transaction - empty prev OUT item - if(dap_hash_fast_is_blank(&tx_prev_hash)) { - - dap_tx_data_t *l_tx_data = NULL; - dap_list_t *l_list_out_info_tmp = l_list_out_info; - while(l_list_out_info_tmp) { - l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data->token_ticker[0]) - break; - l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); - } - // add emit info to ret string - if(l_tx_data && !memcmp(&l_tx_data->addr, a_addr, sizeof(dap_chain_addr_t))) { - dap_list_t *l_records_tmp = l_records_out; - while(l_records_tmp) { - char *tx_hash_str; - if(!dap_strcmp(a_hash_out_type,"hex")) - tx_hash_str = dap_strdup( l_tx_data->tx_hash_str); - else - tx_hash_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; - - if(!dap_strcmp(a_hash_out_type,"hex")){ - dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", - tx_hash_str,//l_tx_data->tx_hash_str, - l_tx_out->header.value, - l_tx_data->token_ticker); - } - else { - dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", - l_tx_data->tx_hash_str, - l_tx_out->header.value, - l_tx_data->token_ticker); - } - DAP_DELETE(tx_hash_str); - l_records_tmp = dap_list_next(l_records_tmp); - } - } - //dap_list_free(l_records_out); - } - // in other transactions except first one - else { + // find IN items + dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); + dap_list_t *l_list_in_items_tmp = l_list_in_items; + // find cur addr in prev OUT items + //bool l_is_use_all_cur_out = false; + { + while(l_list_in_items_tmp) { + const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items_tmp->data; + dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; + //find prev OUT item dap_tx_data_t *l_tx_data_prev = NULL; HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); if(l_tx_data_prev != NULL) { - char *l_src_str = NULL; - bool l_src_str_is_cur = false; + // fill token in all l_tx_data from prev transaction + + dap_list_t *l_list_out_info_tmp = l_list_out_info; + while(l_list_out_info_tmp) { + dap_tx_data_t *l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; + if(l_tx_data) { + // get token from prev tx + memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, + sizeof(l_tx_data->token_ticker)); + dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); + dap_chain_datum_tx_t *l_tx_prev = + l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; + + // find OUT items in prev datum + dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, + TX_ITEM_TYPE_OUT, NULL); + // find OUT item for IN item; + dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, + l_tx_in->header.tx_out_prev_idx); + dap_chain_tx_out_t *l_tx_prev_out = + l_list_out_prev_item ? + (dap_chain_tx_out_t*) l_list_out_prev_item->data : + NULL; + if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) + l_tx_data->is_use_all_cur_out = true; + + } + l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); + } + } + l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp); + } + // find prev OUT items for IN items + dap_list_t *l_list_in_items2_tmp = l_list_in_items; // go to begin of list + while(l_list_in_items2_tmp) { + const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items2_tmp->data; + dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; + // if first transaction - empty prev OUT item + if(dap_hash_fast_is_blank(&tx_prev_hash)) { dap_tx_data_t *l_tx_data = NULL; dap_list_t *l_list_out_info_tmp = l_list_out_info; @@ -963,188 +929,238 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons break; l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } - if(l_tx_data) { - // get token from prev tx - memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, - sizeof(l_tx_data->token_ticker)); - - dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); - dap_chain_datum_tx_t *l_tx_prev = - l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; - - // find OUT items in prev datum - dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, - TX_ITEM_TYPE_OUT, NULL); - // find OUT item for IN item; - dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, - l_tx_in->header.tx_out_prev_idx); - dap_chain_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? - (dap_chain_tx_out_t*) l_list_out_prev_item->data : - NULL; - // if use src addr - bool l_is_use_src_addr = false; - // find source addrs - dap_string_t *l_src_addr = dap_string_new(NULL); - { - // find IN items in prev datum - for get destination addr - dap_list_t *l_list_in_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, - TX_ITEM_TYPE_IN, NULL); - dap_list_t *l_list_tmp = l_list_in_prev_items; - while(l_list_tmp) { - dap_chain_tx_in_t *l_tx_prev_in = l_list_tmp->data; - dap_chain_hash_fast_t l_tx_prev_prev_hash = - l_tx_prev_in->header.tx_prev_hash; - //find prev OUT item - dap_tx_data_t *l_tx_data_prev_prev = NULL; - HASH_FIND(hh, l_tx_data_hash, &l_tx_prev_prev_hash, - sizeof(dap_chain_hash_fast_t), l_tx_data_prev_prev); - if(l_tx_data_prev_prev) { - // if use src addr - if(l_tx_data_prev_prev && - !memcmp(&l_tx_data_prev_prev->addr, a_addr, - sizeof(dap_chain_addr_t))) - l_is_use_src_addr = true; - char *l_str = dap_chain_addr_to_str(&l_tx_data_prev_prev->addr); - if(l_src_addr->len > 0) - dap_string_append_printf(l_src_addr, "\n %s", l_str); - else - dap_string_append_printf(l_src_addr, "%s", l_str); // first record - DAP_DELETE(l_str); - } - l_list_tmp = dap_list_next(l_list_tmp); + + // add emit info to ret string + if(l_tx_data && !memcmp(&l_tx_data->addr, a_addr, sizeof(dap_chain_addr_t))) { + dap_list_t *l_records_tmp = l_records_out; + while(l_records_tmp) { + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type,"hex")) + tx_hash_str = dap_strdup( l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); + const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; + + if(!dap_strcmp(a_hash_out_type,"hex")){ + dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", + tx_hash_str,//l_tx_data->tx_hash_str, + l_tx_out->header.value, + l_tx_data->token_ticker); } + else { + dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", + l_tx_data->tx_hash_str, + l_tx_out->header.value, + l_tx_data->token_ticker); + } + DAP_DELETE(tx_hash_str); + l_records_tmp = dap_list_next(l_records_tmp); } - - l_src_str_is_cur = l_is_use_src_addr; - if(l_src_addr->len <= 1) { - l_src_str = - (l_tx_data) ? dap_chain_addr_to_str(&l_tx_data->addr) : - NULL; - if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) - l_src_str_is_cur = true; - dap_string_free(l_src_addr, true); + } + //dap_list_free(l_records_out); + } + // in other transactions except first one + else { + //find prev OUT item + dap_tx_data_t *l_tx_data_prev = NULL; + HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); + if(l_tx_data_prev != NULL) { + char *l_src_str = NULL; + bool l_src_str_is_cur = false; + + dap_tx_data_t *l_tx_data = NULL; + dap_list_t *l_list_out_info_tmp = l_list_out_info; + while(l_list_out_info_tmp) { + l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; + if(l_tx_data->token_ticker[0]) + break; + l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } - else - l_src_str = dap_string_free(l_src_addr, false); - - if(l_tx_prev_out) { - char *l_dst_to_str = dap_chain_addr_to_str(&l_tx_prev_out->addr); - // if use dst addr - bool l_is_use_dst_addr = false; - if(!memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) - l_is_use_dst_addr = true; - char *tx_hash_str; - if(!dap_strcmp(a_hash_out_type, "hex")) - tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); + if(l_tx_data) { + // get token from prev tx + memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, + sizeof(l_tx_data->token_ticker)); + + dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev); + dap_chain_datum_tx_t *l_tx_prev = + l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL; + + // find OUT items in prev datum + dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, + TX_ITEM_TYPE_OUT, NULL); + // find OUT item for IN item; + dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, + l_tx_in->header.tx_out_prev_idx); + dap_chain_tx_out_t *l_tx_prev_out = + l_list_out_prev_item ? + (dap_chain_tx_out_t*) l_list_out_prev_item->data : + NULL; + // if use src addr + bool l_is_use_src_addr = false; + // find source addrs + dap_string_t *l_src_addr = dap_string_new(NULL); + { + // find IN items in prev datum - for get destination addr + dap_list_t *l_list_in_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, + TX_ITEM_TYPE_IN, NULL); + dap_list_t *l_list_tmp = l_list_in_prev_items; + while(l_list_tmp) { + dap_chain_tx_in_t *l_tx_prev_in = l_list_tmp->data; + dap_chain_hash_fast_t l_tx_prev_prev_hash = + l_tx_prev_in->header.tx_prev_hash; + //find prev OUT item + dap_tx_data_t *l_tx_data_prev_prev = NULL; + HASH_FIND(hh, l_tx_data_hash, &l_tx_prev_prev_hash, + sizeof(dap_chain_hash_fast_t), l_tx_data_prev_prev); + if(l_tx_data_prev_prev) { + // if use src addr + if(l_tx_data_prev_prev && + !memcmp(&l_tx_data_prev_prev->addr, a_addr, + sizeof(dap_chain_addr_t))) + l_is_use_src_addr = true; + char *l_str = dap_chain_addr_to_str(&l_tx_data_prev_prev->addr); + if(l_src_addr->len > 0) + dap_string_append_printf(l_src_addr, "\n %s", l_str); + else + dap_string_append_printf(l_src_addr, "%s", l_str); // first record + DAP_DELETE(l_str); + } + l_list_tmp = dap_list_next(l_list_tmp); + } + } + + l_src_str_is_cur = l_is_use_src_addr; + if(l_src_addr->len <= 1) { + l_src_str = + (l_tx_data) ? dap_chain_addr_to_str(&l_tx_data->addr) : + NULL; + if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) + l_src_str_is_cur = true; + dap_string_free(l_src_addr, true); + } else - tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); - if(l_is_use_src_addr && !l_is_use_dst_addr) { - dap_string_append_printf(l_str_out, - "tx hash %s \n %s in send %"DAP_UINT64_FORMAT_U" %s from %s\n to %s\n", - tx_hash_str,//l_tx_data->tx_hash_str, - l_time_str ? l_time_str : "", - l_tx_prev_out->header.value, - l_tx_data->token_ticker, - l_src_str ? l_src_str : "", - l_dst_to_str); - } else if(l_is_use_dst_addr && !l_is_use_src_addr) { - if(!l_src_str_is_cur) + l_src_str = dap_string_free(l_src_addr, false); + + if(l_tx_prev_out) { + char *l_dst_to_str = dap_chain_addr_to_str(&l_tx_prev_out->addr); + // if use dst addr + bool l_is_use_dst_addr = false; + if(!memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) + l_is_use_dst_addr = true; + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type, "hex")) + tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); + if(l_is_use_src_addr && !l_is_use_dst_addr) { dap_string_append_printf(l_str_out, - "tx hash %s \n %s in recv %"DAP_UINT64_FORMAT_U" %s from %s\n", + "tx hash %s \n %s in send %"DAP_UINT64_FORMAT_U" %s from %s\n to %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_prev_out->header.value, l_tx_data->token_ticker, - l_src_str ? l_src_str : ""); + l_src_str ? l_src_str : "", + l_dst_to_str); + } else if(l_is_use_dst_addr && !l_is_use_src_addr) { + if(!l_src_str_is_cur) + dap_string_append_printf(l_str_out, + "tx hash %s \n %s in recv %"DAP_UINT64_FORMAT_U" %s from %s\n", + tx_hash_str,//l_tx_data->tx_hash_str, + l_time_str ? l_time_str : "", + l_tx_prev_out->header.value, + l_tx_data->token_ticker, + l_src_str ? l_src_str : ""); + } + DAP_DELETE(tx_hash_str); + DAP_DELETE(l_dst_to_str); } - DAP_DELETE(tx_hash_str); - DAP_DELETE(l_dst_to_str); + dap_list_free(l_list_out_prev_items); } - dap_list_free(l_list_out_prev_items); - } - - // OUT items - dap_list_t *l_records_tmp = l_records_out; - while(l_records_tmp) { - - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; - if(( l_tx_data && l_tx_data->is_use_all_cur_out ) - || !memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) { - - char *l_addr_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; - - char *tx_hash_str; - if(!dap_strcmp(a_hash_out_type, "hex")) - tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); - else - tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); - if(l_tx_out && a_addr && memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))==0) { - if(!l_src_str_is_cur) + // OUT items + dap_list_t *l_records_tmp = l_records_out; + while(l_records_tmp) { + + const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; + + if(( l_tx_data && l_tx_data->is_use_all_cur_out ) + || !memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) { + + char *l_addr_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; + + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type, "hex")) + tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); + if(l_tx_out && a_addr && memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))==0) { + if(!l_src_str_is_cur) + dap_string_append_printf(l_str_out, + "tx hash %s \n %s recv %"DAP_UINT64_FORMAT_U" %s from %s\n", + tx_hash_str,//l_tx_data->tx_hash_str, + l_time_str ? l_time_str : "", + l_tx_out->header.value, + l_tx_data_prev->token_ticker, + l_src_str ? l_src_str : "?"); + // break search prev OUT items for IN items + l_list_in_items2_tmp = NULL; + } + else { dap_string_append_printf(l_str_out, - "tx hash %s \n %s recv %"DAP_UINT64_FORMAT_U" %s from %s\n", + "tx hash %s \n %s send %"DAP_UINT64_FORMAT_U" %s to %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_out->header.value, l_tx_data_prev->token_ticker, - l_src_str ? l_src_str : "?"); - // break search prev OUT items for IN items - l_list_in_items2_tmp = NULL; - } - else { - dap_string_append_printf(l_str_out, - "tx hash %s \n %s send %"DAP_UINT64_FORMAT_U" %s to %s\n", - tx_hash_str,//l_tx_data->tx_hash_str, - l_time_str ? l_time_str : "", - l_tx_out->header.value, - l_tx_data_prev->token_ticker, - l_addr_str ? l_addr_str : ""); - l_list_in_items2_tmp = NULL; + l_addr_str ? l_addr_str : ""); + l_list_in_items2_tmp = NULL; + } + DAP_DELETE(tx_hash_str); + DAP_DELETE(l_addr_str); } - DAP_DELETE(tx_hash_str); - DAP_DELETE(l_addr_str); + + l_records_tmp = dap_list_next(l_records_tmp); } + //dap_list_free(l_records_out); + DAP_DELETE(l_src_str); - l_records_tmp = dap_list_next(l_records_tmp); } - //dap_list_free(l_records_out); - DAP_DELETE(l_src_str); - } + l_list_in_items2_tmp = dap_list_next(l_list_in_items2_tmp); } - l_list_in_items2_tmp = dap_list_next(l_list_in_items2_tmp); + // l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp); + // } } - // l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp); - // } - } - if(l_list_tx_token) - dap_list_free(l_list_tx_token); - if(l_list_out_items) - dap_list_free(l_list_out_items); - if(l_list_in_items) - dap_list_free(l_list_in_items); - dap_list_free(l_records_out); - dap_list_free(l_list_out_info); - DAP_DELETE(l_time_str); + if(l_list_tx_token) + dap_list_free(l_list_tx_token); + if(l_list_out_items) + dap_list_free(l_list_out_items); + if(l_list_in_items) + dap_list_free(l_list_in_items); + dap_list_free(l_records_out); + dap_list_free(l_list_out_info); + DAP_DELETE(l_time_str); - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + } + DAP_DELETE(l_datums); } - DAP_DELETE(l_datums); - } - // delete hashes - dap_tx_data_t *l_iter_current, *l_item_tmp; - HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) - { - // delete datum - DAP_DELETE(l_iter_current->datum); - // delete struct - DAP_DELETE(l_iter_current); - HASH_DEL(l_tx_data_hash, l_iter_current); - } + // delete hashes + dap_tx_data_t *l_iter_current, *l_item_tmp; + HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) + { + // delete datum + DAP_DELETE(l_iter_current->datum); + // delete struct + DAP_DELETE(l_iter_current); + HASH_DEL(l_tx_data_hash, l_iter_current); + } + l_cell = l_cell->hh.next; + } while (l_cell); + // if no history if(!l_str_out->len) dap_string_append(l_str_out, " empty"); @@ -1166,102 +1182,102 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke dap_string_t *l_str_out = dap_string_new(NULL); *a_token_num = 0; size_t l_atom_size = 0; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - if(!a_chain->callback_atom_get_datums) { - log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); - return NULL ; - } - for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); - l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count); - for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if (!l_datum || (l_datum->header.type_id != DAP_CHAIN_DATUM_256_TOKEN_DECL && l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) ) - continue; - char l_time_str[70]; - // get time of create datum - if (dap_time_to_str_rfc822(l_time_str, 70, l_datum->header.ts_create) < 1) - l_time_str[0] = '\0'; - dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - if (!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) { - dap_chain_hash_fast_t l_datum_hash = {}; - dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash); - char *l_out_hash_str; - if (!strcmp(a_hash_out_type, "hex")) - l_out_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); - else - l_out_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash); - dap_string_append(l_str_out, l_out_hash_str); - dap_string_append(l_str_out, "\n"); - dap_string_append_printf(l_str_out, "token %s %s, created: %s\n", - l_token->ticker, - dap_chain_datum_token_is_old(l_token->type) ? "" : " 256_t ", - l_time_str - ); - switch (l_token->type) { - // Simple private token decl - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 - dap_string_append_printf(l_str_out, " total_supply: %s(%s), signs: valid/total %02d/%02d \n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), - dap_chain_u256tostr(l_token->header_private.total_supply_256), - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", - dap_chain_datoshi_to_coins(l_token->header_private.total_supply), - l_token->header_private.total_supply, - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)); - dap_string_append_printf(l_str_out, - " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), - dap_chain_u256tostr(l_token->header_public.total_supply_256), - l_token->header_public.flags, - dap_chain_u256tostr(l_token->header_public.premine_supply_256), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); - }break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); - dap_string_append_printf(l_str_out, - " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_datoshi_to_coins(l_token->header_public.total_supply), - dap_chain_balance_print(l_token->header_public.total_supply), - l_token->header_public.flags, - dap_chain_balance_print(l_token->header_public.premine_supply), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); - }break; - default: - dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); - break; + dap_chain_cell_t *l_cell = a_chain->cells; + do { + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + if(!a_chain->callback_atom_get_datums) { + log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); + return NULL ; + } + for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) { + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count); + for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { + dap_chain_datum_t *l_datum = l_datums[l_datum_n]; + if (!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) + continue; + char l_time_str[70]; + // get time of create datum + if (dap_time_to_str_rfc822(l_time_str, 70, l_datum->header.ts_create) < 1) + l_time_str[0] = '\0'; + dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; + if (!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) { + dap_chain_hash_fast_t l_datum_hash = {}; + dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash); + char *l_out_hash_str; + if (!strcmp(a_hash_out_type, "hex")) + l_out_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + else + l_out_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash); + dap_string_append(l_str_out, l_out_hash_str); + dap_string_append(l_str_out, "\n"); + dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); + switch (l_token->type) { + // Simple private token decl + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + dap_string_append_printf(l_str_out, " total_supply: %s(%s), signs: valid/total %02d/%02d \n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), + dap_chain_u256tostr(l_token->header_private.total_supply_256), + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_chain_datoshi_to_coins(l_token->header_private.total_supply), + l_token->header_private.total_supply, + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)); + dap_string_append_printf(l_str_out, + " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), + dap_chain_u256tostr(l_token->header_public.total_supply_256), + l_token->header_public.flags, + dap_chain_u256tostr(l_token->header_public.premine_supply_256), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_datoshi_to_coins(l_token->header_public.total_supply), + dap_chain_balance_print(l_token->header_public.total_supply), + l_token->header_public.flags, + dap_chain_balance_print(l_token->header_public.premine_supply), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + }break; + default: + dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); + break; + } + dap_string_append_printf(l_str_out, "\n"); + (*a_token_num)++; } - dap_string_append_printf(l_str_out, "\n"); - (*a_token_num)++; } + DAP_DELETE(l_datums); } - DAP_DELETE(l_datums); - } - a_chain->callback_atom_iter_delete(l_atom_iter); + a_chain->callback_atom_iter_delete(l_atom_iter); + l_cell = l_cell->hh.next; + } while (l_cell); char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL; return l_ret_str; } @@ -1286,281 +1302,278 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger, const char *a_filter_token_name, const char *a_filtr_addr_base58, const char *a_hash_out_type, long a_datum_start, long a_datum_end, long *a_total_datums, dap_chain_tx_hash_processed_ht_t *a_tx_hash_processed) { dap_string_t *l_str_out = dap_string_new(NULL); - bool l_tx_hash_found = false; // list all transactions dap_tx_data_t *l_tx_data_hash = NULL; - // load transactions - size_t l_atom_size = 0; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); - size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; - size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0; - while(l_atom && l_atom_size) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = - (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ? - a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : NULL; - if(!l_datums) { - log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); - return NULL ; - } - for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { - // go to next atom - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; + dap_chain_cell_t *l_cell = a_chain->cells; + do { + // load transactions + size_t l_atom_size = 0; + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; + size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0; + while(l_atom && l_atom_size) { + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = + (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ? + a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : NULL; + if(!l_datums) { + log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); + return NULL ; } - - /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); - size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); - size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; - while(l_atom && l_atom_size) { - dap_chain_datum_t *l_datum = - a_chain->callback_atom_get_datum ? - a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom; - if(!l_datum) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); - log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom); - continue; - }*/ - char l_time_str[70]; - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1) - l_time_str[0] = '\0'; - - - switch (l_datum->header.type_id) { - - // token - case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256 - case DAP_CHAIN_DATUM_TOKEN_DECL: { - // no token necessary for addr - if(a_filtr_addr_base58) { - break; - } - - dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ - l_token_num++; - break; + for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { + dap_chain_datum_t *l_datum = l_datums[l_datum_n]; + if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { + // go to next atom + //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + continue; } + /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); + size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); + size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; + while(l_atom && l_atom_size) { + dap_chain_datum_t *l_datum = + a_chain->callback_atom_get_datum ? + a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom; + if(!l_datum) { + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); + l_atom_size = a_chain->callback_atom_get_size(l_atom); + log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom); + continue; + }*/ + char l_time_str[70]; + // get time of create datum + if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1) + l_time_str[0] = '\0'; + switch (l_datum->header.type_id) { + + // token + case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_DECL: { + // no token necessary for addr + if(a_filtr_addr_base58) { + break; + } - if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { - dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); - switch (l_token->type) { - // Simple private token decl - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 - dap_string_append_printf(l_str_out, " 256_t total_supply: %s(%s), signs: valid/total %02d/%02d \n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), - dap_chain_u256tostr(l_token->header_private.total_supply_256), - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", - dap_chain_datoshi_to_coins(l_token->header_private.total_supply), - l_token->header_private.total_supply, - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 - dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); + dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; + //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ + l_token_num++; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 - dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); - dap_string_append_printf(l_str_out, - " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), - dap_chain_u256tostr(l_token->header_public.total_supply_256), - l_token->header_public.flags, - dap_chain_u256tostr(l_token->header_public.premine_supply_256), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); - } break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); - dap_string_append_printf(l_str_out, - " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_datoshi_to_coins(l_token->header_public.total_supply), - dap_chain_balance_print(l_token->header_public.total_supply), - l_token->header_public.flags, - dap_chain_balance_print(l_token->header_public.premine_supply), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); - } break; - default: - dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); - break; - - } - dap_string_append_printf(l_str_out, "\n"); - l_token_num++; - } - } - break; + } + if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { + dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); + switch (l_token->type) { + // Simple private token decl + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + dap_string_append_printf(l_str_out, " 256_t total_supply: %s(%s), signs: valid/total %02d/%02d \n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), + dap_chain_u256tostr(l_token->header_private.total_supply_256), + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_chain_datoshi_to_coins(l_token->header_private.total_supply), + l_token->header_private.total_supply, + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), + dap_chain_u256tostr(l_token->header_public.total_supply_256), + l_token->header_public.flags, + dap_chain_u256tostr(l_token->header_public.premine_supply_256), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + } break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_datoshi_to_coins(l_token->header_public.total_supply), + dap_chain_balance_print(l_token->header_public.total_supply), + l_token->header_public.flags, + dap_chain_balance_print(l_token->header_public.premine_supply), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + } break; + default: + dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); + break; - // emission - case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 - case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_token_num++; - break; - } - size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); - dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); - 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)) { - break; + } + dap_string_append_printf(l_str_out, "\n"); + l_token_num++; + } } + break; - if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256 - dap_string_append_printf(l_str_out, "emission 256: %s(%s) %s, type: %s, version: %d\n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)), - dap_chain_u256tostr(l_token_em->hdr.value_256), - l_token_em->hdr.ticker, - c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], - l_token_em->hdr.version); - } else - dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", - dap_chain_datoshi_to_coins(l_token_em->hdr.value), - l_token_em->hdr.value, - l_token_em->hdr.ticker, - c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], - l_token_em->hdr.version); - - dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); - - DAP_DELETE(l_token_emission_address_str); - switch (l_token_em->hdr.type) { - // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: // 256 - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: - break; - // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: // 256 - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: - dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); - break; - // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: // 256 - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: - dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); - break; - // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256 - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + // emission + case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_token_num++; + break; + } + size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); + dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); + 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)) { + break; + } if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256 - dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)), - dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256), - l_token_em->data.type_atom_owner.value_change_algo_codename - ); - } else { - dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", - dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start), - l_token_em->data.type_atom_owner.value_start, - l_token_em->data.type_atom_owner.value_change_algo_codename - ); + dap_string_append_printf(l_str_out, "emission 256: %s(%s) %s, type: %s, version: %d\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)), + dap_chain_u256tostr(l_token_em->hdr.value_256), + l_token_em->hdr.ticker, + c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], + l_token_em->hdr.version); + } else + dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", + dap_chain_datoshi_to_coins(l_token_em->hdr.value), + l_token_em->hdr.value, + l_token_em->hdr.ticker, + c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], + l_token_em->hdr.version); + dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); + + DAP_DELETE(l_token_emission_address_str); + switch (l_token_em->hdr.type) { + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: + dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256 + dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)), + dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256), + l_token_em->data.type_atom_owner.value_change_algo_codename + ); + } else { + dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", + dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start), + l_token_em->data.type_atom_owner.value_start, + l_token_em->data.type_atom_owner.value_change_algo_codename + ); + } + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { + char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); + // get time of create datum + if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) + l_time_str[0] = '\0'; + dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); + dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); + DAP_DELETE(l_addr); + } + break; } - break; - // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT: - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { - char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) - l_time_str[0] = '\0'; - dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); - dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); - DAP_DELETE(l_addr); + dap_string_append_printf(l_str_out, "\n"); + l_emission_num++; } - break; + DAP_DELETE(l_token_em); + } break; + + // transaction + case DAP_CHAIN_DATUM_TX:{ + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_tx_num++; + break; + } + + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + //calc tx hash + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); } - dap_string_append_printf(l_str_out, "\n"); - l_emission_num++; - } - DAP_DELETE(l_token_em); - } break; - - // transaction - case DAP_CHAIN_DATUM_TX:{ - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_tx_num++; - break; - } + break; - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; - //calc tx hash - s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); - } - break; + // transaction + case DAP_CHAIN_DATUM_256_TX:{ // 256 + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_tx_num++; + break; + } + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); + } + break; - // transaction - case DAP_CHAIN_DATUM_256_TX:{ // 256 - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_tx_num++; - break; + default: + dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); + break; + } + l_datum_num++; } - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; - s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); + //l_atom_size = a_chain->callback_atom_get_size(l_atom); } - break; - - default: - dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); - break; + a_chain->callback_atom_iter_delete(l_atom_iter); + //total + dap_string_append_printf(l_str_out, + "---------------\ntokens: %zu\nemissions: %zu\ntransactions: %zu\ntotal datums: %zu", l_token_num, + l_emission_num, l_tx_num, l_datum_num); + + // return total datums + if(a_total_datums) + *a_total_datums = l_datum_num; + // delete hashes + dap_tx_data_t *l_iter_current, *l_item_tmp; + HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) + { + HASH_DEL(l_tx_data_hash, l_iter_current); + // delete datum + DAP_DELETE(l_iter_current->datum); + // delete struct + DAP_DELETE(l_iter_current); } - l_datum_num++; - } - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - //l_atom_size = a_chain->callback_atom_get_size(l_atom); - } - a_chain->callback_atom_iter_delete(l_atom_iter); - //total - dap_string_append_printf(l_str_out, - "---------------\ntokens: %zu\nemissions: %zu\ntransactions: %zu\ntotal datums: %zu", l_token_num, - l_emission_num, l_tx_num, l_datum_num); - - // return total datums - if(a_total_datums) - *a_total_datums = l_datum_num; - // delete hashes - dap_tx_data_t *l_iter_current, *l_item_tmp; - HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) - { - HASH_DEL(l_tx_data_hash, l_iter_current); - // delete datum - DAP_DELETE(l_iter_current->datum); - // delete struct - DAP_DELETE(l_iter_current); - } + l_cell = l_cell->hh.next; + } while (l_cell); // if no history if(!l_str_out->len) @@ -1623,7 +1636,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-all' or '-addr' or '-w'"); return -1; } - // Select chain network if(!l_net_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-net'"); @@ -1635,7 +1647,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return -3; } } - //Select chain emission if(!l_chain_str) { // chain may be null -> then all chain use //dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-chain'"); @@ -1650,7 +1661,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) } //char *l_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); //const char *l_chain_group = dap_chain_gdb_get_group(l_chain); - dap_chain_hash_fast_t l_tx_hash; if(l_tx_hash_str) { if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { @@ -1662,7 +1672,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) // dap_chain_hash_fast_to_str(&l_tx_hash, hash_str,99); // int gsdgsd=523; } - dap_chain_addr_t *l_addr = NULL; // if need addr if(l_wallet_name || l_addr_base58) { @@ -1685,7 +1694,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return -1; } } - dap_string_t *l_str_ret = dap_string_new(NULL); //char *l_str_ret = NULL; dap_chain_t *l_chain_cur; void *l_chain_tmp = (void*)0x1; @@ -1696,7 +1704,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) // all chain else l_chain_cur = dap_chain_enum(&l_chain_tmp); - while(l_chain_cur) { // only selected net @@ -1708,18 +1715,15 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) char *l_str_out = NULL; dap_string_append_printf(l_str_ret, "chain: %s\n", l_chain_cur->name); dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str); - if(l_is_all) { // without filters l_str_out = dap_db_history_filter(l_chain_cur, l_ledger, NULL, NULL, l_hash_out_type, -1, 0, NULL, l_list_tx_hash_processd); dap_string_append_printf(l_str_ret, "all history:\n%s\n", l_str_out ? l_str_out : " empty"); } else { - l_str_out = l_tx_hash_str ? dap_db_history_tx(&l_tx_hash, l_chain_cur, l_hash_out_type) : dap_db_history_addr(l_addr, l_chain_cur, l_hash_out_type); - if(l_tx_hash_str) { dap_string_append_printf(l_str_ret, "history for tx hash %s:\n%s\n", l_tx_hash_str, l_str_out ? l_str_out : " empty"); @@ -1740,8 +1744,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_enum_unlock(); l_chain_cur = dap_chain_enum(&l_chain_tmp); } - - DAP_DELETE(l_addr); _dap_chain_tx_hash_processed_ht_free(l_list_tx_hash_processd); // all chain @@ -1752,7 +1754,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return 0; } else if(l_cmd == CMD_LIST){ - enum {SUBCMD_NONE, SUBCMD_LIST_COIN}; int l_sub_cmd = SUBCMD_NONE; if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "coins", NULL )) @@ -1778,7 +1779,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_string_free(l_str_ret, true); return 0; } else if (l_cmd == CMD_TX_INFO){ - //GET hash dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-hash", &l_tx_hash_str); //get net diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 111f7fd5ab4b7d39508055e081e71e2315b5f446..2f599cd3b0e1b031953bce38261316f8e0f1b2da 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -233,7 +233,7 @@ static bool s_timer_update_states_callback(void *a_arg) dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); dap_stream_ch_chain_pkt_write_unsafe(l_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ, - l_net->pub.id.uint64, 0, l_net->pub.cell_id.uint64, + l_net->pub.id.uint64, 0, 0, &l_sync_gdb, sizeof(l_sync_gdb)); } return true; @@ -667,7 +667,7 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no a_node_client->client->_inheritor = a_node_client; dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels); - //dap_client_set_auth_cert(a_node_client->client, dap_cert_find_by_name("auth")); // TODO provide the certificate choice + dap_client_set_auth_cert(a_node_client->client, a_node_client->net->pub.name); // TODO provide the certificate choice int hostlen = 128; char host[hostlen]; diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index e7e40be7532b8207727a0bd53802a41410b9b4cc..cb12d6ecd545535deb8fc1b4fd44c91ba9b81fff 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -67,7 +67,6 @@ static const char * g_net_state_str[]={ typedef struct dap_chain_net{ struct { dap_chain_net_id_t id; - dap_chain_cell_id_t cell_id; // Cell where the node is connected to. {{0}} if not celled(sharded) blockchain char * name; char * gdb_groups_prefix; char * gdb_nodes_aliases; diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 216d6a4261c130a77397d44fc5eecd8cc75856af..703175de5068982408b12d69a41216642fd1894e 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -122,14 +122,14 @@ size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info); //dap_chain_node_info_t* dap_chain_node_info_deserialize(uint8_t *node_info_str, size_t size); /** - * Generate node addr by shard id + * Generate node addr by net id */ -dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * l_net,dap_chain_cell_id_t *a_cell_id); +dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id); /** * Check the validity of the node address by shard id */ -bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *a_cell_id); +bool dap_chain_node_check_addr(dap_chain_net_t * l_net, dap_chain_node_addr_t *a_addr); dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias); bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr); @@ -144,7 +144,7 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre return a_key; } -bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum); +int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum); bool dap_chain_node_mempool_autoproc_init(); void dap_chain_node_mempool_autoproc_deinit(); void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group, diff --git a/modules/net/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt index b6661c7f1b94abb872d0e6f63babbdaa7a086a32..399b0a433767971f7af42388381ad7e80c303885 100644 --- a/modules/net/srv/CMakeLists.txt +++ b/modules/net/srv/CMakeLists.txt @@ -18,6 +18,6 @@ endif() #endif() target_link_libraries(${NET_SRV_LIBS}) -target_include_directories(dap_chain_net_srv INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src) diff --git a/modules/service/app-db/CMakeLists.txt b/modules/service/app-db/CMakeLists.txt index f6a7a7977d843e1bdf10796aa8c237534a916ec5..66ca6ade4273ae9e2e34d8d15795c869529401dc 100644 --- a/modules/service/app-db/CMakeLists.txt +++ b/modules/service/app-db/CMakeLists.txt @@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_APP_DB_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_DB_SRCS} ${DAP_CHAIN_NET_SRV_APP_DB_HEADERS}) -target_link_libraries(dap_chain_net_srv_app_db dap_chain_net_srv dap_chain_net_srv_app) -target_include_directories(dap_chain_net_srv_app_db INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_chain_net_srv dap_chain_net_srv_app) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/app/CMakeLists.txt b/modules/service/app/CMakeLists.txt index e69756a8d304d41eb5e220462288a86aead5c742..210374c2f42c6e5a616714fabdd788da5235e848 100644 --- a/modules/service/app/CMakeLists.txt +++ b/modules/service/app/CMakeLists.txt @@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_NET_SRV_APP_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_SRCS} ${DAP_CHAIN_NET_SRV_APP_HEADERS}) -target_link_libraries(dap_chain_net_srv_app dap_core dap_crypto dap_chain dap_chain_net dap_chain_net_srv) -target_include_directories(dap_chain_net_srv_app INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net dap_chain_net_srv) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/datum/CMakeLists.txt b/modules/service/datum/CMakeLists.txt index dc38274497865096fdd8e21bb576dc99cf373ef0..62ad4a0ba48cf1603be5e5a9d22959f881683498 100644 --- a/modules/service/datum/CMakeLists.txt +++ b/modules/service/datum/CMakeLists.txt @@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_DATUM_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_HEADERS}) -target_link_libraries(dap_chain_net_srv_datum dap_chain_net_srv) -target_include_directories(dap_chain_net_srv_datum INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_chain_net_srv) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/mining-pool/CMakeLists.txt b/modules/service/mining-pool/CMakeLists.txt index 6a66f485f3affa09480ab6930c8b3f153c44afd5..7db0c520a52b763772d313a21ec2d1a0ff55540e 100644 --- a/modules/service/mining-pool/CMakeLists.txt +++ b/modules/service/mining-pool/CMakeLists.txt @@ -6,7 +6,7 @@ file(GLOB DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS}) -target_link_libraries(dap_chain_net_srv_datum_pool dap_chain_net_srv dap_chain_net_srv_datum) -target_include_directories(dap_chain_net_srv_datum_pool INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_chain_net_srv dap_chain_net_srv_datum) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/stake/CMakeLists.txt b/modules/service/stake/CMakeLists.txt index e6217cf00995e909380b99444018ef70a5235501..99474583910ad884edbd0326202522816a11ced1 100644 --- a/modules/service/stake/CMakeLists.txt +++ b/modules/service/stake/CMakeLists.txt @@ -7,6 +7,6 @@ file(GLOB DAP_SRV_STAKE_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_SRV_STAKE_SRCS} ${DAP_SRV_STAKE_HEADERS}) -target_include_directories(dap_chain_crypto INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv dap_chain_cs_dag_poa dap_chain_cs_block_poa) diff --git a/modules/service/xchange/CMakeLists.txt b/modules/service/xchange/CMakeLists.txt index 82d036e96bc5d37317cd91cb7ad5d5df4bc53515..c6b509051eb664c3ea4dba7b4939eda69681aca8 100644 --- a/modules/service/xchange/CMakeLists.txt +++ b/modules/service/xchange/CMakeLists.txt @@ -7,6 +7,6 @@ file(GLOB DAP_SRV_XCHANGE_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_SRV_XCHANGE_SRCS} ${DAP_SRV_XCHANGE_HEADERS}) -target_include_directories(dap_chain_crypto INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv) diff --git a/modules/test/CMakeLists.txt b/modules/test/CMakeLists.txt index 70e543e45b934bcc5d43a765db96d620a4af9280..b48617d0f087fa6a5e14e6113595548353fe63cb 100644 --- a/modules/test/CMakeLists.txt +++ b/modules/test/CMakeLists.txt @@ -6,4 +6,4 @@ project(dap_test) add_library(${PROJECT_NAME} STATIC dap_test.h dap_test.c dap_test_generator.h dap_test_generator.c) -target_include_directories(dap_test INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) diff --git a/modules/type/blocks/CMakeLists.txt b/modules/type/blocks/CMakeLists.txt index 44f0787add4f670f935894cffad47fbe58c4a33b..0c377cec8c870d5b1959ac79eadfad106d78e0a6 100644 --- a/modules/type/blocks/CMakeLists.txt +++ b/modules/type/blocks/CMakeLists.txt @@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_BLOCK_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_SRCS} ${DAP_CHAIN_BLOCK_HEADERS}) -target_link_libraries(dap_chain_cs_blocks dap_core dap_crypto dap_chain ) -target_include_directories(dap_chain_cs_blocks INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain ) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index b001560403b5fdb3e0663f522bee85936afae056..192b6211fb370cc1a792388ab7737ae8903068ed 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -105,7 +105,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain, // Get block header size static size_t s_callback_atom_get_static_hdr_size(void); -static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain ); +static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain , dap_chain_cell_id_t a_cell_id); static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t * , dap_chain_atom_ptr_t , size_t); @@ -456,7 +456,13 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) size_t l_block_size = 0; dap_chain_hash_fast_t l_block_hash={0}; dap_enc_base58_hex_to_hash( l_subcmd_str_arg, &l_block_hash); // Convert argument to hash - l_block = (dap_chain_block_t*) dap_chain_get_atom_by_hash( l_chain, &l_block_hash, &l_block_size); + dap_chain_cell_t *l_cell = l_chain->cells; + do { + l_block = (dap_chain_block_t *)dap_chain_get_atom_by_hash(l_chain, &l_block_hash, &l_block_size, l_cell->id); + if (l_block) + break; + l_cell = l_cell->hh.next; + } while (l_cell); if ( l_block){ dap_chain_block_cache_t *l_block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_block_hash); if ( l_block_cache ){ @@ -903,10 +909,11 @@ static size_t s_callback_atom_get_static_hdr_size(void) * @param a_chain * @return */ -static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain ) +static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id) { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_atom_iter->chain = a_chain; + l_atom_iter->cell_id.uint64 = a_cell_id.uint64; l_atom_iter->_inheritor = DAP_NEW_Z(dap_chain_cs_blocks_iter_t); ITER_PVT(l_atom_iter)->blocks = DAP_CHAIN_CS_BLOCKS(a_chain); @@ -925,7 +932,7 @@ static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t * a_c if (a_atom && a_atom_size){ dap_chain_hash_fast_t l_atom_hash; dap_hash_fast(a_atom, a_atom_size, &l_atom_hash); - dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain); + dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain, a_chain->cells->id); if (l_atom_iter){ dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); l_atom_iter->cur_item = ITER_PVT(l_atom_iter)->cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_atom_hash); @@ -1156,8 +1163,7 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_ pthread_rwlock_wrlock(&l_blocks_pvt->datums_lock); if (!l_blocks->block_new) { l_blocks->block_new = dap_chain_block_new(&l_blocks_pvt->block_cache_last->block_hash, &l_blocks->block_new_size); - dap_chain_net_t *l_net = dap_chain_net_by_id(l_blocks->chain->net_id); - l_blocks->block_new->hdr.cell_id.uint64 = l_net->pub.cell_id.uint64; + l_blocks->block_new->hdr.cell_id.uint64 = a_chain->cells->id.uint64; l_blocks->block_new->hdr.chain_id.uint64 = l_blocks->chain->id.uint64; } for (size_t i = 0; i < a_datums_count; i++) { diff --git a/modules/type/dag/CMakeLists.txt b/modules/type/dag/CMakeLists.txt index 7ba78b85c68258118ad2b67a6b64c8ff1052c7be..d4912385dcf81e7f0630642cecb0109f70bf244a 100644 --- a/modules/type/dag/CMakeLists.txt +++ b/modules/type/dag/CMakeLists.txt @@ -5,7 +5,7 @@ file(GLOB DAP_CHAIN_DAG_SRCS *.c) file(GLOB DAP_CHAIN_DAG_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_SRCS} ${DAP_CHAIN_DAG_HEADERS}) -target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_net dap_chain_global_db) -target_include_directories(dap_chain_cs_dag INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net dap_chain_global_db) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src) diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index dbccc2d4d5e2a7685a65d484b9ab6ce92f88b116..c9b8a95cbe473211080b0d48e85cb415eda38ac2 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -89,7 +89,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_add_from_treshold(dap_chain_t static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t); // Verify new event in dag static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get dag event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id); static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * , dap_chain_atom_ptr_t , size_t); @@ -203,13 +203,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) a_chain->callback_add_datums = s_chain_callback_datums_pool_proc; - // Datum operations callbacks -/* - a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create - a_chain->callback_datum_iter_delete = s_chain_callback_datum_iter_delete; // Datum iterator delete - a_chain->callback_datum_iter_get_first = s_chain_callback_datum_iter_get_first; // Get the fisrt datum from chain - a_chain->callback_datum_iter_get_next = s_chain_callback_datum_iter_get_next; // Get the next datum from chain from the current one -*/ // Others a_chain->_inheritor = l_dag; @@ -513,12 +506,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain dap_chain_hash_fast_t * l_hashes = l_hashes_size ?DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, sizeof(dap_chain_hash_fast_t) * l_hashes_size) : NULL; size_t l_hashes_linked = 0; - dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); - dap_chain_cell_id_t l_cell_id = { - .uint64 = l_net ? l_net->pub.cell_id.uint64 : 0 - }; - dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(a_chain, l_cell_id); - + dap_chain_cell_t *l_cell = NULL; for (size_t d = 0; d <a_datums_count ; d++){ dap_chain_datum_t * l_datum = a_datums[d]; if(l_datum == NULL){ // Was wrong datum thats not passed checks @@ -594,11 +582,9 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked,&l_event_size); if ( l_event&&l_event_size){ // Event is created if (l_dag->is_add_directy) { + l_cell = a_chain->cells; if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) { // add events to file - if (!l_cell) { - l_cell = dap_chain_cell_create_fill(a_chain, l_cell_id); - } if (dap_chain_cell_file_append(l_cell, l_event, l_event_size ) < 0) { log_it(L_ERROR, "Can't add new event to the file '%s'", l_cell->file_storage_path); continue; @@ -612,7 +598,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain l_atom_treshold = s_chain_callback_atom_add_from_treshold(a_chain, &l_atom_treshold_size); // add into file if(l_atom_treshold) { - int l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); + int l_res = dap_chain_cell_file_append(a_chain->cells, l_atom_treshold, l_atom_treshold_size); if(l_res < 0) { log_it(L_ERROR, "Can't save event %p from treshold to the file '%s'", l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]"); @@ -671,9 +657,8 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain } } DAP_DELETE(l_hashes); - if (l_cell) { + if (l_cell) dap_chain_cell_close(l_cell); - } dap_chain_global_db_objs_delete(l_events_round_new, l_events_round_new_size); return l_datum_processed; } @@ -989,10 +974,11 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * @param a_chain * @return */ -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ) +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id) { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_atom_iter->chain = a_chain; + l_atom_iter->cell_id = a_cell_id; pthread_rwlock_rdlock(&a_chain->atoms_rwlock); #ifdef WIN32 log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread())); @@ -1037,7 +1023,14 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ assert(l_dag); dap_chain_cs_dag_pvt_t *l_dag_pvt = PVT(l_dag); assert(l_dag_pvt); - a_atom_iter->cur_item = l_dag_pvt->events; + a_atom_iter->cur_item = NULL; + dap_chain_cs_dag_event_item_t *l_item_tmp, *l_item_cur; + HASH_ITER(hh, l_dag_pvt->events, l_item_cur, l_item_tmp) { + if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { + a_atom_iter->cur_item = l_item_cur; + break; + } + } if ( a_atom_iter->cur_item ){ a_atom_iter->cur = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event; a_atom_iter->cur_size = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event_size; @@ -1185,21 +1178,20 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t * a_atom_size ) { - if (a_atom_iter->cur ){ - //dap_chain_cs_dag_pvt_t* l_dag_pvt = PVT(DAP_CHAIN_CS_DAG(a_atom_iter->chain)); - dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; - a_atom_iter->cur_item = l_event_item->hh.next; - l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; - // if l_event_item=NULL then items are over - a_atom_iter->cur = l_event_item ? l_event_item->event : NULL; - a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0; - a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL; - if(a_atom_size) - *a_atom_size = a_atom_iter->cur_size; - return a_atom_iter->cur; - }else - return NULL; - + dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; + while (l_event_item) { + l_event_item = (dap_chain_cs_dag_event_item_t *)l_event_item->hh.next; + if (l_event_item && l_event_item->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) + break; + } + // if l_event_item=NULL then items are over + a_atom_iter->cur_item = l_event_item; + a_atom_iter->cur = l_event_item ? l_event_item->event : NULL; + a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0; + a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL; + if(a_atom_size) + *a_atom_size = a_atom_iter->cur_size; + return a_atom_iter->cur; } /** @@ -1350,24 +1342,16 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) } // write events to file and delete events from db if(l_list_to_del) { - dap_chain_cell_id_t l_cell_id = { - .uint64 = l_net ? l_net->pub.cell_id.uint64 : 0 - }; - dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(l_chain, l_cell_id); - if (!l_cell) - l_cell = dap_chain_cell_create_fill(l_chain, l_cell_id); - if(l_cell) { - if(dap_chain_cell_file_update(l_cell) > 0) { - // delete events from db - dap_list_t *l_list_tmp = l_list_to_del; - while(l_list_tmp) { - char *l_key = strdup((char*) l_list_tmp->data); - dap_chain_global_db_gr_del(l_key, l_dag->gdb_group_events_round_new); - l_list_tmp = dap_list_next(l_list_tmp); - } + if (dap_chain_cell_file_update(l_chain->cells) > 0) { + // delete events from db + dap_list_t *l_list_tmp = l_list_to_del; + while(l_list_tmp) { + char *l_key = strdup((char*) l_list_tmp->data); + dap_chain_global_db_gr_del(l_key, l_dag->gdb_group_events_round_new); + l_list_tmp = dap_list_next(l_list_tmp); } } - dap_chain_cell_close(l_cell); + dap_chain_cell_close(l_chain->cells); dap_list_free(l_list_to_del); } diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt index 65e9b46203484dadf47906ee5895639539a9d70f..4d61a3b9f8bb7201f8ac88c5cc54a4549f817732 100644 --- a/modules/wallet/CMakeLists.txt +++ b/modules/wallet/CMakeLists.txt @@ -6,7 +6,7 @@ file(GLOB DAP_CHAIN_WALLET_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_WALLET_SRCS} ${DAP_CHAIN_WALLET_HEADERS}) -target_link_libraries(dap_chain_wallet dap_core dap_crypto dap_chain dap_chain_net) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net) -target_include_directories(dap_chain_wallet INTERFACE .) +target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include)