Skip to content

Commit 1e90862

Browse files
committed
Merge #13417: [net] Tighten scope in net_processing
3339ba2 Make g_enable_bip61 a member variable of PeerLogicValidation (Jesse Cohen) 6690a28 Restrict as much as possible in net_processing to translation unit (Jesse Cohen) 1d4df02 [move-only] Move things only referenced in net_processing out of header file (Jesse Cohen) 02bbc05 Rescope g_enable_bip61 to net_processing (Jesse Cohen) Pull request description: As part of a larger effort to decouple net_processing and validation a bit, these are a bunch of simple scope cleanups. I've moved things out of the header file that are only referenced in net_processing and added static (or anonymous namespace) modifiers to everything possible in net_processing. There are a handful of functions which could be static except that they are exposed for the sake of unit testing - these are explicitly commented. There has been some discussion of a compile time annotation, but no conclusion has been reached on that yet. This is somewhat related to other prs #12934 #13413 #13407 and will be followed by prs that reduce reliance on cs_main to synchronize data structures which are translation unit local to net_processing Tree-SHA512: 46c9660ee4e06653feb42ba92189565b0aea17aac2375c20747c0d091054c63829cbf66d2daddf65682b58ce1d6922e23aefea051a7f2c8abbb6db253a609082
2 parents ad552a5 + 3339ba2 commit 1e90862

File tree

5 files changed

+76
-73
lines changed

5 files changed

+76
-73
lines changed

