mirror of
https://github.com/monero-project/monero.git
synced 2024-12-13 20:06:32 +02:00
consensus: from v12, enforce >= 2 outputs
This commit is contained in:
parent
475481949a
commit
df83ed74e4
@ -48,6 +48,7 @@ namespace cryptonote
|
||||
bool m_overspend;
|
||||
bool m_fee_too_low;
|
||||
bool m_not_rct;
|
||||
bool m_too_few_outputs;
|
||||
};
|
||||
|
||||
struct block_verification_context
|
||||
|
@ -147,6 +147,7 @@
|
||||
#define HF_VERSION_PER_BYTE_FEE 8
|
||||
#define HF_VERSION_SMALLER_BP 10
|
||||
#define HF_VERSION_LONG_TERM_BLOCK_WEIGHT 10
|
||||
#define HF_VERSION_MIN_2_OUTPUTS 12
|
||||
|
||||
#define PER_KB_FEE_QUANTIZATION_DECIMALS 8
|
||||
|
||||
|
@ -2800,6 +2800,19 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc,
|
||||
|
||||
const uint8_t hf_version = m_hardfork->get_current_version();
|
||||
|
||||
if (hf_version >= HF_VERSION_MIN_2_OUTPUTS)
|
||||
{
|
||||
if (tx.version >= 2)
|
||||
{
|
||||
if (tx.vout.size() < 2)
|
||||
{
|
||||
MERROR_VER("Tx " << get_transaction_hash(tx) << " has fewer than two outputs");
|
||||
tvc.m_too_few_outputs = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// from hard fork 2, we require mixin at least 2 unless one output cannot mix with 2 others
|
||||
// if one output cannot mix with 2 others, we accept at most 1 output that can mix
|
||||
if (hf_version >= 2)
|
||||
|
@ -875,6 +875,8 @@ namespace cryptonote
|
||||
add_reason(reason, "fee too low");
|
||||
if ((res.not_rct = tvc.m_not_rct))
|
||||
add_reason(reason, "tx is not ringct");
|
||||
if ((res.too_few_outputs = tvc.m_too_few_outputs))
|
||||
add_reason(reason, "too few outputs");
|
||||
const std::string punctuation = reason.empty() ? "" : ": ";
|
||||
if (tvc.m_verifivation_failed)
|
||||
{
|
||||
|
@ -609,6 +609,7 @@ namespace cryptonote
|
||||
bool overspend;
|
||||
bool fee_too_low;
|
||||
bool not_rct;
|
||||
bool too_few_outputs;
|
||||
bool sanity_check_failed;
|
||||
bool untrusted;
|
||||
|
||||
@ -624,6 +625,7 @@ namespace cryptonote
|
||||
KV_SERIALIZE(overspend)
|
||||
KV_SERIALIZE(fee_too_low)
|
||||
KV_SERIALIZE(not_rct)
|
||||
KV_SERIALIZE(too_few_outputs)
|
||||
KV_SERIALIZE(sanity_check_failed)
|
||||
KV_SERIALIZE(untrusted)
|
||||
END_KV_SERIALIZE_MAP()
|
||||
|
@ -343,6 +343,11 @@ namespace rpc
|
||||
if (!res.error_details.empty()) res.error_details += " and ";
|
||||
res.error_details = "tx is not ringct";
|
||||
}
|
||||
if (tvc.m_too_few_outputs)
|
||||
{
|
||||
if (!res.error_details.empty()) res.error_details += " and ";
|
||||
res.error_details = "too few outputs";
|
||||
}
|
||||
if (res.error_details.empty())
|
||||
{
|
||||
res.error_details = "an unknown issue was found with the transaction";
|
||||
|
@ -213,6 +213,8 @@ namespace
|
||||
add_reason(reason, "invalid input");
|
||||
if (res.invalid_output)
|
||||
add_reason(reason, "invalid output");
|
||||
if (res.too_few_outputs)
|
||||
add_reason(reason, "too few outputs");
|
||||
if (res.too_big)
|
||||
add_reason(reason, "too big");
|
||||
if (res.overspend)
|
||||
|
@ -564,6 +564,7 @@ class TransferTest():
|
||||
assert res.overspend == False
|
||||
assert res.fee_too_low == False
|
||||
assert res.not_rct == False
|
||||
assert res.too_few_outputs == False
|
||||
|
||||
res = daemon.get_transactions([txes[0][0]])
|
||||
assert len(res.txs) >= 1
|
||||
|
Loading…
Reference in New Issue
Block a user