Skip to content

Commit

Permalink
Merge c372fce into 56f1da2
Browse files Browse the repository at this point in the history
  • Loading branch information
toxeus committed Jul 18, 2018
2 parents 56f1da2 + c372fce commit 5519e0b
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 65 deletions.
10 changes: 6 additions & 4 deletions include/bitcoin/bitcoin/chain/chain_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ class BC_API chain_state

/// Checkpoints must be ordered by height with greatest at back.
static map get_map(size_t height, const checkpoints& checkpoints,
uint32_t forks, size_t retargeting_interval);
uint32_t forks, size_t retargeting_interval, size_t net_sample);

static uint32_t signal_version(uint32_t forks);
static uint32_t signal_version(uint32_t forks, const settings& settings);

/// Create pool state from top chain top block state.
chain_state(const chain_state& top, const settings& settings);
Expand Down Expand Up @@ -185,15 +185,17 @@ class BC_API chain_state
uint32_t maximum_transaction_version;
};

static activations activation(const data& values, uint32_t forks);
static activations activation(const data& values, uint32_t forks,
const settings& settings);
static uint32_t median_time_past(const data& values, uint32_t forks);
static uint32_t work_required(const data& values, uint32_t forks,
const settings& settings);

private:
static size_t bits_count(size_t height, uint32_t forks,
size_t retargeting_interval);
static size_t version_count(size_t height, uint32_t forks);
static size_t version_count(size_t height, uint32_t forks,
size_t net_sample);
static size_t timestamp_count(size_t height, uint32_t forks);
static size_t retarget_height(size_t height, uint32_t forks,
size_t retargeting_interval);
Expand Down
19 changes: 0 additions & 19 deletions include/bitcoin/bitcoin/constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,25 +98,6 @@ BC_CONSTEXPR uint32_t relative_locktime_time_locked = 0x00400000;
// Fork constants.
//-----------------------------------------------------------------------------

// Consensus rule change activation and enforcement parameters.
BC_CONSTEXPR uint32_t first_version = 1;
BC_CONSTEXPR uint32_t bip34_version = 2;
BC_CONSTEXPR uint32_t bip66_version = 3;
BC_CONSTEXPR uint32_t bip65_version = 4;
BC_CONSTEXPR uint32_t bip9_version_bit0 = 1u << 0;
BC_CONSTEXPR uint32_t bip9_version_bit1 = 1u << 1;
BC_CONSTEXPR uint32_t bip9_version_base = 0x20000000;

// Mainnet activation parameters (bip34-style activations).
BC_CONSTEXPR size_t mainnet_active = 750;
BC_CONSTEXPR size_t mainnet_enforce = 950;
BC_CONSTEXPR size_t mainnet_sample = 1000;

// Testnet activation parameters (bip34-style activations).
BC_CONSTEXPR size_t testnet_active = 51;
BC_CONSTEXPR size_t testnet_enforce = 75;
BC_CONSTEXPR size_t testnet_sample = 100;

// Mainnet frozen activation heights (frozen_activations).
BC_CONSTEXPR size_t mainnet_bip65_freeze = 388381;
BC_CONSTEXPR size_t mainnet_bip66_freeze = 363725;
Expand Down
17 changes: 17 additions & 0 deletions include/bitcoin/bitcoin/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,23 @@ class BC_API settings
size_t retargeting_interval;

chain::block genesis_block;

// Fork settings.
//--------------------------------------------------------------------------

// Consensus rule change activation and enforcement parameters.
uint32_t first_version;
uint32_t bip34_version;
uint32_t bip66_version;
uint32_t bip65_version;
uint32_t bip9_version_bit0;
uint32_t bip9_version_bit1;
uint32_t bip9_version_base;

// Activation parameters (bip34-style activations).
size_t net_active;
size_t net_enforce;
size_t net_sample;
};

} // namespace libbitcoin
Expand Down
86 changes: 45 additions & 41 deletions src/chain/chain_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,14 @@ using namespace boost::adaptors;
// Inlines.
//-----------------------------------------------------------------------------

inline size_t version_sample_size(bool mainnet)
inline bool is_active(size_t count, size_t net_active)
{
return mainnet ? mainnet_sample : testnet_sample;
return count >= net_active;
}

inline bool is_active(size_t count, bool mainnet)
inline bool is_enforced(size_t count, size_t net_enforce)
{
return count >= (mainnet ? mainnet_active : testnet_active);
}

inline bool is_enforced(size_t count, bool mainnet)
{
return count >= (mainnet ? mainnet_enforce : testnet_enforce);
return count >= net_enforce;
}

inline bool is_bip30_exception(const checkpoint& check, bool mainnet)
Expand Down Expand Up @@ -156,7 +151,7 @@ inline uint32_t bits_high(const chain_state::data& values)
//-----------------------------------------------------------------------------