src/init.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,8 +1122,6 @@ bool AppInitParameterInteraction()
11221122
if (gArgs.GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
11231123
nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
11241124

1125-
g_enable_bip61 = gArgs.GetBoolArg("-enablebip61", DEFAULT_ENABLE_BIP61);
1126-
11271125
if (gArgs.GetArg("-rpcserialversion", DEFAULT_RPC_SERIALIZE_VERSION) < 0)
11281126
return InitError("rpcserialversion must be non-negative.");
11291127

@@ -1308,7 +1306,7 @@ bool AppInitMain()
13081306
g_connman = std::unique_ptr<CConnman>(new CConnman(GetRand(std::numeric_limits<uint64_t>::max()), GetRand(std::numeric_limits<uint64_t>::max())));
13091307
CConnman& connman = *g_connman;
13101308

1311-
peerLogic.reset(new PeerLogicValidation(&connman, scheduler));
1309+
peerLogic.reset(new PeerLogicValidation(&connman, scheduler, gArgs.GetBoolArg("-enablebip61", DEFAULT_ENABLE_BIP61)));
13121310
RegisterValidationInterface(peerLogic.get());
13131311

13141312
// sanitize comments per BIP-0014, format user agent and check total size

src/net_processing.cpp

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,34 @@
3535
# error "Bitcoin cannot be compiled without assertions."
3636
#endif
3737

38-
std::atomic<int64_t> nTimeBestReceived(0); // Used only to inform the wallet of when we last received a block
39-
bool g_enable_bip61 = DEFAULT_ENABLE_BIP61;
40-
41-
struct IteratorComparator
42-
{
43-
template<typename I>
44-
bool operator()(const I& a, const I& b) const
45-
{
46-
return &(*a) < &(*b);
47-
}
48-
};
38+
/** Expiration time for orphan transactions in seconds */
39+
static constexpr int64_t ORPHAN_TX_EXPIRE_TIME = 20 * 60;
40+
/** Minimum time between orphan transactions expire time checks in seconds */
41+
static constexpr int64_t ORPHAN_TX_EXPIRE_INTERVAL = 5 * 60;
42+
/** Headers download timeout expressed in microseconds
43+
* Timeout = base + per_header * (expected number of headers) */
44+
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_BASE = 15 * 60 * 1000000; // 15 minutes
45+
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1000; // 1ms/header
46+
/** Protect at least this many outbound peers from disconnection due to slow/
47+
* behind headers chain.
48+
*/
49+
static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;
50+
/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */
51+
static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes
52+
/** How frequently to check for stale tips, in seconds */
53+
static constexpr int64_t STALE_CHECK_INTERVAL = 10 * 60; // 10 minutes
54+
/** How frequently to check for extra outbound peers and disconnect, in seconds */
55+
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;
56+
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */
57+
static constexpr int64_t MINIMUM_CONNECT_TIME = 30;
58+
/** SHA256("main address relay")[0:8] */
59+
static constexpr uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL;
60+
/// Age after which a stale block will no longer be served if requested as
61+
/// protection against fingerprinting. Set to one month, denominated in seconds.
62+
static constexpr int STALE_RELAY_AGE_LIMIT = 30 * 24 * 60 * 60;
63+
/// Age after which a block is considered historical for purposes of rate
64+
/// limiting block relay. Set to one week, denominated in seconds.
65+
static constexpr int HISTORICAL_BLOCK_AGE = 7 * 24 * 60 * 60;
4966

5067
struct COrphanTx {
5168
// When modifying, adapt the copy of this definition in tests/DoS_tests.
@@ -55,21 +72,11 @@ struct COrphanTx {
5572
};
5673
static CCriticalSection g_cs_orphans;
5774
std::map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(g_cs_orphans);
58-
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(g_cs_orphans);
59-
void EraseOrphansFor(NodeId peer);
60-
61-
static size_t vExtraTxnForCompactIt GUARDED_BY(g_cs_orphans) = 0;
62-
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_cs_orphans);
6375

64-
static const uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL; // SHA256("main address relay")[0:8]
65-
66-
/// Age after which a stale block will no longer be served if requested as
67-
/// protection against fingerprinting. Set to one month, denominated in seconds.
68-
static const int STALE_RELAY_AGE_LIMIT = 30 * 24 * 60 * 60;
76+
void EraseOrphansFor(NodeId peer);
6977

70-
/// Age after which a block is considered historical for purposes of rate
71-
/// limiting block relay. Set to one week, denominated in seconds.
72-
static const int HISTORICAL_BLOCK_AGE = 7 * 24 * 60 * 60;
78+
/** Increase a node's misbehavior score. */
79+
void Misbehaving(NodeId nodeid, int howmuch, const std::string& message="");
7380

7481
// Internal stuff
7582
namespace {
@@ -137,10 +144,24 @@ namespace {
137144
MapRelay mapRelay;
138145
/** Expiration-time ordered list of (expire time, relay map entry) pairs, protected by cs_main). */
139146
std::deque<std::pair<int64_t, MapRelay::iterator>> vRelayExpiration;
147+
148+
std::atomic<int64_t> nTimeBestReceived(0); // Used only to inform the wallet of when we last received a block
149+
150+
struct IteratorComparator
151+
{
152+
template<typename I>
153+
bool operator()(const I& a, const I& b) const
154+
{
155+
return &(*a) < &(*b);
156+
}
157+
};
158+
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(g_cs_orphans);
159+
160+
static size_t vExtraTxnForCompactIt GUARDED_BY(g_cs_orphans) = 0;
161+
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_cs_orphans);
140162
} // namespace
141163

142164
namespace {
143-
144165
struct CBlockReject {
145166
unsigned char chRejectCode;
146167
std::string strRejectReason;
@@ -267,10 +288,10 @@ struct CNodeState {
267288
};
268289

269290
/** Map maintaining per-node state. Requires cs_main. */
270-
std::map<NodeId, CNodeState> mapNodeState;
291+
static std::map<NodeId, CNodeState> mapNodeState;
271292

272293
// Requires cs_main.
273-
CNodeState *State(NodeId pnode) {
294+
static CNodeState *State(NodeId pnode) {
274295
std::map<NodeId, CNodeState>::iterator it = mapNodeState.find(pnode);
275296
if (it == mapNodeState.end())
276297
return nullptr;
@@ -809,7 +830,9 @@ static bool BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Para
809830
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, consensusParams) < STALE_RELAY_AGE_LIMIT);
810831
}
811832

812-
PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, CScheduler &scheduler) : connman(connmanIn), m_stale_tip_check_time(0) {
833+
PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, CScheduler &scheduler, bool enable_bip61)
834+
: connman(connmanIn), m_stale_tip_check_time(0), m_enable_bip61(enable_bip61) {
835+
813836
// Initialize global variables that cannot be constructed at startup.
814837
recentRejects.reset(new CRollingBloomFilter(120000, 0.000001));
815838

@@ -866,7 +889,7 @@ static uint256 most_recent_block_hash;
866889
static bool fWitnessesPresentInMostRecentCompactBlock;
867890

868891
/**
869-
* Maintain state about the best-seen block and fast-announce a compact block
892+
* Maintain state about the best-seen block and fast-announce a compact block
870893
* to compatible peers.
871894
*/
872895
void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) {
@@ -911,7 +934,7 @@ void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std:
911934
}
912935

913936
/**
914-
* Update our best height and announce any block hashes which weren't previously
937+
* Update our best height and announce any block hashes which weren't previously
915938
* in chainActive to our peers.
916939
*/
917940
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
@@ -947,7 +970,7 @@ void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CB
947970
}
948971

