In the Bitcoin Core source code there is a function to check if a given transaction is a coinbase or not:

    bool IsCoinBase() const
        return (vin.size() == 1 && vin[0].prevout.IsNull());

Does it really need to check if vin.size() is equal to 1? Isn't vin[0].prevout.IsNull() a sufficient condition for a transaction to be a coinbase? Is there any situation that the later condition is true but we have more than one input?

The only reason I can guess is to avoid run-time error when vin is empty (so there is no vin[0]).

  • 1
    Hi Amir, I edited the title of this topic because the previous felt a bit vague. I tried to capture the main idea of your question. Please feel free to revert or otherwise edit it if this doesn't align with what you wanted to express.
    – Murch
    Commented Jul 5, 2022 at 10:55
  • @Murch Hi Murch, thanks for your edit. It's now really better. Commented Jul 5, 2022 at 11:17

2 Answers 2


A coinbase transaction is not allowed to have any other inputs, hence this check. Furthermore, because this check is part of consensus code, it is the definition for a coinbase transaction, so this ends up being a bit circular - the function says that a coinbase transaction must only have one input, and it checks that.


A coinbase transaction uses an input to store metadata. Some types of metadata are the block height and extra nonce. See:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.