chain_state::activations chain_state::activation(const data& values,
uint32_t forks)
uint32_t forks, const bc::settings& settings)
{
const auto height = values.height;
const auto version = values.version.self;
Expand All @@ -177,9 +172,12 @@ chain_state::activations chain_state::activation(const data& values,
};

// Declare bip34-based version predicates.
const auto ge_2 = [=](uint32_t value) { return ge(value, bip34_version); };
const auto ge_3 = [=](uint32_t value) { return ge(value, bip66_version); };
const auto ge_4 = [=](uint32_t value) { return ge(value, bip65_version); };
const auto ge_2 = [=](uint32_t value) { return ge(value,
settings.bip34_version); };
const auto ge_3 = [=](uint32_t value) { return ge(value,
settings.bip66_version); };
const auto ge_4 = [=](uint32_t value) { return ge(value,
settings.bip65_version); };

// Compute bip34-based activation version summaries.
const auto count_2 = std::count_if(history.begin(), history.end(), ge_2);
Expand All @@ -192,7 +190,7 @@ chain_state::activations chain_state::activation(const data& values,
const auto bip65_ice = bip65(height, frozen, mainnet, testnet);

// Initialize activation results with genesis values.
activations result{ rule_fork::no_rules, first_version };
activations result{ rule_fork::no_rules, settings.first_version };

// retarget is only activated via configuration (hard fork).
result.forks |= (rule_fork::retarget & forks);
Expand All @@ -218,19 +216,22 @@ chain_state::activations chain_state::activation(const data& values,
}

// bip34 is activated based on 75% of preceding 1000 mainnet blocks.
if (bip34_ice || (is_active(count_2, mainnet) && version >= bip34_version))
if (bip34_ice || (is_active(count_2, settings.net_active) && version >=
settings.bip34_version))
{
result.forks |= (rule_fork::bip34_rule & forks);
}

// bip66 is activated based on 75% of preceding 1000 mainnet blocks.
if (bip66_ice || (is_active(count_3, mainnet) && version >= bip66_version))
if (bip66_ice || (is_active(count_3, settings.net_active) && version >=
settings.bip66_version))
{
result.forks |= (rule_fork::bip66_rule & forks);
}

// bip65 is activated based on 75% of preceding 1000 mainnet blocks.
if (bip65_ice || (is_active(count_4, mainnet) && version >= bip65_version))
if (bip65_ice || (is_active(count_4, settings.net_active) && version >=
settings.bip65_version))
{
result.forks |= (rule_fork::bip65_rule & forks);
}
Expand All @@ -248,21 +249,21 @@ chain_state::activations chain_state::activation(const data& values,
}

// version 4/3/2 enforced based on 95% of preceding 1000 mainnet blocks.
if (bip65_ice || is_enforced(count_4, mainnet))
if (bip65_ice || is_enforced(count_4, settings.net_enforce))
{
result.minimum_block_version = bip65_version;
result.minimum_block_version = settings.bip65_version;
}
else if (bip66_ice || is_enforced(count_3, mainnet))
else if (bip66_ice || is_enforced(count_3, settings.net_enforce))
{
result.minimum_block_version = bip66_version;
result.minimum_block_version = settings.bip66_version;
}
else if (bip34_ice || is_enforced(count_2, mainnet))
else if (bip34_ice || is_enforced(count_2, settings.net_enforce))
{
result.minimum_block_version = bip34_version;
result.minimum_block_version = settings.bip34_version;
}
else
{
result.minimum_block_version = first_version;
result.minimum_block_version = settings.first_version;
}

// TODO: add configurable option to apply transaction version policy.
Expand All @@ -289,7 +290,8 @@ size_t chain_state::bits_count(size_t height, uint32_t forks,
return std::min(height, retargeting_interval);
}

size_t chain_state::version_count(size_t height, uint32_t forks)
size_t chain_state::version_count(size_t height, uint32_t forks,
size_t net_sample)
{
if (script::is_enabled(forks, rule_fork::bip90_rule) ||
!script::is_enabled(forks, rule_fork::bip34_activations))
Expand All @@ -300,7 +302,7 @@ size_t chain_state::version_count(size_t height, uint32_t forks)
// Regtest and testnet both use bip34 testnet activation.
const auto difficult = script::is_enabled(forks, rule_fork::difficult);
const auto retarget = script::is_enabled(forks, rule_fork::retarget);
return std::min(height, version_sample_size(retarget && difficult));
return std::min(height, net_sample);
}

size_t chain_state::timestamp_count(size_t height, uint32_t)
Expand Down Expand Up @@ -494,7 +496,7 @@ size_t chain_state::retarget_distance(size_t height,
// static
chain_state::map chain_state::get_map(size_t height,
const checkpoints& /* checkpoints */, uint32_t forks,
size_t retargeting_interval)
size_t retargeting_interval, size_t net_sample)
{
if (height == 0)
return {};
Expand All @@ -514,7 +516,7 @@ chain_state::map chain_state::get_map(size_t height,
// The height bound of the version sample for activations.
map.version_self = height;
map.version.high = height - 1;
map.version.count = version_count(height, forks);
map.version.count = version_count(height, forks, net_sample);

// The most recent past retarget height.
map.timestamp_retarget = retarget_height(height, forks,
Expand All @@ -530,28 +532,29 @@ chain_state::map chain_state::get_map(size_t height,
}

// static
uint32_t chain_state::signal_version(uint32_t forks)
uint32_t chain_state::signal_version(uint32_t forks,
const bc::settings& settings)
{
if (script::is_enabled(forks, rule_fork::bip65_rule))
return bip65_version;
return settings.bip65_version;

if (script::is_enabled(forks, rule_fork::bip66_rule))
return bip66_version;
return settings.bip66_version;

if (script::is_enabled(forks, rule_fork::bip34_rule))
return bip34_version;
return settings.bip34_version;

// TODO: these can be retired.
// Signal bip9 bit0 if any of the group is configured.
if (script::is_enabled(forks, rule_fork::bip9_bit0_group))
return bip9_version_base | bip9_version_bit0;
return settings.bip9_version_base | settings.bip9_version_bit0;

// TODO: these can be retired.
// Signal bip9 bit1 if any of the group is configured.
if (script::is_enabled(forks, rule_fork::bip9_bit1_group))
return bip9_version_base | bip9_version_bit1;
return settings.bip9_version_base | settings.bip9_version_bit1;

return first_version;
return settings.first_version;
}

// This is promotion from a preceding height to the next.
Expand Down Expand Up @@ -581,7 +584,8 @@ chain_state::data chain_state::to_pool(const chain_state& top,
data.bits.ordered.pop_front();

// If version collection overflows, dequeue oldest member.
if (data.version.ordered.size() > version_count(height, forks))
if (data.version.ordered.size() > version_count(height, forks,
settings.net_sample))
data.version.ordered.pop_front();

// If timestamp collection overflows, dequeue oldest member.
Expand All @@ -602,7 +606,7 @@ chain_state::data chain_state::to_pool(const chain_state& top,
data.height = height;
data.hash = null_hash;
data.bits.self = 0;
data.version.self = signal_version(forks);
data.version.self = signal_version(forks, settings);
return data;
}

Expand All @@ -613,7 +617,7 @@ chain_state::chain_state(const chain_state& top, const bc::settings& settings)
forks_(top.forks_),
stale_seconds_(top.stale_seconds_),
checkpoints_(top.checkpoints_),
active_(activation(data_, forks_)),
active_(activation(data_, forks_, settings)),
work_required_(work_required(data_, forks_, settings)),
median_time_past_(median_time_past(data_, forks_))
{
Expand Down Expand Up @@ -661,7 +665,7 @@ chain_state::chain_state(const chain_state& pool, const block& block,
forks_(pool.forks_),
stale_seconds_(pool.stale_seconds_),
checkpoints_(pool.checkpoints_),
active_(activation(data_, forks_)),
active_(activation(data_, forks_, settings)),
work_required_(work_required(data_, forks_, settings)),
median_time_past_(median_time_past(data_, forks_))
{
Expand Down Expand Up @@ -710,7 +714,7 @@ chain_state::chain_state(const chain_state& parent, const header& header,
forks_(parent.forks_),
stale_seconds_(parent.stale_seconds_),
checkpoints_(parent.checkpoints_),
active_(activation(data_, forks_)),
active_(activation(data_, forks_, settings)),
work_required_(work_required(data_, forks_, settings)),
median_time_past_(median_time_past(data_, forks_))
{
Expand All @@ -723,7 +727,7 @@ chain_state::chain_state(data&& values, const checkpoints& checkpoints,
forks_(forks),
stale_seconds_(stale_seconds),
checkpoints_(checkpoints),
active_(activation(data_, forks_)),
active_(activation(data_, forks_, settings)),
work_required_(work_required(data_, forks_, settings)),
median_time_past_(median_time_past(data_, forks_))
{
Expand Down
15 changes: 14 additions & 1 deletion src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,14 @@ settings::settings()
min_timespan(target_timespan_seconds / retargeting_factor),
max_timespan(target_timespan_seconds * retargeting_factor),
retargeting_interval(target_timespan_seconds / target_spacing_seconds),
genesis_block(*this)
genesis_block(*this),
first_version(1),
bip34_version(2),
bip66_version(3),
bip65_version(4),
bip9_version_bit0(1u << 0),
bip9_version_bit1(1u << 1),
bip9_version_base(0x20000000)
{
}

Expand Down Expand Up @@ -82,6 +89,9 @@ settings::settings(config::settings context)
0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57,
0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f,
0xac, 0x00, 0x00, 0x00, 0x00});
net_active = 750;
net_enforce = 950;
net_sample = 1000;

break;
}
Expand Down Expand Up @@ -125,6 +135,9 @@ settings::settings(config::settings context)
0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57,
0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f,
0xac, 0x00, 0x00, 0x00, 0x00});
net_active = 51;
net_enforce = 75;
net_sample = 100;

break;
}
Expand Down

0 comments on commit 5519e0b

Please sign in to comment.