blockchain: fix sync at v14 boundary

Miners with MLSAG txes which they'd already verified included
a couple in that block, but the consensus rules had changed
in the meantime, so that block is technically invalid and any
node which did not already have those two txes in their txpool
could not sync. Grandfather them in, since it has no effect in
practice.
This commit is contained in:
moneromooo-monero 2020-10-18 11:50:10 +00:00
parent 3cbb44a2fd
commit 88fde0309a
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -3067,6 +3067,17 @@ bool Blockchain::check_tx_outputs(const transaction& tx, tx_verification_context
if (hf_version > HF_VERSION_CLSAG) { if (hf_version > HF_VERSION_CLSAG) {
if (tx.version >= 2) { if (tx.version >= 2) {
if (tx.rct_signatures.type <= rct::RCTTypeBulletproof2) if (tx.rct_signatures.type <= rct::RCTTypeBulletproof2)
{
// two MLSAG txes went in due to a bug with txes that went into the txpool before the fork, grandfather them in
static const char * grandfathered[2] = { "c5151944f0583097ba0c88cd0f43e7fabb3881278aa2f73b3b0a007c5d34e910", "6f2f117cde6fbcf8d4a6ef8974fcac744726574ac38cf25d3322c996b21edd4c" };
crypto::hash h0, h1;
epee::string_tools::hex_to_pod(grandfathered[0], h0);
epee::string_tools::hex_to_pod(grandfathered[1], h1);
if (cryptonote::get_transaction_hash(tx) == h0 || cryptonote::get_transaction_hash(tx) == h1)
{
MDEBUG("Grandfathering cryptonote::get_transaction_hash(tx) in");
}
else
{ {
MERROR_VER("Ringct type " << (unsigned)tx.rct_signatures.type << " is not allowed from v" << (HF_VERSION_CLSAG + 1)); MERROR_VER("Ringct type " << (unsigned)tx.rct_signatures.type << " is not allowed from v" << (HF_VERSION_CLSAG + 1));
tvc.m_invalid_output = true; tvc.m_invalid_output = true;
@ -3074,6 +3085,7 @@ bool Blockchain::check_tx_outputs(const transaction& tx, tx_verification_context
} }
} }
} }
}
return true; return true;
} }