Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
consensus
tx_check.cpp
Go to the documentation of this file.
1
// Copyright (c) 2017-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <
consensus/tx_check.h
>
6
7
#include <
consensus/amount.h
>
8
#include <
primitives/transaction.h
>
9
#include <
consensus/validation.h
>
10
11
bool
CheckTransaction
(
const
CTransaction
& tx,
TxValidationState
& state)
12
{
13
// Basic checks that don't depend on any context
14
if
(tx.
vin
.empty())
15
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-vin-empty"
);
16
if
(tx.
vout
.empty())
17
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-vout-empty"
);
18
// Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
19
if
(
::GetSerializeSize
(
TX_NO_WITNESS
(tx)) *
WITNESS_SCALE_FACTOR
>
MAX_BLOCK_WEIGHT
) {
20
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-oversize"
);
21
}
22
23
// Check for negative or overflow output values (see CVE-2010-5139)
24
CAmount
nValueOut = 0;
25
for
(
const
auto
& txout : tx.
vout
)
26
{
27
if
(txout.nValue < 0)
28
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-vout-negative"
);
29
if
(txout.nValue >
MAX_MONEY
)
30
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-vout-toolarge"
);
31
nValueOut += txout.nValue;
32
if
(!
MoneyRange
(nValueOut))
33
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-txouttotal-toolarge"
);
34
}
35
36
// Check for duplicate inputs (see CVE-2018-17144)
37
// While Consensus::CheckTxInputs does check if all inputs of a tx are available, and UpdateCoins marks all inputs
38
// of a tx as spent, it does not check if the tx has duplicate inputs.
39
// Failure to run this check will result in either a crash or an inflation bug, depending on the implementation of
40
// the underlying coins database.
41
std::set<COutPoint> vInOutPoints;
42
for
(
const
auto
& txin : tx.
vin
) {
43
if
(!vInOutPoints.insert(txin.prevout).second)
44
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-inputs-duplicate"
);
45
}
46
47
if
(tx.
IsCoinBase
())
48
{
49
if
(tx.
vin
[0].scriptSig.size() < 2 || tx.
vin
[0].scriptSig.size() > 100)
50
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-cb-length"
);
51
}
52
else
53
{
54
for
(
const
auto
& txin : tx.
vin
)
55
if
(txin.prevout.IsNull())
56
return
state.
Invalid
(
TxValidationResult::TX_CONSENSUS
,
"bad-txns-prevout-null"
);
57
}
58
59
return
true
;
60
}
amount.h
MAX_MONEY
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
Definition
amount.h:26
MoneyRange
bool MoneyRange(const CAmount &nValue)
Definition
amount.h:27
CAmount
int64_t CAmount
Amount in satoshis (Can be negative).
Definition
amount.h:12
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition
transaction.h:281
CTransaction::vout
const std::vector< CTxOut > vout
Definition
transaction.h:292
CTransaction::IsCoinBase
bool IsCoinBase() const
Definition
transaction.h:341
CTransaction::vin
const std::vector< CTxIn > vin
Definition
transaction.h:291
TxValidationState
Definition
validation.h:125
ValidationState::Invalid
bool Invalid(Result result, const std::string &reject_reason="", const std::string &debug_message="")
Definition
validation.h:88
validation.h
TxValidationResult::TX_CONSENSUS
@ TX_CONSENSUS
invalid by consensus rules
Definition
validation.h:25
MAX_BLOCK_WEIGHT
static const unsigned int MAX_BLOCK_WEIGHT
The maximum allowed weight for a block, see BIP 141 (network rule).
Definition
consensus.h:15
WITNESS_SCALE_FACTOR
static const int WITNESS_SCALE_FACTOR
Definition
consensus.h:21
transaction.h
TX_NO_WITNESS
static constexpr TransactionSerParams TX_NO_WITNESS
Definition
transaction.h:181
GetSerializeSize
uint64_t GetSerializeSize(const T &t)
Definition
serialize.h:1095
CheckTransaction
bool CheckTransaction(const CTransaction &tx, TxValidationState &state)
Definition
tx_check.cpp:11
tx_check.h
Generated on
for Bitcoin Core by
1.17.0