From 24ba5ce6ca1eccbfb2f6fa4be7f85ff106960894 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Fri, 27 May 2022 22:51:32 +0300 Subject: [PATCH 1/7] Adjusted keepOldConnections value for llmq_devnet (#4851) --- src/llmq/params.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llmq/params.h b/src/llmq/params.h index 7464b207976d..5ce836d1c9a3 100644 --- a/src/llmq/params.h +++ b/src/llmq/params.h @@ -217,7 +217,7 @@ static constexpr std::array available_llmqs = { .signingActiveQuorumCount = 4, // just a few ones to allow easier testing - .keepOldConnections = 4, + .keepOldConnections = 5, .recoveryMembers = 6, }, From 228633a99c830b5b6291cd4a71952115c7a40ed1 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Sat, 28 May 2022 19:37:20 +0300 Subject: [PATCH 2/7] fix!: Return FinalCommitment in qrinfo (instead of simply quorumHash) (#4850) --- src/llmq/snapshot.cpp | 18 ++++++++++++------ src/llmq/snapshot.h | 12 +++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/llmq/snapshot.cpp b/src/llmq/snapshot.cpp index 0d031f491af7..b5acef5723a0 100644 --- a/src/llmq/snapshot.cpp +++ b/src/llmq/snapshot.cpp @@ -88,12 +88,13 @@ void CQuorumRotationInfo::ToJson(UniValue& obj) const mnListDiffAtHMinus4C.value().ToJson(objdiff4c); obj.pushKV("mnListDiffAtHMinus4C", objdiff4c); } - - UniValue hlists(UniValue::VARR); - for (const auto& h : lastQuorumHashPerIndex) { - hlists.push_back(h.ToString()); + UniValue hqclists(UniValue::VARR); + for (const auto& qc : lastCommitmentPerIndex) { + UniValue objqc; + qc.ToJson(objqc); + hqclists.push_back(objqc); } - obj.pushKV("lastQuorumHashPerIndex", hlists); + obj.pushKV("lastCommitmentPerIndex", hqclists); UniValue snapshotlist(UniValue::VARR); for (const auto& snap : quorumSnapshotList) { @@ -296,7 +297,12 @@ bool BuildQuorumRotationInfo(const CGetQuorumRotationInfo& request, CQuorumRotat std::vector> qdata = quorumBlockProcessor->GetLastMinedCommitmentsPerQuorumIndexUntilBlock(llmqType, blockIndex, 0); for (const auto& obj : qdata) { - response.lastQuorumHashPerIndex.push_back(obj.second->GetBlockHash()); + uint256 minedBlockHash; + llmq::CFinalCommitmentPtr qc = llmq::quorumBlockProcessor->GetMinedCommitment(llmqType, obj.second->GetBlockHash(), minedBlockHash); + if (qc == nullptr) { + return false; + } + response.lastCommitmentPerIndex.push_back(*qc); int quorumCycleStartHeight = obj.second->nHeight - (obj.second->nHeight % llmqParams.dkgInterval); snapshotHeightsNeeded.insert(quorumCycleStartHeight - cycleLength); diff --git a/src/llmq/snapshot.h b/src/llmq/snapshot.h index b4b6e0b93e4c..dceccfacf9e9 100644 --- a/src/llmq/snapshot.h +++ b/src/llmq/snapshot.h @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -114,7 +115,7 @@ class CQuorumRotationInfo std::optional quorumSnapshotAtHMinus4C; std::optional mnListDiffAtHMinus4C; - std::vector lastQuorumHashPerIndex; + std::vector lastCommitmentPerIndex; std::vector quorumSnapshotList; std::vector mnListDiffList; @@ -145,8 +146,8 @@ class CQuorumRotationInfo ::Serialize(s, mnListDiffAtHMinus4C.value()); } - WriteCompactSize(s, lastQuorumHashPerIndex.size()); - for (const auto& obj : lastQuorumHashPerIndex) { + WriteCompactSize(s, lastCommitmentPerIndex.size()); + for (const auto& obj : lastCommitmentPerIndex) { ::Serialize(s, obj); } @@ -177,8 +178,9 @@ class CQuorumRotationInfo size_t cnt = ReadCompactSize(s); for (size_t i = 0; i < cnt; i++) { uint256 hash; - ::Unserialize(s, hash); - lastQuorumHashPerIndex.push_back(std::move(hash)); + CFinalCommitment qc; + ::Unserialize(s, qc); + lastCommitmentPerIndex.push_back(std::move(qc)); } cnt = ReadCompactSize(s); From 145a974a22d0c07fa6b8234a47493f4e1a066c78 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Thu, 26 May 2022 23:16:13 +0300 Subject: [PATCH 3/7] fix!: llmqTypeInstantSend deactivation prevention if used for other purposes (#4848) --- src/llmq/utils.cpp | 14 ++++++++++++++ src/llmq/utils.h | 1 + 2 files changed, 15 insertions(+) diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 38bf65c8b127..9065a1016e84 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -535,6 +535,17 @@ bool CLLMQUtils::IsDIP0024Active(const CBlockIndex* pindex) return VersionBitsState(pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, llmq_versionbitscache) == ThresholdState::ACTIVE; } +bool CLLMQUtils::IsInstantSendLLMQTypeShared() +{ + if (Params().GetConsensus().llmqTypeInstantSend == Params().GetConsensus().llmqTypeChainLocks || + Params().GetConsensus().llmqTypeInstantSend == Params().GetConsensus().llmqTypePlatform || + Params().GetConsensus().llmqTypeInstantSend == Params().GetConsensus().llmqTypeMnhf) { + return true; + } + + return false; +} + uint256 CLLMQUtils::DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2) { // We need to deterministically select who is going to initiate the connection. The naive way would be to simply @@ -754,6 +765,9 @@ bool CLLMQUtils::IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const { case Consensus::LLMQType::LLMQ_TEST_INSTANTSEND: case Consensus::LLMQType::LLMQ_50_60: { + if (IsInstantSendLLMQTypeShared()) { + break; + } bool fDIP0024IsActive = optDIP0024IsActive.has_value() ? *optDIP0024IsActive : CLLMQUtils::IsDIP0024Active(pindex); if (fDIP0024IsActive) { bool fHaveDIP0024Quorums = optHaveDIP0024Quorums.has_value() ? *optHaveDIP0024Quorums diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 3f48b8d9008d..1865dec3917c 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -97,6 +97,7 @@ class CLLMQUtils static Consensus::LLMQType GetInstantSendLLMQType(const CBlockIndex* pindex); static Consensus::LLMQType GetInstantSendLLMQType(bool deterministic); static bool IsDIP0024Active(const CBlockIndex* pindex); + static bool IsInstantSendLLMQTypeShared(); /// Returns the state of `-llmq-data-recovery` static bool QuorumDataRecoveryEnabled(); From a8b9dedefb2f76963275495aedc8985170d0c6d3 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sun, 29 May 2022 23:42:18 +0300 Subject: [PATCH 4/7] fix(qt): Disable "Show address QR code" menu items/buttons when no qrencode support was compiled in (#4854) --- src/qt/addressbookpage.cpp | 10 ++++++++++ src/qt/transactionview.cpp | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index 1010a992171d..ceccefdf049b 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -67,6 +67,9 @@ AddressBookPage::AddressBookPage(Mode _mode, Tabs _tab, QWidget* parent) : ui->setupUi(this); ui->showAddressQRCode->setIcon(QIcon()); +#ifndef USE_QRCODE + ui->showAddressQRCode->setEnabled(false); +#endif switch(mode) { @@ -110,6 +113,9 @@ AddressBookPage::AddressBookPage(Mode _mode, Tabs _tab, QWidget* parent) : QAction *editAction = new QAction(tr("&Edit"), this); QAction *showAddressQRCodeAction = new QAction(tr("&Show address QR code"), this); deleteAction = new QAction(ui->deleteAddress->text(), this); +#ifndef USE_QRCODE + showAddressQRCodeAction->setEnabled(false); +#endif // Build context menu contextMenu = new QMenu(this); @@ -269,13 +275,17 @@ void AddressBookPage::selectionChanged() break; } ui->copyAddress->setEnabled(true); +#ifdef USE_QRCODE ui->showAddressQRCode->setEnabled(true); +#endif } else { ui->deleteAddress->setEnabled(false); ui->copyAddress->setEnabled(false); +#ifdef USE_QRCODE ui->showAddressQRCode->setEnabled(false); +#endif } } diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index 2bd5e4dee7ce..bbfa3d2c306e 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -157,6 +157,9 @@ transactionView(nullptr), abandonAction(nullptr), columnResizingFixer(nullptr) QAction *editLabelAction = new QAction(tr("Edit address label"), this); QAction *showDetailsAction = new QAction(tr("Show transaction details"), this); QAction *showAddressQRCodeAction = new QAction(tr("Show address QR code"), this); +#ifndef USE_QRCODE + showAddressQRCodeAction->setEnabled(false); +#endif contextMenu = new QMenu(this); contextMenu->setObjectName("contextMenu"); From 8aefb77d86dc33d3dc20416d1e5cc7a4ba8416bf Mon Sep 17 00:00:00 2001 From: pasta Date: Sun, 29 May 2022 15:44:00 -0500 Subject: [PATCH 5/7] chore: bump to rc5 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 847aebb43c11..525711774ecb 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 18) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_BUILD, 0) -define(_CLIENT_VERSION_RC, 4) +define(_CLIENT_VERSION_RC, 5) define(_CLIENT_VERSION_IS_RELEASE, false) define(_COPYRIGHT_YEAR, 2021) define(_COPYRIGHT_HOLDERS,[The %s developers]) From 1babc5abff2607692aacf02fc1aef4fde2fccc5b Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Sun, 29 May 2022 11:27:04 +0700 Subject: [PATCH 6/7] docs/build: Kubuntu 22.04 build fix (#4843) * Fix build of qtbase in contrib for Gcc 11.x It adds a patch with missing include in qtbase/src/tools/moc/generator.cpp * Merge bitcoin/bitcoin#23716: test: replace hashlib.ripemd160 with an own implementation 5b559dc7ecf37ab1604b75ec8ffe8436377a5fb1 Swap out hashlib.ripemd160 for own implementation (Pieter Wuille) ad3e9e1f214d739e098c6ebbd300da5df1026a44 Add pure Python RIPEMD-160 (Pieter Wuille) Pull request description: Closes #23710. ACKs for top commit: jamesob: ACK https://github.com/bitcoin/bitcoin/pull/23716/commits/5b559dc7ecf37ab1604b75ec8ffe8436377a5fb1, pending CI Tree-SHA512: dcd4ea2027eac572f7ab0da434b081b9a5d6b78675e559258a446b4d254b29d93c4d2cc12da4a28303543d6d99f5f2246fde4052e84af81d18e04399b137b39e * Updates doc for Unix build: added missing dependency bison Co-authored-by: MarcoFalke --- depends/patches/qt/fix_limits_header.patch | 13 ++ doc/build-unix.md | 4 +- test/functional/test_framework/ripemd160.py | 130 ++++++++++++++++++++ test/functional/test_framework/script.py | 5 +- 4 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 test/functional/test_framework/ripemd160.py diff --git a/depends/patches/qt/fix_limits_header.patch b/depends/patches/qt/fix_limits_header.patch index d1acfa15d94d..a435fb38d57d 100644 --- a/depends/patches/qt/fix_limits_header.patch +++ b/depends/patches/qt/fix_limits_header.patch @@ -28,3 +28,16 @@ Upstream commits: +#include + QT_BEGIN_NAMESPACE + + +--- old/qtbase/src/tools/moc/generator.cpp ++++ new/qtbase/src/tools/moc/generator.cpp +@@ -42,6 +42,7 @@ + + #include + #include ++#include + + #include //for the flags. + #include //for the flags. + diff --git a/doc/build-unix.md b/doc/build-unix.md index 743edc1b6ea0..428841cd5e49 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -13,7 +13,7 @@ Run the following commands to install required packages: ##### Debian/Ubuntu: ```bash -$ sudo apt-get install curl build-essential libtool autotools-dev automake pkg-config python3 bsdmainutils +$ sudo apt-get install curl build-essential libtool autotools-dev automake pkg-config python3 bsdmainutils bison ``` ##### Fedora: @@ -158,4 +158,4 @@ If your user is in the `staff` group the limit can be raised with: The change will only affect the current shell and processes spawned by it. To make the change system-wide, change `datasize-cur` and `datasize-max` in -`/etc/login.conf`, and reboot. \ No newline at end of file +`/etc/login.conf`, and reboot. diff --git a/test/functional/test_framework/ripemd160.py b/test/functional/test_framework/ripemd160.py new file mode 100644 index 000000000000..12801364b406 --- /dev/null +++ b/test/functional/test_framework/ripemd160.py @@ -0,0 +1,130 @@ +# Copyright (c) 2021 Pieter Wuille +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test-only pure Python RIPEMD160 implementation.""" + +import unittest + +# Message schedule indexes for the left path. +ML = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +] + +# Message schedule indexes for the right path. +MR = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +] + +# Rotation counts for the left path. +RL = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +] + +# Rotation counts for the right path. +RR = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +] + +# K constants for the left path. +KL = [0, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e] + +# K constants for the right path. +KR = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0] + + +def fi(x, y, z, i): + """The f1, f2, f3, f4, and f5 functions from the specification.""" + if i == 0: + return x ^ y ^ z + elif i == 1: + return (x & y) | (~x & z) + elif i == 2: + return (x | ~y) ^ z + elif i == 3: + return (x & z) | (y & ~z) + elif i == 4: + return x ^ (y | ~z) + else: + assert False + + +def rol(x, i): + """Rotate the bottom 32 bits of x left by i bits.""" + return ((x << i) | ((x & 0xffffffff) >> (32 - i))) & 0xffffffff + + +def compress(h0, h1, h2, h3, h4, block): + """Compress state (h0, h1, h2, h3, h4) with block.""" + # Left path variables. + al, bl, cl, dl, el = h0, h1, h2, h3, h4 + # Right path variables. + ar, br, cr, dr, er = h0, h1, h2, h3, h4 + # Message variables. + x = [int.from_bytes(block[4*i:4*(i+1)], 'little') for i in range(16)] + + # Iterate over the 80 rounds of the compression. + for j in range(80): + rnd = j >> 4 + # Perform left side of the transformation. + al = rol(al + fi(bl, cl, dl, rnd) + x[ML[j]] + KL[rnd], RL[j]) + el + al, bl, cl, dl, el = el, al, bl, rol(cl, 10), dl + # Perform right side of the transformation. + ar = rol(ar + fi(br, cr, dr, 4 - rnd) + x[MR[j]] + KR[rnd], RR[j]) + er + ar, br, cr, dr, er = er, ar, br, rol(cr, 10), dr + + # Compose old state, left transform, and right transform into new state. + return h1 + cl + dr, h2 + dl + er, h3 + el + ar, h4 + al + br, h0 + bl + cr + + +def ripemd160(data): + """Compute the RIPEMD-160 hash of data.""" + # Initialize state. + state = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0) + # Process full 64-byte blocks in the input. + for b in range(len(data) >> 6): + state = compress(*state, data[64*b:64*(b+1)]) + # Construct final blocks (with padding and size). + pad = b"\x80" + b"\x00" * ((119 - len(data)) & 63) + fin = data[len(data) & ~63:] + pad + (8 * len(data)).to_bytes(8, 'little') + # Process final blocks. + for b in range(len(fin) >> 6): + state = compress(*state, fin[64*b:64*(b+1)]) + # Produce output. + return b"".join((h & 0xffffffff).to_bytes(4, 'little') for h in state) + + +class TestFrameworkKey(unittest.TestCase): + def test_ripemd160(self): + """RIPEMD-160 test vectors.""" + # See https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + for msg, hexout in [ + (b"", "9c1185a5c5e9fc54612808977ee8f548b2258d31"), + (b"a", "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"), + (b"abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"), + (b"message digest", "5d0689ef49d2fae572b881b123a85ffa21595f36"), + (b"abcdefghijklmnopqrstuvwxyz", + "f71c27109c692c1b56bbdceb5b9d2865b3708dbc"), + (b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "12a053384a9c0c88e405a06c27dcf49ada62eb2b"), + (b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "b0e20b6e3116640286ed3a87a5713079b21f5189"), + (b"1234567890" * 8, "9b752e45573d4b39f4dbd3323cab82bf63326bfb"), + (b"a" * 1000000, "52783243c1697bdbe16d37f97f68f08325dc1528") + ]: + self.assertEqual(ripemd160(msg).hex(), hexout) diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py index 943b404deb74..e9c791058af6 100644 --- a/test/functional/test_framework/script.py +++ b/test/functional/test_framework/script.py @@ -7,18 +7,19 @@ This file is modified from python-bitcoinlib. """ -import hashlib import struct from .bignum import bn2vch from .messages import CTransaction, CTxOut, sha256, hash256 +from .ripemd160 import ripemd160 + MAX_SCRIPT_ELEMENT_SIZE = 520 OPCODE_NAMES = {} def hash160(s): - return hashlib.new('ripemd160', sha256(s)).digest() + return ripemd160(sha256(s)) _opcode_instances = [] From 07249a836f8e7015a73de8e2865773d5b926d338 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 25 May 2022 22:12:40 +0700 Subject: [PATCH 7/7] feat(qt): UI fixes for window "Wallet Repair" (#4846) * Qt: fix layout of components on "Wallet Repair" window * Qt: refactor ui xml config It orders components accordingly their positions on windows and fixes space indentation --- src/qt/forms/debugwindow.ui | 418 +++++++++++++++--------------------- 1 file changed, 170 insertions(+), 248 deletions(-) diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index af9718e562fb..b04d64509db3 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -1390,255 +1390,177 @@ - - - - 10 - 100 - 301 - 23 - - - - - 180 - 23 - - - - Rescan blockchain files 1 - - - - - - 10 - 150 - 301 - 23 - - - - - 180 - 23 - - - - Rescan blockchain files 2 - - - - - - 10 - 200 - 301 - 23 - - - - - 180 - 23 - - - - Recover transactions 1 - - - - - - 10 - 250 - 301 - 23 - - - - - 180 - 23 - - - - Recover transactions 2 - - - - - - 10 - 300 - 301 - 23 - - - - - 180 - 23 - - - - Upgrade wallet format - - - - - - 10 - 30 - 711 - 41 - - - - The buttons below will restart the wallet with command-line options to repair the wallet, fix issues with corrupt blockchain files or missing/obsolete transactions. - - - true - - - - - - 330 - 90 - 411 - 41 - - - - -rescan=1: Rescan the block chain for missing wallet transactions starting from wallet creation time. - - - true - - - - - - 330 - 140 - 411 - 41 - - - - -rescan=2: Rescan the block chain for missing wallet transactions starting from genesis block. - - - true - - - - - - 330 - 190 - 411 - 41 - - - - -zapwallettxes=1: Recover transactions from blockchain (keep meta-data, e.g. account owner). - - - true - - - - - - 330 - 240 - 411 - 41 - - - - -zapwallettxes=2: Recover transactions from blockchain (drop meta-data). - - - true - - - - - - 330 - 290 - 411 - 41 - - - - -upgradewallet: Upgrade wallet to latest format on startup. (Note: this is NOT an update of the wallet itself!) - - - true - - - - - - 10 - 10 - 711 - 16 - - - - Wallet repair options. - - - true - - - - - - 10 - 350 - 301 - 23 - - - - Rebuild index - - - - - - 330 - 340 - 411 - 41 - - - - -reindex: Rebuild block chain index from current blk000??.dat files. - - - true - - - - - - 10 - 70 - 731 - 21 - - - - Wallet Path + + + 12 - + + + + Wallet repair options. + + + true + + + + + + + The buttons below will restart the wallet with command-line options to repair the wallet, fix issues with corrupt blockchain files or missing/obsolete transactions. + + + true + + + + + + + Wallet Path + + + + + + + + 180 + 23 + + + + Rescan blockchain files 1 + + + + + + + -rescan=1: Rescan the block chain for missing wallet transactions starting from wallet creation time. + + + true + + + + + + + + 180 + 23 + + + + Rescan blockchain files 2 + + + + + + + -rescan=2: Rescan the block chain for missing wallet transactions starting from genesis block. + + + true + + + + + + + + 180 + 23 + + + + Recover transactions 1 + + + + + + + -zapwallettxes=1: Recover transactions from blockchain (keep meta-data, e.g. account owner). + + + true + + + + + + + + 180 + 23 + + + + Recover transactions 2 + + + + + + + -zapwallettxes=2: Recover transactions from blockchain (drop meta-data). + + + true + + + + + + + + 180 + 23 + + + + Upgrade wallet format + + + + + + + -upgradewallet: Upgrade wallet to latest format on startup. (Note: this is NOT an update of the wallet itself!) + + + true + + + + + + + Rebuild index + + + + + + + -reindex: Rebuild block chain index from current blk000??.dat files. + + + true + + + + + + + Qt::Vertical + + + +