[build] Move CheckTransaction from lib_server to lib_consensus
CheckTransaction is a context-free function that does not require access to the blockchain or mempool. Move it from src/consensus/tx_verify in lib_server to a new unit src/consensus/tx_check in lib_consensus so that it can be called by non-server libraries.
This commit is contained in:
parent
93de9abe6d
commit
fdf8888b6f
10 changed files with 84 additions and 55 deletions
|
@ -22,6 +22,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\arith_uint256.cpp" />
|
<ClCompile Include="..\..\src\arith_uint256.cpp" />
|
||||||
<ClCompile Include="..\..\src\consensus\merkle.cpp" />
|
<ClCompile Include="..\..\src\consensus\merkle.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\consensus\tx_check.cpp" />
|
||||||
<ClCompile Include="..\..\src\crypto\aes.cpp" />
|
<ClCompile Include="..\..\src\crypto\aes.cpp" />
|
||||||
<ClCompile Include="..\..\src\crypto\chacha20.cpp" />
|
<ClCompile Include="..\..\src\crypto\chacha20.cpp" />
|
||||||
<ClCompile Include="..\..\src\crypto\hmac_sha256.cpp" />
|
<ClCompile Include="..\..\src\crypto\hmac_sha256.cpp" />
|
||||||
|
|
|
@ -124,6 +124,7 @@ BITCOIN_CORE_H = \
|
||||||
compat/sanity.h \
|
compat/sanity.h \
|
||||||
compressor.h \
|
compressor.h \
|
||||||
consensus/consensus.h \
|
consensus/consensus.h \
|
||||||
|
consensus/tx_check.h \
|
||||||
consensus/tx_verify.h \
|
consensus/tx_verify.h \
|
||||||
core_io.h \
|
core_io.h \
|
||||||
core_memusage.h \
|
core_memusage.h \
|
||||||
|
@ -391,6 +392,7 @@ libbitcoin_consensus_a_SOURCES = \
|
||||||
consensus/merkle.cpp \
|
consensus/merkle.cpp \
|
||||||
consensus/merkle.h \
|
consensus/merkle.h \
|
||||||
consensus/params.h \
|
consensus/params.h \
|
||||||
|
consensus/tx_check.cpp \
|
||||||
consensus/validation.h \
|
consensus/validation.h \
|
||||||
hash.cpp \
|
hash.cpp \
|
||||||
hash.h \
|
hash.h \
|
||||||
|
|
57
src/consensus/tx_check.cpp
Normal file
57
src/consensus/tx_check.cpp
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright (c) 2017-2018 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <consensus/tx_check.h>
|
||||||
|
|
||||||
|
#include <primitives/transaction.h>
|
||||||
|
#include <consensus/validation.h>
|
||||||
|
|
||||||
|
bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fCheckDuplicateInputs)
|
||||||
|
{
|
||||||
|
// Basic checks that don't depend on any context
|
||||||
|
if (tx.vin.empty())
|
||||||
|
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vin-empty");
|
||||||
|
if (tx.vout.empty())
|
||||||
|
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");
|
||||||
|
// Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
|
||||||
|
if (::GetSerializeSize(tx, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-oversize");
|
||||||
|
|
||||||
|
// Check for negative or overflow output values
|
||||||
|
CAmount nValueOut = 0;
|
||||||
|
for (const auto& txout : tx.vout)
|
||||||
|
{
|
||||||
|
if (txout.nValue < 0)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative");
|
||||||
|
if (txout.nValue > MAX_MONEY)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-toolarge");
|
||||||
|
nValueOut += txout.nValue;
|
||||||
|
if (!MoneyRange(nValueOut))
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for duplicate inputs - note that this check is slow so we skip it in CheckBlock
|
||||||
|
if (fCheckDuplicateInputs) {
|
||||||
|
std::set<COutPoint> vInOutPoints;
|
||||||
|
for (const auto& txin : tx.vin)
|
||||||
|
{
|
||||||
|
if (!vInOutPoints.insert(txin.prevout).second)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tx.IsCoinBase())
|
||||||
|
{
|
||||||
|
if (tx.vin[0].scriptSig.size() < 2 || tx.vin[0].scriptSig.size() > 100)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-cb-length");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (const auto& txin : tx.vin)
|
||||||
|
if (txin.prevout.IsNull())
|
||||||
|
return state.DoS(10, false, REJECT_INVALID, "bad-txns-prevout-null");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
20
src/consensus/tx_check.h
Normal file
20
src/consensus/tx_check.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (c) 2017-2018 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_CONSENSUS_TX_CHECK_H
|
||||||
|
#define BITCOIN_CONSENSUS_TX_CHECK_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Context-independent transaction checking code that can be called outside the
|
||||||
|
* bitcoin server and doesn't depend on chain or mempool state. Transaction
|
||||||
|
* verification code that does call server functions or depend on server state
|
||||||
|
* belongs in tx_verify.h/cpp instead.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CTransaction;
|
||||||
|
class CValidationState;
|
||||||
|
|
||||||
|
bool CheckTransaction(const CTransaction& tx, CValidationState& state, bool fCheckDuplicateInputs=true);
|
||||||
|
|
||||||
|
#endif // BITCOIN_CONSENSUS_TX_CHECK_H
|
|
@ -156,55 +156,6 @@ int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& i
|
||||||
return nSigOps;
|
return nSigOps;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fCheckDuplicateInputs)
|
|
||||||
{
|
|
||||||
// Basic checks that don't depend on any context
|
|
||||||
if (tx.vin.empty())
|
|
||||||
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vin-empty");
|
|
||||||
if (tx.vout.empty())
|
|
||||||
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");
|
|
||||||
// Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
|
|
||||||
if (::GetSerializeSize(tx, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT)
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-oversize");
|
|
||||||
|
|
||||||
// Check for negative or overflow output values
|
|
||||||
CAmount nValueOut = 0;
|
|
||||||
for (const auto& txout : tx.vout)
|
|
||||||
{
|
|
||||||
if (txout.nValue < 0)
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative");
|
|
||||||
if (txout.nValue > MAX_MONEY)
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-toolarge");
|
|
||||||
nValueOut += txout.nValue;
|
|
||||||
if (!MoneyRange(nValueOut))
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for duplicate inputs - note that this check is slow so we skip it in CheckBlock
|
|
||||||
if (fCheckDuplicateInputs) {
|
|
||||||
std::set<COutPoint> vInOutPoints;
|
|
||||||
for (const auto& txin : tx.vin)
|
|
||||||
{
|
|
||||||
if (!vInOutPoints.insert(txin.prevout).second)
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx.IsCoinBase())
|
|
||||||
{
|
|
||||||
if (tx.vin[0].scriptSig.size() < 2 || tx.vin[0].scriptSig.size() > 100)
|
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-cb-length");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (const auto& txin : tx.vin)
|
|
||||||
if (txin.prevout.IsNull())
|
|
||||||
return state.DoS(10, false, REJECT_INVALID, "bad-txns-prevout-null");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee)
|
bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee)
|
||||||
{
|
{
|
||||||
// are the actual inputs available?
|
// are the actual inputs available?
|
||||||
|
|
|
@ -17,9 +17,6 @@ class CValidationState;
|
||||||
|
|
||||||
/** Transaction validation functions */
|
/** Transaction validation functions */
|
||||||
|
|
||||||
/** Context-independent validity checks */
|
|
||||||
bool CheckTransaction(const CTransaction& tx, CValidationState& state, bool fCheckDuplicateInputs=true);
|
|
||||||
|
|
||||||
namespace Consensus {
|
namespace Consensus {
|
||||||
/**
|
/**
|
||||||
* Check whether all inputs of this transaction are valid (no double spends and amounts)
|
* Check whether all inputs of this transaction are valid (no double spends and amounts)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include <consensus/tx_verify.h>
|
#include <consensus/tx_check.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <test/data/sighash.json.h>
|
#include <test/data/sighash.json.h>
|
||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#include <clientversion.h>
|
#include <clientversion.h>
|
||||||
#include <checkqueue.h>
|
#include <checkqueue.h>
|
||||||
#include <consensus/tx_verify.h>
|
#include <consensus/tx_check.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <core_io.h>
|
#include <core_io.h>
|
||||||
#include <key.h>
|
#include <key.h>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <checkqueue.h>
|
#include <checkqueue.h>
|
||||||
#include <consensus/consensus.h>
|
#include <consensus/consensus.h>
|
||||||
#include <consensus/merkle.h>
|
#include <consensus/merkle.h>
|
||||||
|
#include <consensus/tx_check.h>
|
||||||
#include <consensus/tx_verify.h>
|
#include <consensus/tx_verify.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <cuckoocache.h>
|
#include <cuckoocache.h>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include <wallet/walletdb.h>
|
#include <wallet/walletdb.h>
|
||||||
|
|
||||||
#include <consensus/tx_verify.h>
|
#include <consensus/tx_check.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <key_io.h>
|
#include <key_io.h>
|
||||||
|
|
Loading…
Add table
Reference in a new issue