Skip to content

Commit

Permalink
Validate number of outputs in coinbase transaction
Browse files Browse the repository at this point in the history
Signed-off-by: Azat Nizametdinov <[email protected]>
  • Loading branch information
Nizametdinov committed May 13, 2019
1 parent d17ca5c commit d7f6bca
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/staking/block_reward_validator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ class BlockRewardValidatorImpl : public BlockRewardValidator {
CAmount total_reward = fees + m_behavior->CalculateBlockReward(index.nHeight);

std::size_t num_reward_outputs = 1;
if (coinbase_tx.vout.size() < num_reward_outputs) {
return state.DoS(100,
error("%s: too few coinbase outputs expected at least %d actual %d", __func__,
num_reward_outputs, coinbase_tx.vout.size()),
REJECT_INVALID, "bad-cb-too-few-outputs");
}

CAmount output_amount = coinbase_tx.GetValueOut();
if (output_amount - input_amount > total_reward) {
Expand Down
16 changes: 16 additions & 0 deletions src/test/staking/block_reward_validator_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,22 @@ BOOST_AUTO_TEST_CASE(total_output_is_too_large) {
test_invalid_outputs({f.immediate_reward + fees, input_amount + 1});
}

BOOST_AUTO_TEST_CASE(no_outputs) {
Fixture f;
const auto validator = f.GetBlockRewardValidator();

const CAmount input_amount = 11 * UNIT;
const CAmount fees = UNIT / 2;
CTransaction tx = f.MakeCoinbaseTx({});
CValidationState validation_state;

const bool result = validator->CheckBlockRewards(tx, validation_state, f.block, input_amount, fees);
BOOST_CHECK(!result);
BOOST_CHECK(!validation_state.IsValid());
BOOST_CHECK_EQUAL(validation_state.GetRejectCode(), REJECT_INVALID);
BOOST_CHECK_EQUAL(validation_state.GetRejectReason(), "bad-cb-too-few-outputs");
}

BOOST_AUTO_TEST_CASE(total_output_is_too_small) {
Fixture f;
const auto validator = f.GetBlockRewardValidator();
Expand Down

0 comments on commit d7f6bca

Please sign in to comment.