949972
/**
950-
* Handle invalid block rejection and consequent peer banning, maintain which
973+
* Handle invalid block rejection and consequent peer banning, maintain which
951974
* peers announce compact blocks.
952975
*/
953976
void PeerLogicValidation::BlockChecked(const CBlock& block, const CValidationState& state) {
@@ -1534,7 +1557,7 @@ bool static ProcessHeadersMessage(CNode *pfrom, CConnman *connman, const std::ve
15341557
return true;
15351558
}
15361559

1537-
bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CConnman* connman, const std::atomic<bool>& interruptMsgProc)
1560+
bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CConnman* connman, const std::atomic<bool>& interruptMsgProc, bool enable_bip61)
15381561
{
15391562
LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->GetId());
15401563
if (gArgs.IsArgSet("-dropmessagestest") && GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0)
@@ -1588,7 +1611,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
15881611
// Each connection can only send one version message
15891612
if (pfrom->nVersion != 0)
15901613
{
1591-
if (g_enable_bip61) {
1614+
if (enable_bip61) {
15921615
connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, std::string("Duplicate version message")));
15931616
}
15941617
LOCK(cs_main);
@@ -1619,7 +1642,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
16191642
if (!pfrom->fInbound && !pfrom->fFeeler && !pfrom->m_manual_connection && !HasAllDesirableServiceFlags(nServices))
16201643
{
16211644
LogPrint(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom->GetId(), nServices, GetDesirableServiceFlags(nServices));
1622-
if (g_enable_bip61) {
1645+
if (enable_bip61) {
16231646
connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,
16241647
strprintf("Expected to offer services %08x", GetDesirableServiceFlags(nServices))));
16251648
}
@@ -1642,7 +1665,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
16421665
{
16431666
// disconnect from peers older than this proto version
16441667
LogPrint(BCLog::NET, "peer=%d using obsolete version %i; disconnecting\n", pfrom->GetId(), nVersion);
1645-
if (g_enable_bip61) {
1668+
if (enable_bip61) {
16461669
connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_OBSOLETE,
16471670
strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION)));
16481671
}
@@ -2340,7 +2363,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
23402363
LogPrint(BCLog::MEMPOOLREJ, "%s from peer=%d was not accepted: %s\n", tx.GetHash().ToString(),
23412364
pfrom->GetId(),
23422365
FormatStateMessage(state));
2343-
if (g_enable_bip61 && state.GetRejectCode() > 0 && state.GetRejectCode() < REJECT_INTERNAL) { // Never send AcceptToMemoryPool's internal codes over P2P
2366+
if (enable_bip61 && state.GetRejectCode() > 0 && state.GetRejectCode() < REJECT_INTERNAL) { // Never send AcceptToMemoryPool's internal codes over P2P
23442367
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),
23452368
state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), inv.hash));
23462369
}
@@ -2525,7 +2548,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
25252548
} // cs_main
25262549

25272550
if (fProcessBLOCKTXN)
2528-
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, connman, interruptMsgProc);
2551+
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, connman, interruptMsgProc, enable_bip61);
25292552

25302553
if (fRevertToHeaderProcessing) {
25312554
// Headers received from HB compact block peers are permitted to be
@@ -2911,12 +2934,12 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
29112934
return true;
29122935
}
29132936

2914-
static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)
2937+
static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman, bool enable_bip61)
29152938
{
29162939
AssertLockHeld(cs_main);
29172940
CNodeState &state = *State(pnode->GetId());
29182941

2919-
if (g_enable_bip61) {
2942+
if (enable_bip61) {
29202943
for (const CBlockReject& reject : state.rejects) {
29212944
connman->PushMessage(pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, std::string(NetMsgType::BLOCK), reject.chRejectCode, reject.strRejectReason, reject.hashBlock));
29222945
}
@@ -3018,15 +3041,15 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
30183041
bool fRet = false;
30193042
try
30203043
{
3021-
fRet = ProcessMessage(pfrom, strCommand, vRecv, msg.nTime, chainparams, connman, interruptMsgProc);
3044+
fRet = ProcessMessage(pfrom, strCommand, vRecv, msg.nTime, chainparams, connman, interruptMsgProc, m_enable_bip61);
30223045
if (interruptMsgProc)
30233046
return false;
30243047
if (!pfrom->vRecvGetData.empty())
30253048
fMoreWork = true;
30263049
}
30273050
catch (const std::ios_base::failure& e)
30283051
{
3029-
if (g_enable_bip61) {
3052+
if (m_enable_bip61) {
30303053
connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_MALFORMED, std::string("error parsing message")));
30313054
}
30323055
if (strstr(e.what(), "end of data"))
@@ -3060,7 +3083,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
30603083
}
30613084

30623085
LOCK(cs_main);
3063-
SendRejectsAndCheckIfBanned(pfrom, connman);
3086+
SendRejectsAndCheckIfBanned(pfrom, connman, m_enable_bip61);
30643087

30653088
return fMoreWork;
30663089
}
@@ -3195,6 +3218,7 @@ void PeerLogicValidation::CheckForStaleTipAndEvictPeers(const Consensus::Params
31953218
}
31963219
}
31973220

