From 2886efd3f601b77e032a9ab881686741edf10a35 Mon Sep 17 00:00:00 2001 From: cellframe <roman.khlopkov@demlabs.net> Date: Fri, 2 Dec 2022 18:58:53 +0300 Subject: [PATCH] [*] Port hotfix from master --- modules/net/dap_chain_node_cli_cmd.c | 5 ++- .../stake_lock/dap_chain_net_srv_stake_lock.c | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 95c52c3811..3d0b238999 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2639,9 +2639,10 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a const char *l_type = NULL; DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_type) const char *l_token_ticker = NULL; - if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { + if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { // TODO rewrite it for support of multichannel & conditional transactions dap_chain_tx_in_t *obj_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get((dap_chain_datum_tx_t*)l_datum->data, NULL, TX_ITEM_TYPE_IN, NULL); - l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &obj_in->header.tx_prev_hash); + if (obj_in) + l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &obj_in->header.tx_prev_hash); } dap_string_append_printf(a_str_tmp, "type_id=%s%s%s data_size=%u ts_create=%s", // \n included in timestamp diff --git a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c index a4d7c74178..53eab8f82d 100644 --- a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c @@ -468,11 +468,6 @@ static enum error_code s_cli_take(int a_argc, char **a_argv, int a_arg_index, da return IS_USED_OUT_ERROR; } - if (l_tx_out_cond->subtype.srv_stake_lock.flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { - if (l_tx_out_cond->subtype.srv_stake_lock.time_unlock > dap_time_now()) - return NOT_ENOUGH_TIME; - } - if (NULL == (l_ticker_str = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_tx_hash))) return TX_TICKER_ERROR; @@ -507,17 +502,35 @@ static enum error_code s_cli_take(int a_argc, char **a_argv, int a_arg_index, da if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) return WALLET_OPEN_ERROR; + if (NULL == (l_owner_key = dap_chain_wallet_get_key(l_wallet, 0))) { + dap_chain_wallet_close(l_wallet); + return OWNER_KEY_ERROR; + } + + size_t l_owner_pkey_size; + uint8_t *l_owner_pkey = dap_enc_key_serealize_pub_key(l_owner_key, &l_owner_pkey_size); + dap_sign_t *l_owner_sign = NULL; + dap_chain_tx_sig_t *l_tx_sign = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get( + l_cond_tx, NULL, TX_ITEM_TYPE_SIG, NULL); + if (l_tx_sign) + l_owner_sign = dap_chain_datum_tx_item_sign_get_sig(l_tx_sign); + if (!l_owner_sign || l_owner_pkey_size != l_owner_sign->header.sign_pkey_size || + memcmp(l_owner_sign->pkey_n_sign, l_owner_pkey, l_owner_pkey_size)) { + dap_chain_wallet_close(l_wallet); + return OWNER_KEY_ERROR; + } + if (NULL == (l_owner_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(l_wallet, l_net->pub.id))) { dap_chain_wallet_close(l_wallet); return WALLET_ADDR_ERROR; - } + } - if (NULL == (l_owner_key = dap_chain_wallet_get_key(l_wallet, 0))) { + if (l_tx_out_cond->subtype.srv_stake_lock.flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME && + l_tx_out_cond->subtype.srv_stake_lock.time_unlock > dap_time_now()) { dap_chain_wallet_close(l_wallet); DAP_DEL_Z(l_owner_addr); - return OWNER_KEY_ERROR; + return NOT_ENOUGH_TIME; } - /*________________________________________________________________________________________________________________*/ //add tx @@ -726,7 +739,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t *output_line } break; case OWNER_KEY_ERROR: { - dap_string_append_printf(output_line, "key retrieval error"); + dap_string_append_printf(output_line, "wallet key is not equal tx owner key"); } break; case CREATE_TX_ERROR: { @@ -992,8 +1005,8 @@ static bool s_stake_lock_callback_verificator(dap_ledger_t *a_ledger, dap_hash_f dap_chain_datum_token_t *delegate_token; char delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; - /*if (!a_owner) TODO: ??? - return false;*/ + if (!a_owner) + return false; if (a_cond->subtype.srv_stake_lock.flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { if (a_cond->subtype.srv_stake_lock.time_unlock > dap_time_now()) -- GitLab