Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115538
D7414.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Subscribers
None
D7414.diff
View Options
diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt
--- a/src/bench/CMakeLists.txt
+++ b/src/bench/CMakeLists.txt
@@ -50,6 +50,7 @@
gcs_filter.cpp
lockedpool.cpp
mempool_eviction.cpp
+ mempool_stress.cpp
merkle_root.cpp
prevector.cpp
rollingbloom.cpp
diff --git a/src/bench/mempool_stress.cpp b/src/bench/mempool_stress.cpp
new file mode 100644
--- /dev/null
+++ b/src/bench/mempool_stress.cpp
@@ -0,0 +1,93 @@
+// Copyright (c) 2011-2019 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 <bench/bench.h>
+#include <policy/policy.h>
+#include <random.h>
+#include <txmempool.h>
+
+#include <vector>
+
+static void AddTx(const CTransactionRef &tx, CTxMemPool &pool)
+ EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs) {
+ int64_t nTime = 0;
+ unsigned int nHeight = 1;
+ bool spendsCoinbase = false;
+ unsigned int sigOpCost = 4;
+ LockPoints lp;
+ pool.addUnchecked(CTxMemPoolEntry(tx, 1000 * SATOSHI, nTime, nHeight,
+ spendsCoinbase, sigOpCost, lp));
+}
+
+struct Available {
+ CTransactionRef ref;
+ size_t vin_left{0};
+ size_t tx_count;
+ Available(CTransactionRef &_ref, size_t _tx_count)
+ : ref(_ref), tx_count(_tx_count) {}
+};
+
+static void ComplexMemPool(benchmark::State &state) {
+ FastRandomContext det_rand{true};
+ std::vector<Available> available_coins;
+ std::vector<CTransactionRef> ordered_coins;
+ // Create some base transactions
+ size_t tx_counter = 1;
+ for (auto x = 0; x < 100; ++x) {
+ CMutableTransaction tx = CMutableTransaction();
+ tx.vin.resize(1);
+ tx.vin[0].scriptSig = CScript() << CScriptNum(tx_counter);
+ tx.vout.resize(det_rand.randrange(10) + 2);
+ for (auto &out : tx.vout) {
+ out.scriptPubKey = CScript() << CScriptNum(tx_counter) << OP_EQUAL;
+ out.nValue = 10 * COIN;
+ }
+ ordered_coins.emplace_back(MakeTransactionRef(tx));
+ available_coins.emplace_back(ordered_coins.back(), tx_counter++);
+ }
+ for (auto x = 0; x < 800 && !available_coins.empty(); ++x) {
+ CMutableTransaction tx = CMutableTransaction();
+ size_t n_ancestors = det_rand.randrange(10) + 1;
+ for (size_t ancestor = 0;
+ ancestor < n_ancestors && !available_coins.empty(); ++ancestor) {
+ size_t idx = det_rand.randrange(available_coins.size());
+ Available coin = available_coins[idx];
+ TxId txid = coin.ref->GetId();
+ // biased towards taking just one ancestor, but maybe more
+ size_t n_to_take =
+ det_rand.randrange(2) == 0
+ ? 1
+ : 1 + det_rand.randrange(coin.ref->vout.size() -
+ coin.vin_left);
+ for (size_t i = 0; i < n_to_take; ++i) {
+ tx.vin.emplace_back();
+ tx.vin.back().prevout = COutPoint(txid, coin.vin_left++);
+ tx.vin.back().scriptSig = CScript() << coin.tx_count;
+ }
+ if (coin.vin_left == coin.ref->vin.size()) {
+ coin = available_coins.back();
+ available_coins.pop_back();
+ }
+ tx.vout.resize(det_rand.randrange(10) + 2);
+ for (auto &out : tx.vout) {
+ out.scriptPubKey = CScript()
+ << CScriptNum(tx_counter) << OP_EQUAL;
+ out.nValue = 10 * COIN;
+ }
+ }
+ ordered_coins.emplace_back(MakeTransactionRef(tx));
+ available_coins.emplace_back(ordered_coins.back(), tx_counter++);
+ }
+ CTxMemPool pool;
+ LOCK2(cs_main, pool.cs);
+ while (state.KeepRunning()) {
+ for (auto &tx : ordered_coins) {
+ AddTx(tx, pool);
+ }
+ pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4);
+ pool.TrimToSize(GetVirtualTransactionSize(*ordered_coins.front()));
+ }
+}
+
+BENCHMARK(ComplexMemPool, 1);
diff --git a/src/psbt.h b/src/psbt.h
--- a/src/psbt.h
+++ b/src/psbt.h
@@ -328,9 +328,6 @@
bool AddInput(const CTxIn &txin, PSBTInput &psbtin);
bool AddOutput(const CTxOut &txout, const PSBTOutput &psbtout);
PartiallySignedTransaction() {}
- PartiallySignedTransaction(const PartiallySignedTransaction &psbt_in)
- : tx(psbt_in.tx), inputs(psbt_in.inputs), outputs(psbt_in.outputs),
- unknown(psbt_in.unknown) {}
explicit PartiallySignedTransaction(const CMutableTransaction &txIn);
/**
* Finds the UTXO for a given input index
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 1, 11:20 (8 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5185882
Default Alt Text
D7414.diff (4 KB)
Attached To
D7414: [backport#17292] Add new mempool benchmarks for a complex pool
Event Timeline
Log In to Comment