Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115693
D1611.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
26 KB
Subscribers
None
D1611.diff
View Options
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
--- a/src/consensus/consensus.h
+++ b/src/consensus/consensus.h
@@ -12,6 +12,8 @@
static const uint64_t ONE_MEGABYTE = 1000000;
/** The maximum allowed size for a transaction, in bytes */
static const uint64_t MAX_TX_SIZE = ONE_MEGABYTE;
+/** The minimum allowed size for a transaction, in bytes */
+static const uint64_t MIN_TX_SIZE = 100;
/** The maximum allowed size for a block, before the UAHF */
static const uint64_t LEGACY_MAX_BLOCK_SIZE = ONE_MEGABYTE;
/** Default setting for maximum allowed size for a block, in bytes */
diff --git a/src/miner.h b/src/miner.h
--- a/src/miner.h
+++ b/src/miner.h
@@ -146,6 +146,7 @@
// Chain context for the block
int nHeight;
int64_t nLockTimeCutoff;
+ int64_t nMedianTimePast;
const Config *config;
diff --git a/src/miner.cpp b/src/miner.cpp
--- a/src/miner.cpp
+++ b/src/miner.cpp
@@ -162,9 +162,10 @@
pblock->nTime = GetAdjustedTime();
nMaxGeneratedBlockSize = ComputeMaxGeneratedBlockSize(*config, pindexPrev);
+ nMedianTimePast = pindexPrev->GetMedianTimePast();
nLockTimeCutoff =
(STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
- ? pindexPrev->GetMedianTimePast()
+ ? nMedianTimePast
: pblock->GetBlockTime();
addPriorityTxs();
@@ -196,6 +197,15 @@
coinbaseTx.vout[0].nValue =
nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
+
+ // Make sure the coinbase is big enough.
+ uint64_t coinbaseSize =
+ ::GetSerializeSize(coinbaseTx, SER_NETWORK, PROTOCOL_VERSION);
+ if (coinbaseSize < MIN_TX_SIZE) {
+ coinbaseTx.vin[0].scriptSig
+ << std::vector<uint8_t>(MIN_TX_SIZE - coinbaseSize - 1);
+ }
+
pblock->vtx[0] = MakeTransactionRef(coinbaseTx);
pblocktemplate->vTxFees[0] = -1 * nFees;
@@ -278,7 +288,7 @@
for (const CTxMemPool::txiter it : package) {
CValidationState state;
if (!ContextualCheckTransaction(*config, it->GetTx(), state, nHeight,
- nLockTimeCutoff)) {
+ nLockTimeCutoff, nMedianTimePast)) {
return false;
}
@@ -330,7 +340,7 @@
// is always enforced as long as reorgs keep the mempool consistent.
CValidationState state;
if (!ContextualCheckTransaction(*config, it->GetTx(), state, nHeight,
- nLockTimeCutoff)) {
+ nLockTimeCutoff, nMedianTimePast)) {
return TestForBlockResult::TXCantFit;
}
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -1,4 +1,5 @@
// Copyright (c) 2011-2016 The Bitcoin Core developers
+// Copyright (c) 2017-2018 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -285,8 +286,12 @@
txCoinbase.vout.resize(1);
txCoinbase.vout[0].scriptPubKey = CScript();
pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase));
- if (txFirst.size() == 0) baseheight = chainActive.Height();
- if (txFirst.size() < 4) txFirst.push_back(pblock->vtx[0]);
+ if (txFirst.size() == 0) {
+ baseheight = chainActive.Height();
+ }
+ if (txFirst.size() < 4) {
+ txFirst.push_back(pblock->vtx[0]);
+ }
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
pblock->nNonce = blockinfo[i].nonce;
std::shared_ptr<const CBlock> shared_pblock =
@@ -615,9 +620,10 @@
// Locktime passes on 2nd block.
GlobalConfig config;
CValidationState state;
+ int64_t nMedianTimePast = chainActive.Tip()->GetMedianTimePast();
BOOST_CHECK(ContextualCheckTransaction(
config, CTransaction(tx), state, chainActive.Tip()->nHeight + 2,
- chainActive.Tip()->GetMedianTimePast()));
+ nMedianTimePast, nMedianTimePast));
}
// Absolute time locked.
@@ -644,9 +650,10 @@
// Locktime passes 1 second later.
GlobalConfig config;
CValidationState state;
+ int64_t nMedianTimePast = chainActive.Tip()->GetMedianTimePast() + 1;
BOOST_CHECK(ContextualCheckTransaction(
config, CTransaction(tx), state, chainActive.Tip()->nHeight + 1,
- chainActive.Tip()->GetMedianTimePast() + 1));
+ nMedianTimePast, nMedianTimePast));
}
// mempool-dependent transactions (not added)
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -1,4 +1,5 @@
// Copyright (c) 2011-2016 The Bitcoin Core developers
+// Copyright (c) 2017-2018 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -6,8 +7,10 @@
#include "data/tx_valid.json.h"
#include "test/test_bitcoin.h"
+#include "chainparams.h" // For CChainParams
#include "checkqueue.h"
#include "clientversion.h"
+#include "config.h"
#include "consensus/validation.h"
#include "core_io.h"
#include "key.h"
@@ -20,7 +23,7 @@
#include "test/jsonutil.h"
#include "test/scriptflags.h"
#include "utilstrencodings.h"
-#include "validation.h" // For CheckRegularTransaction
+#include "validation.h" // For CheckRegularTransaction and ContextualCheckTransaction
#include <map>
#include <string>
@@ -757,4 +760,21 @@
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
}
+BOOST_AUTO_TEST_CASE(txsize_activation_test) {
+ const Config &config = GetConfig();
+ const int64_t magneticAnomalyActivationTime =
+ config.GetChainParams().GetConsensus().magneticAnomalyActivationTime;
+
+ // A minimaly sized transction.
+ CTransaction minTx;
+ CValidationState state;
+
+ BOOST_CHECK(ContextualCheckTransaction(config, minTx, state, 1234, 5678,
+ magneticAnomalyActivationTime - 1));
+ BOOST_CHECK(!ContextualCheckTransaction(config, minTx, state, 1234, 5678,
+ magneticAnomalyActivationTime));
+ BOOST_CHECK_EQUAL(state.GetRejectCode(), REJECT_INVALID);
+ BOOST_CHECK_EQUAL(state.GetRejectReason(), "bad-txns-undersize");
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/validation.h b/src/validation.h
--- a/src/validation.h
+++ b/src/validation.h
@@ -644,7 +644,8 @@
*/
bool ContextualCheckTransaction(const Config &config, const CTransaction &tx,
CValidationState &state, int nHeight,
- int64_t nLockTimeCutoff);
+ int64_t nLockTimeCutoff,
+ int64_t nMedianTimePast);
/**
* This is a variant of ContextualCheckTransaction which computes the contextual
diff --git a/src/validation.cpp b/src/validation.cpp
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -3617,7 +3617,8 @@
bool ContextualCheckTransaction(const Config &config, const CTransaction &tx,
CValidationState &state, int nHeight,
- int64_t nLockTimeCutoff) {
+ int64_t nLockTimeCutoff,
+ int64_t nMedianTimePast) {
if (!IsFinalTx(tx, nHeight, nLockTimeCutoff)) {
// While this is only one transaction, we use txns in the error to
// ensure continuity with other clients.
@@ -3625,6 +3626,14 @@
"non-final transaction");
}
+ if (IsMagneticAnomalyEnabled(config, nMedianTimePast)) {
+ // Size limit
+ if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) <
+ MIN_TX_SIZE) {
+ return state.DoS(100, false, REJECT_INVALID, "bad-txns-undersize");
+ }
+ }
+
return true;
}
@@ -3654,12 +3663,15 @@
// When the next block is created its previous block will be the current
// chain tip, so we use that to calculate the median time passed to
// ContextualCheckTransaction() if LOCKTIME_MEDIAN_TIME_PAST is set.
+ const int64_t nMedianTimePast =
+ chainActive.Tip() == nullptr ? 0
+ : chainActive.Tip()->GetMedianTimePast();
const int64_t nLockTimeCutoff = (flags & LOCKTIME_MEDIAN_TIME_PAST)
- ? chainActive.Tip()->GetMedianTimePast()
+ ? nMedianTimePast
: GetAdjustedTime();
return ContextualCheckTransaction(config, tx, state, nBlockHeight,
- nLockTimeCutoff);
+ nLockTimeCutoff, nMedianTimePast);
}
static bool ContextualCheckBlock(const Config &config, const CBlock &block,
@@ -3704,7 +3716,7 @@
}
if (!ContextualCheckTransaction(config, tx, state, nHeight,
- nLockTimeCutoff)) {
+ nLockTimeCutoff, nMedianTimePast)) {
// state set by ContextualCheckTransaction.
return false;
}
diff --git a/test/functional/abc-transaction-ordering.py b/test/functional/abc-magnetic-anomaly-activation.py
copy from test/functional/abc-transaction-ordering.py
copy to test/functional/abc-magnetic-anomaly-activation.py
--- a/test/functional/abc-transaction-ordering.py
+++ b/test/functional/abc-magnetic-anomaly-activation.py
@@ -1,20 +1,17 @@
#!/usr/bin/env python3
-# Copyright (c) 2015-2016 The Bitcoin Core developers
-# Copyright (c) 2017 The Bitcoin developers
+# Copyright (c) 2018 The Bitcoin developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""
-This test checks that the nod esoftware accepts transactions in
-non topological order once the feature is activated.
+This test checks that simple features of the magnetic anomaly fork
+activates properly. More complex features are given their own tests.
"""
from test_framework.test_framework import ComparisonTestFramework
from test_framework.util import assert_equal, assert_raises_rpc_error
from test_framework.comptool import TestManager, TestInstance, RejectResult
from test_framework.blocktools import *
-import time
-from test_framework.key import CECKey
-from test_framework.script import *
+from test_framework.cdefs import MIN_TX_SIZE
from collections import deque
# far into the future
@@ -28,11 +25,7 @@
self.n = n # the output we're spending
-class TransactionOrderingTest(ComparisonTestFramework):
-
- # Can either run this test as 1 node with expected answers, or two and compare them.
- # Change the "outcome" variable from each TestInstance object to only do
- # the comparison.
+class MagneticAnomalyActivationTest(ComparisonTestFramework):
def set_test_params(self):
self.num_nodes = 1
@@ -57,12 +50,7 @@
[tx.rehash() for tx in tx_list]
block.vtx.extend(tx_list)
- # this is a little handier to use than the version in blocktools.py
- def create_tx(self, spend, value, script=CScript([OP_TRUE])):
- tx = create_transaction(spend.tx, spend.n, b"", value, script)
- return tx
-
- def next_block(self, number, spend=None, tx_count=0):
+ def next_block(self, number, spend=None, tx_size=0):
if self.tip == None:
base_block_hash = self.genesis_hash
block_time = int(time.time()) + 1
@@ -85,45 +73,35 @@
# Make sure we have plenty enough to spend going forward.
spendable_outputs = deque([spend])
- def get_base_transaction():
- # Create the new transaction
- tx = CTransaction()
- # Spend from one of the spendable outputs
- spend = spendable_outputs.popleft()
- tx.vin.append(CTxIn(COutPoint(spend.tx.sha256, spend.n)))
- # Add spendable outputs
- for i in range(4):
- tx.vout.append(CTxOut(0, CScript([OP_TRUE])))
- spendable_outputs.append(PreviousSpendableOutput(tx, i))
- return tx
-
- tx = get_base_transaction()
+ # Create the new transaction
+ tx = CTransaction()
+ # Spend from one of the spendable outputs
+ spend = spendable_outputs.popleft()
+ tx.vin.append(CTxIn(COutPoint(spend.tx.sha256, spend.n)))
+ # Add spendable outputs
+ for i in range(2):
+ tx.vout.append(CTxOut(0, CScript([OP_TRUE])))
+ spendable_outputs.append(PreviousSpendableOutput(tx, i))
+ # Put some random data into the transaction in order to randomize ids.
+ if tx_size == 0:
+ tx.vout.append(
+ CTxOut(0, CScript([random.getrandbits(8), OP_RETURN])))
+ else:
+ tx.vout.append(
+ CTxOut(0, CScript([random.getrandbits(8 * (tx_size - 82) - 1), OP_RETURN])))
+ assert_equal(len(tx.serialize()), tx_size)
# Make it the same format as transaction added for padding and save the size.
# It's missing the padding output, so we add a constant to account for it.
tx.rehash()
- base_tx_size = len(tx.serialize()) + 18
-
- # Put some random data into the first transaction of the chain to randomize ids.
- tx.vout.append(
- CTxOut(0, CScript([random.randint(0, 256), OP_RETURN])))
# Add the transaction to the block
self.add_transactions_to_block(block, [tx])
- # If we have a transaction count requirement, just fill the block until we get there
- while len(block.vtx) < tx_count:
- # Create the new transaction and add it.
- tx = get_base_transaction()
- self.add_transactions_to_block(block, [tx])
-
# Now that we added a bunch of transaction, we need to recompute
# the merkle root.
block.hashMerkleRoot = block.calc_merkle_root()
- if tx_count > 0:
- assert_equal(len(block.vtx), tx_count)
-
# Do PoW, which is cheap on regnet
block.solve()
self.tip = block
@@ -219,50 +197,29 @@
assert_equal(node.getblockheader(node.getbestblockhash())['mediantime'],
MAGNETIC_ANOMALY_START_TIME - 1)
- # Before we activate the Nov 15, 2018 HF, transaction order is respected.
- def ordered_block(block_number, spend):
- b = block(block_number, spend=spend, tx_count=16)
- b.vtx = [b.vtx[0]] + sorted(b.vtx[1:], key=lambda tx: tx.get_id())
- update_block(block_number)
- return b
-
- ordered_block(4444, out[16])
- yield rejected(RejectResult(16, b'bad-txns-inputs-missingorspent'))
-
- # Rewind bad block.
- tip(5104)
-
- # Activate the Nov 15, 2018 HF
- block(5556, out[16], tx_count=16)
+ # Check that block with small transactions are still accepted.
+ small_tx_block = block(4444, out[0], MIN_TX_SIZE - 1)
+ assert_equal(len(small_tx_block.vtx[1].serialize()), MIN_TX_SIZE - 1)
yield accepted()
- # Now MTP is exactly the fork time. Bigger blocks are now accepted.
+ # Now MTP is exactly the fork time. Small transaction are now rejected.
assert_equal(node.getblockheader(node.getbestblockhash())['mediantime'],
MAGNETIC_ANOMALY_START_TIME)
- # Block with regular ordering are now rejected.
- block(5557, out[17], tx_count=16)
- yield rejected(RejectResult(16, b'tx-ordering'))
+ # Now that the for activated, it is not possible to have
+ # small transactions anymore.
+ small_tx_block = block(4445, out[1], MIN_TX_SIZE - 1)
+ assert_equal(len(small_tx_block.vtx[1].serialize()), MIN_TX_SIZE - 1)
+ yield rejected(RejectResult(16, b'bad-txns-undersize'))
# Rewind bad block.
- tip(5556)
+ tip(4444)
- # Now that the fork activated, we need to order transaction per txid.
- ordered_block(4445, out[17])
+ # But large transactions are still ok.
+ large_tx_block = block(4446, out[1], MIN_TX_SIZE)
+ assert_equal(len(large_tx_block.vtx[1].serialize()), MIN_TX_SIZE)
yield accepted()
- # Invalidate the best block and make sure we are back at the fork point.
- ctorblockhash = node.getbestblockhash()
- node.invalidateblock(ctorblockhash)
- forkblockhash = node.getbestblockhash()
- assert(forkblockhash != ctorblockhash)
- assert_equal(node.getblockheader(forkblockhash)[
- 'mediantime'], MAGNETIC_ANOMALY_START_TIME)
-
- node.generate(1)
- generatedblockhash = node.getbestblockhash()
- assert(forkblockhash != generatedblockhash)
-
if __name__ == '__main__':
- TransactionOrderingTest().main()
+ MagneticAnomalyActivationTest().main()
diff --git a/test/functional/abc-transaction-ordering.py b/test/functional/abc-transaction-ordering.py
--- a/test/functional/abc-transaction-ordering.py
+++ b/test/functional/abc-transaction-ordering.py
@@ -1,10 +1,9 @@
#!/usr/bin/env python3
-# Copyright (c) 2015-2016 The Bitcoin Core developers
-# Copyright (c) 2017 The Bitcoin developers
+# Copyright (c) 2018 The Bitcoin developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""
-This test checks that the nod esoftware accepts transactions in
+This test checks that the node software accepts transactions in
non topological order once the feature is activated.
"""
@@ -57,11 +56,6 @@
[tx.rehash() for tx in tx_list]
block.vtx.extend(tx_list)
- # this is a little handier to use than the version in blocktools.py
- def create_tx(self, spend, value, script=CScript([OP_TRUE])):
- tx = create_transaction(spend.tx, spend.n, b"", value, script)
- return tx
-
def next_block(self, number, spend=None, tx_count=0):
if self.tip == None:
base_block_hash = self.genesis_hash
@@ -95,6 +89,10 @@
for i in range(4):
tx.vout.append(CTxOut(0, CScript([OP_TRUE])))
spendable_outputs.append(PreviousSpendableOutput(tx, i))
+ # Put some random data into the transaction in order to randomize ids.
+ # This also ensures that transaction are larger than 100 bytes.
+ tx.vout.append(
+ CTxOut(0, CScript([random.getrandbits(256), OP_RETURN])))
return tx
tx = get_base_transaction()
@@ -102,11 +100,6 @@
# Make it the same format as transaction added for padding and save the size.
# It's missing the padding output, so we add a constant to account for it.
tx.rehash()
- base_tx_size = len(tx.serialize()) + 18
-
- # Put some random data into the first transaction of the chain to randomize ids.
- tx.vout.append(
- CTxOut(0, CScript([random.randint(0, 256), OP_RETURN])))
# Add the transaction to the block
self.add_transactions_to_block(block, [tx])
@@ -236,7 +229,7 @@
block(5556, out[16], tx_count=16)
yield accepted()
- # Now MTP is exactly the fork time. Bigger blocks are now accepted.
+ # Now MTP is exactly the fork time. Transactions are expected to be ordered now.
assert_equal(node.getblockheader(node.getbestblockhash())['mediantime'],
MAGNETIC_ANOMALY_START_TIME)
diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py
--- a/test/functional/test_framework/blocktools.py
+++ b/test/functional/test_framework/blocktools.py
@@ -60,6 +60,12 @@
else:
coinbaseoutput.scriptPubKey = CScript([OP_TRUE])
coinbase.vout = [coinbaseoutput]
+
+ # Make sure the coinbase is at least 100 bytes
+ coinbase_size = len(coinbase.serialize())
+ if coinbase_size < 100:
+ coinbase.vin[0].scriptSig += b'x' * (100 - coinbase_size)
+
coinbase.calc_sha256()
return coinbase
diff --git a/test/functional/test_framework/cdefs.py b/test/functional/test_framework/cdefs.py
--- a/test/functional/test_framework/cdefs.py
+++ b/test/functional/test_framework/cdefs.py
@@ -85,8 +85,8 @@
# blocks (network rule)
COINBASE_MATURITY = 100
-# Anti replay OP_RETURN commitment.
-ANTI_REPLAY_COMMITMENT = b"Bitcoin: A Peer-to-Peer Electronic Cash System"
+# Minimum size a transaction can have.
+MIN_TX_SIZE = 100
if __name__ == "__main__":
# Output values if run standalone to verify
diff --git a/test/functional/timing.json b/test/functional/timing.json
--- a/test/functional/timing.json
+++ b/test/functional/timing.json
@@ -1,27 +1,31 @@
[
{
"name": "abandonconflict.py",
- "time": 14
+ "time": 17
},
{
"name": "abc-cmdline.py",
- "time": 9
+ "time": 8
},
{
"name": "abc-high_priority_transaction.py",
- "time": 11
+ "time": 10
+ },
+ {
+ "name": "abc-magnetic-anomaly-activation.py",
+ "time": 15
},
{
"name": "abc-mempool-accept-txn.py",
- "time": 4
+ "time": 5
},
{
"name": "abc-p2p-compactblocks.py",
- "time": 194
+ "time": 176
},
{
"name": "abc-p2p-fullblocktest.py",
- "time": 77
+ "time": 51
},
{
"name": "abc-replay-protection.py",
@@ -33,27 +37,27 @@
},
{
"name": "abc-transaction-ordering.py",
- "time": 7
+ "time": 13
},
{
"name": "assumevalid.py",
- "time": 14
+ "time": 13
},
{
"name": "bip65-cltv-p2p.py",
- "time": 6
+ "time": 7
},
{
"name": "bip68-112-113-p2p.py",
- "time": 21
+ "time": 22
},
{
"name": "bip68-sequence.py",
- "time": 36
+ "time": 40
},
{
"name": "bipdersig-p2p.py",
- "time": 6
+ "time": 18
},
{
"name": "bitcoin_cli.py",
@@ -61,15 +65,15 @@
},
{
"name": "blockchain.py",
- "time": 9
+ "time": 19
},
{
"name": "dbcrash.py",
- "time": 923
+ "time": 1183
},
{
"name": "decodescript.py",
- "time": 3
+ "time": 4
},
{
"name": "disablewallet.py",
@@ -77,11 +81,11 @@
},
{
"name": "disconnect_ban.py",
- "time": 16
+ "time": 24
},
{
"name": "example_test.py",
- "time": 14
+ "time": 4
},
{
"name": "forknotify.py",
@@ -89,23 +93,23 @@
},
{
"name": "fundrawtransaction.py",
- "time": 41
+ "time": 43
},
{
"name": "getblocktemplate_longpoll.py",
- "time": 69
+ "time": 68
},
{
"name": "getchaintips.py",
- "time": 5
+ "time": 7
},
{
"name": "httpbasics.py",
- "time": 3
+ "time": 6
},
{
"name": "import-rescan.py",
- "time": 32
+ "time": 20
},
{
"name": "importmulti.py",
@@ -113,11 +117,11 @@
},
{
"name": "importprunedfunds.py",
- "time": 3
+ "time": 4
},
{
"name": "invalidateblock.py",
- "time": 8
+ "time": 21
},
{
"name": "invalidblockrequest.py",
@@ -129,23 +133,23 @@
},
{
"name": "keypool-topup.py",
- "time": 26
+ "time": 23
},
{
"name": "keypool.py",
- "time": 31
+ "time": 11
},
{
"name": "listsinceblock.py",
- "time": 9
+ "time": 5
},
{
"name": "listtransactions.py",
- "time": 11
+ "time": 12
},
{
"name": "maxuploadtarget.py",
- "time": 53
+ "time": 52
},
{
"name": "mempool_limit.py",
@@ -153,15 +157,15 @@
},
{
"name": "mempool_packages.py",
- "time": 60
+ "time": 30
},
{
"name": "mempool_persist.py",
- "time": 19
+ "time": 27
},
{
"name": "mempool_reorg.py",
- "time": 6
+ "time": 5
},
{
"name": "mempool_resurrect_test.py",
@@ -169,19 +173,19 @@
},
{
"name": "mempool_spendcoinbase.py",
- "time": 3
+ "time": 2
},
{
"name": "merkle_blocks.py",
- "time": 4
+ "time": 5
},
{
"name": "minchainwork.py",
- "time": 16
+ "time": 6
},
{
"name": "mining.py",
- "time": 4
+ "time": 3
},
{
"name": "multi_rpc.py",
@@ -189,39 +193,39 @@
},
{
"name": "multiwallet.py",
- "time": 10
+ "time": 7
},
{
"name": "net.py",
- "time": 4
+ "time": 5
},
{
"name": "nulldummy.py",
- "time": 15
+ "time": 3
},
{
"name": "p2p-acceptblock.py",
- "time": 7
+ "time": 8
},
{
"name": "p2p-compactblocks.py",
- "time": 25
+ "time": 27
},
{
"name": "p2p-feefilter.py",
- "time": 22
+ "time": 31
},
{
"name": "p2p-fullblocktest.py",
- "time": 136
+ "time": 140
},
{
"name": "p2p-leaktests.py",
- "time": 13
+ "time": 8
},
{
"name": "p2p-mempool.py",
- "time": 13
+ "time": 3
},
{
"name": "p2p-timeouts.py",
@@ -229,27 +233,27 @@
},
{
"name": "preciousblock.py",
- "time": 4
+ "time": 5
},
{
"name": "prioritise_transaction.py",
- "time": 11
+ "time": 22
},
{
"name": "proxy_test.py",
- "time": 5
+ "time": 4
},
{
"name": "pruning.py",
- "time": 1387
+ "time": 1623
},
{
"name": "rawtransactions.py",
- "time": 17
+ "time": 15
},
{
"name": "receivedby.py",
- "time": 11
+ "time": 21
},
{
"name": "reindex.py",
@@ -257,27 +261,27 @@
},
{
"name": "resendwallettransactions.py",
- "time": 6
+ "time": 18
},
{
"name": "rest.py",
- "time": 9
+ "time": 19
},
{
"name": "rpcbind_test.py",
- "time": 27
+ "time": 28
},
{
"name": "rpcnamedargs.py",
- "time": 25
+ "time": 3
},
{
"name": "sendheaders.py",
- "time": 27
+ "time": 29
},
{
"name": "signmessages.py",
- "time": 12
+ "time": 2
},
{
"name": "signrawtransactions.py",
@@ -285,7 +289,7 @@
},
{
"name": "txn_clone.py",
- "time": 5
+ "time": 6
},
{
"name": "txn_clone.py --mineblock",
@@ -293,7 +297,7 @@
},
{
"name": "txn_doublespend.py",
- "time": 27
+ "time": 20
},
{
"name": "txn_doublespend.py --mineblock",
@@ -301,38 +305,38 @@
},
{
"name": "uptime.py",
- "time": 3
+ "time": 2
},
{
"name": "wallet-accounts.py",
- "time": 8
+ "time": 15
},
{
"name": "wallet-dump.py",
- "time": 11
+ "time": 8
},
{
"name": "wallet-encryption.py",
- "time": 9
+ "time": 24
},
{
"name": "wallet-hd.py",
- "time": 107
+ "time": 82
},
{
"name": "wallet.py",
- "time": 45
+ "time": 43
},
{
"name": "walletbackup.py",
- "time": 110
+ "time": 139
},
{
"name": "zapwallettxes.py",
- "time": 15
+ "time": 12
},
{
"name": "zmq_test.py",
- "time": 5
+ "time": 4
}
-]
+]
\ No newline at end of file
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 1, 11:45 (6 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187687
Default Alt Text
D1611.diff (26 KB)
Attached To
D1611: Impose a minimum transaction size of 100 bytes after the Nov, 15 2018 HF
Event Timeline
Log In to Comment