mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Merge pull request #4226 from PastaPastaPasta/backport-triv-pr6
backport: 'trivial' pr6
This commit is contained in:
commit
637a8a28fe
@ -20,6 +20,7 @@ endif
|
||||
BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT)
|
||||
BITCOIN_QT_BIN=$(top_builddir)/src/qt/$(BITCOIN_GUI_NAME)$(EXEEXT)
|
||||
BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT)
|
||||
BITCOIN_TX_BIN=$(top_builddir)/src/$(BITCOIN_TX_NAME)$(EXEEXT)
|
||||
BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
|
||||
|
||||
empty :=
|
||||
@ -74,6 +75,7 @@ $(BITCOIN_WIN_INSTALLER): all-recursive
|
||||
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release
|
||||
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release
|
||||
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release
|
||||
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_TX_BIN) $(top_builddir)/release
|
||||
@test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi || \
|
||||
echo error: could not build $@
|
||||
@echo built $@
|
||||
@ -167,6 +169,9 @@ $(BITCOIND_BIN): FORCE
|
||||
$(BITCOIN_CLI_BIN): FORCE
|
||||
$(MAKE) -C src $(@F)
|
||||
|
||||
$(BITCOIN_TX_BIN): FORCE
|
||||
$(MAKE) -C src $(@F)
|
||||
|
||||
if USE_LCOV
|
||||
LCOV_FILTER_PATTERN=-p "/usr/include/" -p "/usr/lib/" -p "src/leveldb/" -p "src/bench/" -p "src/univalue" -p "src/crypto/ctaes" -p "src/secp256k1"
|
||||
|
||||
|
@ -86,7 +86,7 @@ def check_ELF_RELRO(executable):
|
||||
# This does not affect security: the permission flags of the GNU_RELRO program header are ignored, the PT_LOAD header determines the effective permissions.
|
||||
# However, the dynamic linker need to write to this area so these are RW.
|
||||
# Glibc itself takes care of mprotecting this area R after relocations are finished.
|
||||
# See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347
|
||||
# See also https://marc.info/?l=binutils&m=1498883354122353
|
||||
if typ == 'GNU_RELRO':
|
||||
have_gnu_relro = True
|
||||
|
||||
|
@ -2,3 +2,4 @@
|
||||
133EAC179436F14A5CF1B794860FEB804E669320
|
||||
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
|
||||
B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B
|
||||
CA03882CB1FC067B5D3ACFE4D300116E1C875A3D
|
||||
|
@ -742,7 +742,7 @@ Current subtrees include:
|
||||
- Upstream at https://github.com/bitcoin-core/ctaes ; actively maintained by Core contributors.
|
||||
|
||||
- src/univalue
|
||||
- Upstream at https://github.com/jgarzik/univalue ; report important PRs to Core to avoid delay.
|
||||
- Upstream at https://github.com/bitcoin-core/univalue ; actively maintained by Core contributors, deviates from upstream https://github.com/jgarzik/univalue
|
||||
|
||||
Upgrading LevelDB
|
||||
---------------------
|
||||
@ -807,7 +807,16 @@ To create a scripted-diff:
|
||||
- `-BEGIN VERIFY SCRIPT-`
|
||||
- `-END VERIFY SCRIPT-`
|
||||
|
||||
The scripted-diff is verified by the tool `test/lint/commit-script-check.sh`
|
||||
The scripted-diff is verified by the tool `test/lint/commit-script-check.sh`. The tool's default behavior when supplied
|
||||
with a commit is to verify all scripted-diffs from the beginning of time up to said commit. Internally, the tool passes
|
||||
the first supplied argument to `git rev-list --reverse` to determine which commits to verify script-diffs for, ignoring
|
||||
commits that don't conform to the commit message format described above.
|
||||
|
||||
For development, it might be more convenient to verify all scripted-diffs in a range `A..B`, for example:
|
||||
|
||||
```bash
|
||||
test/lint/commit-script-check.sh origin/master..HEAD
|
||||
```
|
||||
|
||||
Commit [`bb81e173`](https://github.com/bitcoin/bitcoin/commit/bb81e173) is an example of a scripted-diff.
|
||||
|
||||
|
@ -80,6 +80,7 @@ Section -Main SEC0000
|
||||
SetOutPath $INSTDIR\daemon
|
||||
File @abs_top_srcdir@/release/@BITCOIN_DAEMON_NAME@@EXEEXT@
|
||||
File @abs_top_srcdir@/release/@BITCOIN_CLI_NAME@@EXEEXT@
|
||||
File @abs_top_srcdir@/release/@BITCOIN_TX_NAME@@EXEEXT@
|
||||
SetOutPath $INSTDIR\doc
|
||||
File /r /x Makefile* @abs_top_srcdir@/doc\*.*
|
||||
SetOutPath $INSTDIR
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
#include <stdexcept>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
@ -189,7 +190,7 @@ public:
|
||||
{
|
||||
// prefix operator
|
||||
int i = 0;
|
||||
while (i < WIDTH && --pn[i] == (uint32_t)-1)
|
||||
while (i < WIDTH && --pn[i] == std::numeric_limits<uint32_t>::max())
|
||||
i++;
|
||||
return *this;
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ static void SetupCliArgs()
|
||||
gArgs.AddArg("-rpcport=<port>", strprintf("Connect to JSON-RPC on <port> (default: %u or testnet: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort()), false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-rpcuser=<user>", "Username for JSON-RPC connections", false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-rpcwait", "Wait for RPC server to start", false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-rpcwallet=<walletname>", "Send RPC for non-default wallet on RPC server (needs to exactly match corresponding -wallet option passed to bitcoind)", false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-rpcwallet=<walletname>", "Send RPC for non-default wallet on RPC server (needs to exactly match corresponding -wallet option passed to dashd). This changes the RPC endpoint used, e.g. http://127.0.0.1:9998/wallet/<walletname>", false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-stdin", "Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases). When combined with -stdinrpcpass, the first line from standard input is used for the RPC password.", false, OptionsCategory::OPTIONS);
|
||||
gArgs.AddArg("-stdinrpcpass", "Read RPC password from standard input as a single line. When combined with -stdin, the first line from standard input is used for the RPC password.", false, OptionsCategory::OPTIONS);
|
||||
|
||||
@ -510,9 +510,6 @@ static int CommandLineRPC(int argc, char *argv[])
|
||||
}
|
||||
} while (fWait);
|
||||
}
|
||||
catch (const boost::thread_interrupted&) {
|
||||
throw;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
strPrint = std::string("error: ") + e.what();
|
||||
nRet = EXIT_FAILURE;
|
||||
|
@ -771,10 +771,6 @@ static int CommandLineRawTx(int argc, char* argv[])
|
||||
|
||||
OutputTx(tx);
|
||||
}
|
||||
|
||||
catch (const boost::thread_interrupted&) {
|
||||
throw;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
strPrint = std::string("error: ") + e.what();
|
||||
nRet = EXIT_FAILURE;
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
@ -198,22 +199,11 @@ private:
|
||||
const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
|
||||
|
||||
void fill(T* dst, ptrdiff_t count) {
|
||||
if (IS_TRIVIALLY_CONSTRUCTIBLE<T>::value) {
|
||||
// The most common use of prevector is where T=unsigned char. For
|
||||
// trivially constructible types, we can use memset() to avoid
|
||||
// looping.
|
||||
::memset(dst, 0, count * sizeof(T));
|
||||
} else {
|
||||
for (auto i = 0; i < count; ++i) {
|
||||
new(static_cast<void*>(dst + i)) T();
|
||||
}
|
||||
}
|
||||
std::fill_n(dst, count, T{});
|
||||
}
|
||||
|
||||
void fill(T* dst, ptrdiff_t count, const T& value) {
|
||||
for (auto i = 0; i < count; ++i) {
|
||||
new(static_cast<void*>(dst + i)) T(value);
|
||||
}
|
||||
std::fill_n(dst, count, value);
|
||||
}
|
||||
|
||||
template<typename InputIterator>
|
||||
|
@ -30,13 +30,15 @@ public:
|
||||
uint256 hash;
|
||||
uint32_t n;
|
||||
|
||||
COutPoint(): n((uint32_t) -1) { }
|
||||
static constexpr uint32_t NULL_INDEX = std::numeric_limits<uint32_t>::max();
|
||||
|
||||
COutPoint(): n(NULL_INDEX) { }
|
||||
COutPoint(const uint256& hashIn, uint32_t nIn): hash(hashIn), n(nIn) { }
|
||||
|
||||
SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }
|
||||
|
||||
void SetNull() { hash.SetNull(); n = (uint32_t) -1; }
|
||||
bool IsNull() const { return (hash.IsNull() && n == (uint32_t) -1); }
|
||||
void SetNull() { hash.SetNull(); n = NULL_INDEX; }
|
||||
bool IsNull() const { return (hash.IsNull() && n == NULL_INDEX); }
|
||||
|
||||
friend bool operator<(const COutPoint& a, const COutPoint& b)
|
||||
{
|
||||
|
@ -567,7 +567,7 @@ bool checkPoint(const QPoint &p, const QWidget *w)
|
||||
{
|
||||
QWidget *atW = QApplication::widgetAt(w->mapToGlobal(p));
|
||||
if (!atW) return false;
|
||||
return atW->topLevelWidget() == w;
|
||||
return atW->window() == w;
|
||||
}
|
||||
|
||||
bool isObscured(QWidget *w)
|
||||
|
@ -24,25 +24,10 @@ void MacNotificationHandler::showNotification(const QString &title, const QStrin
|
||||
{
|
||||
// check if users OS has support for NSUserNotification
|
||||
if(this->hasUserNotificationCenterSupport()) {
|
||||
// okay, seems like 10.8+
|
||||
QByteArray utf8 = title.toUtf8();
|
||||
char* cString = (char *)utf8.constData();
|
||||
NSString *titleMac = [[NSString alloc] initWithUTF8String:cString];
|
||||
|
||||
utf8 = text.toUtf8();
|
||||
cString = (char *)utf8.constData();
|
||||
NSString *textMac = [[NSString alloc] initWithUTF8String:cString];
|
||||
|
||||
// do everything weak linked (because we will keep <10.8 compatibility)
|
||||
id userNotification = [[NSClassFromString(@"NSUserNotification") alloc] init];
|
||||
[userNotification performSelector:@selector(setTitle:) withObject:titleMac];
|
||||
[userNotification performSelector:@selector(setInformativeText:) withObject:textMac];
|
||||
|
||||
id notificationCenterInstance = [NSClassFromString(@"NSUserNotificationCenter") performSelector:@selector(defaultUserNotificationCenter)];
|
||||
[notificationCenterInstance performSelector:@selector(deliverNotification:) withObject:userNotification];
|
||||
|
||||
[titleMac release];
|
||||
[textMac release];
|
||||
NSUserNotification* userNotification = [[NSUserNotification alloc] init];
|
||||
userNotification.title = title.toNSString();
|
||||
userNotification.informativeText = text.toNSString();
|
||||
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification: userNotification];
|
||||
[userNotification release];
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
#ifndef BITCOIN_QT_TEST_UTIL_H
|
||||
#define BITCOIN_QT_TEST_UTIL_H
|
||||
|
||||
#include <QString>
|
||||
|
||||
/**
|
||||
* Press "Ok" button in message box dialog.
|
||||
*
|
||||
|
@ -759,7 +759,7 @@ protected:
|
||||
|
||||
public:
|
||||
CBufferedFile(FILE *fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn) :
|
||||
nType(nTypeIn), nVersion(nVersionIn), nSrcPos(0), nReadPos(0), nReadLimit((uint64_t)(-1)), nRewind(nRewindIn), vchBuf(nBufSize, 0)
|
||||
nType(nTypeIn), nVersion(nVersionIn), nSrcPos(0), nReadPos(0), nReadLimit(std::numeric_limits<uint64_t>::max()), nRewind(nRewindIn), vchBuf(nBufSize, 0)
|
||||
{
|
||||
src = fileIn;
|
||||
}
|
||||
@ -844,7 +844,7 @@ public:
|
||||
|
||||
// prevent reading beyond a certain position
|
||||
// no argument removes the limit
|
||||
bool SetLimit(uint64_t nPos = (uint64_t)(-1)) {
|
||||
bool SetLimit(uint64_t nPos = std::numeric_limits<uint64_t>::max()) {
|
||||
if (nPos < nReadPos)
|
||||
return false;
|
||||
nReadLimit = nPos;
|
||||
|
@ -973,6 +973,28 @@ BOOST_AUTO_TEST_CASE(script_PushData)
|
||||
BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SigVersion::BASE, &err));
|
||||
BOOST_CHECK(pushdata4Stack == directStack);
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
const std::vector<unsigned char> pushdata1_trunc{OP_PUSHDATA1, 1};
|
||||
const std::vector<unsigned char> pushdata2_trunc{OP_PUSHDATA2, 1, 0};
|
||||
const std::vector<unsigned char> pushdata4_trunc{OP_PUSHDATA4, 1, 0, 0, 0};
|
||||
|
||||
std::vector<std::vector<unsigned char>> stack_ignore;
|
||||
BOOST_CHECK(!EvalScript(stack_ignore, CScript(pushdata1_trunc.begin(), pushdata1_trunc.end()), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SigVersion::BASE, &err));
|
||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_BAD_OPCODE);
|
||||
BOOST_CHECK(!EvalScript(stack_ignore, CScript(pushdata2_trunc.begin(), pushdata2_trunc.end()), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SigVersion::BASE, &err));
|
||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_BAD_OPCODE);
|
||||
BOOST_CHECK(!EvalScript(stack_ignore, CScript(pushdata4_trunc.begin(), pushdata4_trunc.end()), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SigVersion::BASE, &err));
|
||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_BAD_OPCODE);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(script_cltv_truncated)
|
||||
{
|
||||
const auto script_cltv_trunc = CScript() << OP_CHECKLOCKTIMEVERIFY;
|
||||
|
||||
std::vector<std::vector<unsigned char>> stack_ignore;
|
||||
ScriptError err;
|
||||
BOOST_CHECK(!EvalScript(stack_ignore, script_cltv_trunc, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, BaseSignatureChecker(), SigVersion::BASE, &err));
|
||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_INVALID_STACK_OPERATION);
|
||||
}
|
||||
|
||||
static CScript
|
||||
|
@ -197,7 +197,7 @@ BOOST_AUTO_TEST_CASE(varints)
|
||||
}
|
||||
|
||||
for (uint64_t i = 0; i < 100000000000ULL; i += 999999937) {
|
||||
uint64_t j = -1;
|
||||
uint64_t j = std::numeric_limits<uint64_t>::max();
|
||||
ss >> VARINT(j);
|
||||
BOOST_CHECK_MESSAGE(i == j, "decoded:" << j << " expected:" << i);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ void static RandomTransaction(CMutableTransaction &tx, bool fSingle) {
|
||||
txin.prevout.hash = InsecureRand256();
|
||||
txin.prevout.n = InsecureRandBits(2);
|
||||
RandomScript(txin.scriptSig);
|
||||
txin.nSequence = (InsecureRandBool()) ? InsecureRand32() : (unsigned int)-1;
|
||||
txin.nSequence = (InsecureRandBool()) ? InsecureRand32() : std::numeric_limits<uint32_t>::max();
|
||||
}
|
||||
for (int out = 0; out < outs; out++) {
|
||||
tx.vout.push_back(CTxOut());
|
||||
|
@ -3756,6 +3756,7 @@ static bool ContextualCheckBlock(const CBlock& block, CValidationState& state, c
|
||||
// Start enforcing BIP113 (Median Time Past) using versionbits logic.
|
||||
int nLockTimeFlags = 0;
|
||||
if (VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_CSV, versionbitscache) == ThresholdState::ACTIVE) {
|
||||
assert(pindexPrev != nullptr);
|
||||
nLockTimeFlags |= LOCKTIME_MEDIAN_TIME_PAST;
|
||||
}
|
||||
|
||||
@ -3852,10 +3853,30 @@ bool CChainState::AcceptBlockHeader(const CBlockHeader& block, CValidationState&
|
||||
if (!ContextualCheckBlockHeader(block, state, chainparams, pindexPrev, GetAdjustedTime()))
|
||||
return error("%s: Consensus::ContextualCheckBlockHeader: %s, %s", __func__, hash.ToString(), FormatStateMessage(state));
|
||||
|
||||
// If the previous block index isn't valid, determine if it descends from any block which
|
||||
// has been found invalid (m_failed_blocks), then mark pindexPrev and any blocks
|
||||
// between them as failed.
|
||||
/* Determine if this block descends from any block which has been found
|
||||
* invalid (m_failed_blocks), then mark pindexPrev and any blocks between
|
||||
* them as failed. For example:
|
||||
*
|
||||
* D3
|
||||
* /
|
||||
* B2 - C2
|
||||
* / \
|
||||
* A D2 - E2 - F2
|
||||
* \
|
||||
* B1 - C1 - D1 - E1
|
||||
*
|
||||
* In the case that we attempted to reorg from E1 to F2, only to find
|
||||
* C2 to be invalid, we would mark D2, E2, and F2 as BLOCK_FAILED_CHILD
|
||||
* but NOT D3 (it was not in any of our candidate sets at the time).
|
||||
*
|
||||
* In any case D3 will also be marked as BLOCK_FAILED_CHILD at restart
|
||||
* in LoadBlockIndex.
|
||||
*/
|
||||
if (!pindexPrev->IsValid(BLOCK_VALID_SCRIPTS)) {
|
||||
// The above does not mean "invalid": it checks if the previous block
|
||||
// hasn't been validated up to BLOCK_VALID_SCRIPTS. This is a performance
|
||||
// optimization, in the common case of adding a new block to the tip,
|
||||
// we don't need to iterate over the failed blocks list.
|
||||
for (const CBlockIndex* failedit : m_failed_blocks) {
|
||||
if (pindexPrev->GetAncestor(failedit->nHeight) == failedit) {
|
||||
assert(failedit->nStatus & BLOCK_FAILED_VALID);
|
||||
@ -4324,8 +4345,6 @@ bool CChainState::LoadBlockIndex(const Consensus::Params& consensus_params, CBlo
|
||||
if (!blocktree.LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); }))
|
||||
return false;
|
||||
|
||||
boost::this_thread::interruption_point();
|
||||
|
||||
// Calculate nChainWork
|
||||
std::vector<std::pair<int, CBlockIndex*> > vSortedByHeight;
|
||||
vSortedByHeight.reserve(mapBlockIndex.size());
|
||||
|
@ -185,6 +185,8 @@ class PruneTest(BitcoinTestFramework):
|
||||
def reorg_back(self):
|
||||
# Verify that a block on the old main chain fork has been pruned away
|
||||
assert_raises_rpc_error(-1, "Block not available (pruned data)", self.nodes[2].getblock, self.forkhash)
|
||||
with self.nodes[2].assert_debug_log(expected_msgs=['block verification stopping at height', '(pruning, no data)']):
|
||||
self.nodes[2].verifychain(checklevel=4, nblocks=0)
|
||||
self.log.info("Will need to redownload block %d" % self.forkheight)
|
||||
|
||||
# Verify that we have enough history to reorg back to the fork point
|
||||
|
@ -41,6 +41,7 @@ import time
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import *
|
||||
|
||||
|
||||
class MempoolPersistTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 3
|
||||
@ -56,7 +57,7 @@ class MempoolPersistTest(BitcoinTestFramework):
|
||||
|
||||
self.log.debug("Send 5 transactions from node2 (to its own address)")
|
||||
for i in range(5):
|
||||
self.nodes[2].sendtoaddress(self.nodes[2].getnewaddress(), Decimal("10"))
|
||||
last_txid = self.nodes[2].sendtoaddress(self.nodes[2].getnewaddress(), Decimal("10"))
|
||||
node2_balance = self.nodes[2].getbalance()
|
||||
self.sync_all()
|
||||
|
||||
@ -64,6 +65,13 @@ class MempoolPersistTest(BitcoinTestFramework):
|
||||
assert_equal(len(self.nodes[0].getrawmempool()), 5)
|
||||
assert_equal(len(self.nodes[1].getrawmempool()), 5)
|
||||
|
||||
self.log.debug("Prioritize a transaction on node0")
|
||||
fees = self.nodes[0].getmempoolentry(txid=last_txid)['fees']
|
||||
assert_equal(fees['base'], fees['modified'])
|
||||
self.nodes[0].prioritisetransaction(txid=last_txid, fee_delta=1000)
|
||||
fees = self.nodes[0].getmempoolentry(txid=last_txid)['fees']
|
||||
assert_equal(fees['base'] + Decimal('0.00001000'), fees['modified'])
|
||||
|
||||
self.log.debug("Stop-start the nodes. Verify that node0 has the transactions in its mempool and node1 does not. Verify that node2 calculates its balance correctly after loading wallet transactions.")
|
||||
self.stop_nodes()
|
||||
# Give this node a head-start, so we can be "extra-sure" that it didn't load anything later
|
||||
@ -77,6 +85,10 @@ class MempoolPersistTest(BitcoinTestFramework):
|
||||
# The others have loaded their mempool. If node_1 loaded anything, we'd probably notice by now:
|
||||
assert_equal(len(self.nodes[1].getrawmempool()), 0)
|
||||
|
||||
self.log.debug('Verify prioritization is loaded correctly')
|
||||
fees = self.nodes[0].getmempoolentry(txid=last_txid)['fees']
|
||||
assert_equal(fees['base'] + Decimal('0.00001000'), fees['modified'])
|
||||
|
||||
# Verify accounting of mempool transactions after restart is correct
|
||||
self.nodes[2].syncwithvalidationinterfacequeue() # Flush mempool to wallet
|
||||
assert_equal(node2_balance, self.nodes[2].getbalance())
|
||||
|
@ -278,7 +278,7 @@ def main():
|
||||
if tests:
|
||||
# Individual tests have been specified. Run specified tests that exist
|
||||
# in the ALL_SCRIPTS list. Accept the name with or without .py extension.
|
||||
tests = [re.sub("\.py$", "", test) + ".py" for test in tests]
|
||||
tests = [test + ".py" if ".py" not in test else test for test in tests]
|
||||
for test in tests:
|
||||
if test in ALL_SCRIPTS:
|
||||
test_list.append(test)
|
||||
|
@ -248,12 +248,11 @@ def count_format_specifiers(format_string):
|
||||
4
|
||||
"""
|
||||
assert(type(format_string) is str)
|
||||
format_string = format_string.replace('%%', 'X')
|
||||
n = 0
|
||||
in_specifier = False
|
||||
for i, char in enumerate(format_string):
|
||||
if format_string[i - 1:i + 1] == "%%" or format_string[i:i + 2] == "%%":
|
||||
pass
|
||||
elif char == "%":
|
||||
if char == "%":
|
||||
in_specifier = True
|
||||
n += 1
|
||||
elif char in "aAcdeEfFgGinopsuxX":
|
||||
|
Loading…
Reference in New Issue
Block a user