diff --git a/dap-sdk b/dap-sdk index c8534099483b4e17994955a6b9c332c4f91072b4..dc523abecb6bff079a72e71748cb295b4f40d11c 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit c8534099483b4e17994955a6b9c332c4f91072b4 +Subproject commit dc523abecb6bff079a72e71748cb295b4f40d11c diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 3b786b824d87d281a68cbc2c757d33625083a286..8c2c63e492d46eece847642d8980ee7b14485ef1 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -297,16 +297,15 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_chain_cs_blocks_t *a_blocks, dap_ dap_return_val_if_fail(a_blocks && a_key_from && a_addr_to && a_block_list, NULL); dap_chain_t *l_chain = a_blocks->chain; bool l_net_fee_used = dap_chain_net_tx_get_fee(l_chain->net_id, &l_net_fee, &l_addr_fee); - //add tx - if (NULL == (l_tx = dap_chain_datum_tx_create())) { - log_it(L_WARNING, "Can't create datum tx"); - return NULL; - } dap_ledger_t *l_ledger = dap_chain_net_by_id(l_chain->net_id)->pub.ledger; dap_pkey_t *l_sign_pkey = dap_pkey_from_enc_key(a_key_from); if (!l_sign_pkey) { log_it(L_ERROR, "Can't serialize public key of sign certificate"); - dap_chain_datum_tx_delete(l_tx); + return NULL; + } + //add tx + if (NULL == (l_tx = dap_chain_datum_tx_create())) { + log_it(L_WARNING, "Can't create datum tx"); return NULL; } for(dap_list_t *bl = a_block_list; bl; bl = bl->next) { @@ -317,21 +316,18 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_chain_cs_blocks_t *a_blocks, dap_ char l_block_hash_str[DAP_HASH_FAST_STR_SIZE]; dap_hash_fast_to_str(l_block_hash, l_block_hash_str, DAP_HASH_FAST_STR_SIZE); log_it(L_ERROR, "Can't find cache for block hash %s", l_block_hash_str); - DAP_DELETE(l_sign_pkey); - dap_chain_datum_tx_delete(l_tx); - return NULL; + continue; } //verification of signatures of all blocks dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, 0); if (!l_sign || !dap_pkey_compare_with_sign(l_sign_pkey, l_sign)) { log_it(L_WARNING, "Block %s signature does not match certificate key", l_block_cache->block_hash_str); - DAP_DELETE(l_sign_pkey); - dap_chain_datum_tx_delete(l_tx); - return NULL; + continue; } dap_list_t *l_list_used_out = dap_chain_block_get_list_tx_cond_outs_with_val(l_ledger, l_block_cache, &l_value_out_block); - if (!l_list_used_out) continue; + if (!l_list_used_out) + continue; //add 'in' items { @@ -348,6 +344,12 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_chain_cs_blocks_t *a_blocks, dap_ dap_hash_fast(l_sign_pkey->pkey, l_sign_pkey->header.size, &l_sign_pkey_hash); DAP_DELETE(l_sign_pkey); + if (dap_chain_datum_tx_get_size(l_tx) == sizeof(dap_chain_datum_tx_t)) { + // tx is empty, no valid inputs + dap_chain_datum_tx_delete(l_tx); + return NULL; + } + //add 'fee' items { uint256_t l_value_pack = {}; @@ -456,9 +458,7 @@ char *dap_chain_mempool_tx_reward_create(dap_chain_cs_blocks_t *a_blocks, dap_en char l_block_hash_str[DAP_HASH_FAST_STR_SIZE]; dap_hash_fast_to_str(l_block_hash, l_block_hash_str, DAP_HASH_FAST_STR_SIZE); log_it(L_WARNING, "Block %s signatures does not match certificate key", l_block_hash_str); - DAP_DELETE(l_sign_pkey); - dap_chain_datum_tx_delete(l_tx); - return NULL; + continue; } if (dap_ledger_is_used_reward(l_ledger, l_block_hash, &l_sign_pkey_hash)) { char l_block_hash_str[DAP_HASH_FAST_STR_SIZE]; @@ -466,21 +466,23 @@ char *dap_chain_mempool_tx_reward_create(dap_chain_cs_blocks_t *a_blocks, dap_en char l_sign_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; dap_hash_fast_to_str(&l_sign_pkey_hash, l_sign_pkey_hash_str, DAP_HASH_FAST_STR_SIZE); log_it(L_WARNING, "Block %s reward is already collected by signer %s", l_block_hash_str, l_sign_pkey_hash_str); - DAP_DELETE(l_sign_pkey); - dap_chain_datum_tx_delete(l_tx); - return NULL; + continue; } //add 'in_reward' items if (dap_chain_datum_tx_add_in_reward_item(&l_tx, l_block_hash) != 1) { log_it(L_ERROR, "Can't create in_reward item for reward collect TX"); - DAP_DELETE(l_sign_pkey); - dap_chain_datum_tx_delete(l_tx); - return NULL; + continue; } SUM_256_256(l_value_out, l_reward_value, &l_value_out); } DAP_DELETE(l_sign_pkey); + if (dap_chain_datum_tx_get_size(l_tx) == sizeof(dap_chain_datum_tx_t)) { + // tx is empty, no valid inputs + dap_chain_datum_tx_delete(l_tx); + return NULL; + } + uint256_t l_net_fee = uint256_0, l_total_fee = uint256_0; dap_chain_addr_t l_addr_fee = c_dap_chain_addr_blank; bool l_net_fee_used = dap_chain_net_tx_get_fee(l_chain->net_id, &l_net_fee, &l_addr_fee);