//----------------------------------------------------------------------------------------------- bool core::check_tx_semantic(const Transaction& tx, bool keeped_by_block) { if(!tx.vin.size()) { LOG_PRINT_RED_L0("tx with empty inputs, rejected for tx id= " << get_transaction_hash(tx)); return false; } if(!check_inputs_types_supported(tx)) { LOG_PRINT_RED_L0("unsupported input types for tx id= " << get_transaction_hash(tx)); return false; } if(!check_outs_valid(tx)) { LOG_PRINT_RED_L0("tx with invalid outputs, rejected for tx id= " << get_transaction_hash(tx)); return false; } if(!check_money_overflow(tx)) { LOG_PRINT_RED_L0("tx have money overflow, rejected for tx id= " << get_transaction_hash(tx)); return false; } uint64_t amount_in = m_currency.getTransactionAllInputsAmount(tx); uint64_t amount_out = get_outs_money_amount(tx); if(amount_in <= amount_out) { LOG_PRINT_RED_L0("tx with wrong amounts: ins " << amount_in << ", outs " << amount_out << ", rejected for tx id= " << get_transaction_hash(tx)); return false; } if(!keeped_by_block && get_object_blobsize(tx) >= m_blockchain_storage.get_current_comulative_blocksize_limit() - m_currency.minerTxBlobReservedSize()) { LOG_PRINT_RED_L0("transaction is too big " << get_object_blobsize(tx) << ", maximum allowed size is " << (m_blockchain_storage.get_current_comulative_blocksize_limit() - m_currency.minerTxBlobReservedSize())); return false; } //check if tx use different key images if(!check_tx_inputs_keyimages_diff(tx)) { LOG_PRINT_RED_L0("tx has a few inputs with identical keyimages"); return false; } if (!checkMultisignatureInputsDiff(tx)) { LOG_PRINT_RED_L0("tx has a few multisignature inputs with identical output indexes"); return false; } return true; }
bool TransactionPrefixImpl::validateOutputs() const { return check_outs_valid(m_txPrefix) && check_outs_overflow(m_txPrefix); }