diff --git a/modules/chain/dap_chain_policy.c b/modules/chain/dap_chain_policy.c index 4094f761fc14b6621f609919f301baa1932840ba..2b6e06c41c0b9d65cef64779d6c62e798e16941a 100644 --- a/modules/chain/dap_chain_policy.c +++ b/modules/chain/dap_chain_policy.c @@ -25,32 +25,32 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_chain_policy.h" #include "dap_chain_datum_decree.h" #include "dap_list.h" +#include "uthash.h" #define LOG_TAG "dap_chain_policy" typedef struct dap_chain_net dap_chain_net_t; -struct policy_net_list_item { +struct net_policy_item { uint64_t net_id; uint32_t last_num_policy; dap_list_t *exception_list; dap_list_t *policies; + UT_hash_handle hh; }; -static dap_list_t *s_net_list = NULL; +static struct net_policy_item *s_net_policy_items = NULL; /** * @brief search net element in list by id * @param a_net_id * @return pointer if find, NULL if not */ -DAP_STATIC_INLINE struct policy_net_list_item *s_net_find(uint64_t a_net_id) +DAP_STATIC_INLINE struct net_policy_item *s_net_item_find(uint64_t a_net_id) { - for (dap_list_t *l_iter = dap_list_first(s_net_list); l_iter; l_iter = l_iter->next) { - if ( ((struct policy_net_list_item *)(l_iter->data))->net_id == a_net_id) - return (struct policy_net_list_item *)(l_iter->data); - } - return NULL; + struct net_policy_item *l_item = NULL; + HASH_FIND_BYHASHVALUE(hh, s_net_policy_items, &a_net_id, sizeof(a_net_id), a_net_id, l_item); + return l_item; } DAP_STATIC_INLINE int s_policy_num_compare(dap_list_t *a_list1, dap_list_t *a_list2) @@ -69,25 +69,23 @@ DAP_STATIC_INLINE int s_policy_num_compare(dap_list_t *a_list1, dap_list_t *a_ DAP_STATIC_INLINE bool s_policy_is_cond(dap_chain_policy_t *a_policy) { return a_policy->type == DAP_CHAIN_POLICY_ACTIVATE && - (DAP_FLAG_CHECK(((dap_chain_policy_activate_t *)(a_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS) || - DAP_FLAG_CHECK(((dap_chain_policy_activate_t *)(a_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)); + (DAP_FLAG_CHECK(a_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS) || + DAP_FLAG_CHECK(a_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)); } -static bool s_policy_cond_activated(dap_chain_policy_activate_t *a_policy_activate) +static bool s_policy_cond_activated(dap_chain_policy_activate_t *a_policy_activate, uint64_t a_flags) { bool l_ret = false; - if (DAP_FLAG_CHECK(a_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS)) { + if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS)) { time_t l_current_time = dap_time_now(); - if (l_current_time >= a_policy_activate->ts_start && (!a_policy_activate->ts_stop || l_current_time <= a_policy_activate->ts_stop)) - l_ret |= true; + l_ret |= l_current_time >= a_policy_activate->ts_start; } - if (DAP_FLAG_CHECK(a_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) { + if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) { if (!a_policy_activate->chain_union.chain) { log_it(L_ERROR, "Chain is null in policy item with upped DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM flag"); return l_ret; } - if ( a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start && (!a_policy_activate->block_stop || a_policy_activate->chain_union.chain->atom_num_last <= a_policy_activate->block_stop)) - l_ret |= true; + l_ret |= a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start; } return l_ret; } @@ -101,6 +99,22 @@ int dap_chain_policy_init() return 0; } +/** + * @brief deinit policy commands + */ +void dap_chain_policy_deinit() +{ + struct net_policy_item + *l_temp = NULL, + *l_current = NULL; + HASH_ITER(hh, s_net_policy_items, l_current, l_temp) { + HASH_DEL(s_net_policy_items, l_current); + dap_list_free_full(l_current->policies, NULL); + dap_list_free(l_current->exception_list); + DAP_DELETE(l_current); + } +} + /** * @brief add new net to policies list * @param a_net_id @@ -109,13 +123,13 @@ int dap_chain_policy_init() int dap_chain_policy_net_add(uint64_t a_net_id) { dap_return_val_if_pass(!a_net_id, -1); - if(s_net_find(a_net_id)) { + if(s_net_item_find(a_net_id)) { log_it(L_ERROR, "Net with id %"DAP_UINT64_FORMAT_X" already added", a_net_id); return -2; } - struct policy_net_list_item *l_new_item = DAP_NEW_Z_RET_VAL_IF_FAIL(struct policy_net_list_item, -3); + struct net_policy_item *l_new_item = DAP_NEW_Z_RET_VAL_IF_FAIL(struct net_policy_item, -3); l_new_item->net_id = a_net_id; - s_net_list = dap_list_append(s_net_list, l_new_item); + HASH_ADD_BYHASHVALUE(hh, s_net_policy_items, net_id, sizeof(l_new_item->net_id), l_new_item->net_id, l_new_item); return 0; } @@ -127,17 +141,15 @@ int dap_chain_policy_net_add(uint64_t a_net_id) int dap_chain_policy_net_remove(uint64_t a_net_id) { dap_return_val_if_pass(!a_net_id, -1); - dap_list_t *l_net_item = dap_list_first(s_net_list); - for ( ; l_net_item && ((struct policy_net_list_item *)(l_net_item->data))->net_id != a_net_id; l_net_item = l_net_item->next) {}; - + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); if (!l_net_item) { log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id); return -2; } - s_net_list = dap_list_remove_link(s_net_list, l_net_item); - dap_list_free_full(((struct policy_net_list_item *)(l_net_item->data))->policies, NULL); - dap_list_free(((struct policy_net_list_item *)(l_net_item->data))->exception_list); - DAP_DEL_MULTY(l_net_item->data, l_net_item); + HASH_DEL(s_net_policy_items, l_net_item); + dap_list_free_full(l_net_item->policies, NULL); + dap_list_free(l_net_item->exception_list); + DAP_DELETE(l_net_item); return 0; } @@ -150,7 +162,7 @@ int dap_chain_policy_net_remove(uint64_t a_net_id) int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id) { dap_return_val_if_pass(!a_policy, -1); - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); if (!l_net_item) { log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id); return -2; @@ -191,7 +203,7 @@ int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id) int dap_chain_policy_add_to_exception_list(uint32_t a_policy_num, uint64_t a_net_id) { dap_return_val_if_pass(!a_policy_num, -1); - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); if (!l_net_item) { log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id); return -2; @@ -213,7 +225,7 @@ int dap_chain_policy_add_to_exception_list(uint32_t a_policy_num, uint64_t a_net bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id) { const bool l_ret_false = false; - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); dap_return_val_if_pass(!l_net_item, l_ret_false); // exception list check if (dap_list_find(l_net_item->exception_list, (const void *)(uintptr_t)a_policy_num, NULL)) @@ -225,7 +237,11 @@ bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id) dap_list_t *l_list_item = dap_list_find(l_net_item->policies, l_to_search, s_policy_num_compare); DAP_DELETE(l_to_search); if (l_list_item && s_policy_is_cond((dap_chain_policy_t *)l_list_item->data)) { - return s_policy_cond_activated((dap_chain_policy_activate_t *)((dap_chain_policy_t *)(l_list_item->data))->data); + dap_chain_policy_activate_t *l_activate = (dap_chain_policy_activate_t *)((dap_chain_policy_t *)(l_list_item->data))->data; + bool l_ret = s_policy_cond_activated(l_activate, ((dap_chain_policy_t *)l_list_item->data)->flags); + if (l_ret) + l_net_item->last_num_policy = dap_max(l_activate->num, l_net_item->last_num_policy); + return l_ret; } // cumulative return return a_policy_num <= l_net_item->last_num_policy; @@ -240,7 +256,7 @@ bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id) dap_chain_policy_t *dap_chain_policy_find(uint32_t a_policy_num, uint64_t a_net_id) { dap_return_val_if_pass(!a_policy_num, NULL); - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); dap_return_val_if_pass(!l_net_item, NULL); dap_chain_policy_t *l_to_search = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_activate_t), false); @@ -262,7 +278,7 @@ dap_chain_policy_t *dap_chain_policy_find(uint32_t a_policy_num, uint64_t a_net_ */ DAP_INLINE uint32_t dap_chain_policy_get_last_num(uint64_t a_net_id) { - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); dap_return_val_if_pass(!l_net_item, 0); return l_net_item->last_num_policy; } @@ -270,7 +286,7 @@ DAP_INLINE uint32_t dap_chain_policy_get_last_num(uint64_t a_net_id) json_object *dap_chain_policy_list(uint64_t a_net_id) { - struct policy_net_list_item *l_net_item = s_net_find(a_net_id); + struct net_policy_item *l_net_item = s_net_item_find(a_net_id); dap_return_val_if_pass(!l_net_item, NULL); json_object *l_ret = json_object_new_object(); @@ -285,7 +301,7 @@ json_object *dap_chain_policy_list(uint64_t a_net_id) if (dap_list_find(l_net_item->exception_list, (const void *)(uintptr_t)l_policy_activate->num, NULL)) continue; if (s_policy_is_cond((dap_chain_policy_t *)(l_iter->data))) { - if (s_policy_cond_activated(l_policy_activate)) + if (s_policy_cond_activated(l_policy_activate, ((dap_chain_policy_t *)(l_iter->data))->flags)) dap_string_append_printf(l_active_str, "CN-%u ", l_policy_activate->num); else dap_string_append_printf(l_inactive_str, "CN-%u ", l_policy_activate->num); @@ -322,16 +338,8 @@ json_object *dap_chain_policy_json_collect(dap_chain_policy_t *a_policy) } else { json_object_object_add(l_ret, "ts_start", json_object_new_int(0)); } - if (l_policy_activate->ts_stop) { - char l_time[DAP_TIME_STR_SIZE] = {}; - dap_time_to_str_rfc822(l_time, DAP_TIME_STR_SIZE - 1, l_policy_activate->ts_stop); - json_object_object_add(l_ret, "ts_stop", json_object_new_string(l_time)); - } else { - json_object_object_add(l_ret, "ts_stop", json_object_new_int(0)); - } json_object_object_add(l_ret, "block_start", json_object_new_uint64(l_policy_activate->block_start)); - json_object_object_add(l_ret, "block_stop", json_object_new_uint64(l_policy_activate->block_stop)); - if (l_policy_activate->block_start || l_policy_activate->block_stop) { + if (l_policy_activate->block_start) { if (!l_policy_activate->chain_union.chain) { json_object_object_add(l_ret, "chain", json_object_new_string("ERROR pointer chain is NULL")); } else { diff --git a/modules/chain/include/dap_chain_policy.h b/modules/chain/include/dap_chain_policy.h index 5184524ab718af7b246b5cc23899dfa74383155c..0e5f9e0ca753360044f034cf1e448e818e62e6b8 100644 --- a/modules/chain/include/dap_chain_policy.h +++ b/modules/chain/include/dap_chain_policy.h @@ -37,37 +37,37 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #define DAP_CHAIN_POLICY_OUT_EXT_USE_ENSURE 0x2 typedef enum { - DAP_CHAIN_POLICY_ACTIVATE = 0, - DAP_CHAIN_POLICY_DEACTIVATE + DAP_CHAIN_POLICY_DEACTIVATE = 0, + DAP_CHAIN_POLICY_ACTIVATE } dap_chain_policy_type_t; +typedef struct dap_chain_policy_deactivate { + uint32_t count; + uint32_t nums[]; +} DAP_ALIGN_PACKED dap_chain_policy_deactivate_t; + + typedef struct dap_chain_policy_activate { - uint64_t flags; uint32_t num; int64_t ts_start; - int64_t ts_stop; uint64_t block_start; - uint64_t block_stop; union { dap_chain_id_t chain_id; dap_chain_t *chain; } chain_union; + uint16_t generation; } DAP_ALIGN_PACKED dap_chain_policy_activate_t; -typedef struct dap_chain_policy_deactivate { - uint64_t flags; - uint32_t count; - uint32_t nums[]; -} dap_chain_policy_deactivate_t; - typedef struct dap_chain_policy { uint16_t version; uint16_t type; + uint64_t flags; uint64_t data_size; uint8_t data[]; } DAP_ALIGN_PACKED dap_chain_policy_t; int dap_chain_policy_init(); +void dap_chain_policy_deinit(); int dap_chain_policy_net_add(uint64_t a_net_id); int dap_chain_policy_net_remove(uint64_t a_net_id); int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id); @@ -83,11 +83,6 @@ DAP_STATIC_INLINE size_t dap_chain_policy_deactivate_calc_size(size_t a_deactiva return sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_deactivate_t) + sizeof(uint32_t) * a_deactivate_count; } -DAP_STATIC_INLINE size_t dap_chain_policy_activate_calc_size() -{ - return sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_activate_t); -} - DAP_STATIC_INLINE size_t dap_chain_policy_get_size(dap_chain_policy_t *a_policy) { return a_policy ? sizeof(dap_chain_policy_t) + a_policy->data_size : 0; diff --git a/modules/ledger/dap_chain_ledger.c b/modules/ledger/dap_chain_ledger.c index b3891550de21c18f80b5b10da0380418a0df74bb..5a1b31307e9f4354c114f28c8d605f3d3419af44 100644 --- a/modules/ledger/dap_chain_ledger.c +++ b/modules/ledger/dap_chain_ledger.c @@ -1397,9 +1397,10 @@ dap_chain_tx_out_cond_t *dap_ledger_out_cond_unspent_find_by_addr(dap_ledger_t * ret = NULL; // Get 'out_cond' item from transaction byte_t *l_item; size_t l_size; int i, l_out_idx = 0; + dap_chain_tx_out_cond_subtype_t l_subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_UNDEFINED; TX_ITEM_ITER_TX_TYPE(l_item, TX_ITEM_TYPE_OUT_ALL, l_size, i, it->tx) { if (*l_item == TX_ITEM_TYPE_OUT_COND) { - dap_chain_tx_out_cond_subtype_t l_subtype = ((dap_chain_tx_out_cond_t *)l_item)->header.subtype; + l_subtype = ((dap_chain_tx_out_cond_t *)l_item)->header.subtype; if (l_subtype == a_subtype || (a_subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_ALL && l_subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE)) { ret = (dap_chain_tx_out_cond_t *)l_item; @@ -1411,7 +1412,7 @@ dap_chain_tx_out_cond_t *dap_ledger_out_cond_unspent_find_by_addr(dap_ledger_t * // Don't return regular tx or spent conditions if (!ret || !dap_hash_fast_is_blank(&it->out_metadata[l_out_idx].tx_spent_hash_fast)) continue; - dap_hash_fast_t l_owner_tx_hash = dap_ledger_get_first_chain_tx_hash(a_ledger, a_subtype, &it->tx_hash_fast); + dap_hash_fast_t l_owner_tx_hash = dap_ledger_get_first_chain_tx_hash(a_ledger, l_subtype, &it->tx_hash_fast); dap_chain_datum_tx_t *l_tx = dap_hash_fast_is_blank(&l_owner_tx_hash) ? it->tx : dap_ledger_tx_find_by_hash(a_ledger, &l_owner_tx_hash); if (!l_tx) { diff --git a/modules/ledger/dap_chain_ledger_decree.c b/modules/ledger/dap_chain_ledger_decree.c index 3c84131a0c0a11879cfc2f443d160d5c2f5951ea..5db69b6a7431dbcfdeb455b480c115973d7cd522 100644 --- a/modules/ledger/dap_chain_ledger_decree.c +++ b/modules/ledger/dap_chain_ledger_decree.c @@ -672,7 +672,7 @@ const char *l_ban_addr; l_policy = DAP_DUP_SIZE_RET_VAL_IF_FAIL(l_policy, dap_chain_policy_get_size(l_policy), -106); if (l_policy->type == DAP_CHAIN_POLICY_ACTIVATE) { dap_chain_policy_activate_t *l_policy_activate = (dap_chain_policy_activate_t *)l_policy->data; - if(DAP_FLAG_CHECK(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) + if(DAP_FLAG_CHECK(l_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) l_policy_activate->chain_union.chain = dap_chain_find_by_id(a_net->pub.id, l_policy_activate->chain_union.chain_id); } return dap_chain_policy_add(l_policy, a_net->pub.id.uint64); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 1adccf4576c632a24628305a22eed3a3d83533e9..421600f3189bff46e5b1027102b157063252aa4a 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -780,11 +780,11 @@ static dap_chain_net_t *s_net_new(const char *a_net_name, dap_config_t *a_cfg) if (!dap_chain_policy_num_is_valid(l_policy_num)) { log_it(L_ERROR, "Can't add policy CN-%"DAP_UINT64_FORMAT_U, l_policy_num); } else { - dap_chain_policy_t *l_new_policy = NULL; - l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, dap_chain_policy_activate_calc_size(), NULL, l_ret->pub.name, l_ret); + dap_chain_policy_t *l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_activate_t), NULL, l_ret->pub.name, l_ret); + l_new_policy->type = DAP_CHAIN_POLICY_ACTIVATE; l_new_policy->version = DAP_CHAIN_POLICY_VERSION; ((dap_chain_policy_activate_t *)(l_new_policy->data))->num = l_policy_num; - ((dap_chain_policy_activate_t *)(l_new_policy->data))->flags = DAP_FLAG_ADD(((dap_chain_policy_activate_t *)(l_new_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_CONFIG); + l_new_policy->flags = DAP_FLAG_ADD(l_new_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_CONFIG); dap_chain_policy_add(l_new_policy, l_ret->pub.id.uint64); } } @@ -1792,6 +1792,7 @@ void dap_chain_net_deinit() dap_chain_net_delete(l_net); } dap_http_ban_list_client_deinit(); + dap_chain_policy_deinit(); } /** diff --git a/modules/node-cli/dap_chain_node_cli.c b/modules/node-cli/dap_chain_node_cli.c index 55b6ab876fb0177c170814c286fa11a5a3b8922b..e8f9a63abd04df580178934cb0445ee4e3231ee7 100644 --- a/modules/node-cli/dap_chain_node_cli.c +++ b/modules/node-cli/dap_chain_node_cli.c @@ -388,10 +388,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\t-net <net_name>\n" "\t-num <policy_num>\n" "\t[-ts_start <dd/mm/yy-H:M:S>] - date to start policy\n" - "\t[-ts_stop <dd/mm/yy-H:M:S>] - date to stop policy\n" - "\t{\n\t\t[-block_start <block_num>] - block num to start policy\n" - "\t\t[-block_stop <block_num>] - block num to stop policy\n" - "\t\t-chain <chain_name> - chain name to check blocks num\n\t}\n" + "\t[{\n\t\t-block_start <block_num> - block num to start policy\n" + "\t\t-chain <chain_name> - chain name to check blocks num\n\t}]\n" "\t-certs <cert1[,cert2,...,certN]> - list signing certs\n" "policy deactivate - prepare policy deactivate decree\n" "\t[execute] - used to create policy decree, otherwise show policy decree draft\n" diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c index 5be3d487b9b9c2997cfc15d0dad3dc71d97d6993..b5b7dd92f596a79f9ac7c6aee08513728defd01c 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd.c +++ b/modules/node-cli/dap_chain_node_cli_cmd.c @@ -1755,6 +1755,10 @@ int com_tx_wallet(int a_argc, char **a_argv, void **a_str_reply) // wallet list case CMD_WALLET_LIST: s_wallet_list(c_wallets_path, json_arr_out, NULL); + if (json_object_array_length(json_arr_out) == 0) { + dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_FOUND_ERR, + "Сouldn't find any wallets"); + } break; // wallet info case CMD_WALLET_INFO: { @@ -6131,14 +6135,13 @@ int com_policy(int argc, char **argv, void **reply) { *l_deactivate_str = NULL, *l_chain_str = NULL, *l_ts_start_str = NULL, - *l_ts_stop_str = NULL, *l_block_start_str = NULL, - *l_block_stop_str = NULL, *l_certs_str = NULL; size_t l_deactivate_count = 0, l_certs_count = 0; dap_cert_t **l_certs = NULL; + uint64_t l_flags = 0; bool l_execute = false; enum { CMD_NONE = 0, CMD_ACTIVATE, CMD_DEACTIVATE, CMD_FIND, CMD_LIST }; @@ -6234,9 +6237,7 @@ int com_policy(int argc, char **argv, void **reply) { dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-chain", &l_chain_str); dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-ts_start", &l_ts_start_str); - dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-ts_stop", &l_ts_stop_str); dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-block_start", &l_block_start_str); - dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-block_stop", &l_block_stop_str); dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-deactivate", &l_deactivate_str); dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-certs", &l_certs_str); l_execute = dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "execute", NULL); @@ -6273,40 +6274,15 @@ int com_policy(int argc, char **argv, void **reply) { DAP_DELETE(l_policy_activate); return -13; } - } - - if (l_ts_stop_str) { - l_policy_activate->ts_stop = dap_time_from_str_custom(l_ts_stop_str, "%d/%m/%y-%H:%M:%S"); - if (!l_policy_activate->ts_stop) { - dap_json_rpc_error_add(*a_json_arr_reply, -14, "Can't read ts_stop \"%s\"", l_ts_stop_str); - DAP_DELETE(l_policy_activate); - return -14; - } - if (l_policy_activate->ts_stop <= l_policy_activate->ts_start) { - dap_json_rpc_error_add(*a_json_arr_reply, -12, "ts_start should less than ts_stop"); - DAP_DELETE(l_policy_activate); - return -12; - } - } - - if (l_policy_activate->ts_start || l_policy_activate->ts_stop) { - l_policy_activate->flags = DAP_FLAG_ADD(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS); + l_flags = DAP_FLAG_ADD(l_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS); } if (l_block_start_str) l_policy_activate->block_start = strtoull(l_block_start_str, NULL, 10); - if (l_block_stop_str) { - l_policy_activate->block_stop = strtoull(l_block_stop_str, NULL, 10); - if (l_policy_activate->block_stop <= l_policy_activate->block_start) { - dap_json_rpc_error_add(*a_json_arr_reply, -13, "block_start should less than block_stop"); - DAP_DELETE(l_policy_activate); - return -13; - } - } - if (l_policy_activate->block_start || l_policy_activate->block_stop) { + if (l_policy_activate->block_start) { if (!l_chain_str) { - dap_json_rpc_error_add(*a_json_arr_reply, -8, "Command policy create with -block_start or -block_stop require args -chain"); + dap_json_rpc_error_add(*a_json_arr_reply, -8, "Command policy create with -block_start require args -chain"); DAP_DELETE(l_policy_activate); return -8; } @@ -6317,9 +6293,9 @@ int com_policy(int argc, char **argv, void **reply) { return -9; } l_policy_activate->chain_union.chain = l_chain; - l_policy_activate->flags = DAP_FLAG_ADD(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM); + l_flags = DAP_FLAG_ADD(l_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM); } - if (!l_policy_activate->flags && l_policy_activate->num < l_last_num) { + if (!l_flags && l_policy_activate->num < l_last_num) { dap_json_rpc_error_add(*a_json_arr_reply, -16, "Specified policy already activated by CN-%u", l_last_num); DAP_DELETE(l_policy_activate); return -16; @@ -6330,6 +6306,7 @@ int com_policy(int argc, char **argv, void **reply) { l_policy->data_size = l_data_size; l_policy->version = DAP_CHAIN_POLICY_VERSION; l_policy->type = l_policy_type; + l_policy->flags = l_flags; memcpy(l_policy->data, l_policy_data, l_policy->data_size); DAP_DELETE(l_policy_data); // if cmd none - only print preaparing result diff --git a/modules/node-cli/dap_chain_node_cli_cmd_tx.c b/modules/node-cli/dap_chain_node_cli_cmd_tx.c index c10e932cf7e8eabe79e366869dd8e69b7df3e8c1..a45221e2de22db6df44ef5a0d6e4638d93c44cec 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd_tx.c +++ b/modules/node-cli/dap_chain_node_cli_cmd_tx.c @@ -591,7 +591,7 @@ json_object* dap_db_history_addr(json_object* a_json_arr_reply, dap_chain_addr_t if (l_src_addr && l_dst_addr && dap_chain_addr_compare(l_dst_addr, l_src_addr) && - dap_strcmp(l_noaddr_token, l_dst_token)) + (!l_recv_from_cond || (l_noaddr_token && dap_strcmp(l_noaddr_token, l_dst_token)))) continue; // sent to self (coinback) if (l_dst_addr && l_net_fee_used && dap_chain_addr_compare(&l_net_fee_addr, l_dst_addr)) @@ -727,9 +727,7 @@ json_object* dap_db_history_addr(json_object* a_json_arr_reply, dap_chain_addr_t json_object_object_add(l_corr_object, "recv_datoshi", json_object_new_string(l_value_str)); } if (l_send_to_same_cond) { - json_object *l_cond_recv_value_obj = json_object_object_get(l_cond_recv_object, "recv_datoshi"); - const char *l_cond_recv_value_str = json_object_get_string(l_cond_recv_value_obj); - uint256_t l_cond_recv_value = dap_uint256_scan_uninteger(l_cond_recv_value_str); + uint256_t l_cond_recv_value = l_cond_value; json_object *l_cond_send_value_obj = json_object_object_get(l_cond_send_object, "send_datoshi"); const char *l_cond_send_value_str = json_object_get_string(l_cond_send_value_obj); uint256_t l_cond_send_value = dap_uint256_scan_uninteger(l_cond_send_value_str); @@ -2057,7 +2055,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-limit", &l_limit_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-offset", &l_offset_str); bool l_head = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-head", &l_head_str) ? true : false; - size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 0; + size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 1000; size_t l_offset = l_offset_str ? strtoul(l_offset_str, NULL, 10) : 0; //default is ALL/ANY diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c index bbd028763d1d730b1f85af6504af64c2319fd9e0..3965207130414736b2fa26d05bf9bc74c98bd89f 100644 --- a/modules/service/voting/dap_chain_net_srv_voting.c +++ b/modules/service/voting/dap_chain_net_srv_voting.c @@ -328,10 +328,12 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx // Get last sign item from transaction dap_hash_fast_t l_pkey_hash = {}; - dap_sign_t *l_pkey_sign = NULL; + dap_sign_t *l_pkey_sign = NULL, *l_wallet_sign = NULL; uint8_t *l_tx_item = NULL; size_t l_size; int i, l_sign_num = 0; TX_ITEM_ITER_TX_TYPE(l_tx_item, TX_ITEM_TYPE_SIG, l_size, i, a_tx_in) { l_pkey_sign = dap_chain_datum_tx_item_sig_get_sign((dap_chain_tx_sig_t *)l_tx_item); + if (!l_wallet_sign) + l_wallet_sign = l_pkey_sign; l_sign_num++; } dap_sign_get_pkey_hash(l_pkey_sign, &l_pkey_hash); @@ -394,10 +396,15 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx dap_chain_datum_tx_t *l_tx_prev_temp = dap_ledger_tx_find_by_hash(a_ledger, &l_tx_hash); dap_chain_tx_out_cond_t *l_prev_out = (dap_chain_tx_out_cond_t *)dap_chain_datum_tx_out_get_by_out_idx(l_tx_prev_temp, l_out_idx); if (!l_prev_out || l_prev_out->header.item_type != TX_ITEM_TYPE_OUT_COND || - l_prev_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) + l_prev_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + log_it(L_WARNING, "TX hash %s out #%d subtype %s is restricted", dap_hash_fast_to_str_static(&l_tx_hash), l_out_idx, + l_prev_out ? dap_chain_tx_out_cond_subtype_to_str(l_prev_out->header.subtype) : "(null)"); return -16; - if (!dap_ledger_check_condition_owner(a_ledger, &l_tx_hash, l_prev_out->header.subtype, l_out_idx, l_pkey_sign)) + } + if (!dap_ledger_check_condition_owner(a_ledger, &l_tx_hash, l_prev_out->header.subtype, l_out_idx, l_wallet_sign)) { + log_it(L_WARNING, "TX hash %s out #%d owner verification error", dap_hash_fast_to_str_static(&l_tx_hash), l_out_idx); return -17; + } break; } default: diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 2cfa21a90a5bd639c82a90ee2b3d759b369f1994..d693f63c71c42a06d7aa22da0df63674d6ec1082 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -225,7 +225,7 @@ int dap_chain_net_srv_xchange_init() "\tShows transaction history for the selected order\n" "srv_xchange order status -net <net_name> -order <order_hash>\n" "\tShows current amount of unselled coins from the selected order and percentage of its completion\n" - "srv_xchange orders -net <net_name> [-status {opened|closed|all}] [-token_from <token_ticker>] [-token_to <token_ticker>] [-addr <wallet_addr>] [-limit <limit>] [-offset <offset>]\n" + "srv_xchange orders -net <net_name> [-status {opened|closed|all}] [-token_from <token_ticker>] [-token_to <token_ticker>] [-addr <wallet_addr>] [-limit <limit>] [-offset <offset>] [-head]\n" "\tGet the exchange orders list within specified net name\n" "srv_xchange purchase -order <order hash> -net <net_name> -w <wallet_name> -value <value> -fee <value>\n" @@ -2365,6 +2365,7 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) const char * l_token_from_str = NULL; const char * l_token_to_str = NULL; + const char * l_head_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_from", &l_token_from_str); if(l_token_from_str){ dap_chain_datum_token_t * l_token_from_datum = dap_ledger_token_ticker_check( l_net->pub.ledger, l_token_from_str); @@ -2385,6 +2386,7 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) } } + bool l_head = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-head", &l_head_str) ? true : false; dap_chain_addr_t *l_addr = NULL; const char *l_addr_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-addr", &l_addr_str); @@ -2407,7 +2409,8 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) json_object_object_add(json_obj_order, "PAGINA", json_arr_orders_limit); size_t i_tmp = 0; // Print all txs - for (dap_list_t *it = l_list; it; it = it->next) { + for (dap_list_t *it = l_head ? dap_list_last(l_list) : dap_list_first(l_list); + it; it = l_head ? it->prev : it->next) { dap_chain_datum_tx_t *l_tx = NULL; char l_buy_token[DAP_CHAIN_TICKER_SIZE_MAX] = {0}; char l_sell_token[DAP_CHAIN_TICKER_SIZE_MAX] = {0}; @@ -2514,10 +2517,14 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) continue; } - if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { + if (i_tmp < l_arr_start) { i_tmp++; continue; } + + if (i_tmp >= l_arr_end) { + break; + } i_tmp++; char l_tmp_buf[DAP_TIME_STR_SIZE]; @@ -2547,6 +2554,7 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) json_object_array_add(*json_arr_reply, json_obj_order); DAP_DELETE(l_owner_addr); l_printed_orders_count++; + if (l_head && (it->prev->next == NULL)) break; } json_object_object_add(json_obj_order, "ORDERS", json_arr_orders_out); json_object_array_add(*json_arr_reply, json_obj_order);