diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a87c39556879cbc2a0ad93dcf5f56c339dbf684..c81ec7e9c6b39bb2309e9fbb5d728d755c77c096 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -82,3 +82,11 @@ build:macos: 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/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 2a38ee0ae83bad2d9ddcaef624dd2966641ac832..63cc46f6ed242f9840e724eda723d8e6443f01a7 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -339,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; @@ -536,7 +541,6 @@ 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_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); @@ -944,6 +948,37 @@ 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"); + 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); + 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); + 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 +989,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 +1070,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,46 +1988,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); - if (dap_store_obj_get_type(a_obj) == DAP_GLOBAL_DB_OPTYPE_ADD) - l_session->db_hash = dap_global_db_driver_hash_get(a_obj); - else { - char *l_last_key = NULL; - byte_t *l_value = dap_global_db_get_last_sync(a_obj->group, &l_last_key, NULL, NULL, NULL); - if (l_last_key) { - dap_store_obj_t *l_last_raw = dap_global_db_get_raw_sync(a_obj->group, l_last_key); - assert(l_last_raw); - if (l_last_raw) { - l_session->db_hash = dap_global_db_driver_hash_get(l_last_raw); - dap_store_obj_free_one(l_last_raw); - } else - log_it(L_ERROR, "Last key in %s is %s, but no raw object with this key", a_obj->group, l_last_key); - DAP_DELETE(l_last_key); - } else - l_session->db_hash = c_dap_global_db_driver_hash_blank; - DAP_DEL_Z(l_value); - } -} - static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, dap_hash_fast_t *a_directive_hash) { if (!a_directive) { @@ -2325,6 +2324,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)) { diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index 93c9109637c97c8c791862de9b5662dc08ad94c0..bd009e34b125c2eac26c81315a10a16800def6d7 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -207,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 ab3ce0ed37f86a583ae6a9c8105268111b7e64a0..4ea8aeca84dc0f5bc32271e58c0a44ab635f7139 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -4591,7 +4591,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 909692910a3e6492361c5a6db9db0c8d1d197723..4ba06647b8635c3beddbc5125ae6ab692884ab2c 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -677,6 +677,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; } @@ -686,8 +688,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; @@ -2588,10 +2593,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; @@ -2968,6 +2976,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/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 70a5e4fc3d5709d2f6c11798c008bc5e60db365e..b8477039d0a3fbce0c1d92296481d42b7e1da193 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 6e9a439f4f927842f43b7a495ab52c7c65eebf84..38986922299ee3aa5c5bd9cd36dcbe8da9f6e7f3 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