diff --git a/Builds/VisualStudio2015/RippleD.vcxproj b/Builds/VisualStudio2015/RippleD.vcxproj
index 145c44a454..97fe368547 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj
+++ b/Builds/VisualStudio2015/RippleD.vcxproj
@@ -4628,6 +4628,10 @@
True
True
+
+ True
+ True
+
True
True
diff --git a/Builds/VisualStudio2015/RippleD.vcxproj.filters b/Builds/VisualStudio2015/RippleD.vcxproj.filters
index c921aae40a..f7bf7fa95d 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2015/RippleD.vcxproj.filters
@@ -5352,6 +5352,9 @@
test\ledger
+
+ test\ledger
+
test\ledger
diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp
index aec258d189..4e77b31e21 100644
--- a/src/ripple/app/ledger/Ledger.cpp
+++ b/src/ripple/app/ledger/Ledger.cpp
@@ -217,9 +217,11 @@ Ledger::Ledger (
beast::Journal j)
: mImmutable (true)
, txMap_ (std::make_shared (SHAMapType::TRANSACTION,
- info.txHash, family, SHAMap::version{1}))
+ info.txHash, family,
+ SHAMap::version{getSHAMapV2(info) ? 2 : 1}))
, stateMap_ (std::make_shared (SHAMapType::STATE,
- info.accountHash, family, SHAMap::version{1}))
+ info.accountHash, family,
+ SHAMap::version{getSHAMapV2(info) ? 2 : 1}))
, info_ (info)
{
loaded = true;
@@ -273,6 +275,12 @@ Ledger::Ledger (Ledger const& prevLedger,
info_.closeTimeResolution = getNextLedgerTimeResolution(
prevLedger.info_.closeTimeResolution,
getCloseAgree(prevLedger.info()), info_.seq);
+
+ if (stateMap_->get_version() == SHAMap::version{2})
+ {
+ info_.closeFlags |= sLCF_SHAMapV2;
+ }
+
if (prevLedger.info_.closeTime == NetClock::time_point{})
{
info_.closeTime = roundCloseTime(closeTime, info_.closeTimeResolution);
@@ -1053,6 +1061,7 @@ Ledger::make_v2()
info_.accountHash = stateMap_->getHash ().as_uint256();
info_.txHash = txMap_->getHash ().as_uint256();
info_.hash = calculateLedgerHash (info_);
+ info_.closeFlags |= sLCF_SHAMapV2;
}
void
diff --git a/src/ripple/ledger/ReadView.h b/src/ripple/ledger/ReadView.h
index b313bce1fe..3ad05b4f60 100644
--- a/src/ripple/ledger/ReadView.h
+++ b/src/ripple/ledger/ReadView.h
@@ -416,7 +416,10 @@ public:
// ledger close flags
static
-std::uint32_t const sLCF_NoConsensusTime = 1;
+std::uint32_t const sLCF_NoConsensusTime = 0x01;
+
+static
+std::uint32_t const sLCF_SHAMapV2 = 0x02;
inline
bool getCloseAgree (LedgerInfo const& info)
@@ -424,6 +427,12 @@ bool getCloseAgree (LedgerInfo const& info)
return (info.closeFlags & sLCF_NoConsensusTime) == 0;
}
+inline
+bool getSHAMapV2 (LedgerInfo const& info)
+{
+ return (info.closeFlags & sLCF_SHAMapV2) != 0;
+}
+
void addRaw (LedgerInfo const&, Serializer&);
} // ripple
diff --git a/src/test/ledger/SHAMapV2_test.cpp b/src/test/ledger/SHAMapV2_test.cpp
new file mode 100644
index 0000000000..740453c71f
--- /dev/null
+++ b/src/test/ledger/SHAMapV2_test.cpp
@@ -0,0 +1,71 @@
+//-----------------------------------------------------------------------------
+/*
+ This file is part of rippled: https://github.com/ripple/rippled
+ Copyright (c) 2012, 2015 Ripple Labs Inc.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#include
+#include
+#include
+#include
+
+namespace ripple {
+namespace test {
+
+// Test that converting a ledger to SHAMapV2
+// works as expected
+
+class SHAMapV2_test : public beast::unit_test::suite
+{
+ void
+ testSHAMapV2()
+ {
+ jtx::Env env(*this);
+ Config config;
+
+ auto ledger =
+ std::make_shared(create_genesis, config, env.app().family());
+ BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
+ BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
+ BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
+
+ ledger =
+ std::make_shared(*ledger, NetClock::time_point{});
+ BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
+ BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
+ BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
+
+ ledger->make_v2();
+ BEAST_EXPECT(getSHAMapV2 (ledger->info()));
+ BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
+ BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
+
+ ledger = std::make_shared(*ledger, NetClock::time_point{});
+ BEAST_EXPECT(getSHAMapV2 (ledger->info()));
+ BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
+ BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
+ }
+
+ void run()
+ {
+ testSHAMapV2();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(SHAMapV2,ledger,ripple);
+
+} // test
+} // ripple
diff --git a/src/unity/ledger_test_unity.cpp b/src/unity/ledger_test_unity.cpp
index 7c569159ce..9496f523fd 100644
--- a/src/unity/ledger_test_unity.cpp
+++ b/src/unity/ledger_test_unity.cpp
@@ -22,5 +22,6 @@
#include
#include
#include
+#include
#include
-#include
\ No newline at end of file
+#include