2019-04-11 09:53:04 -04:00
// Copyright (c) 2011-2019 The Bitcoin Core developers
2014-12-13 12:09:33 +08:00
// Distributed under the MIT software license, see the accompanying
2014-03-18 10:11:00 +01:00
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
2013-04-13 00:13:08 -05:00
2017-11-10 13:57:53 +13:00
# include <chainparams.h>
# include <coins.h>
# include <consensus/consensus.h>
# include <consensus/merkle.h>
# include <consensus/tx_verify.h>
# include <miner.h>
# include <policy/policy.h>
2018-08-06 15:40:20 -04:00
# include <pow.h>
2017-11-10 13:57:53 +13:00
# include <script/standard.h>
# include <txmempool.h>
# include <uint256.h>
2018-10-22 15:51:11 -07:00
# include <util/strencodings.h>
2019-04-19 13:19:20 -04:00
# include <util/system.h>
2019-06-24 17:22:28 +02:00
# include <util/time.h>
2019-04-19 13:19:20 -04:00
# include <validation.h>
2017-11-10 13:57:53 +13:00
2019-04-11 09:44:10 -04:00
# include <test/setup_common.h>
2015-03-03 07:49:12 -08:00
2016-06-18 19:38:28 +02:00
# include <memory>
2013-04-13 00:13:08 -05:00
# include <boost/test/unit_test.hpp>
2015-03-03 07:49:12 -08:00
BOOST_FIXTURE_TEST_SUITE ( miner_tests , TestingSetup )
2011-09-27 20:16:07 +02:00
2017-11-09 12:02:46 +01:00
// BOOST_CHECK_EXCEPTION predicates to check the specific validation error
class HasReason {
public :
2018-07-26 17:15:32 +02:00
explicit HasReason ( const std : : string & reason ) : m_reason ( reason ) { }
2017-11-09 12:02:46 +01:00
bool operator ( ) ( const std : : runtime_error & e ) const {
return std : : string ( e . what ( ) ) . find ( m_reason ) ! = std : : string : : npos ;
} ;
private :
const std : : string m_reason ;
} ;
2017-01-19 21:02:54 -05:00
static CFeeRate blockMinFeeRate = CFeeRate ( DEFAULT_BLOCK_MIN_TX_FEE ) ;
2017-02-26 16:13:51 -08:00
static BlockAssembler AssemblerForTest ( const CChainParams & params ) {
BlockAssembler : : Options options ;
options . nBlockMaxWeight = MAX_BLOCK_WEIGHT ;
options . blockMinFeeRate = blockMinFeeRate ;
return BlockAssembler ( params , options ) ;
}
2018-08-06 15:40:20 -04:00
const unsigned int nonces [ ] = {
56564 , 72380 , 128907 , 2182 , 184471 , 63950 , 34000 , 9478 , 59377 , 10829 ,
66034 , 37442 , 89195 , 26592 , 26566 , 53604 , 125840 , 89873 , 28210 , 13648 ,
65365 , 100838 , 146064 , 9575 , 124878 , 75942 , 24172 , 234386 , 163091 , 4967 ,
10462 , 22895 , 143012 , 26772 , 98584 , 50257 , 76046 , 56716 , 63762 , 20472 ,
27042 , 11610 , 117648 , 59446 , 95391 , 13726 , 72678 , 54999 , 15643 , 66372 ,
159975 , 34190 , 3253 , 3817 , 3249 , 19231 , 287 , 14293 , 56344 , 1314 , 24596 ,
39278 , 42371 , 204220 , 17374 , 32391 , 4980 , 127690 , 13713 , 66198 , 89787 ,
33360 , 8777 , 33257 , 194167 , 25918 , 20999 , 165920 , 55226 , 158831 , 13566 ,
37669 , 264730 , 44469 , 57778 , 40117 , 61777 , 196161 , 107084 , 69370 , 49739 ,
168694 , 181818 , 58959 , 48614 , 1646 , 52654 , 13423 , 89689 , 67406 , 126841 ,
22148 , 59206 , 76962 , 77648 , 2215 , 162303 , 137215 , 37951 , 30207 , 53220 ,
34221 , 14213 , 100990 , 24457 , 181162 , 1451 , 14573 , 10467 , 24983 , 262822 ,
167979 , 25163 , 68559 , 88074 , 135052 , 30256 , 24860 , 25890 , 191606 , 307582 ,
41542 , 15231 , 296998 , 87388 , 275976 , 26110 , 42669 , 12916 , 3833 , 10375 ,
9826 , 37676 , 163341 , 168130 , 3209 , 55275 , 140779 , 33289 , 68881 , 18576 ,
136275 , 536 , 25789 , 16372 , 51618 , 12954 , 3584 , 235289 , 5003 , 135396 ,
107987 , 871 , 29290 , 29457 , 59987 , 36795 , 27771 , 105636 , 68229 , 7266 ,
37970 , 31076 , 9463 , 5272 , 47100 , 5844 , 55508 , 35003 , 7540 , 27079 ,
56325 , 59682 , 22508 , 24828 , 42895 , 69580 , 71361 , 83950 , 8510 , 21211 ,
26562 , 65709 , 122140 , 23400 , 79693 , 36035 , 50444 , 70005 , 36025 , 135185 ,
71536 , 4941 , 11151 , 3816 , 45028 , 45271 , 90086 , 94324 , 18419 , 108975 ,
17221 , 108672 , 166833 , 40212 , 168684 , 21230 , 22513 , 73286 , 43347 , 101454 ,
418017 , 71718 , 93728 , 214959 , 31443 , 31111 , 41327 , 74140 , 25836
2012-05-22 21:55:15 +00:00
} ;
2019-04-19 13:19:20 -04:00
static CBlockIndex CreateBlockIndex ( int nHeight ) EXCLUSIVE_LOCKS_REQUIRED ( cs_main )
2015-12-07 15:44:16 -05:00
{
CBlockIndex index ;
index . nHeight = nHeight ;
2019-03-27 11:14:25 -04:00
index . pprev = : : ChainActive ( ) . Tip ( ) ;
2015-12-07 15:44:16 -05:00
return index ;
}
2018-08-13 13:24:52 +02:00
static bool TestSequenceLocks ( const CTransaction & tx , int flags ) EXCLUSIVE_LOCKS_REQUIRED ( cs_main )
2015-12-07 15:44:16 -05:00
{
2018-07-27 14:35:28 -04:00
LOCK ( : : mempool . cs ) ;
return CheckSequenceLocks ( : : mempool , tx , flags ) ;
2015-12-07 15:44:16 -05:00
}
2016-02-20 20:58:23 -05:00
// Test suite for ancestor feerate transaction selection.
// Implemented as an additional function, rather than a separate test case,
// to allow reusing the blockchain created in CreateNewBlock_validity.
2018-12-17 14:27:43 -05:00
static void TestPackageSelection ( const CChainParams & chainparams , const CScript & scriptPubKey , const std : : vector < CTransactionRef > & txFirst ) EXCLUSIVE_LOCKS_REQUIRED ( cs_main , : : mempool . cs )
2016-02-20 20:58:23 -05:00
{
// Test the ancestor feerate transaction selection.
TestMemPoolEntryHelper entry ;
// Test that a medium fee transaction will be selected after a higher fee
// rate package with a low fee rate parent.
CMutableTransaction tx ;
tx . vin . resize ( 1 ) ;
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_1 ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 0 ] . prevout . n = 0 ;
tx . vout . resize ( 1 ) ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000 ;
2016-02-20 20:58:23 -05:00
// This tx has a low fee: 1000 satoshis
uint256 hashParentTx = tx . GetHash ( ) ; // save this txid for later use
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 1000 ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2016-02-20 20:58:23 -05:00
// This tx has a medium fee: 10000 satoshis
tx . vin [ 0 ] . prevout . hash = txFirst [ 1 ] - > GetHash ( ) ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 10000 ;
2016-02-20 20:58:23 -05:00
uint256 hashMediumFeeTx = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 10000 ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2016-02-20 20:58:23 -05:00
// This tx has a high fee, but depends on the first transaction
tx . vin [ 0 ] . prevout . hash = hashParentTx ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000 - 50000 ; // 50k satoshi fee
2016-02-20 20:58:23 -05:00
uint256 hashHighFeeTx = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 50000 ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
2016-02-20 20:58:23 -05:00
2017-02-26 16:13:51 -08:00
std : : unique_ptr < CBlockTemplate > pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ;
2016-11-10 17:26:00 -08:00
BOOST_CHECK ( pblocktemplate - > block . vtx [ 1 ] - > GetHash ( ) = = hashParentTx ) ;
BOOST_CHECK ( pblocktemplate - > block . vtx [ 2 ] - > GetHash ( ) = = hashHighFeeTx ) ;
BOOST_CHECK ( pblocktemplate - > block . vtx [ 3 ] - > GetHash ( ) = = hashMediumFeeTx ) ;
2016-02-20 20:58:23 -05:00
2017-01-19 21:02:54 -05:00
// Test that a package below the block min tx fee doesn't get included
2016-02-20 20:58:23 -05:00
tx . vin [ 0 ] . prevout . hash = hashHighFeeTx ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000 - 50000 ; // 0 fee
2016-02-20 20:58:23 -05:00
uint256 hashFreeTx = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 0 ) . FromTx ( tx ) ) ;
2018-06-22 18:27:18 +00:00
size_t freeTxSize = : : GetSerializeSize ( tx , PROTOCOL_VERSION ) ;
2016-02-20 20:58:23 -05:00
// Calculate a fee on child transaction that will put the package just
2017-01-19 21:02:54 -05:00
// below the block min tx fee (assuming 1 child tx of the same size).
CAmount feeToUse = blockMinFeeRate . GetFee ( 2 * freeTxSize ) - 1 ;
2016-02-20 20:58:23 -05:00
tx . vin [ 0 ] . prevout . hash = hashFreeTx ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000 - 50000 - feeToUse ;
2016-02-20 20:58:23 -05:00
uint256 hashLowFeeTx = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( feeToUse ) . FromTx ( tx ) ) ;
2017-02-26 16:13:51 -08:00
pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ;
2016-02-20 20:58:23 -05:00
// Verify that the free tx and the low fee tx didn't get selected
for ( size_t i = 0 ; i < pblocktemplate - > block . vtx . size ( ) ; + + i ) {
2016-11-10 17:26:00 -08:00
BOOST_CHECK ( pblocktemplate - > block . vtx [ i ] - > GetHash ( ) ! = hashFreeTx ) ;
BOOST_CHECK ( pblocktemplate - > block . vtx [ i ] - > GetHash ( ) ! = hashLowFeeTx ) ;
2016-02-20 20:58:23 -05:00
}
// Test that packages above the min relay fee do get included, even if one
// of the transactions is below the min relay fee
// Remove the low fee transaction and replace with a higher fee transaction
2019-07-22 07:42:01 -04:00
mempool . removeRecursive ( CTransaction ( tx ) , MemPoolRemovalReason : : REPLACED ) ;
2016-02-20 20:58:23 -05:00
tx . vout [ 0 ] . nValue - = 2 ; // Now we should be just over the min relay fee
hashLowFeeTx = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( feeToUse + 2 ) . FromTx ( tx ) ) ;
2017-02-26 16:13:51 -08:00
pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ;
2016-11-10 17:26:00 -08:00
BOOST_CHECK ( pblocktemplate - > block . vtx [ 4 ] - > GetHash ( ) = = hashFreeTx ) ;
BOOST_CHECK ( pblocktemplate - > block . vtx [ 5 ] - > GetHash ( ) = = hashLowFeeTx ) ;
2016-02-20 20:58:23 -05:00
// Test that transaction selection properly updates ancestor fee
// calculations as ancestor transactions get included in a block.
// Add a 0-fee transaction that has 2 outputs.
tx . vin [ 0 ] . prevout . hash = txFirst [ 2 ] - > GetHash ( ) ;
tx . vout . resize ( 2 ) ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000000LL ;
tx . vout [ 1 ] . nValue = 1000000LL ; // 1BTC output
2016-02-20 20:58:23 -05:00
uint256 hashFreeTx2 = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 0 ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2016-02-20 20:58:23 -05:00
// This tx can't be mined by itself
tx . vin [ 0 ] . prevout . hash = hashFreeTx2 ;
tx . vout . resize ( 1 ) ;
2017-01-19 21:02:54 -05:00
feeToUse = blockMinFeeRate . GetFee ( freeTxSize ) ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 50000000LL - 1000000LL - feeToUse ;
2016-02-20 20:58:23 -05:00
uint256 hashLowFeeTx2 = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( feeToUse ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
2017-02-26 16:13:51 -08:00
pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ;
2016-02-20 20:58:23 -05:00
// Verify that this tx isn't selected.
for ( size_t i = 0 ; i < pblocktemplate - > block . vtx . size ( ) ; + + i ) {
2016-11-10 17:26:00 -08:00
BOOST_CHECK ( pblocktemplate - > block . vtx [ i ] - > GetHash ( ) ! = hashFreeTx2 ) ;
BOOST_CHECK ( pblocktemplate - > block . vtx [ i ] - > GetHash ( ) ! = hashLowFeeTx2 ) ;
2016-02-20 20:58:23 -05:00
}
// This tx will be mineable, and should cause hashLowFeeTx2 to be selected
// as well.
tx . vin [ 0 ] . prevout . n = 1 ;
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue = 1000000LL - 10000 ; // 10k satoshi fee
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( 10000 ) . FromTx ( tx ) ) ;
2017-02-26 16:13:51 -08:00
pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ;
2016-11-10 17:26:00 -08:00
BOOST_CHECK ( pblocktemplate - > block . vtx [ 8 ] - > GetHash ( ) = = hashLowFeeTx2 ) ;
2016-02-20 20:58:23 -05:00
}
2012-05-22 21:55:15 +00:00
// NOTE: These tests rely on CreateNewBlock doing its own self-validation!
BOOST_AUTO_TEST_CASE ( CreateNewBlock_validity )
{
2016-07-28 14:27:19 -04:00
// Note that by default, these tests run with size accounting enabled.
2015-11-28 15:04:35 +01:00
const auto chainParams = CreateChainParams ( CBaseChainParams : : MAIN ) ;
const CChainParams & chainparams = * chainParams ;
2013-12-09 09:22:15 +01:00
CScript scriptPubKey = CScript ( ) < < ParseHex ( " 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f " ) < < OP_CHECKSIG ;
2016-06-18 19:38:28 +02:00
std : : unique_ptr < CBlockTemplate > pblocktemplate ;
2018-07-17 19:22:17 +02:00
CMutableTransaction tx ;
2012-05-22 21:55:15 +00:00
CScript script ;
uint256 hash ;
2015-11-14 17:04:15 -05:00
TestMemPoolEntryHelper entry ;
entry . nFee = 11 ;
entry . nHeight = 11 ;
2012-05-22 21:55:15 +00:00
2015-04-22 23:22:36 -04:00
fCheckpointsEnabled = false ;
2013-12-02 13:11:21 +10:00
2012-05-22 21:55:15 +00:00
// Simple block creation, nothing special yet:
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-05-22 21:55:15 +00:00
// We can't make transactions until we have inputs
// Therefore, load 100 blocks :)
2015-12-07 15:44:16 -05:00
int baseheight = 0 ;
2016-11-10 17:34:17 -08:00
std : : vector < CTransactionRef > txFirst ;
2018-08-06 15:40:20 -04:00
for ( unsigned int i = 0 ; i < sizeof ( nonces ) / sizeof ( unsigned int ) ; + + i )
2012-05-22 21:55:15 +00:00
{
2018-08-06 15:40:20 -04:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-12-19 15:21:21 -05:00
CBlock * pblock = & pblocktemplate - > block ; // pointer for convenience
2017-12-04 18:25:57 -05:00
{
LOCK ( cs_main ) ;
2018-08-06 15:40:20 -04:00
pblock - > hashPrevBlock = chainActive . Tip ( ) - > GetBlockHash ( ) ;
pblock - > nVersion = 5 ;
pblock - > nTime = chainActive . Tip ( ) - > GetBlockTime ( ) + chainparams . GetConsensus ( ) . nPowTargetSpacing ;
2017-12-04 18:25:57 -05:00
CMutableTransaction txCoinbase ( * pblock - > vtx [ 0 ] ) ;
2018-08-06 15:40:20 -04:00
txCoinbase . vin [ 0 ] . scriptSig = CScript ( ) < < int ( chainActive . Height ( ) + 1 ) < < i ;
2017-12-04 18:25:57 -05:00
txCoinbase . vout . resize ( 1 ) ; // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this)
txCoinbase . vout [ 0 ] . scriptPubKey = CScript ( ) ;
pblock - > vtx [ 0 ] = MakeTransactionRef ( std : : move ( txCoinbase ) ) ;
if ( txFirst . size ( ) = = 0 )
2019-03-27 11:14:25 -04:00
baseheight = : : ChainActive ( ) . Height ( ) ;
2017-12-04 18:25:57 -05:00
if ( txFirst . size ( ) < 4 )
txFirst . push_back ( pblock - > vtx [ 0 ] ) ;
pblock - > hashMerkleRoot = BlockMerkleRoot ( * pblock ) ;
2018-08-06 15:40:20 -04:00
pblock - > nNonce = nonces [ i ] ;
//Use below code to find nonces, in case we change hashing or difficulty retargeting algo
//#define NEED_NEW_NONCES_MINER_TEST
# ifdef NEED_NEW_NONCES_MINER_TEST
for ( int j = 0 ; ; j + + )
{
pblock - > nNonce = j ;
if ( CheckProofOfWork ( pblock - > GetPoWHash ( ) , pblock - > nBits , chainparams . GetConsensus ( ) ) )
{
std : : cout < < " Nonce is " < < pblock - > nNonce < < std : : endl ;
break ;
}
}
# endif
2017-12-04 18:25:57 -05:00
}
2016-12-04 00:17:30 -08:00
std : : shared_ptr < const CBlock > shared_pblock = std : : make_shared < const CBlock > ( * pblock ) ;
2017-08-07 07:36:37 +02:00
BOOST_CHECK ( ProcessNewBlock ( chainparams , shared_pblock , true , nullptr ) ) ;
2012-05-22 21:55:15 +00:00
}
2017-12-04 18:25:57 -05:00
LOCK ( cs_main ) ;
2018-07-28 11:09:58 -04:00
LOCK ( : : mempool . cs ) ;
2017-12-04 18:25:57 -05:00
2012-05-22 21:55:15 +00:00
// Just to make sure we can still make simple blocks
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-05-22 21:55:15 +00:00
2018-08-06 15:40:20 -04:00
const CAmount BLOCKSUBSIDY = 50000000LL ;
const CAmount LOWFEE = 100000LL ;
const CAmount HIGHFEE = 1000000LL ;
const CAmount HIGHERFEE = 4 * HIGHFEE ;
2016-04-04 11:17:23 -04:00
2012-05-22 21:55:15 +00:00
// block sigops > limit: 1000 CHECKMULTISIG + 1
tx . vin . resize ( 1 ) ;
// NOTE: OP_NOP is used to force 20 SigOps for the CHECKMULTISIG
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_0 < < OP_0 < < OP_0 < < OP_NOP < < OP_CHECKMULTISIG < < OP_1 ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 0 ] . prevout . n = 0 ;
tx . vout . resize ( 1 ) ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY ;
2012-05-22 21:55:15 +00:00
for ( unsigned int i = 0 ; i < 1001 ; + + i )
{
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue - = 101 ;
2012-05-22 21:55:15 +00:00
hash = tx . GetHash ( ) ;
2017-06-08 12:06:09 +02:00
bool spendsCoinbase = i = = 0 ; // only first tx spends coinbase
2015-11-03 10:35:39 -05:00
// If we don't set the # of sig ops in the CTxMemPoolEntry, template creation fails
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( spendsCoinbase ) . FromTx ( tx ) ) ;
2015-11-03 10:35:39 -05:00
tx . vin [ 0 ] . prevout . hash = hash ;
}
2017-11-09 12:02:46 +01:00
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-blk-sigops " ) ) ;
2015-11-03 10:35:39 -05:00
mempool . clear ( ) ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY ;
2015-11-03 10:35:39 -05:00
for ( unsigned int i = 0 ; i < 1001 ; + + i )
{
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue - = 101 ;
2015-11-03 10:35:39 -05:00
hash = tx . GetHash ( ) ;
2017-06-08 12:06:09 +02:00
bool spendsCoinbase = i = = 0 ; // only first tx spends coinbase
2015-11-03 10:35:39 -05:00
// If we do set the # of sig ops in the CTxMemPoolEntry, template creation passes
2018-08-06 15:40:20 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE / 2 ) . Time ( GetTime ( ) ) . SpendsCoinbase ( spendsCoinbase ) . SigOpsCost ( 80 ) . FromTx ( tx ) ) ;
2012-05-22 21:55:15 +00:00
tx . vin [ 0 ] . prevout . hash = hash ;
}
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
// block size > limit
tx . vin [ 0 ] . scriptSig = CScript ( ) ;
// 18 * (520char + DROP) + OP_1 = 9433 bytes
std : : vector < unsigned char > vchData ( 520 ) ;
for ( unsigned int i = 0 ; i < 18 ; + + i )
tx . vin [ 0 ] . scriptSig < < vchData < < OP_DROP ;
tx . vin [ 0 ] . scriptSig < < OP_1 ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY ;
2012-05-22 21:55:15 +00:00
for ( unsigned int i = 0 ; i < 128 ; + + i )
{
2018-08-06 15:40:20 -04:00
tx . vout [ 0 ] . nValue - = 100 ;
2012-05-22 21:55:15 +00:00
hash = tx . GetHash ( ) ;
2017-06-08 12:06:09 +02:00
bool spendsCoinbase = i = = 0 ; // only first tx spends coinbase
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( spendsCoinbase ) . FromTx ( tx ) ) ;
2012-05-22 21:55:15 +00:00
tx . vin [ 0 ] . prevout . hash = hash ;
}
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
2015-11-03 10:35:39 -05:00
// orphan in mempool, template creation fails
2012-05-22 21:55:15 +00:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
2017-11-09 12:02:46 +01:00
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-txns-inputs-missingorspent " ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
2017-01-19 22:46:50 -05:00
// child with higher feerate than parent
2012-05-22 21:55:15 +00:00
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_1 ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 1 ] - > GetHash ( ) ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY - HIGHFEE ;
2012-05-22 21:55:15 +00:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2012-05-22 21:55:15 +00:00
tx . vin [ 0 ] . prevout . hash = hash ;
tx . vin . resize ( 2 ) ;
tx . vin [ 1 ] . scriptSig = CScript ( ) < < OP_1 ;
tx . vin [ 1 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 1 ] . prevout . n = 0 ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = tx . vout [ 0 ] . nValue + BLOCKSUBSIDY - HIGHERFEE ; //First txn output + fresh coinbase - new txn fee
2012-05-22 21:55:15 +00:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( HIGHERFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
2015-11-03 10:35:39 -05:00
// coinbase in mempool, template creation fails
2012-05-22 21:55:15 +00:00
tx . vin . resize ( 1 ) ;
tx . vin [ 0 ] . prevout . SetNull ( ) ;
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_0 < < OP_1 ;
tx . vout [ 0 ] . nValue = 0 ;
hash = tx . GetHash ( ) ;
2015-11-03 10:35:39 -05:00
// give it a fee so it'll get mined
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
2017-11-09 12:02:46 +01:00
// Should throw bad-cb-multiple
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-cb-multiple " ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
2015-11-03 10:35:39 -05:00
// double spend txn pair in mempool, template creation fails
2012-05-22 21:55:15 +00:00
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_1 ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY - HIGHFEE ;
2012-05-22 21:55:15 +00:00
tx . vout [ 0 ] . scriptPubKey = CScript ( ) < < OP_1 ;
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2012-05-22 21:55:15 +00:00
tx . vout [ 0 ] . scriptPubKey = CScript ( ) < < OP_2 ;
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2017-11-09 12:02:46 +01:00
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-txns-inputs-missingorspent " ) ) ;
2012-05-22 21:55:15 +00:00
mempool . clear ( ) ;
// subsidy changing
2019-03-27 11:14:25 -04:00
int nHeight = : : ChainActive ( ) . Height ( ) ;
2016-02-15 05:13:27 +01:00
// Create an actual 209999-long block chain (without valid blocks).
2018-08-06 15:40:20 -04:00
BOOST_CHECK ( pclaimTrie ) ;
CClaimTrieCache trieCache ( pclaimTrie ) ;
BOOST_CHECK ( chainActive . Tip ( ) - > GetBlockHash ( ) = = trieCache . getBestBlock ( ) ) ;
while ( chainActive . Tip ( ) - > nHeight < 209999 ) {
CBlockIndex * prev = chainActive . Tip ( ) ;
2016-02-15 05:13:27 +01:00
CBlockIndex * next = new CBlockIndex ( ) ;
2017-06-07 12:03:17 -07:00
next - > phashBlock = new uint256 ( InsecureRand256 ( ) ) ;
2019-07-24 11:45:04 -04:00
: : ChainstateActive ( ) . CoinsTip ( ) . SetBestBlock ( next - > GetBlockHash ( ) ) ;
2018-08-06 15:40:20 -04:00
trieCache . setBestBlock ( next - > GetBlockHash ( ) ) ;
trieCache . flush ( ) ;
2016-02-15 05:13:27 +01:00
next - > pprev = prev ;
next - > nHeight = prev - > nHeight + 1 ;
next - > BuildSkip ( ) ;
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . SetTip ( next ) ;
2016-02-15 05:13:27 +01:00
}
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2016-02-15 05:13:27 +01:00
// Extend to a 210000-long block chain.
2019-03-27 11:14:25 -04:00
while ( : : ChainActive ( ) . Tip ( ) - > nHeight < 210000 ) {
CBlockIndex * prev = : : ChainActive ( ) . Tip ( ) ;
2016-02-15 05:13:27 +01:00
CBlockIndex * next = new CBlockIndex ( ) ;
2017-06-07 12:03:17 -07:00
next - > phashBlock = new uint256 ( InsecureRand256 ( ) ) ;
2019-07-24 11:45:04 -04:00
: : ChainstateActive ( ) . CoinsTip ( ) . SetBestBlock ( next - > GetBlockHash ( ) ) ;
2018-08-06 15:40:20 -04:00
trieCache . setBestBlock ( next - > GetBlockHash ( ) ) ;
trieCache . flush ( ) ;
2016-02-15 05:13:27 +01:00
next - > pprev = prev ;
next - > nHeight = prev - > nHeight + 1 ;
next - > BuildSkip ( ) ;
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . SetTip ( next ) ;
2016-02-15 05:13:27 +01:00
}
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2017-10-13 11:35:18 -04:00
// invalid p2sh txn in mempool, template creation fails
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 0 ] . prevout . n = 0 ;
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_1 ;
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY - LOWFEE ;
script = CScript ( ) < < OP_0 ;
2019-02-19 17:00:45 -05:00
tx . vout [ 0 ] . scriptPubKey = GetScriptForDestination ( ScriptHash ( script ) ) ;
2017-10-13 11:35:18 -04:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2017-10-13 11:35:18 -04:00
tx . vin [ 0 ] . prevout . hash = hash ;
tx . vin [ 0 ] . scriptSig = CScript ( ) < < std : : vector < unsigned char > ( script . begin ( ) , script . end ( ) ) ;
tx . vout [ 0 ] . nValue - = LOWFEE ;
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
2017-11-09 12:02:46 +01:00
// Should throw block-validation-failed
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " block-validation-failed " ) ) ;
2017-10-13 11:35:18 -04:00
mempool . clear ( ) ;
2016-02-15 05:13:27 +01:00
// Delete the dummy blocks again.
2019-03-27 11:14:25 -04:00
while ( : : ChainActive ( ) . Tip ( ) - > nHeight > nHeight ) {
CBlockIndex * del = : : ChainActive ( ) . Tip ( ) ;
: : ChainActive ( ) . SetTip ( del - > pprev ) ;
2019-07-24 11:45:04 -04:00
: : ChainstateActive ( ) . CoinsTip ( ) . SetBestBlock ( del - > pprev - > GetBlockHash ( ) ) ;
2018-08-06 15:40:20 -04:00
trieCache . setBestBlock ( del - > pprev - > GetBlockHash ( ) ) ;
trieCache . flush ( ) ;
2016-02-15 05:13:27 +01:00
delete del - > phashBlock ;
delete del ;
}
2013-09-19 00:01:36 +02:00
2014-01-26 21:50:15 -05:00
// non-final txs in mempool
2019-03-27 11:14:25 -04:00
SetMockTime ( : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) + 1 ) ;
2015-12-07 15:44:16 -05:00
int flags = LOCKTIME_VERIFY_SEQUENCE | LOCKTIME_MEDIAN_TIME_PAST ;
// height map
std : : vector < int > prevheights ;
2014-01-26 21:50:15 -05:00
2015-12-07 15:44:16 -05:00
// relative height locked
2018-08-06 15:40:20 -04:00
tx . nVersion = CTransaction : : CURRENT_VERSION ;
2015-12-07 15:44:16 -05:00
tx . vin . resize ( 1 ) ;
prevheights . resize ( 1 ) ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ; // only 1 transaction
tx . vin [ 0 ] . prevout . n = 0 ;
2014-01-26 21:50:15 -05:00
tx . vin [ 0 ] . scriptSig = CScript ( ) < < OP_1 ;
2019-03-27 11:14:25 -04:00
tx . vin [ 0 ] . nSequence = : : ChainActive ( ) . Tip ( ) - > nHeight + 1 ; // txFirst[0] is the 2nd block
2015-12-07 15:44:16 -05:00
prevheights [ 0 ] = baseheight + 1 ;
tx . vout . resize ( 1 ) ;
2016-04-04 11:17:23 -04:00
tx . vout [ 0 ] . nValue = BLOCKSUBSIDY - HIGHFEE ;
2014-01-26 21:50:15 -05:00
tx . vout [ 0 ] . scriptPubKey = CScript ( ) < < OP_1 ;
2015-12-07 15:44:16 -05:00
tx . nLockTime = 0 ;
2014-01-26 21:50:15 -05:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( CheckFinalTx ( CTransaction ( tx ) , flags ) ) ; // Locktime passes
BOOST_CHECK ( ! TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks fail
2019-03-27 11:14:25 -04:00
BOOST_CHECK ( SequenceLocks ( CTransaction ( tx ) , flags , & prevheights , CreateBlockIndex ( : : ChainActive ( ) . Tip ( ) - > nHeight + 2 ) ) ) ; // Sequence locks pass on 2nd block
2015-12-07 15:44:16 -05:00
// relative time locked
tx . vin [ 0 ] . prevout . hash = txFirst [ 1 ] - > GetHash ( ) ;
2019-03-27 11:14:25 -04:00
tx . vin [ 0 ] . nSequence = CTxIn : : SEQUENCE_LOCKTIME_TYPE_FLAG | ( ( ( : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) + 1 - : : ChainActive ( ) [ 1 ] - > GetMedianTimePast ( ) ) > > CTxIn : : SEQUENCE_LOCKTIME_GRANULARITY ) + 1 ) ; // txFirst[1] is the 3rd block
2015-12-07 15:44:16 -05:00
prevheights [ 0 ] = baseheight + 2 ;
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( CheckFinalTx ( CTransaction ( tx ) , flags ) ) ; // Locktime passes
BOOST_CHECK ( ! TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks fail
2015-12-07 15:44:16 -05:00
for ( int i = 0 ; i < CBlockIndex : : nMedianTimeSpan ; i + + )
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . Tip ( ) - > GetAncestor ( : : ChainActive ( ) . Tip ( ) - > nHeight - i ) - > nTime + = 512 ; //Trick the MedianTimePast
BOOST_CHECK ( SequenceLocks ( CTransaction ( tx ) , flags , & prevheights , CreateBlockIndex ( : : ChainActive ( ) . Tip ( ) - > nHeight + 1 ) ) ) ; // Sequence locks pass 512 seconds later
2015-12-07 15:44:16 -05:00
for ( int i = 0 ; i < CBlockIndex : : nMedianTimeSpan ; i + + )
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . Tip ( ) - > GetAncestor ( : : ChainActive ( ) . Tip ( ) - > nHeight - i ) - > nTime - = 512 ; //undo tricked MTP
2015-12-07 15:44:16 -05:00
// absolute height locked
tx . vin [ 0 ] . prevout . hash = txFirst [ 2 ] - > GetHash ( ) ;
tx . vin [ 0 ] . nSequence = CTxIn : : SEQUENCE_FINAL - 1 ;
prevheights [ 0 ] = baseheight + 3 ;
2019-03-27 11:14:25 -04:00
tx . nLockTime = : : ChainActive ( ) . Tip ( ) - > nHeight + 1 ;
2015-12-07 15:44:16 -05:00
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( ! CheckFinalTx ( CTransaction ( tx ) , flags ) ) ; // Locktime fails
BOOST_CHECK ( TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks pass
2019-03-27 11:14:25 -04:00
BOOST_CHECK ( IsFinalTx ( CTransaction ( tx ) , : : ChainActive ( ) . Tip ( ) - > nHeight + 2 , : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) ) ) ; // Locktime passes on 2nd block
2015-12-07 15:44:16 -05:00
// absolute time locked
tx . vin [ 0 ] . prevout . hash = txFirst [ 3 ] - > GetHash ( ) ;
2019-03-27 11:14:25 -04:00
tx . nLockTime = : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) ;
2015-12-07 15:44:16 -05:00
prevheights . resize ( 1 ) ;
prevheights [ 0 ] = baseheight + 4 ;
hash = tx . GetHash ( ) ;
2018-07-30 09:11:13 -04:00
mempool . addUnchecked ( entry . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( ! CheckFinalTx ( CTransaction ( tx ) , flags ) ) ; // Locktime fails
BOOST_CHECK ( TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks pass
2019-03-27 11:14:25 -04:00
BOOST_CHECK ( IsFinalTx ( CTransaction ( tx ) , : : ChainActive ( ) . Tip ( ) - > nHeight + 2 , : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) + 1 ) ) ; // Locktime passes 1 second later
2015-12-07 15:44:16 -05:00
// mempool-dependent transactions (not added)
tx . vin [ 0 ] . prevout . hash = hash ;
2019-03-27 11:14:25 -04:00
prevheights [ 0 ] = : : ChainActive ( ) . Tip ( ) - > nHeight + 1 ;
2015-12-07 15:44:16 -05:00
tx . nLockTime = 0 ;
tx . vin [ 0 ] . nSequence = 0 ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( CheckFinalTx ( CTransaction ( tx ) , flags ) ) ; // Locktime passes
BOOST_CHECK ( TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks pass
2015-12-07 15:44:16 -05:00
tx . vin [ 0 ] . nSequence = 1 ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( ! TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks fail
2015-12-07 15:44:16 -05:00
tx . vin [ 0 ] . nSequence = CTxIn : : SEQUENCE_LOCKTIME_TYPE_FLAG ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks pass
2015-12-07 15:44:16 -05:00
tx . vin [ 0 ] . nSequence = CTxIn : : SEQUENCE_LOCKTIME_TYPE_FLAG | 1 ;
2018-12-08 15:38:12 -08:00
BOOST_CHECK ( ! TestSequenceLocks ( CTransaction ( tx ) , flags ) ) ; // Sequence locks fail
2014-01-26 21:50:15 -05:00
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2014-01-26 21:50:15 -05:00
2015-12-07 15:44:16 -05:00
// None of the of the absolute height/time locked tx should have made
// it into the template because we still check IsFinalTx in CreateNewBlock,
// but relative locked txs will if inconsistently added to mempool.
// For now these will still generate a valid template until BIP68 soft fork
2018-04-09 16:50:19 +09:00
BOOST_CHECK_EQUAL ( pblocktemplate - > block . vtx . size ( ) , 3U ) ;
2015-12-07 15:44:16 -05:00
// However if we advance height by 1 and time by 512, all of them should be mined
for ( int i = 0 ; i < CBlockIndex : : nMedianTimeSpan ; i + + )
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . Tip ( ) - > GetAncestor ( : : ChainActive ( ) . Tip ( ) - > nHeight - i ) - > nTime + = 512 ; //Trick the MedianTimePast
: : ChainActive ( ) . Tip ( ) - > nHeight + + ;
SetMockTime ( : : ChainActive ( ) . Tip ( ) - > GetMedianTimePast ( ) + 1 ) ;
2014-01-26 21:50:15 -05:00
2017-02-26 16:13:51 -08:00
BOOST_CHECK ( pblocktemplate = AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) ) ;
2018-04-09 16:50:19 +09:00
BOOST_CHECK_EQUAL ( pblocktemplate - > block . vtx . size ( ) , 5U ) ;
2014-01-26 21:50:15 -05:00
2019-03-27 11:14:25 -04:00
: : ChainActive ( ) . Tip ( ) - > nHeight - - ;
2014-01-26 21:50:15 -05:00
SetMockTime ( 0 ) ;
2014-09-04 16:23:42 -03:00
mempool . clear ( ) ;
2014-01-26 21:50:15 -05:00
2016-02-20 20:58:23 -05:00
TestPackageSelection ( chainparams , scriptPubKey , txFirst ) ;
2015-04-22 23:22:36 -04:00
fCheckpointsEnabled = true ;
2012-05-22 21:55:15 +00:00
}
2011-09-27 20:16:07 +02:00
BOOST_AUTO_TEST_SUITE_END ( )