From 2cb47d17050c70cd6608693ebcd26212251aaff3 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Mon, 25 Mar 2019 09:55:32 -0400 Subject: [PATCH] Disallow coinbase output witness data, since outputs are explicit anyways --- src/confidential_validation.cpp | 8 ++++++++ test/functional/feature_txwitness.py | 5 ++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/confidential_validation.cpp b/src/confidential_validation.cpp index 39a73bca71..da17e07a17 100644 --- a/src/confidential_validation.cpp +++ b/src/confidential_validation.cpp @@ -406,6 +406,14 @@ bool VerifyAmounts(const std::vector& inputs, const CTransaction& tx, st bool VerifyCoinbaseAmount(const CTransaction& tx, const CAmountMap& mapFees) { assert(tx.IsCoinBase()); + + // Miner shouldn't be stuffing witness data + for (const auto& outwit : tx.witness.vtxoutwit) { + if (!outwit.IsNull()) { + return false; + } + } + CAmountMap remaining = mapFees; for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& out = tx.vout[i]; diff --git a/test/functional/feature_txwitness.py b/test/functional/feature_txwitness.py index 8494c486cc..d40e5a80dc 100755 --- a/test/functional/feature_txwitness.py +++ b/test/functional/feature_txwitness.py @@ -167,8 +167,7 @@ class TxWitnessTest(BitcoinTestFramework): block_witness_stuffed = copy.deepcopy(block_struct) - # Add extra witness data that is covered by witness merkle root, make sure invalid until - # witness merkle root is recalculated + # Add extra witness data that is covered by witness merkle root, make sure invalid assert_equal(block_witness_stuffed.vtx[0].wit.vtxoutwit[0].vchSurjectionproof, b'') assert_equal(block_witness_stuffed.vtx[0].wit.vtxoutwit[0].vchRangeproof, b'') block_witness_stuffed.vtx[0].wit.vtxoutwit[0].vchRangeproof = b'\x00'*100000 @@ -180,7 +179,7 @@ class TxWitnessTest(BitcoinTestFramework): block_witness_stuffed.vtx[0].rehash() block_witness_stuffed.hashMerkleRoot = block_witness_stuffed.calc_merkle_root() block_witness_stuffed.rehash() - self.nodes[0].testproposedblock(WitToHex(block_witness_stuffed)) + assert_raises_rpc_error(-25, "bad-cb-amount", self.nodes[0].testproposedblock, WitToHex(block_witness_stuffed)) assert_greater_than(len(WitToHex(block_witness_stuffed)), 100000*4) # Make sure the witness data is actually serialized # Test that issuance inputs in coinbase don't survive a serialization round-trip