3221+
namespace {
31983222
class CompareInvMempoolOrder
31993223
{
32003224
CTxMemPool *mp;
@@ -3211,6 +3235,7 @@ class CompareInvMempoolOrder
32113235
return mp->CompareDepthAndScore(*b, *a);
32123236
}
32133237
};
3238+
}
32143239

32153240
bool PeerLogicValidation::SendMessages(CNode* pto)
32163241
{
@@ -3256,7 +3281,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
32563281
if (!lockMain)
32573282
return true;
32583283

3259-
if (SendRejectsAndCheckIfBanned(pto, connman))
3284+
if (SendRejectsAndCheckIfBanned(pto, connman, m_enable_bip61))
32603285
return true;
32613286
CNodeState &state = *State(pto->GetId());
32623287

src/net_processing.h

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,17 @@
1212

1313
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
1414
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
15-
/** Expiration time for orphan transactions in seconds */
16-
static const int64_t ORPHAN_TX_EXPIRE_TIME = 20 * 60;
17-
/** Minimum time between orphan transactions expire time checks in seconds */
18-
static const int64_t ORPHAN_TX_EXPIRE_INTERVAL = 5 * 60;
1915
/** Default number of orphan+recently-replaced txn to keep around for block reconstruction */
2016
static const unsigned int DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN = 100;
21-
/** Headers download timeout expressed in microseconds
22-
* Timeout = base + per_header * (expected number of headers) */
23-
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_BASE = 15 * 60 * 1000000; // 15 minutes
24-
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1000; // 1ms/header
25-
/** Protect at least this many outbound peers from disconnection due to slow/
26-
* behind headers chain.
27-
*/
28-
static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;
29-
/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */
30-
static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes
31-
/** How frequently to check for stale tips, in seconds */
32-
static constexpr int64_t STALE_CHECK_INTERVAL = 10 * 60; // 10 minutes
33-
/** How frequently to check for extra outbound peers and disconnect, in seconds */
34-
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;
35-
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */
36-
static constexpr int64_t MINIMUM_CONNECT_TIME = 30;
37-
3817
/** Default for BIP61 (sending reject messages) */
3918
static constexpr bool DEFAULT_ENABLE_BIP61 = true;
40-
/** Enable BIP61 (sending reject messages) */
41-
extern bool g_enable_bip61;
4219

4320
class PeerLogicValidation final : public CValidationInterface, public NetEventsInterface {
4421
private:
4522
CConnman* const connman;
4623

4724
public:
48-
explicit PeerLogicValidation(CConnman* connman, CScheduler &scheduler);
25+
explicit PeerLogicValidation(CConnman* connman, CScheduler &scheduler, bool enable_bip61);
4926

5027
/**
5128
* Overridden from CValidationInterface.
@@ -92,6 +69,9 @@ class PeerLogicValidation final : public CValidationInterface, public NetEventsI
9269

9370
private:
9471
int64_t m_stale_tip_check_time; //! Next time to check for stale tip
72+
73+
/** Enable BIP61 (sending reject messages) */
74+
const bool m_enable_bip61;
9575
};
9676

9777
struct CNodeStateStats {
@@ -103,7 +83,5 @@ struct CNodeStateStats {
10383

10484
/** Get statistics from node state */
10585
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats);
106-
/** Increase a node's misbehavior score. */
107-
void Misbehaving(NodeId nodeid, int howmuch, const std::string& message="");
10886

10987
#endif // BITCOIN_NET_PROCESSING_H

src/test/denialofservice_tests.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
extern bool AddOrphanTx(const CTransactionRef& tx, NodeId peer);
2525
extern void EraseOrphansFor(NodeId peer);
2626
extern unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans);
27+
extern void Misbehaving(NodeId nodeid, int howmuch, const std::string& message="");
28+
2729
struct COrphanTx {
2830
CTransactionRef tx;
2931
NodeId fromPeer;

src/test/test_bitcoin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
107107
threadGroup.create_thread(&ThreadScriptCheck);
108108
g_connman = std::unique_ptr<CConnman>(new CConnman(0x1337, 0x1337)); // Deterministic randomness for tests.
109109
connman = g_connman.get();
110-
peerLogic.reset(new PeerLogicValidation(connman, scheduler));
110+
peerLogic.reset(new PeerLogicValidation(connman, scheduler, /*enable_bip61=*/true));
111111
}
112112

113113
TestingSetup::~TestingSetup()

0 commit comments

Comments
 (0)