From 8dcb533226557041c0b745566057131a1178959b Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 5 May 2020 09:28:39 -0600 Subject: [PATCH 1/7] Add the intended testnet activation block of Heartwood to our intended rewind logic. --- src/chainparams.cpp | 2 ++ src/main.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 31a9673ff..d8a3c0f60 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -322,6 +322,8 @@ public: uint256S("00367515ef2e781b8c9358b443b6329572599edd02c59e8af67db9785122f298"); consensus.vUpgrades[Consensus::UPGRADE_HEARTWOOD].nProtocolVersion = 170010; consensus.vUpgrades[Consensus::UPGRADE_HEARTWOOD].nActivationHeight = 903800; + consensus.vUpgrades[Consensus::UPGRADE_HEARTWOOD].hashActivationBlock = + uint256S("05688d8a0e9ff7c04f6f05e6d695dc5ab43b9c4803342d77ae360b2b27d2468e"); // On testnet we activate this rule 6 blocks after Blossom activation. From block 299188 and // prior to Blossom activation, the testnet minimum-difficulty threshold was 15 minutes (i.e. diff --git a/src/main.cpp b/src/main.cpp index 85914e54e..6bc809a72 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4770,7 +4770,9 @@ bool RewindBlockIndex(const CChainParams& chainparams, bool& clearWitnessCaches) (networkID == "test" && nHeight == 252500 && *phashFirstInsufValidated == uint256S("0018bd16a9c6f15795a754c498d2b2083ab78f14dae44a66a8d0e90ba8464d9c")) || (networkID == "test" && nHeight == 584000 && *phashFirstInsufValidated == - uint256S("002e1d6daf4ab7b296e7df839dc1bee9d615583bb4bc34b1926ce78307532852")); + uint256S("002e1d6daf4ab7b296e7df839dc1bee9d615583bb4bc34b1926ce78307532852")) || + (networkID == "test" && nHeight == 903800 && *phashFirstInsufValidated == + uint256S("0044f3c696a242220ed608c70beba5aa804f1cfb8a20e32186727d1bec5dfa1e")); clearWitnessCaches = (rewindLength > MAX_REORG_LENGTH && intendedRewind); From d946b69cf824669bfde72fcd8add77619000d063 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 5 May 2020 14:59:22 +1200 Subject: [PATCH 2/7] txdb/chain: Restrict Heartwood chain consistency check to block index objects that were created by Heartwood-unaware clients. In the vicinity of a network upgrade, a zcashd node may receive headers for a non-upgrading chain from its non-upgraded peers (e.g. if the block at the NU activation height is found more quickly by the non-upgrading chain). In this situation, the node will end up with two headers at the NU activation height (and possibly for subsequent block heights). In the case of Heartwood, the block headers from the non-upgrading chain do not satisfy the Heartwood header consistency check in CBlockTreeDB::LoadBlockIndexGuts. In this commit, we restrict the Heartwood consistency checks to block index objects that were created by clients that are CHAIN_HISTORY_ROOT_VERSION or better. --- src/chain.h | 7 +++++++ src/txdb.cpp | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/chain.h b/src/chain.h index 1a6c198f7..06052986b 100644 --- a/src/chain.h +++ b/src/chain.h @@ -435,6 +435,12 @@ class CDiskBlockIndex : public CBlockIndex public: uint256 hashPrev; + // This is the serialized `nVersion` of the block index, which is only set + // after the (de)serialization routine is called. This should only be used + // in LoadBlockIndexGuts (which is the only place where we read block index + // objects from disk anyway). + int nClientVersion = 0; + CDiskBlockIndex() { hashPrev = uint256(); } @@ -450,6 +456,7 @@ public: int nVersion = s.GetVersion(); if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT(nVersion)); + nClientVersion = nVersion; READWRITE(VARINT(nHeight)); READWRITE(VARINT(nStatus)); diff --git a/src/txdb.cpp b/src/txdb.cpp index 3a11ba123..de372b826 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -566,11 +566,15 @@ bool CBlockTreeDB::LoadBlockIndexGuts( return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); // ZIP 221 consistency checks - if (chainParams.GetConsensus().NetworkUpgradeActive(pindexNew->nHeight, Consensus::UPGRADE_HEARTWOOD)) { + // We assume block index objects on disk that are not at least + // CHAIN_HISTORY_ROOT_VERSION were created by nodes that were + // not Heartwood aware. + if (diskindex.nClientVersion >= CHAIN_HISTORY_ROOT_VERSION && + chainParams.GetConsensus().NetworkUpgradeActive(pindexNew->nHeight, Consensus::UPGRADE_HEARTWOOD)) { if (pindexNew->hashLightClientRoot != pindexNew->hashChainHistoryRoot) { return error( - "LoadBlockIndex(): block index inconsistency detected (hashLightClientRoot != hashChainHistoryRoot): %s", - pindexNew->ToString()); + "LoadBlockIndex(): block index inconsistency detected (hashLightClientRoot %s != hashChainHistoryRoot %s): %s", + pindexNew->hashLightClientRoot.ToString(), pindexNew->hashChainHistoryRoot.ToString(), pindexNew->ToString()); } } else { if (pindexNew->hashLightClientRoot != pindexNew->hashFinalSaplingRoot) { From c3018904c31864a87459305bae4079c964f441aa Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 5 May 2020 17:24:27 -0600 Subject: [PATCH 3/7] Don't throw exception in PopHistoryNode when popping from empty tree. If we are doing an expected rollback that changes the consensus branch ID for some upgrade (or introduces one that wasn't present at the equivalent height) this will occur because `SelectHistoryCache` selects the tree for the new consensus branch ID, not the one that existed on the chain being rolled back. --- src/coins.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 9672118eb..2446b3c0b 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -506,9 +506,17 @@ void CCoinsViewCache::PopHistoryNode(uint32_t epochId) { switch (historyCache.length) { case 0: - // Caller is not expected to pop from empty tree! Caller should - // switch to previous epoch and pop history from there. - throw std::runtime_error("popping history node from empty history"); + // Caller is generally not expected to pop from empty tree! Caller + // should switch to previous epoch and pop history from there. + + // If we are doing an expected rollback that changes the consensus + // branch ID for some upgrade (or introduces one that wasn't present + // at the equivalent height) this will occur because + // `SelectHistoryCache` selects the tree for the new consensus + // branch ID, not the one that existed on the chain being rolled + // back. + + // Sensible action is to truncate the history cache: case 1: // Just resetting tree to empty historyCache.Truncate(0); From 5d24937e5fd22c34e4a962a1d032f73ab569fb70 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 6 May 2020 10:50:43 -0600 Subject: [PATCH 4/7] make-release.py: Versioning changes for 2.1.2-1. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7d904fb22..a2919407c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 2.1.2 +Zcash 2.1.2-1 =========== diff --git a/configure.ac b/configure.ac index d45e0a470..6cdff56f8 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 2) define(_CLIENT_VERSION_MINOR, 1) define(_CLIENT_VERSION_REVISION, 2) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_BUILD, 51) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 2bbc5e72b..a3f6abfde 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-2.1.2" +name: "zcash-2.1.2-1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index e2ab2c2ff..e12fa1167 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 2 #define CLIENT_VERSION_MINOR 1 #define CLIENT_VERSION_REVISION 2 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_BUILD 51 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 5041b6b4a..a2e2cab41 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 805837; +static const int APPROX_RELEASE_HEIGHT = 821903; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 48); From 72da9f77fa67a2aa97cfb7062477c065bc3dc18d Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 6 May 2020 10:52:57 -0600 Subject: [PATCH 5/7] make-release.py: Updated manpages for 2.1.2-1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index ea9d753c9..26c2d9ba3 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH ZCASH-CLI "1" "April 2020" "zcash-cli v2.1.2" "User Commands" +.TH ZCASH-CLI "1" "May 2020" "zcash-cli v2.1.2-1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v2.1.2 +zcash-cli \- manual page for zcash-cli v2.1.2-1 .SH DESCRIPTION -Zcash RPC client version v2.1.2 +Zcash RPC client version v2.1.2\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 524328c2f..e0264476e 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH ZCASH-TX "1" "April 2020" "zcash-tx v2.1.2" "User Commands" +.TH ZCASH-TX "1" "May 2020" "zcash-tx v2.1.2-1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v2.1.2 +zcash-tx \- manual page for zcash-tx v2.1.2-1 .SH DESCRIPTION -Zcash zcash\-tx utility version v2.1.2 +Zcash zcash\-tx utility version v2.1.2\-1 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index d454cc99d..0343e693d 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH ZCASHD "1" "April 2020" "zcashd v2.1.2" "User Commands" +.TH ZCASHD "1" "May 2020" "zcashd v2.1.2-1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v2.1.2 +zcashd \- manual page for zcashd v2.1.2-1 .SH DESCRIPTION -Zcash Daemon version v2.1.2 +Zcash Daemon version v2.1.2\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . From c80adfcfccef3a5f5e3b824bbdc354214424509d Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 6 May 2020 10:52:57 -0600 Subject: [PATCH 6/7] make-release.py: Updated release notes and changelog for 2.1.2-1. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 4 ++-- doc/release-notes/release-notes-2.1.2-1.md | 12 ++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 doc/release-notes/release-notes-2.1.2-1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index db4b428a1..23330c14a 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (2.1.2+1) stable; urgency=medium + + * 2.1.2-1 release. + + -- Electric Coin Company Wed, 06 May 2020 10:52:57 -0600 + zcash (2.1.2) stable; urgency=medium * 2.1.2 release. diff --git a/doc/authors.md b/doc/authors.md index 10b8dec11..6c2ed4aae 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,9 +1,9 @@ Zcash Contributors ================== -Jack Grigg (1020) +Jack Grigg (1021) Simon Liu (460) -Sean Bowe (306) +Sean Bowe (310) Eirik Ogilvie-Wigley (214) Daira Hopwood (180) Taylor Hornby (99) diff --git a/doc/release-notes/release-notes-2.1.2-1.md b/doc/release-notes/release-notes-2.1.2-1.md new file mode 100644 index 000000000..58869f92a --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2-1.md @@ -0,0 +1,12 @@ +Changelog +========= + +Jack Grigg (1): + txdb/chain: Restrict Heartwood chain consistency check to block index objects that were created by Heartwood-unaware clients. + +Sean Bowe (4): + Add the intended testnet activation block of Heartwood to our intended rewind logic. + Don't throw exception in PopHistoryNode when popping from empty tree. + make-release.py: Versioning changes for 2.1.2-1. + make-release.py: Updated manpages for 2.1.2-1. + From f7d2142eb0744d51be448130d0cee0c5bd1cb6f3 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 6 May 2020 10:58:53 -0600 Subject: [PATCH 7/7] Add release details about v2.1.2-1 hotfix. --- doc/release-notes/release-notes-2.1.2-1.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/release-notes/release-notes-2.1.2-1.md b/doc/release-notes/release-notes-2.1.2-1.md index 58869f92a..db272faff 100644 --- a/doc/release-notes/release-notes-2.1.2-1.md +++ b/doc/release-notes/release-notes-2.1.2-1.md @@ -1,3 +1,11 @@ +Notable changes +=============== + +This release fixes two issues that were identified by the Heartwood activation on testnet. + +* v2.1.2 nodes that followed the Heartwood activation on testnet would crash on restart if, prior to shutdown, they had received a block from a miner that had not activated Heartwood, which is very likely. This release fixes that crash. +* Nodes that had not followed the Heartwood activation on testnet (by running a version prior to v2.1.2) but then tried to upgrade to v2.1.2 would have difficulty rolling back. In this release we have ensured that nodes will now roll back if necessary to follow the Heartwood activation on testnet. + Changelog =========