diff --git a/CMakeLists.txt b/CMakeLists.txt index 270e002866420dfa5e44e1417093d0504f61ec10..6e3de449bc75b9657d8c47d870f648770498aec1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 3.0) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "3.0-7") +set(CELLFRAME_SDK_NATIVE_VERSION "3.0-8") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") message("Cellframe modules: ${CELLFRAME_MODULES}") diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index 164121dd11fe57bf04f86571482f2bfcc3217589..641096894ded2889af8adec2eced6e15258473d1 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -451,6 +451,7 @@ char *dap_log_get_item(time_t a_start_time, int a_limit); #define DAP_PRINTF_ATTR(format_index, args_index) #endif /* __GNUC__ */ + DAP_PRINTF_ATTR(3, 4) void _log_it( const char * log_tag, enum dap_log_level, const char * format, ... ); #define log_it( _log_level, ...) _log_it( LOG_TAG, _log_level, ##__VA_ARGS__) diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c index 2789fec964794a738da7f5df3c47f67aea44ddfb..9787b2bf2dabae02e12dd7afd38c9d411829af00 100755 --- a/dap-sdk/core/src/dap_common.c +++ b/dap-sdk/core/src/dap_common.c @@ -1085,15 +1085,21 @@ void dap_usleep(time_t a_microseconds) char* dap_ctime_r(time_t *a_time, char* a_buf){ - if (*a_time > DAP_END_OF_DAYS) { - return "(null)\r\n"; + char *l_fail_ret = "(null)\r\n"; + if (!a_buf) + return l_fail_ret; + if(!a_time || *a_time > DAP_END_OF_DAYS) { + strcpy(a_buf, l_fail_ret); + return l_fail_ret; } struct tm l_time; localtime_r(a_time, &l_time); char *l_str_time = asctime_r(&l_time, a_buf); if (l_str_time) return l_str_time; - else - return "(null)\r\n"; + else { + strcpy(a_buf, l_fail_ret); + return l_fail_ret; + } } diff --git a/dap-sdk/core/src/dap_string.c b/dap-sdk/core/src/dap_string.c index 9016f7bfc0fcb0c332ae9aaa8c4cfd550ad25c17..e7d61347828f7033b34f99c347e0ee715c936eb1 100755 --- a/dap-sdk/core/src/dap_string.c +++ b/dap-sdk/core/src/dap_string.c @@ -836,10 +836,18 @@ void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list len = dap_vasprintf(&buf, format, args); - if(len >= 0) { + if (len >= 0) { dap_string_maybe_expand(string, len); - memcpy(string->str + string->len, buf, len + 1); - string->len += len; + if (string->str) { + memcpy(string->str + string->len, buf, len + 1); + string->len += len; + } else { + const char *l_mem_out = "Out of memory!"; + const int l_fail_len = strlen(l_mem_out) + 1; + string->str = DAP_NEW_SIZE(char, l_fail_len); + strcpy(string->str, l_mem_out); + string->len = string->allocated_len = l_fail_len; + } DAP_DELETE(buf); } } diff --git a/dap-sdk/crypto/include/dap_cert.h b/dap-sdk/crypto/include/dap_cert.h index 0dee3bf8858f543c7878ac73e8eaf341be497b25..ee526e8649a01c2fc532e09c2f0e645266d8e8d6 100755 --- a/dap-sdk/crypto/include/dap_cert.h +++ b/dap-sdk/crypto/include/dap_cert.h @@ -45,7 +45,7 @@ typedef enum dap_cert_metadata_type { typedef struct dap_cert_metadata { const char *key; uint32_t length; - dap_cert_metadata_type_t type : 8; + dap_cert_metadata_type_t type; byte_t value[]; } dap_cert_metadata_t; diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h index 0f152542f8305978e755706e5a41bd7560ff4c8d..73b0c3a2869e0d07e8603766c0c678cbd453a7c5 100755 --- a/dap-sdk/crypto/include/dap_hash.h +++ b/dap-sdk/crypto/include/dap_hash.h @@ -93,6 +93,14 @@ static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast return false; } +/** + * @brief + * compare hash with blank hash + * @param a_hash + * @return true + * @return false + */ + static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash ) { static dap_hash_fast_t l_blank_hash = {}; diff --git a/dap-sdk/crypto/include/dap_pkey.h b/dap-sdk/crypto/include/dap_pkey.h index 56805e565e327460c4dc7aaa1e29b0e82a55c427..93040b6a0617ccb2b2178826787c81ff27ac6c4e 100755 --- a/dap-sdk/crypto/include/dap_pkey.h +++ b/dap-sdk/crypto/include/dap_pkey.h @@ -37,9 +37,10 @@ enum dap_pkey_type_enum { PKEY_TYPE_MULTI = 0xffff /// @brief Has inside subset of different keys }; +typedef uint16_t dap_pkey_type_enum_t; typedef union dap_pkey_type{ - enum dap_pkey_type_enum type: 16; + dap_pkey_type_enum_t type; uint16_t raw; } dap_pkey_type_t; diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h index 4018361a65e70323cda9cb9aca0a741a0ca4b53c..23d13c366641c28d3f6f0bae351bdc3f2c1a92b2 100755 --- a/dap-sdk/crypto/include/dap_sign.h +++ b/dap-sdk/crypto/include/dap_sign.h @@ -32,7 +32,7 @@ #include "dap_hash.h" #include "dap_string.h" -typedef enum { +enum dap_sign_type_enum { SIG_TYPE_NULL = 0x0000, SIG_TYPE_BLISS = 0x0001, SIG_TYPE_DEFO = 0x0002, /// @brief key image for anonymous transaction @@ -41,10 +41,11 @@ typedef enum { SIG_TYPE_DILITHIUM = 0x0102, /// @brief SIG_TYPE_MULTI_CHAINED = 0x0f00, /// @brief Has inside subset of different signatures and sign composed with all of them SIG_TYPE_MULTI_COMBINED = 0x0f01 /// @brief Has inside subset of different public keys and sign composed with all of appropriate private keys -} dap_sign_type_enum_t; +}; +typedef uint32_t dap_sign_type_enum_t; typedef union dap_sign_type { - dap_sign_type_enum_t type: 32; + dap_sign_type_enum_t type; uint32_t raw; } DAP_ALIGN_PACKED dap_sign_type_t; diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c index 4b9d0e35a417f366e8e95f35f8b5a94a00eb0f40..8e77a4649d4d2e773c569adc4e32168d8cb2a6a1 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,6 +843,7 @@ 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() { diff --git a/dap-sdk/crypto/src/dap_pkey.c b/dap-sdk/crypto/src/dap_pkey.c index 4a62c3820887fc8789e959f59a57c8ee436f1bf2..a8a40a9ecbce9576cad556911291cc4965543abe 100755 --- a/dap-sdk/crypto/src/dap_pkey.c +++ b/dap-sdk/crypto/src/dap_pkey.c @@ -30,9 +30,10 @@ /** - * @brief dap_pkey_from_enc_key - * @param a_key - * @return + * @brief + * convert encryption key to public key + * @param a_key dap_enc_key_t encryption key + * @return dap_pkey_t* */ dap_pkey_t* dap_pkey_from_enc_key(dap_enc_key_t *a_key) { @@ -51,9 +52,10 @@ dap_pkey_t* dap_pkey_from_enc_key(dap_enc_key_t *a_key) /** * @brief dap_pkey_from_enc_key_output - * @param a_key - * @param a_output - * @return + * convert encryption key to public key and placed it in output buffer + * @param a_key dap_enc_key_t encryption key object + * @param a_output output data + * @return result */ int dap_pkey_from_enc_key_output(dap_enc_key_t *a_key, void * a_output) { 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/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index 9b6ff27f9b9b649e6ed4916de6fe73cbab6dffb8..044dca1e62f523d2a7a3aa9fef59f8fd45be9e4d 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -305,7 +305,8 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock) * @param a_tfd * @param a_callback */ -void dap_timerfd_delete(dap_timerfd_t *l_timerfd) +void dap_timerfd_delete(dap_timerfd_t *a_timerfd) { - dap_events_socket_remove_and_delete_mt(l_timerfd->events_socket->worker, l_timerfd->esocket_uuid); + if (a_timerfd->events_socket->worker) + dap_events_socket_remove_and_delete_mt(a_timerfd->events_socket->worker, a_timerfd->esocket_uuid); } diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 9a33b5f97471092db8804bb33eec318f84927f9a..689c203b0a738d81c94a06ae416ab47204e14d22 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -820,7 +820,7 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream) memcpy(l_ret_pkt.sig, c_dap_stream_sig, sizeof(l_ret_pkt.sig)); dap_events_socket_write_unsafe(a_stream->esocket, &l_ret_pkt, sizeof(l_ret_pkt)); // Reset client keepalive timer - if (a_stream->keepalive_timer) { + if (a_stream->keepalive_timer && a_stream->keepalive_timer->events_socket->worker) { void *l_arg = a_stream->keepalive_timer->callback_arg; dap_timerfd_delete(a_stream->keepalive_timer); a_stream->keepalive_timer = dap_timerfd_start_on_worker(a_stream->stream_worker->worker, diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 8a8b7387df4437c8e2d7ce39ce79a0e47e62950b..dc82cdf9c85eb73dbada1bd9021c6012478b30d3 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -991,7 +991,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) } dap_chain_global_db_objs_delete(l_objs, l_objs_count); DAP_DELETE(l_gdb_group); - if (l_objs_count == 0) { + if (l_objs_count == 0 || l_ledger_pvt->last_ticker.key == NULL) { l_ledger_pvt->last_ticker.found = true; } @@ -1024,7 +1024,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) } dap_chain_global_db_objs_delete(l_objs, l_objs_count); DAP_DELETE(l_gdb_group); - if (l_objs_count == 0) { + if (l_objs_count == 0 || l_ledger_pvt->last_emit.hash == NULL) { l_ledger_pvt->last_emit.found = true; } @@ -1039,12 +1039,12 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) memcpy(&l_tx_item->cache_data, l_objs[i].value, sizeof(l_tx_item->cache_data)); HASH_ADD(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item); if (i == l_objs_count - 1) { - PVT(a_ledger)->last_tx.hash = &l_tx_item->tx_hash_fast; + l_ledger_pvt->last_tx.hash = &l_tx_item->tx_hash_fast; } } dap_chain_global_db_objs_delete(l_objs, l_objs_count); DAP_DELETE(l_gdb_group); - if (l_objs_count == 0) { + if (l_objs_count == 0 || l_ledger_pvt->last_tx.hash == NULL) { l_ledger_pvt->last_tx.found = true; } @@ -1058,12 +1058,12 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) memcpy(l_tx_item->tx, l_objs[i].value, l_objs[i].value_len); HASH_ADD(hh, l_ledger_pvt->treshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item); if (i == l_objs_count - 1) { - PVT(a_ledger)->last_thres_tx.hash = &l_tx_item->tx_hash_fast; + l_ledger_pvt->last_thres_tx.hash = &l_tx_item->tx_hash_fast; } } dap_chain_global_db_objs_delete(l_objs, l_objs_count); DAP_DELETE(l_gdb_group); - if (l_objs_count == 0) { + if (l_objs_count == 0 || l_ledger_pvt->last_thres_tx.hash == NULL) { l_ledger_pvt->last_thres_tx.found = true; } diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 807079680d020d03bfe04f03c0a750c25e7ef697..2b51b2f672ef12824ba868da6ecdabe97a5242ab 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -189,7 +189,7 @@ typedef union { serv_unit_enum_t enm; } dap_chain_net_srv_price_unit_uid_t; -typedef enum dap_chain_tx_item_type { +enum dap_chain_tx_item_type { TX_ITEM_TYPE_IN = 0x00, /// @brief Transaction: inputs TX_ITEM_TYPE_OUT = 0x10, /// @brief Transaction: outputs TX_ITEM_TYPE_OUT_EXT = 0x11, @@ -203,7 +203,8 @@ typedef enum dap_chain_tx_item_type { TX_ITEM_TYPE_OUT_ALL = 0xfe, TX_ITEM_TYPE_ANY = 0xff -} dap_chain_tx_item_type_t; +}; +typedef byte_t dap_chain_tx_item_type_t; typedef struct dap_chain_receipt{ diff --git a/modules/common/include/dap_chain_datum_tx_in.h b/modules/common/include/dap_chain_datum_tx_in.h index d52c76aac74bbb030412d864e881d6e1ead281b4..780c710c9aaa8d10cff8bd14b915b502121db4d8 100644 --- a/modules/common/include/dap_chain_datum_tx_in.h +++ b/modules/common/include/dap_chain_datum_tx_in.h @@ -34,7 +34,7 @@ typedef struct dap_chain_tx_in{ struct { - dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type + dap_chain_tx_item_type_t type; /// @param type @brief Transaction item type dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash @brief Hash of the previous transaction. 0 for generation TX uint32_t tx_out_prev_idx; /// @param tx_prev_idx @brief Previous tx_out index. 0 for generation TX // dap_sign_type_t sig_type; /// Signature type diff --git a/modules/common/include/dap_chain_datum_tx_out.h b/modules/common/include/dap_chain_datum_tx_out.h index 24f8240a6fc37aaf163783b7700dc7d71323e00f..0e3b46b304977c592573f3055550969d4d3910e8 100644 --- a/modules/common/include/dap_chain_datum_tx_out.h +++ b/modules/common/include/dap_chain_datum_tx_out.h @@ -34,7 +34,7 @@ */ typedef struct dap_chain_tx_out{ struct { - dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type + dap_chain_tx_item_type_t type; /// @param type @brief Transaction item type uint64_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered } header; /// Only header's hash is used for verification dap_chain_addr_t addr; //// diff --git a/modules/common/include/dap_chain_datum_tx_out_cond.h b/modules/common/include/dap_chain_datum_tx_out_cond.h index 3d96e7faf7f764e0020f5808048f57303c527630..9eec59aeac09b77f3dfece7dbebd5c604490a79f 100644 --- a/modules/common/include/dap_chain_datum_tx_out_cond.h +++ b/modules/common/include/dap_chain_datum_tx_out_cond.h @@ -29,12 +29,13 @@ #include "dap_chain_common.h" #include "dap_chain_datum_tx.h" -typedef enum dap_chain_tx_out_cond_subtype { +enum dap_chain_tx_out_cond_subtype { DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY = 0x01, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE = 0x02, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE = 0x13, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA // Virtual type for stake update verificator -} dap_chain_tx_out_cond_subtype_t; +}; +typedef byte_t dap_chain_tx_out_cond_subtype_t; DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_out_cond_subtype_t a_subtype){ switch (a_subtype) { @@ -53,9 +54,9 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_ typedef struct dap_chain_tx_out_cond { struct { /// Transaction item type - dap_chain_tx_item_type_t item_type :8; + dap_chain_tx_item_type_t item_type; /// Condition subtype - dap_chain_tx_out_cond_subtype_t subtype : 8; + dap_chain_tx_out_cond_subtype_t subtype; /// Number of Datoshis ( DAP/10^9 ) to be reserver for service uint64_t value; /// When time expires this output could be used only by transaction owner diff --git a/modules/common/include/dap_chain_datum_tx_out_ext.h b/modules/common/include/dap_chain_datum_tx_out_ext.h index 536012bbd6226418cf05fd7dce55aa98dc19564d..5b23771a420a9171b856806e5dd7bba5f7d42990 100644 --- a/modules/common/include/dap_chain_datum_tx_out_ext.h +++ b/modules/common/include/dap_chain_datum_tx_out_ext.h @@ -35,7 +35,7 @@ */ typedef struct dap_chain_tx_out_ext{ struct { - dap_chain_tx_item_type_t type : 8; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT + dap_chain_tx_item_type_t type; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT uint64_t value; // Number of Datoshis ( DAP/10^9 ) to be transfered } header; // Only header's hash is used for verification dap_chain_addr_t addr; // Address to transfer to diff --git a/modules/common/include/dap_chain_datum_tx_pkey.h b/modules/common/include/dap_chain_datum_tx_pkey.h index 58a92b631a850e40e1ff1127cf51bab2678bd53f..cfea7b332887388ea590c365cfafff4136e939e1 100644 --- a/modules/common/include/dap_chain_datum_tx_pkey.h +++ b/modules/common/include/dap_chain_datum_tx_pkey.h @@ -33,7 +33,7 @@ */ typedef struct dap_chain_tx_pkey{ struct { - dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type + dap_chain_tx_item_type_t type; /// @param type @brief Transaction item type dap_sign_type_t sig_type; /// Signature type uint32_t sig_size; /// Signature size } header; /// Only header's hash is used for verification diff --git a/modules/common/include/dap_chain_datum_tx_receipt.h b/modules/common/include/dap_chain_datum_tx_receipt.h index f873a4d92761974639e2c6e8e9e81ce468f51258..4d5effd8f80da5095939b48a3490998c48b8cc33 100644 --- a/modules/common/include/dap_chain_datum_tx_receipt.h +++ b/modules/common/include/dap_chain_datum_tx_receipt.h @@ -32,7 +32,7 @@ * @brief Transaction item out_cond */ typedef struct dap_chain_datum_tx_receipt { - uint8_t type; //dap_chain_tx_item_type_t type :8; // Transaction item type + dap_chain_tx_item_type_t type; // Transaction item type dap_chain_receipt_info_t receipt_info; // Receipt itself uint16_t size; uint16_t exts_size; diff --git a/modules/common/include/dap_chain_datum_tx_sig.h b/modules/common/include/dap_chain_datum_tx_sig.h index 8265348babd74220775f53d5f38317ec6ca24b4a..8d6c4f27aa1f57d1f93a306c12c6c421bd325a09 100644 --- a/modules/common/include/dap_chain_datum_tx_sig.h +++ b/modules/common/include/dap_chain_datum_tx_sig.h @@ -35,8 +35,7 @@ */ typedef struct dap_chain_tx_sig{ struct { - dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type -// dap_sign_type_t sig_type; /// Signature type + dap_chain_tx_item_type_t type; /// @param type @brief Transaction item type uint32_t sig_size; /// Signature size } header; /// Only header's hash is used for verification uint8_t sig[]; /// @param sig @brief raw signature data diff --git a/modules/common/include/dap_chain_datum_tx_token.h b/modules/common/include/dap_chain_datum_tx_token.h index 65a99a10b3b80d7ea3eda10025e3e4e44f268ccc..f385363a12654da1b948bc462e7afd132bc47f4a 100644 --- a/modules/common/include/dap_chain_datum_tx_token.h +++ b/modules/common/include/dap_chain_datum_tx_token.h @@ -34,7 +34,7 @@ */ typedef struct dap_chain_tx_token{ struct { - dap_chain_tx_item_type_t type:8; + dap_chain_tx_item_type_t type; char ticker[DAP_CHAIN_TICKER_SIZE_MAX]; uint8_t padding; // Padding dap_chain_id_t token_emission_chain_id; @@ -49,7 +49,7 @@ typedef struct dap_chain_tx_token{ */ typedef struct dap_chain_tx_token_ext{ struct { - dap_chain_tx_item_type_t type:8; + dap_chain_tx_item_type_t type; uint8_t version; char ticker[DAP_CHAIN_TICKER_SIZE_MAX]; uint8_t padding1; // Padding diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 233377e230b7fd7c4809bfb420d71fbcec8e6d21..243565c6679c1020d1af546a45fd10ba26150637 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -96,7 +96,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 +123,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 +145,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) { @@ -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) { @@ -256,10 +268,13 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) return 1; }*/ + /** - * 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 +291,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 +308,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 +326,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) { @@ -352,11 +380,14 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha return ATOM_ACCEPT; } + /** - * @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) { @@ -368,9 +399,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() { @@ -378,23 +409,28 @@ static size_t s_chain_callback_atom_get_static_hdr_size() return sizeof(l_datum_null->header); } + /** - * @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) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_iter->chain = a_chain; + l_iter->cur_hash = DAP_NEW(dap_chain_hash_fast_t); 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) @@ -403,24 +439,32 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t l_iter->chain = a_chain; l_iter->cur = a_atom; l_iter->cur_size = a_atom_size; + dap_hash_fast(a_atom, a_atom_size, l_iter->cur_hash); return l_iter; } + /** - * @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) { + if (a_atom_iter->cur_item) + DAP_DELETE(a_atom_iter->cur_item); + DAP_DELETE(a_atom_iter->cur_hash); DAP_DELETE(a_atom_iter); } + /** - * @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) @@ -436,59 +480,81 @@ 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) { if (!a_atom_iter) return NULL; dap_chain_datum_t * l_datum = NULL; - a_atom_iter->cur_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items; + dap_chain_gdb_datum_hash_item_t *l_item = PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->hash_items; + a_atom_iter->cur_item = l_item; if (a_atom_iter->cur_item ){ - dap_chain_gdb_datum_hash_item_t * l_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items; size_t l_datum_size =0; - l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_item->key,&l_datum_size,PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums ); + l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_item->key, &l_datum_size, + PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums ); if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it DAP_DELETE( a_atom_iter->cur); a_atom_iter->cur = l_datum; + a_atom_iter->cur_size = l_datum_size; + dap_chain_hash_fast_from_str(l_item->key, a_atom_iter->cur_hash); if (a_atom_size) *a_atom_size = l_datum_size; - } else if (a_atom_size) - *a_atom_size = 0; + } else { + DAP_DEL_Z(a_atom_iter->cur); + a_atom_iter->cur_size = 0; + if (a_atom_size) + *a_atom_size = 0; + } return l_datum; } + /** - * @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) +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) { dap_chain_datum_t * l_datum = NULL; - a_atom_iter->cur_item = a_atom_iter->cur_item? - ((dap_chain_gdb_datum_hash_item_t*) a_atom_iter->cur_item)->next : NULL; + dap_chain_gdb_datum_hash_item_t *l_item = (dap_chain_gdb_datum_hash_item_t*)a_atom_iter->cur_item; + if (l_item) + l_item = l_item->next; + a_atom_iter->cur_item = l_item; if (a_atom_iter->cur_item ){ size_t l_datum_size =0; - l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get( - ((dap_chain_gdb_datum_hash_item_t*) a_atom_iter->cur_item)->key, - &l_datum_size, PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums ); + l_datum = (dap_chain_datum_t *)dap_chain_global_db_gr_get(l_item->key, &l_datum_size, + PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums); if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it - DAP_DELETE( a_atom_iter->cur); + DAP_DELETE(a_atom_iter->cur); a_atom_iter->cur = l_datum; - *a_atom_size = l_datum_size; - }else - *a_atom_size = 0; + a_atom_iter->cur_size = l_datum_size; + dap_chain_hash_fast_from_str(l_item->key, a_atom_iter->cur_hash); + if (a_atom_size) + *a_atom_size = l_datum_size; + } else { + DAP_DEL_Z(a_atom_iter->cur); + a_atom_iter->cur_size = 0; + if (a_atom_size) + *a_atom_size = 0; + } return l_datum; } /** - * @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) @@ -500,10 +566,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) @@ -514,6 +582,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/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c index 1232f9837bb27b5d8b2b5a7388cf25cfaaa7e98c..2722bed4207fec3501af157dd2c53a488e241a83 100644 --- a/modules/global-db/dap_chain_global_db_driver_pgsql.c +++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c @@ -191,7 +191,7 @@ int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks } /** - * @brief Deinitializes a SQLite database. + * @brief Deinitializes a PostgreSQL database. * * @return Returns 0 if successful. */ @@ -206,7 +206,7 @@ int dap_db_driver_pgsql_deinit(void) } /** - * @brief Starts a transaction. + * @brief Starts a transaction in a PostgreSQL database. * * @return Returns 0 if successful, otherwise -1. */ @@ -227,7 +227,7 @@ int dap_db_driver_pgsql_start_transaction(void) } /** - * @brief Starts a transaction in a PostgreSQL database. + * @brief Ends a transaction in a PostgreSQL database. * * @return Returns 0 if successful, otherwise -1. */ diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index 3c51d5bec51b247045e1f4041e8fb7957ed6162f..e1c5d27c1309c8cfacb2a4938f3cb622d5865d42 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -11,7 +11,7 @@ #define LOG_TAG "dap_chain_global_db_remote" -// default time of node address expired in hours +// Default time of a node address expired in hours #define NODE_TIME_EXPIRED_DEFAULT 720 /** diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 467ce31008b6e190b5d5226d3a8fe78415568c51..7f162283f3d75df03394617c1a256a4d5bc943f2 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -255,7 +255,59 @@ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); static dap_global_db_obj_callback_notify_t s_srv_callback_notify = NULL; +/** + * @brief + * init network settings from cellrame-node.cfg file + * register net* commands in cellframe-node-cli interface + * @return + */ +int dap_chain_net_init() +{ + dap_chain_node_client_init(); + dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands", + "net list [chains -n <chain net name>]" + "\tList all networks or list all chains in selected network" + "net -net <chain net name> [-mode update|all] go < online | offline >\n" + "\tFind and establish links and stay online. \n" + "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" + "net -net <chain net name> get status\n" + "\tLook at current status\n" + "net -net <chain net name> stats tx [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n" + "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n" + "net -net <chain net name> [-mode update|all] sync < all | gdb | chains >\n" + "\tSyncronyze gdb, chains or everything\n" + "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" + "net -net <chain net name> link < list | add | del | info | establish >\n" + "\tList, add, del, dump or establish links\n" + "net -net <chain net name> ca add {-cert <cert name> | -hash <cert hash>}\n" + "\tAdd certificate to list of authority cetificates in GDB group\n" + "net -net <chain net name> ca list\n" + "\tPrint list of authority cetificates from GDB group\n" + "net -net <chain net name> ca del -hash <cert hash> [-H hex|base58(default)]\n" + "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n" + "net -net <chain net name> ledger reload\n" + "\tPurge the cache of chain net ledger and recalculate it from chain file\n" ); + s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); + + // maximum number of connections to other nodes + s_max_links_count = dap_config_get_item_int32_default(g_config, "general", "max_links", s_max_links_count); + // required number of connections to other nodes + s_required_links_count = dap_config_get_item_int32_default(g_config, "general", "require_links", s_required_links_count); + s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false); + + dap_chain_net_load_all(); + + dap_enc_http_set_acl_callback(dap_chain_net_set_acl); + log_it(L_NOTICE,"Chain networks initialized"); + return 0; +} +/** + * @brief get certificate hash from chain config [acl_accept_ca_gdb] param + * + * @param a_net dap_chain_net_t chain object + * @return char* + */ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) { if (a_net) { @@ -273,9 +325,10 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) } /** - * @brief s_net_state_to_str - * @param l_state - * @return + * @brief convert dap_chain_net_state_t net state object to string + * + * @param l_state dap_chain_net_state_t + * @return const char* */ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state) { @@ -283,9 +336,11 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state) } /** - * @brief dap_chain_net_state_go_to - * @param a_net - * @param a_new_state + * @brief set current network state to F_DAP_CHAIN_NET_GO_SYNC + * + * @param a_net dap_chain_net_t network object + * @param a_new_state dap_chain_net_state_t new network state + * @return int */ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state) { @@ -308,12 +363,26 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n return 0; } - +/** + * @brief set s_srv_callback_notify + * + * @param a_callback dap_global_db_obj_callback_notify_t callback function + */ void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback) { s_srv_callback_notify = a_callback; } +/** + * @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 + */ void dap_chain_net_sync_gdb_broadcast(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_len) { @@ -358,14 +427,14 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c } /** - * @brief s_gbd_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 added like callback in dap_chain_global_db_add_sync_group + * + * @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_gbd_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_len) @@ -986,6 +1055,8 @@ dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net) static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name , const char * a_node_role) { + if (!a_id || !a_name || !a_node_role) + return NULL; dap_chain_net_t *ret = DAP_NEW_Z_SIZE( dap_chain_net_t, sizeof(ret->pub) + sizeof(dap_chain_net_pvt_t) ); ret->pub.name = strdup( a_name ); @@ -1057,56 +1128,6 @@ void dap_chain_net_delete( dap_chain_net_t * a_net ) } -/** - * @brief - * init network settings from cellrame-node.cfg file - * register net* commands in cellframe-node-cli interface - * @return - */ -int dap_chain_net_init() -{ - dap_stream_ch_chain_init(); - dap_stream_ch_chain_net_init(); - - dap_chain_node_client_init(); - dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands", - "net list [chains -n <chain net name>]" - "\tList all networks or list all chains in selected network" - "net -net <chain net name> [-mode update|all] go < online | offline >\n" - "\tFind and establish links and stay online. \n" - "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" - "net -net <chain net name> get status\n" - "\tLook at current status\n" - "net -net <chain net name> stats tx [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n" - "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n" - "net -net <chain net name> [-mode update|all] sync < all | gdb | chains >\n" - "\tSyncronyze gdb, chains or everything\n" - "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" - "net -net <chain net name> link < list | add | del | info | establish >\n" - "\tList, add, del, dump or establish links\n" - "net -net <chain net name> ca add {-cert <cert name> | -hash <cert hash>}\n" - "\tAdd certificate to list of authority cetificates in GDB group\n" - "net -net <chain net name> ca list\n" - "\tPrint list of authority cetificates from GDB group\n" - "net -net <chain net name> ca del -hash <cert hash> [-H hex|base58(default)]\n" - "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n" - "net -net <chain net name> ledger reload\n" - "\tPurge the cache of chain net ledger and recalculate it from chain file\n" ); - s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); - - // maximum number of connections to other nodes - s_max_links_count = dap_config_get_item_int32_default(g_config, "general", "max_links", s_max_links_count); - // required number of connections to other nodes - s_required_links_count = dap_config_get_item_int32_default(g_config, "general", "require_links", s_required_links_count); - s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false); - - dap_chain_net_load_all(); - - dap_enc_http_set_acl_callback(dap_chain_net_set_acl); - log_it(L_NOTICE,"Chain networks initialized"); - return 0; -} - /** * @brief * load network config settings @@ -1204,14 +1225,13 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) // command 'list' const char * l_list_cmd = NULL; - if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "list", &l_list_cmd) != 0 ) { + if(dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "list", &l_list_cmd) != 0 ) { dap_string_t *l_string_ret = dap_string_new(""); if (dap_strcmp(l_list_cmd,"chains")==0){ const char * l_net_str = NULL; dap_chain_net_t* l_net = NULL; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_str); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "--net", &l_net_str); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-n", &l_net_str); + l_net = dap_chain_net_by_name(l_net_str); if (l_net){ @@ -1239,12 +1259,12 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) } }else{ - dap_string_append(l_string_ret,"Networks:\n "); + dap_string_append(l_string_ret,"Networks:\n"); // show list of nets dap_chain_net_item_t * l_net_item, *l_net_item_tmp; int l_net_i = 0; HASH_ITER(hh, s_net_items, l_net_item, l_net_item_tmp){ - dap_string_append_printf(l_string_ret, "%s\n", l_net_item->name); + dap_string_append_printf(l_string_ret, "\t%s\n", l_net_item->name); l_net_i++; } dap_string_append(l_string_ret, "\n"); @@ -1612,11 +1632,11 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) dap_config_get_item_str(l_cfg , "general" , "name" ), dap_config_get_item_str(l_cfg , "general" , "node-role" ) ); - dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); if(!l_net) { log_it(L_ERROR,"Can't create l_net"); return -1; } + dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); l_net_pvt->load_mode = true; l_net_pvt->acl_idx = a_acl_idx; l_net->pub.gdb_groups_prefix = dap_strdup ( @@ -2894,6 +2914,14 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da } } +/** + * @brief check certificate access list, written in chain config + * + * @param a_net - network object + * @param a_pkey_hash - certificate hash + * @return true + * @return false + */ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pkey_hash) { const char l_path[] = "network/"; @@ -2954,6 +2982,12 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke return l_authorized; } +/** + * @brief s_acl_callback function. Usually called from enc_http_proc + * set acl (l_enc_key_ks->acl_list) from acl_accept_ca_list, acl_accept_ca_gdb chain config parameters in [auth] section + * @param a_pkey_hash dap_chain_hash_fast_t hash object + * @return uint8_t* + */ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash) { uint16_t l_net_count; diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 09745c70f49314a71740572eead1de2d47bfb82c..40159b3fc946b36859fc5f667f53e03d6164ae55 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -1085,8 +1085,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, "Make cond transaction", "tx_cond_create -net <net name> -token <token_ticker> -wallet_f <wallet_from> -wallet_t <wallet_to>" "-value <value_datoshi> -unit <mb|kb|b|sec|day> -service <vpn>\n" ); - dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction", - "tx_verify -wallet <wallet name> \n" ); + dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction in mempool", + "tx_verify -net <net name> -chain <chain name> -tx <tx_hash>\n" ); // Transaction history dap_chain_node_cli_cmd_item_create("tx_history", com_tx_history, "Transaction history (for address or by hash)", diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 18a5f26afc890236658fe13261e230404aacec45..652309a265c9322b8aa177542365fc828ec184b0 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2502,7 +2502,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) switch(l_type){ case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ - dap_list_t *l_tsd_list = dap_list_alloc(); + dap_list_t *l_tsd_list = NULL; size_t l_tsd_total_size = 0; l_arg_index++; while (l_arg_index<a_argc-1){ @@ -3357,6 +3357,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) // create first transaction (with tx_token) dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t)); + l_tx->header.ts_created = time(NULL); dap_chain_hash_fast_t l_tx_prev_hash = { 0 }; // create items dap_chain_tx_token_t *l_tx_token = dap_chain_datum_tx_item_token_create(&l_emission_hash, l_ticker); @@ -3368,7 +3369,6 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_in); dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_out); - // Base tx don't need signature items but let it be if (l_certs){ // Sign all that we have with certs for(size_t i = 0; i < l_certs_size; i++) { @@ -3961,15 +3961,48 @@ int com_tx_create(int argc, char ** argv, char **str_reply) * @param str_reply * @return int */ -int com_tx_verify(int argc, char ** argv, char **str_reply) +int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply) { - if(argc > 1) { - if(str_reply) - dap_chain_node_cli_set_reply_text(str_reply, "command \"%s\" not recognized", argv[1]); + const char * l_tx_hash_str = NULL; + dap_chain_net_t * l_net = NULL; + dap_chain_t * l_chain = NULL; + int l_arg_index = 1; + + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &l_tx_hash_str); + if(!l_tx_hash_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_verify requires parameter '-tx'"); + return -1; } - else if(str_reply) - dap_chain_node_cli_set_reply_text(str_reply, "command not defined, enter \"help <cmd name>\""); - return -1; + dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); + if (!l_net || !l_chain) { + return -2; + } else if (a_str_reply && *a_str_reply) { + DAP_DELETE(*a_str_reply); + *a_str_reply = NULL; + } + dap_hash_fast_t l_tx_hash; + char *l_hex_str_from58 = NULL; + if (dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { + l_hex_str_from58 = dap_enc_base58_to_hex_str_from_str(l_tx_hash_str); + if (!l_hex_str_from58) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid tx hash format, need hex or base58"); + return -3; + } + } + size_t l_tx_size = 0; + char *l_gdb_group = dap_chain_net_get_gdb_group_mempool(l_chain); + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *) + dap_chain_global_db_gr_get(l_hex_str_from58 ? l_hex_str_from58 : l_tx_hash_str, &l_tx_size, l_gdb_group); + if (!l_tx) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx not found"); + return -3; + } + if (dap_chain_ledger_tx_add_check(l_net->pub.ledger, l_tx)) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx verify fail!"); + return -4; + } + dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx verified successfully"); + return 0; } @@ -3999,7 +4032,7 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>"); return -1; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 6fb5949d8145b3539ccf262ccea35654d832c591..d1b0be0a91eb322e8d222bdeaf39538f8f8e2e11 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -121,8 +121,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str); } else { char buf[50]; - dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n", - l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf), + dap_string_append_printf(a_str_out, "transaction:%s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n", + l_list_tx_any ? " (emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf), dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash)); } DAP_DELETE(l_tx_hash_user_str); @@ -267,7 +267,7 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n" "\t\t\t subtype: %s\n" "\t\t SubType:\n", - dap_ctime_r((time_t*)((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), + dap_ctime_r((time_t *)&((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), dap_chain_balance_to_coins( dap_chain_uint128_from(((dap_chain_tx_out_cond_t*)item)->header.value) ), diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index 0a35ddba34ef04ff885eb20ea877e1980f7d207d..50fc831af72e399cc12076b641c70b84a476726c 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -117,7 +117,7 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply); * * Verifing transaction */ -int com_tx_verify(int argc, char ** argv, char **str_reply); +int com_tx_verify(int a_argc, char ** a_argv, char **a_str_reply); /** * tx_history command diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 5206e305e18b7e83014b1641840bda9553b6ac05..80898e657256bf23ed7ba59ddaa5a00e7bdf2b0d 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -111,13 +111,13 @@ int dap_chain_net_srv_init() " -price_unit <Price Unit> -price_token <Token ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>]\n" " [-expires <Unix time when expires>] [-cert <cert name to sign order>]\n" " [{-ext <Extension with params> | -region <Region name> -continent <Continent name>}]\n" - +#ifdef DAP_MODULES_DYNAMIC "\tOrder create\n" "net_srv -net <chain net name> order static [save | delete]\n" "\tStatic nodelist create/delete\n" "net_srv -net <chain net name> order recheck\n" "\tCheck the availability of orders\n" - +#endif ); s_load_all(); @@ -584,7 +584,10 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) } } #endif - else { + else if (l_order_str) { + dap_string_append_printf(l_string_ret, "Unrecognized subcommand '%s'", l_order_str); + ret = -14; + } else { dap_string_append_printf(l_string_ret, "Command 'net_srv' requires subcommand 'order'"); ret = -3; } diff --git a/modules/net/srv/include/dap_chain_net_srv_common.h b/modules/net/srv/include/dap_chain_net_srv_common.h index a6ab4bf0838149ef687ecf8428623b05e75f979a..9c56f4dc38f75c29522b61b74d8ac808c37f54a5 100755 --- a/modules/net/srv/include/dap_chain_net_srv_common.h +++ b/modules/net/srv/include/dap_chain_net_srv_common.h @@ -37,11 +37,12 @@ //Service direction -typedef enum dap_chain_net_srv_order_direction{ +enum dap_chain_net_srv_order_direction{ SERV_DIR_BUY = 1, SERV_DIR_SELL = 2, SERV_DIR_UNDEFINED = 0 -} dap_chain_net_srv_order_direction_t; +}; +typedef byte_t dap_chain_net_srv_order_direction_t; typedef struct dap_chain_net_srv_abstract diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index 809305a7cfe03d28ee240ca2f710f6b12ec51e2e..c5bbdadf89502e2d39b03405ab54bd288b0d5c25 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -34,7 +34,7 @@ typedef struct dap_chain_net_srv_order uint16_t version; dap_chain_net_srv_uid_t srv_uid; // Service UID byte_t padding; // some padding - dap_chain_net_srv_order_direction_t direction:8; // Order direction - SELL or PURCHASE + dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE dap_chain_node_addr_t node_addr; // Node address that servs the order (if present) dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT