diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8409e5dcbe4792c074fb71d820f8162eed9fe3f3..c81ec7e9c6b39bb2309e9fbb5d728d755c77c096 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,69 +16,77 @@ stages: dependencies: [] -linux-amd64-tests: +tests:amd64.gcc: extends: .tests - image: demlabs/amd64/debian-bullseye:linuxbuilder + image: demlabs/debian/amd64:qt5 before_script: /opt/buildtools/prepare_environment.sh amd64-linux script: - mkdir build - cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -linux-amd64-tests-clang: +tests:amd64.clang: extends: .tests - image: demlabs/amd64/debian-bullseye:linuxbuilder + image: demlabs/debian/amd64:qt5 before_script: /opt/buildtools/prepare_environment.sh amd64-linux script: - mkdir build - cd build && cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -linux-arm32v7-tests: +tests:arm64.gcc: extends: .tests - image: demlabs/arm32v7/debian-bullseye:linuxbuilder - before_script: /opt/buildtools/prepare_environment.sh arm32v7-linux + image: demlabs/debian/arm64:qt5 + before_script: /opt/buildtools/prepare_environment.sh arm64-linux script: - mkdir build - cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -linux-arm32v7-tests-clang: +tests:arm64.clang: extends: .tests - image: demlabs/arm32v7/debian-bullseye:linuxbuilder - before_script: /opt/buildtools/prepare_environment.sh arm32v7-linux + image: demlabs/debian/arm64:qt5 + before_script: /opt/buildtools/prepare_environment.sh arm64-linux script: - mkdir build - cd build && cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -linux-arm64v8-tests: +tests:arm32.gcc: extends: .tests - image: demlabs/arm64v8/debian-bullseye:linuxbuilder - before_script: /opt/buildtools/prepare_environment.sh arm64-linux + image: demlabs/debian/arm32:qt5 + before_script: /opt/buildtools/prepare_environment.sh arm32v7-linux script: - mkdir build - cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -linux-arm64v8-tests-clang: +tests:arm32.clang: extends: .tests - image: demlabs/arm64v8/debian-bullseye:linuxbuilder - before_script: /opt/buildtools/prepare_environment.sh arm64-linux + image: demlabs/debian/arm32:qt5 + before_script: /opt/buildtools/prepare_environment.sh arm32v7-linux script: - mkdir build - cd build && cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="multisign" && make -j$(nproc) && ctest --verbose -windows-tests: +build:windows: extends: .tests - image: demlabs/amd64/debian-bullseye:windowsbuilder + image: demlabs/windows/amd64:qt5 before_script: /opt/buildtools/prepare_environment.sh amd64-windows script: - mkdir build - cd build && export PATH=${MXE_ROOT}/usr/bin:$PATH && x86_64-w64-mingw32.static-cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc) -macos-tests: +build:macos: extends: .tests - image: demlabs/amd64/debian-bullseye:osxbuilder + image: demlabs/macos/amd64:qt5 before_script: /opt/buildtools/prepare_environment.sh amd64-windows script: - mkdir build - cd build && $(${OSXCROSS_ROOT}/bin/osxcross-conf) && export OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1 && export OSXCROSS_HOST=x86_64-apple-darwin20.4 && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${OSXCROSS_ROOT}/toolchain.cmake -DBoost_INCLUDE_DIR=$BOOST_INCLUDE_DIR .. && make -j$(nproc) + + +build:android: + extends: .tests + image: demlabs/android/any:qt5 + before_script: /opt/buildtools/prepare_environment.sh amd64-windows + script: + - ./prod_build/build.sh --target android diff --git a/dap-sdk b/dap-sdk index 32adcc61f8cd2133bb1552b26aeb7d892494ada0..57b0f1297be20effd3c5e29b36274280ce7c6e38 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 32adcc61f8cd2133bb1552b26aeb7d892494ada0 +Subproject commit 57b0f1297be20effd3c5e29b36274280ce7c6e38 diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 558c9f504d2fb9c22f79e949241d3a9c020a158d..f0ac122c4eb9da05f548cfda3839cbd4f29c9d58 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -805,8 +805,8 @@ bool dap_chain_datum_dump_tx_json(dap_chain_datum_tx_t *a_datum, json_object_object_add(json_obj_item,"Changing vote is", l_voting_params->vote_changing_allowed ? json_object_new_string("available") : json_object_new_string("not available")); l_voting_params->delegate_key_required ? - json_object_object_add(json_obj_item,"Votes max count", json_object_new_string("A delegated key is required to participate in voting.")): - json_object_object_add(json_obj_item,"Votes max count", json_object_new_string("A delegated key is not required to participate in voting.")); + json_object_object_add(json_obj_item,"Delegated key for participating in voting", json_object_new_string("required")): + json_object_object_add(json_obj_item,"Delegated key for participating in voting", json_object_new_string("not required")); dap_list_free_full(l_voting_params->answers_list, NULL); DAP_DELETE(l_voting_params->voting_question); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 41b5a23e711768a6f353558b87e475f6748fdca0..28daa031aa561c32bd8dfa4df587deb6f536a5e1 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -177,13 +177,13 @@ DAP_STATIC_INLINE uint16_t s_get_round_skip_timeout(dap_chain_esbocs_session_t * int dap_chain_cs_esbocs_init() { - dap_chain_cs_add("esbocs", s_callback_new); + dap_chain_cs_add(DAP_CHAIN_ESBOCS_CS_TYPE_STR, s_callback_new); dap_stream_ch_proc_add(DAP_STREAM_CH_ESBOCS_ID, NULL, NULL, s_stream_ch_packet_in, NULL); - dap_cli_server_cmd_add ("esbocs", s_cli_esbocs, "ESBOCS commands", + dap_cli_server_cmd_add (DAP_CHAIN_ESBOCS_CS_TYPE_STR, s_cli_esbocs, "ESBOCS commands", "esbocs min_validators_count set -net <net_name> [-chain <chain_name>] -cert <poa_cert_name> -val_count <value>\n" "\tSets minimum validators count for ESBOCS consensus\n" "esbocs min_validators_count show -net <net_name> [-chain <chain_name>]\n" @@ -226,29 +226,29 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_ret = - 5; goto lb_err; } - l_esbocs_pvt->debug = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "consensus_debug", false); - l_esbocs_pvt->poa_mode = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "poa_mode", false); - l_esbocs_pvt->round_start_sync_timeout = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_start_sync_timeout", 15); - l_esbocs_pvt->new_round_delay = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "new_round_delay", 10); - l_esbocs_pvt->round_attempts_max = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_attempts_max", 4); - l_esbocs_pvt->round_attempt_timeout = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_attempt_timeout", 10); + l_esbocs_pvt->debug = dap_config_get_item_bool_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "consensus_debug", false); + l_esbocs_pvt->poa_mode = dap_config_get_item_bool_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "poa_mode", false); + l_esbocs_pvt->round_start_sync_timeout = dap_config_get_item_uint16_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "round_start_sync_timeout", 15); + l_esbocs_pvt->new_round_delay = dap_config_get_item_uint16_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "new_round_delay", 10); + l_esbocs_pvt->round_attempts_max = dap_config_get_item_uint16_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "round_attempts_max", 4); + l_esbocs_pvt->round_attempt_timeout = dap_config_get_item_uint16_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "round_attempt_timeout", 10); l_esbocs_pvt->start_validators_min = l_esbocs_pvt->min_validators_count = - dap_config_get_item_uint16(a_chain_cfg, "esbocs", "min_validators_count"); + dap_config_get_item_uint16(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "min_validators_count"); if (!l_esbocs_pvt->min_validators_count) { l_ret = -1; goto lb_err; } - const char *l_auth_certs_prefix = dap_config_get_item_str(a_chain_cfg, "esbocs", "auth_certs_prefix"); + const char *l_auth_certs_prefix = dap_config_get_item_str(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "auth_certs_prefix"); uint16_t l_node_addrs_count; - const char **l_addrs = dap_config_get_array_str(a_chain_cfg, "esbocs", "validators_addrs", &l_node_addrs_count); + const char **l_addrs = dap_config_get_array_str(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "validators_addrs", &l_node_addrs_count); if (l_node_addrs_count < l_esbocs_pvt->min_validators_count) { l_ret = -2; goto lb_err; } dap_chain_net_srv_stake_net_add(a_chain->net_id); - uint16_t l_auth_certs_count = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "auth_certs_count", l_node_addrs_count); + uint16_t l_auth_certs_count = dap_config_get_item_uint16_default(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "auth_certs_count", l_node_addrs_count); dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); for (size_t i = 0; i < l_auth_certs_count; i++) { char l_cert_name[512]; @@ -289,8 +289,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_validator->node_addr = l_signer_node_addr; l_validator->weight = uint256_1; l_esbocs_pvt->poa_validators = dap_list_append(l_esbocs_pvt->poa_validators, l_validator); - const char *l_signer_addr = dap_chain_hash_fast_to_str_static(&l_signing_addr.data.hash_fast); - log_it(L_MSG, "add validator addr "NODE_ADDR_FP_STR", signing addr %s", NODE_ADDR_FP_ARGS_S(l_signer_node_addr), l_signer_addr); + log_it(L_MSG, "add validator addr "NODE_ADDR_FP_STR", signing addr %s", NODE_ADDR_FP_ARGS_S(l_signer_node_addr), dap_chain_addr_to_str_static(&l_signing_addr)); if (!l_esbocs_pvt->poa_mode) { // auth certs in PoA mode will be first PoS validators keys dap_hash_fast_t l_stake_tx_hash = {}; @@ -300,7 +299,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) } } // Preset reward for block signs, before first reward decree - const char *l_preset_reward_str = dap_config_get_item_str(a_chain_cfg, "esbocs", "preset_reward"); + const char *l_preset_reward_str = dap_config_get_item_str(a_chain_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "preset_reward"); if (l_preset_reward_str) { uint256_t l_preset_reward = dap_chain_balance_scan(l_preset_reward_str); if (!IS_ZERO_256(l_preset_reward)) @@ -340,7 +339,12 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(a_group, &l_objs_count); if (l_objs_count >= 10) { for (size_t i = 0; i < l_objs_count; i++) { - SUM_256_256(l_value_total, *(uint256_t*)l_objs[i].value, &l_value_total); + if (l_objs[i].value_len != sizeof(uint256_t)) { + log_it(L_ERROR, "Autocollect record %s is corrupt, len %zu clear it", l_objs[i].key, l_objs[i].value_len); + dap_global_db_del_sync(a_group, l_objs[i].key); + continue; + } + SUM_256_256(l_value_total, *(uint256_t *)l_objs[i].value, &l_value_total); if (compare256(l_value_total, l_block_collect_params->collecting_level) >= 0) { l_level_reached = true; break; @@ -470,9 +474,9 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); - l_esbocs_pvt->collecting_addr = dap_chain_addr_from_str(dap_config_get_item_str(a_chain_net_cfg, "esbocs", "fee_addr")); - l_esbocs_pvt->collecting_level = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "collecting_level", - dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "set_collect_fee", "10.0"))); + l_esbocs_pvt->collecting_addr = dap_chain_addr_from_str(dap_config_get_item_str(a_chain_net_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "fee_addr")); + l_esbocs_pvt->collecting_level = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "collecting_level", + dap_config_get_item_str_default(a_chain_net_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "set_collect_fee", "10.0"))); dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_chain->net_id, false, NULL); for (dap_list_t *it = l_validators; it; it = it->next) { dap_stream_node_addr_t *l_addr = &((dap_chain_net_srv_stake_item_t *)it->data)->node_addr; @@ -487,7 +491,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf log_it(L_INFO, "Init ESBOCS session for net:%s, chain:%s", a_chain->net_name, a_chain->name); const char *l_sign_cert_str = NULL; - if( (l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg, "esbocs", "blocks-sign-cert")) ) { + if( (l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "blocks-sign-cert")) ) { dap_cert_t *l_sign_cert = dap_cert_find_by_name(l_sign_cert_str); if (l_sign_cert == NULL) { log_it(L_ERROR, "Can't load sign certificate, name \"%s\" is wrong", l_sign_cert_str); @@ -537,9 +541,9 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf dap_guuid_compose(l_net->pub.id.uint64, DAP_CHAIN_CLUSTER_ID_ESBOCS), l_sync_group, 72 * 3600, true, DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_TYPE_AUTONOMIC); - DAP_DELETE(l_sync_group); - dap_global_db_cluster_add_notify_callback(l_session->db_cluster, s_db_change_notifier, l_session); dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_session->db_cluster->links_cluster); + dap_global_db_del_sync(l_sync_group, NULL); // Drop table on stratup + DAP_DELETE(l_sync_group); #ifdef DAP_CHAIN_CS_ESBOCS_DIRECTIVE_SUPPORT dap_global_db_role_t l_directives_cluster_role_default = DAP_GDB_MEMBER_ROLE_ROOT; @@ -583,7 +587,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf log_it(L_ERROR, "No valid order found was signed by this validator delegated key. Switch off validator mode."); return -4; } - l_esbocs_pvt->emergency_mode = dap_config_get_item_bool_default(a_chain_net_cfg, "esbocs", "emergency_mode", false); + l_esbocs_pvt->emergency_mode = dap_config_get_item_bool_default(a_chain_net_cfg, DAP_CHAIN_ESBOCS_CS_TYPE_STR, "emergency_mode", false); if (l_esbocs_pvt->emergency_mode && !s_check_emergency_rights(l_esbocs, &l_my_signing_addr)) { log_it(L_ERROR, "This validator is not allowed to work in emergency mode. Use special decree to supply it"); return -5; @@ -685,7 +689,7 @@ bool dap_chain_esbocs_remove_validator_from_clusters(dap_chain_net_id_t a_net_id uint256_t dap_chain_esbocs_get_collecting_level(dap_chain_t *a_chain) { - dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), "esbocs"), uint256_0); + dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), uint256_0); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); @@ -695,7 +699,7 @@ uint256_t dap_chain_esbocs_get_collecting_level(dap_chain_t *a_chain) dap_enc_key_t *dap_chain_esbocs_get_sign_key(dap_chain_t *a_chain) { - dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), "esbocs"), NULL); + dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), NULL); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); @@ -705,7 +709,7 @@ dap_enc_key_t *dap_chain_esbocs_get_sign_key(dap_chain_t *a_chain) int dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value) { - dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), "esbocs"), -1); + dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), -1); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); @@ -727,7 +731,7 @@ int dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_n int dap_chain_esbocs_set_signs_struct_check(dap_chain_t *a_chain, bool a_enable) { - dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), "esbocs"), -1); + dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), -1); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); @@ -737,7 +741,7 @@ int dap_chain_esbocs_set_signs_struct_check(dap_chain_t *a_chain, bool a_enable) int dap_chain_esbocs_set_emergency_validator(dap_chain_t *a_chain, bool a_add, uint32_t a_sign_type, dap_hash_fast_t *a_validator_hash) { - dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), "esbocs"), -1); + dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), -1); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); @@ -944,6 +948,40 @@ static dap_list_t *s_validator_check_synced(dap_chain_addr_t *a_addr, dap_list_t return dap_list_find(a_validators, a_addr, s_callback_addr_compare_synced); } +static void s_db_calc_sync_hash(dap_chain_esbocs_session_t *a_session) +{ + char *l_penalty_group = s_get_penalty_group(a_session->chain->net_id); + size_t l_penalties_count = 0; + dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_penalty_group, &l_penalties_count); + for (size_t i = 0; i < l_penalties_count; i++) { + dap_chain_addr_t *l_validator_addr = dap_chain_addr_from_str(l_objs[i].key); + if (!l_validator_addr) { + log_it(L_WARNING, "Unreadable address in esbocs global DB group"); + dap_global_db_del_sync(l_penalty_group, l_objs[i].key); + continue; + } + if (l_validator_addr->net_id.uint64 != a_session->chain->net_id.uint64) { + log_it(L_ERROR, "Wrong destination net ID %" DAP_UINT64_FORMAT_x "session net ID %" DAP_UINT64_FORMAT_x, + l_validator_addr->net_id.uint64, a_session->chain->net_id.uint64); + dap_global_db_del_sync(l_penalty_group, l_objs[i].key); + continue; + } + if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, false)) { + log_it(L_ERROR, "Validator with signing address %s not found in network %s", + l_objs[i].key, a_session->chain->net_name); + dap_global_db_del_sync(l_penalty_group, l_objs[i].key); + continue; + } + } + dap_global_db_objs_delete(l_objs, l_penalties_count); + dap_store_obj_t *l_last_raw = dap_global_db_driver_read_last(l_penalty_group, false); + if (l_last_raw) { + a_session->db_hash = dap_global_db_driver_hash_get(l_last_raw); + dap_store_obj_free_one(l_last_raw); + } + DAP_DELETE(l_penalty_group); + a_session->is_actual_hash = true; +} static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session) { @@ -954,6 +992,8 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session) a_session->ts_round_sync_start = dap_time_now(); if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash)) return; // My last block hash has changed, skip sync message + if (!a_session->is_actual_hash) + s_db_calc_sync_hash(a_session); if (PVT(a_session->esbocs)->debug) { dap_string_t *l_addr_list = dap_string_new(""); for (dap_list_t *it = a_session->cur_round.validators_list; it; it = it->next) { @@ -1033,6 +1073,8 @@ static void s_session_round_clear(dap_chain_esbocs_session_t *a_session) .last_block_hash = a_session->cur_round.last_block_hash, .sync_attempt = a_session->cur_round.sync_attempt }; + a_session->db_hash = c_dap_global_db_driver_hash_blank; + a_session->is_actual_hash = false; } static bool s_session_round_new(void *a_arg) @@ -1949,29 +1991,6 @@ static void s_session_directive_process(dap_chain_esbocs_session_t *a_session, d s_message_send(a_session, l_type, a_directive_hash, NULL, 0, a_session->cur_round.all_validators); } -static void s_db_change_notifier(dap_store_obj_t *a_obj, void *a_arg) -{ - dap_chain_esbocs_session_t *l_session = a_arg; - dap_chain_addr_t *l_validator_addr = dap_chain_addr_from_str(a_obj->key); - if (!l_validator_addr) { - log_it(L_WARNING, "Unreadable address in esbocs global DB group"); - return; - } - if (l_validator_addr->net_id.uint64 != l_session->chain->net_id.uint64) { - log_it(L_ERROR, "Wrong destination net ID %" DAP_UINT64_FORMAT_x "session net ID %" DAP_UINT64_FORMAT_x, - l_validator_addr->net_id.uint64, l_session->chain->net_id.uint64); - return; - } - if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, - dap_store_obj_get_type(a_obj) != DAP_GLOBAL_DB_OPTYPE_ADD)) { - log_it(L_ERROR, "Validator with signing address %s not found in network %s", - a_obj->key, l_session->chain->net_name); - return; - } - log_it(L_DEBUG, "Got new penalty item for group %s with key %s", a_obj->group, a_obj->key); - l_session->db_hash = dap_global_db_driver_hash_get(a_obj); -} - static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, dap_hash_fast_t *a_directive_hash) { if (!a_directive) { @@ -2308,6 +2327,8 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain " Receive START_SYNC: from validator:%s, sync attempt %"DAP_UINT64_FORMAT_U, l_session->chain->net_name, l_session->chain->name, l_message->hdr.round_id, l_validator_addr_str, l_sync_attempt); + if (!l_session->is_actual_hash) + s_db_calc_sync_hash(l_session); dap_global_db_driver_hash_t l_msg_hash = ((struct sync_params *)l_message_data)->db_hash, l_session_hash = l_session->db_hash; if (!PVT(l_session->esbocs)->emergency_mode && dap_global_db_driver_hash_compare(&l_msg_hash, &l_session_hash)) { @@ -2993,7 +3014,7 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) CHAIN_TYPE_ANCHOR)) return -3; const char *l_chain_type = dap_chain_get_cs_type(l_chain); - if (strcmp(l_chain_type, "esbocs")) { + if (strcmp(l_chain_type, DAP_CHAIN_ESBOCS_CS_TYPE_STR)) { dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR,"Type of chain \"%s\" is not block. Chain with current consensus \"%s\" is not supported by this command", l_chain->name, l_chain_type); return -DAP_CHAIN_NODE_CLI_COM_ESBOCS_CHAIN_TYPE_ERR; diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index 5462d842fa66893095e97f6482b384720445016b..bd009e34b125c2eac26c81315a10a16800def6d7 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -32,7 +32,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #define DAP_STREAM_CH_ESBOCS_ID 'E' #define DAP_CHAIN_ESBOCS_PROTOCOL_VERSION 8 -#define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX "esbocs" +#define DAP_CHAIN_ESBOCS_CS_TYPE_STR "esbocs" +#define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX DAP_CHAIN_ESBOCS_CS_TYPE_STR #define DAP_CHAIN_CLUSTER_ID_ESBOCS 0x8000 #define DAP_CHAIN_ESBOCS_MSG_TYPE_SUBMIT 0x04 @@ -206,6 +207,7 @@ typedef struct dap_chain_esbocs_session { dap_chain_esbocs_penalty_item_t *penalty; dap_global_db_cluster_t *db_cluster; dap_global_db_driver_hash_t db_hash; + bool is_actual_hash; struct dap_chain_esbocs_session *prev, *next; } dap_chain_esbocs_session_t; diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 2b6e49df66c572470ad1d2c1185fa581d01eb2fb..1175e39508913ef9da5a303c96b276dbc9f3737d 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -4705,7 +4705,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_tx_item->cache_data.multichannel = l_multichannel; l_tx_item->ts_added = dap_nanotime_now(); pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); - if (dap_chain_net_get_load_mode(a_ledger->net)) + if (dap_chain_net_get_load_mode(a_ledger->net) || dap_chain_net_get_state(a_ledger->net) == NET_STATE_SYNC_CHAINS) HASH_ADD(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item); else HASH_ADD_INORDER(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index fe298bf9f287414005056f635de1f01ba4b29d5f..c955ad1786763a539ec08c79dabe2292c463f01b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -678,6 +678,8 @@ static bool s_net_states_proc(void *a_arg) dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); assert(l_net_pvt); if (l_net_pvt->state_target == NET_STATE_OFFLINE) { + if(l_net_pvt->state == NET_STATE_SYNC_CHAINS) + dap_leger_load_end(l_net->pub.ledger); l_net_pvt->state = NET_STATE_OFFLINE; } @@ -687,8 +689,11 @@ static bool s_net_states_proc(void *a_arg) log_it(L_NOTICE,"%s.state: NET_STATE_OFFLINE", l_net->pub.name); // delete all links if ( l_net_pvt->state_target != NET_STATE_OFFLINE ){ + dap_chain_net_state_t l_prev_state = l_net_pvt->state; l_net_pvt->state = NET_STATE_LINKS_PREPARE; l_repeat_after_exit = true; + if(l_prev_state == NET_STATE_SYNC_CHAINS) + dap_leger_load_end(l_net->pub.ledger); } l_net_pvt->last_sync = 0; } break; @@ -2589,10 +2594,13 @@ static void s_sync_timer_callback(void *a_arg) l_net_pvt->sync_context.cur_chain = l_net_pvt->sync_context.cur_chain->next; log_it(L_DEBUG, "[%s:%d] Go to next chain %p", __FUNCTION__, __LINE__, l_net_pvt->sync_context.cur_chain); if (!l_net_pvt->sync_context.cur_chain) { + dap_chain_net_state_t l_prev_state = l_net_pvt->state; if (l_net_pvt->sync_context.last_state == SYNC_STATE_SYNCED) { l_net_pvt->state = NET_STATE_ONLINE; l_net_pvt->sync_context.state = l_net_pvt->sync_context.last_state = SYNC_STATE_IDLE; s_net_states_proc(l_net); + if(l_prev_state == NET_STATE_SYNC_CHAINS) + dap_leger_load_end(l_net->pub.ledger); } else l_net_pvt->sync_context.state = l_net_pvt->sync_context.last_state = SYNC_STATE_WAITING; return; @@ -2969,6 +2977,8 @@ void dap_chain_net_set_state(dap_chain_net_t *l_net, dap_chain_net_state_t a_sta if(a_state == PVT(l_net)->state){ return; } + if(PVT(l_net)->state == NET_STATE_SYNC_CHAINS) + dap_leger_load_end(l_net->pub.ledger); PVT(l_net)->state = a_state; dap_proc_thread_callback_add(NULL, s_net_states_proc, l_net); } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 09cd68230f0593ca54de0c2ecb13771885f2eb73..c78ef1d0a471d1c72018bcd44d1dd85eb768b418 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -807,9 +807,9 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) } size_t l_objs_count = 0; - dap_global_db_obj_t* l_obj = dap_global_db_get_all_sync(l_group_str, &l_objs_count); + dap_store_obj_t *l_objs = dap_global_db_get_all_raw_sync(l_group_str, &l_objs_count); - if (!l_obj || !l_objs_count) + if (!l_objs || !l_objs_count) { dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP,"No data in group %s.", l_group_str); return -DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_NO_DATA_IN_GROUP; @@ -819,13 +819,15 @@ int com_global_db(int a_argc, char ** a_argv, void **a_str_reply) json_object* json_obj_keys = NULL; for(size_t i = 0; i < l_objs_count; i++) { char l_ts[64] = { '\0' }; - dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_obj[i].timestamp); + dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_objs[i].timestamp); json_obj_keys = json_object_new_object(); - json_object_object_add(json_obj_keys, "key", json_object_new_string(l_obj[i].key)); + json_object_object_add(json_obj_keys, "key", json_object_new_string(l_objs[i].key)); json_object_object_add(json_obj_keys, "time", json_object_new_string(l_ts)); + json_object_object_add(json_obj_keys, "type", json_object_new_string( + dap_store_obj_get_type(l_objs + i) == DAP_GLOBAL_DB_OPTYPE_ADD ? "record" : "hole")); json_object_array_add(json_arr_keys, json_obj_keys); } - dap_global_db_objs_delete(l_obj, l_objs_count); + dap_store_obj_free(l_objs, l_objs_count); json_object* json_keys_list = json_object_new_object(); json_object_object_add(json_keys_list, "group name", json_object_new_string(l_group_str)); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 548e6fd9850255fdcb6f6c598460c28089d84788..e08164a47dc01ee669a7bec7dc74788c25339631 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -395,28 +395,28 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s return -2; } - // prepare for signal waiting - struct timespec l_cond_timeout; - clock_gettime(CLOCK_REALTIME, &l_cond_timeout); - l_cond_timeout.tv_sec += a_timeout_ms;//1000; // signal waiting - dap_chain_node_client_state_t l_clinet_state = a_client->state; - while (a_client->state == l_clinet_state) { + while (a_client->state != a_waited_state) { + // prepare for signal waiting + struct timespec l_cond_timeout; + clock_gettime(CLOCK_REALTIME, &l_cond_timeout); + l_cond_timeout.tv_sec += a_timeout_ms; int l_ret_wait = pthread_cond_timedwait(&a_client->wait_cond, &a_client->wait_mutex, &l_cond_timeout); - if(l_ret_wait == 0 && ( - a_client->state == a_waited_state || - (a_client->state == NODE_CLIENT_STATE_ERROR || a_client->state == NODE_CLIENT_STATE_DISCONNECTED)) - ) { + if (l_ret_wait == 0) { + if (a_client->state != a_waited_state) { + if (a_client->state == NODE_CLIENT_STATE_CONNECTING) + continue; // Spurious wakeup? + assert(a_client->state == NODE_CLIENT_STATE_DISCONNECTED || a_client->state == NODE_CLIENT_STATE_ERROR); + } ret = a_client->state == a_waited_state ? 0 : -2; - break; - } - else if(l_ret_wait == ETIMEDOUT) { // 110 260 + } else if (l_ret_wait == ETIMEDOUT) { // 110 260 log_it(L_NOTICE, "Wait for status is stopped by timeout"); ret = -1; - break; - }else if (l_ret_wait != 0 ){ + } else if (l_ret_wait != 0) { log_it(L_CRITICAL, "pthread_cond_timedwait() error %d:\"%s\"", l_ret_wait, dap_strerror(l_ret_wait)); + ret = -4; } + break; } pthread_mutex_unlock(&a_client->wait_mutex); return ret; diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c index 0611998fd40651765a993312a25207b48a6e802a..f4805ddea2990db7754c5cc1559c165cf35396fb 100644 --- a/modules/service/voting/dap_chain_net_srv_voting.c +++ b/modules/service/voting/dap_chain_net_srv_voting.c @@ -699,6 +699,10 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) dap_time_t l_time_expire = 0; if (l_voting_expire_str) l_time_expire = dap_time_from_str_rfc822(l_voting_expire_str); + if(!l_time_expire){ + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wrong time format. -expire parameter must be in format \"Day Month Year HH:MM:SS Timezone\" e.g. \"19 August 2024 22:00:00 +00\""); + return -104; + } uint64_t l_max_count = 0; if (l_max_votes_count_str) l_max_count = strtoul(l_max_votes_count_str, NULL, 10); @@ -873,6 +877,9 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) case DAP_CHAIN_NET_VOTE_VOTING_NO_KEY_FOUND_IN_CERT: { dap_cli_server_cmd_set_reply_text(a_str_reply, "No key found in \"%s\" certificate", l_cert_name); } break; + case DAP_CHAIN_NET_VOTE_VOTING_CERT_REQUIRED: { + dap_cli_server_cmd_set_reply_text(a_str_reply, "This voting required a delegated key. Parameter -cert must contain a valid certificate name"); + } break; case DAP_CHAIN_NET_VOTE_VOTING_NO_PUBLIC_KEY_IN_CERT: { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't serialize public key of certificate \"%s\"", l_cert_name); @@ -1003,7 +1010,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) char l_tmp_buf[DAP_TIME_STR_SIZE]; dap_time_t l_expire = *(dap_time_t*)((byte_t*)l_voting->voting_params.voting_tx + l_voting->voting_params.voting_expire_offset); dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_expire); - dap_string_append_printf(l_str_out, "\t Voting expire: %s", l_tmp_buf); + dap_string_append_printf(l_str_out, "\t Voting expire: %s \n", l_tmp_buf); dap_string_truncate(l_str_out, l_str_out->len - 1); dap_string_append_printf(l_str_out, " (%s)\n", l_expire > dap_time_now() ? "active" : "expired"); } @@ -1434,7 +1441,9 @@ int dap_chain_net_vote_voting(dap_cert_t *a_cert, uint256_t a_fee, dap_chain_wal if(l_voting->voting_params.delegate_key_required_offset && *(bool*)((byte_t*)l_voting->voting_params.voting_tx + l_voting->voting_params.delegate_key_required_offset) ){ - if (!a_cert) {} else { + if (!a_cert) { + return DAP_CHAIN_NET_VOTE_VOTING_CERT_REQUIRED; + } else { if (a_cert->enc_key == NULL) { return DAP_CHAIN_NET_VOTE_VOTING_NO_KEY_FOUND_IN_CERT; } diff --git a/modules/service/voting/include/dap_chain_net_srv_voting.h b/modules/service/voting/include/dap_chain_net_srv_voting.h index 94f458d2145adffea685716a5f7e49b8147bf4bc..6fcf2f9a45bb1d02cf2bf3b2d53b4beb2799dac0 100644 --- a/modules/service/voting/include/dap_chain_net_srv_voting.h +++ b/modules/service/voting/include/dap_chain_net_srv_voting.h @@ -98,6 +98,7 @@ enum DAP_CHAIN_NET_VOTE_VOTING_ERROR{ DAP_CHAIN_NET_VOTE_VOTING_ALREADY_EXPIRED, DAP_CHAIN_NET_VOTE_VOTING_NO_KEY_FOUND_IN_CERT, DAP_CHAIN_NET_VOTE_VOTING_NO_PUBLIC_KEY_IN_CERT, + DAP_CHAIN_NET_VOTE_VOTING_CERT_REQUIRED, DAP_CHAIN_NET_VOTE_VOTING_KEY_IS_NOT_DELEGATED, DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE, DAP_CHAIN_NET_VOTE_VOTING_SOURCE_ADDRESS_INVALID, diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 20dafcd7e81e2ea3466c978a6b7a218bd6993474..9ba8db186f44b867cb924aa7c20c6ad6c3310fc5 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -123,7 +123,7 @@ typedef struct vpn_local_network { #endif bool auto_cpu_reassignment; - ch_vpn_pkt_t * pkt_out[400]; + dap_stream_ch_vpn_pkt_t * pkt_out[400]; size_t pkt_out_size; size_t pkt_out_rindex; size_t pkt_out_windex; @@ -159,7 +159,7 @@ typedef struct tun_socket_msg{ struct in_addr addr; } ip_unassigment; struct{ // CH VPN send operation - ch_vpn_pkt_t * pkt; + dap_stream_ch_vpn_pkt_t * pkt; } ch_vpn_send; }; } tun_socket_msg_t; @@ -241,10 +241,10 @@ static int s_tun_attach_queue(int fd); #endif static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * a_ch_vpn_info, const void * a_data, size_t a_data_size); -static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, ch_vpn_pkt_t * l_pkt_out); +static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, dap_stream_ch_vpn_pkt_t * l_pkt_out); -static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, ch_vpn_pkt_t * l_pkt_out) +static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, dap_stream_ch_vpn_pkt_t * l_pkt_out) { dap_chain_net_srv_stream_session_t *l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session); dap_chain_net_srv_usage_t *l_usage = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session, l_ch_vpn->usage_id); @@ -272,7 +272,7 @@ static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, * @param a_pkt_out * @return */ -static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_chain_net_srv_ch_vpn_t * a_ch_vpn, ch_vpn_pkt_t * a_pkt_out) +static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_chain_net_srv_ch_vpn_t * a_ch_vpn, dap_stream_ch_vpn_pkt_t * a_pkt_out) { dap_chain_net_srv_stream_session_t * l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION (a_ch_vpn->ch->stream->session ); dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session, a_ch_vpn->usage_id); @@ -297,7 +297,7 @@ static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_c static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_info, const void * a_data, size_t a_data_size) { assert(a_data_size > sizeof (dap_os_iphdr_t)); - ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size); + dap_stream_ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size); if (!l_pkt_out) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; @@ -1019,7 +1019,7 @@ static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_u l_srv_session->last_update_ts = time(NULL); if (!l_usage_active->is_grace && l_srv_session->limits_ts <= 0){ char *l_user_key = dap_chain_hash_fast_to_str_new(&l_usage_active->client_pkey_hash); - log_it(L_INFO,"%"DAP_UINT64_FORMAT_U" seconds more for VPN usage for user %s", l_srv_session->limits_ts < 0 ? l_usage_active->receipt->receipt_info.units + l_srv_session->limits_ts : + log_it(L_INFO,"%ld seconds more for VPN usage for user %s", l_srv_session->limits_ts < 0 ? l_usage_active->receipt->receipt_info.units + l_srv_session->limits_ts : l_usage_active->receipt->receipt_info.units, l_user_key); DAP_DELETE(l_user_key); l_srv_session->limits_ts += (time_t)l_usage_active->receipt->receipt_info.units; @@ -1388,7 +1388,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch , a_usage->is_limits_changed = true; if(a_srv_session->limits_ts && a_srv_session->limits_ts < l_current_limit_ts/2 && - !a_usage->receipt_next && !a_usage->is_waiting_first_receipt_sign){ + !a_usage->receipt_next && !a_usage->is_waiting_first_receipt_sign && !a_usage->is_grace){ l_issue_new_receipt = true; } a_srv_session->last_update_ts = time(NULL); @@ -1523,7 +1523,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch , static void send_pong_pkt(dap_stream_ch_t* a_ch) { // log_it(L_DEBUG,"---------------------------------- PONG!"); - ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); + dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); if (!pkt_out) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; @@ -1552,7 +1552,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_ if ( l_ch_vpn->addr_ipv4.s_addr ) { log_it(L_WARNING, "IP address is already leased"); - ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header)); + dap_stream_ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header)); if (!pkt_out) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; @@ -1584,7 +1584,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_ HASH_ADD(hh, s_ch_vpn_addrs, addr_ipv4, sizeof (l_ch_vpn->addr_ipv4), l_ch_vpn); pthread_rwlock_unlock( &s_clients_rwlock ); - ch_vpn_pkt_t *l_pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, + dap_stream_ch_vpn_pkt_t *l_pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(l_pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_network_addr)); l_pkt_out->header.sock_id = s_raw_server->tun_fd; l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY; @@ -1687,7 +1687,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_ HASH_ADD(hh, s_ch_vpn_addrs, addr_ipv4, sizeof (l_ch_vpn->addr_ipv4), l_ch_vpn); pthread_rwlock_unlock( &s_clients_rwlock ); - ch_vpn_pkt_t *pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, + dap_stream_ch_vpn_pkt_t *pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw)); pkt_out->header.sock_id = s_raw_server->tun_fd; pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY; @@ -1713,7 +1713,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_ } } else { // All the network is filled with clients, can't lease a new address log_it(L_ERROR, "No free IP address left, can't lease one..."); - ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header)); + dap_stream_ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header)); pkt_out->header.sock_id = s_raw_server->tun_fd; pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM; pkt_out->header.usage_id = a_usage->id; @@ -1741,7 +1741,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) { dap_stream_ch_pkt_t * l_pkt = (dap_stream_ch_pkt_t *) a_arg; - ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t*)l_pkt->data; + dap_stream_ch_vpn_pkt_t *l_vpn_pkt = (dap_stream_ch_vpn_pkt_t*)l_pkt->data; if (l_pkt->hdr.data_size < sizeof(l_vpn_pkt->header)) { log_it(L_WARNING, "Data size of stream channel packet %u is lesser than size of VPN packet header %zu", l_pkt->hdr.data_size, sizeof(l_vpn_pkt->header)); @@ -1942,7 +1942,7 @@ static bool s_es_tun_write(dap_events_socket_t *a_es, void *arg) size_t l_shift = 0; debug_if(s_debug_more, L_DEBUG, "Write %lu bytes to tun", l_tun->es->buf_out_size); for (ssize_t l_pkt_size = 0, l_bytes_written = 0; l_tun->es->buf_out_size; ) { - ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t *)(l_tun->es->buf_out + l_shift); + dap_stream_ch_vpn_pkt_t *l_vpn_pkt = (dap_stream_ch_vpn_pkt_t *)(l_tun->es->buf_out + l_shift); l_pkt_size = l_vpn_pkt->header.op_data.data_size; debug_if(s_debug_more, L_DEBUG, "Packet: op_code 0x%02x, data size %ld", l_vpn_pkt->header.op_code, l_pkt_size); diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index 03ea305bfad2f114c215134cbacebf109461d008..753da5a7267b94b1d8d934331f99ecc7d2089149 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -181,7 +181,7 @@ static int s_callback_client_success(dap_chain_net_srv_t * a_srv, uint32_t a_usa if(l_ch) { // Is present in hash table such destination address size_t l_ipv4_str_len = 0; //dap_strlen(a_ipv4_str); - ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len); + dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len); if (!pkt_out) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_session_unlock(); @@ -682,7 +682,7 @@ dap_chain_net_vpn_client_status_t dap_chain_net_vpn_client_status(void) */ void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t* a_pkt) { - ch_vpn_pkt_t * l_sf_pkt = (ch_vpn_pkt_t *) a_pkt->data; + dap_stream_ch_vpn_pkt_t * l_sf_pkt = (dap_stream_ch_vpn_pkt_t *) a_pkt->data; size_t l_sf_pkt_data_size = a_pkt->hdr.data_size - sizeof(l_sf_pkt->header); if(!a_pkt->hdr.data_size) { diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index f5de32b36fd1feed2f823239d4ade8858b8b51a0..0b3da1c064f4688115525480dd1b3e70632f648d 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -384,7 +384,7 @@ static void m_client_tun_read(dap_events_socket_t * a_es, void * arg) log_it(L_ERROR, "No remote client for incoming ip packet %s -> %s", l_str_saddr, l_str_daddr); break; } - ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header) + l_read_bytes); + dap_stream_ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header) + l_read_bytes); pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_SEND; pkt_out->header.sock_id = s_fd_tun; pkt_out->header.op_data.data_size = l_read_bytes; @@ -617,7 +617,7 @@ int dap_chain_net_vpn_client_tun_status(void) static void ch_sf_pkt_send(dap_stream_ch_t * a_ch, void * a_data, size_t a_data_size) { - ch_vpn_pkt_t *l_pkt_out; + dap_stream_ch_vpn_pkt_t *l_pkt_out; size_t l_pkt_out_size = sizeof(l_pkt_out->header) + a_data_size; //log_it(L_DEBUG,"Peer for addr %s found (pkt_size %d)" // ,inet_ntoa(in_daddr), read_ret); @@ -625,7 +625,7 @@ static void ch_sf_pkt_send(dap_stream_ch_t * a_ch, void * a_data, size_t a_data_ log_it(L_ERROR, "Try to send to NULL channel"); return; } - l_pkt_out = DAP_NEW_SIZE(ch_vpn_pkt_t, l_pkt_out_size); + l_pkt_out = DAP_NEW_SIZE(dap_stream_ch_vpn_pkt_t, l_pkt_out_size); memset(&l_pkt_out->header,0,sizeof(l_pkt_out->header)); l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV; l_pkt_out->header.sock_id = a_ch->stream->esocket->socket; @@ -669,7 +669,7 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, // if((ret = write(raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size))<0){ log_it(L_ERROR, "write() error %d : \"%s\"", errno, dap_strerror(errno)); //log_it(ERROR,"raw socket ring buffer overflowed"); - ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); + dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); if (!pkt_out) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); if(in_daddr_str) @@ -702,7 +702,7 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, * @param a_pkt * @param a_pkt_data_size */ -int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size) +int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, dap_stream_ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size) { if(a_pkt_data_size < (2 * sizeof(struct in_addr))) { log_it(L_ERROR, "Too small ADDR_REPLY packet (%zu bytes, need at least %zu", a_pkt_data_size, 2 * sizeof(struct in_addr)); diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h index dbcbaa095b276cb86c6a9f8b7384bf6d7aa5e00c..fdbae700319d5b7b22979baff69fba823579cb92 100644 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h +++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h @@ -62,7 +62,7 @@ #define TUN_MTU 0xFFFF -typedef struct ch_vpn_pkt { +typedef struct dap_stream_ch_vpn_pkt { struct { int sock_id; // Client's socket id uint32_t op_code; // Operation code @@ -70,25 +70,21 @@ typedef struct ch_vpn_pkt { union { struct { // L4 connect operation uint32_t addr_size; - uint16_t port; - uint16_t padding; - } op_connect; + uint16_t port DAP_ALIGNED(4); + } DAP_PACKED op_connect; struct { // For data transmission, usualy for I/O functions - uint32_t data_size; - uint32_t padding; - } op_data; + uint32_t data_size DAP_ALIGNED(8); + } DAP_PACKED op_data; struct { // We have a problem and we know that! - uint32_t code; // I hope we'll have no more than 4B+ problems, not I?? - uint32_t padding_padding_padding_damned_padding_nobody_nowhere_uses_this_fild_but_if_wil_change_me_pls_with_an_auto_rename; - } op_problem; + uint32_t code DAP_ALIGNED(8); // I hope we'll have no more than 4B+ problems, not I?? + } DAP_PACKED op_problem; struct { - uint32_t padding1; - uint32_t padding2; - } raw; // Raw access to OP bytes + uint64_t op_data_raw DAP_ALIGNED(8); + } DAP_PACKED raw; // Raw access to OP bytes }; } DAP_ALIGN_PACKED header; byte_t data[]; // Binary data nested by packet -}DAP_ALIGN_PACKED ch_vpn_pkt_t; +}DAP_ALIGN_PACKED dap_stream_ch_vpn_pkt_t; typedef struct dap_chain_net_srv_vpn_tun_socket dap_chain_net_srv_vpn_tun_socket_t; typedef struct dap_chain_net_srv_ch_vpn dap_chain_net_srv_ch_vpn_t; diff --git a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h index e1c84a307e83c564355b567bc12877682e91f545..1d5022b564311abb91de0b7cbb8584a28d6c9707 100644 --- a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h +++ b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h @@ -31,5 +31,5 @@ int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char int dap_chain_net_vpn_client_tun_delete(void); int dap_chain_net_vpn_client_tun_status(void); -int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size); +int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, dap_stream_ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size); void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, size_t pkt_data_size); diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 55b491adc60323e7a8c0781ef31e89a81b64243c..87efb2f7871551493bc7f18ef8d1d3d9e29b89c3 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -164,7 +164,7 @@ int dap_chain_net_srv_xchange_init() "srv_xchange tx_list -net <net_name> [-time_from <From_time>] [-time_to <To_time>]" "[[-addr <wallet_addr> [-status {inactive|active|all}] ]\n" /* @RRL: #6294 */ "\tList of exchange transactions\n" - "\tAll times are in RFC822. For example: \"Thu, 7 Dec 2023 21:18:04\"\n" + "\tAll times are in RFC822. For example: \"7 Dec 2023 21:18:04\"\n" "srv_xchange token_pair -net <net_name> list all [-limit <limit>] [-offset <offset>]\n" "\tList of all token pairs\n" @@ -172,7 +172,7 @@ int dap_chain_net_srv_xchange_init() "\tGet average rate for token pair <token from>:<token to> from <From time> to <To time> \n" "srv_xchange token_pair -net <net_name> rate history -token_from <token_ticker> -token_to <token_ticker> [-time_from <From_time>] [-time_to <To_time>] [-limit <limit>] [-offset <offset>]\n" "\tPrint rate history for token pair <token from>:<token to> from <From time> to <To time>\n" - "\tAll times are in RFC822. For example: \"Thu, 7 Dec 2023 21:18:04\"\n" + "\tAll times are in RFC822. For example: \"T7 Dec 2023 21:18:04\"\n" "srv_xchange enable\n" "\tEnable eXchange service\n" diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 1caca8b14032589117f2e10b2bc5485182049710..13c5384906c35c4bf84b2ad87e511f1a8cd697e1 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1242,17 +1242,14 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) .block_sign_pkey = l_pub_key, .collecting_addr = l_addr }; - //Cleare gdb - size_t l_objs_fee_count = 0; - size_t l_objs_rew_count = 0; + //Clear gdb char *l_group_fee = dap_chain_cs_blocks_get_fee_group(l_net->pub.name); - char *l_group_rew = dap_chain_cs_blocks_get_reward_group(l_net->pub.name); - dap_global_db_obj_t *l_objs_fee = dap_global_db_get_all_sync(l_group_fee, &l_objs_fee_count); - dap_global_db_obj_t *l_objs_rew = dap_global_db_get_all_sync(l_group_rew, &l_objs_rew_count); - if(l_objs_fee_count)dap_global_db_objs_delete(l_objs_fee,l_objs_fee_count); - if(l_objs_rew_count)dap_global_db_objs_delete(l_objs_rew,l_objs_rew_count); + dap_global_db_del_sync(l_group_fee, NULL); DAP_DELETE(l_group_fee); - DAP_DELETE(l_group_rew); + char *l_group_reward = dap_chain_cs_blocks_get_reward_group(l_net->pub.name); + dap_global_db_del_sync(l_group_reward, NULL); + DAP_DELETE(l_group_reward); + json_object* json_arr_bl_out = json_object_new_array(); for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index c341711cdbaed35563d8d77025643c23a801e45c..25892281a3fab2a8418557a4eb05290c2a0c4b53 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -63,7 +63,7 @@ //#define __USE_GNU -#if defined(__USE_BSD) || defined(__USE_GNU) +#if defined(__USE_BSD) || defined(__USE_GNU) || defined(DAP_OS_ANDROID) #define S_IREAD S_IRUSR #define S_IWRITE S_IWUSR #define S_IEXEC S_IXUSR diff --git a/prod_build/targets/osx.sh b/prod_build/targets/osx.sh index 67f76e6a7956c63a6f9c3f2b3c58b11bf87807b7..93e9728c88e276a9589cc01fd04d00467189ab06 100644 --- a/prod_build/targets/osx.sh +++ b/prod_build/targets/osx.sh @@ -35,26 +35,18 @@ esac if [ "$MACHINE" != "Mac" ] then echo "Host is $MACHINE, use osx-cross build target" - if [ -z "$OSXCROSS_QT_ROOT" ] + if [ -z "$OSXCROSS_ROOT" ] then - echo "Please, export OSXCROSS_QT_ROOT variable, pointing to Qt-builds locations for osxcross environment" + echo "Please, export OSXCROSS_ROOT variable, pointing to OSXCROSS locations" exit 255 fi - if [ -z "$OSXCROSS_QT_VERSION" ] - then - echo "Please, export OSXCROSS_QT_VERSION variable, scpecifying Qt-version in OSXCROSS_QT_ROOT directory." - exit 255 - fi - echo "Using QT ${OSXCROSS_QT_VERSION} from ${OSXCROSS_QT_ROOT}/${OSXCROSS_QT_VERSION}" - - [ ! -d ${OSXCROSS_QT_ROOT}/${OSXCROSS_QT_VERSION} ] && { echo "No QT ${OSXCROSS_QT_VERSION} found in ${OSXCROSS_QT_ROOT}" && exit 255; } + [ ! -d ${OSXCROSS_ROOT}/ ] && { echo "No OSXCROSS found in ${OSXCROSS_ROOT}" && exit 255; } $(${OSXCROSS_ROOT}/bin/osxcross-conf) - export OSXCROSS_HOST=x86_64-apple-darwin20.4 CMAKE=(cmake -DCMAKE_TOOLCHAIN_FILE=${OSXCROSS_ROOT}/toolchain.cmake)