aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/cryptonote_core/blockchain.cpp4
-rw-r--r--src/cryptonote_core/cryptonote_basic.h4
-rw-r--r--src/cryptonote_core/hardfork.cpp21
-rw-r--r--tests/unit_tests/hardfork.cpp5
4 files changed, 21 insertions, 13 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index c38b58841..306530f02 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -1033,8 +1033,8 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
CRITICAL_REGION_BEGIN(m_blockchain_lock);
height = m_db->height();
- b.major_version = m_hardfork->get_ideal_version();
- b.minor_version = 0;
+ b.major_version = m_hardfork->get_current_version();
+ b.minor_version = m_hardfork->get_ideal_version();
b.prev_id = get_tail_id();
b.timestamp = time(NULL);
diff --git a/src/cryptonote_core/cryptonote_basic.h b/src/cryptonote_core/cryptonote_basic.h
index d3db50068..94887b5a0 100644
--- a/src/cryptonote_core/cryptonote_basic.h
+++ b/src/cryptonote_core/cryptonote_basic.h
@@ -277,8 +277,8 @@ namespace cryptonote
/************************************************************************/
struct block_header
{
- uint8_t major_version; // now used as a voting mechanism, rather than how this particular block is built
- uint8_t minor_version;
+ uint8_t major_version;
+ uint8_t minor_version; // now used as a voting mechanism, rather than how this particular block is built
uint64_t timestamp;
crypto::hash prev_id;
uint32_t nonce;
diff --git a/src/cryptonote_core/hardfork.cpp b/src/cryptonote_core/hardfork.cpp
index 77839678c..6ecaff056 100644
--- a/src/cryptonote_core/hardfork.cpp
+++ b/src/cryptonote_core/hardfork.cpp
@@ -35,6 +35,17 @@
using namespace cryptonote;
+static uint8_t get_block_vote(const cryptonote::block &b)
+{
+ // Pre-hardfork blocks have a minor version hardcoded to 0.
+ // For the purposes of voting, we consider 0 to refer to
+ // version number 1, which is what all blocks from the genesis
+ // block are. It makes things simpler.
+ if (b.minor_version == 0)
+ return 1;
+ return b.minor_version;
+}
+
HardFork::HardFork(cryptonote::BlockchainDB &db, uint8_t original_version, uint64_t original_version_till_height, time_t forked_time, time_t update_time, uint64_t window_size, int threshold_percent):
db(db),
original_version(original_version),
@@ -87,7 +98,7 @@ bool HardFork::do_check(uint8_t version) const
bool HardFork::check(const cryptonote::block &block) const
{
CRITICAL_REGION_LOCAL(lock);
- return do_check(block.major_version);
+ return do_check(get_block_vote(block));
}
bool HardFork::add(uint8_t block_version, uint64_t height)
@@ -125,7 +136,7 @@ bool HardFork::add(uint8_t block_version, uint64_t height)
bool HardFork::add(const cryptonote::block &block, uint64_t height)
{
- return add(block.major_version, height);
+ return add(get_block_vote(block), height);
}
void HardFork::init()
@@ -168,7 +179,7 @@ uint8_t HardFork::get_block_version(uint64_t height) const
return original_version;
const cryptonote::block &block = db.get_block_from_height(height);
- return block.major_version;
+ return get_block_vote(block);
}
bool HardFork::reorganize_from_block_height(uint64_t height)
@@ -192,7 +203,7 @@ bool HardFork::reorganize_from_block_height(uint64_t height)
}
for (uint64_t h = rescan_height; h <= height; ++h) {
cryptonote::block b = db.get_block_from_height(h);
- const uint8_t v = get_effective_version(b.major_version);
+ const uint8_t v = get_effective_version(get_block_vote(b));
last_versions[v]++;
versions.push_back(v);
}
@@ -236,7 +247,7 @@ bool HardFork::rescan_from_block_height(uint64_t height)
const uint64_t rescan_height = height >= (window_size - 1) ? height - (window_size -1) : 0;
for (uint64_t h = rescan_height; h <= height; ++h) {
cryptonote::block b = db.get_block_from_height(h);
- const uint8_t v = get_effective_version(b.major_version);
+ const uint8_t v = get_effective_version(get_block_vote(b));
last_versions[v]++;
versions.push_back(v);
}
diff --git a/tests/unit_tests/hardfork.cpp b/tests/unit_tests/hardfork.cpp
index a8d2d381f..210c1959b 100644
--- a/tests/unit_tests/hardfork.cpp
+++ b/tests/unit_tests/hardfork.cpp
@@ -131,7 +131,7 @@ private:
static cryptonote::block mkblock(uint8_t version)
{
cryptonote::block b;
- b.major_version = version;
+ b.minor_version = version;
return b;
}
@@ -358,7 +358,6 @@ TEST(new_blocks, denied)
ASSERT_TRUE(hf.add(2, 2, 1));
hf.init();
- ASSERT_FALSE(hf.add(mkblock(0), 0));
ASSERT_TRUE(hf.add(mkblock(1), 0));
ASSERT_TRUE(hf.add(mkblock(1), 1));
ASSERT_TRUE(hf.add(mkblock(1), 2));
@@ -384,7 +383,6 @@ TEST(new_version, early)
ASSERT_TRUE(hf.add(2, 4, 1));
hf.init();
- ASSERT_FALSE(hf.add(mkblock(0), 0));
ASSERT_TRUE(hf.add(mkblock(2), 0));
ASSERT_TRUE(hf.add(mkblock(2), 1)); // we have enough votes already
ASSERT_TRUE(hf.add(mkblock(2), 2));
@@ -417,7 +415,6 @@ TEST(reorganize, changed)
#define ADD_TRUE(v, h) ADD(v, h, TRUE)
#define ADD_FALSE(v, h) ADD(v, h, FALSE)
- ADD_FALSE(0, 0);
ADD_TRUE(1, 0);
ADD_TRUE(1, 1);
ADD_TRUE(2, 2);