Skip to content

Commit ccf6697

Browse files
committed
Merge #780: Change elements mode to activating BIP9 signaling based on height
6fc3fe0 Change elements mode to activating BIP9 signaling based on height (Gregory Sanders) Pull request description: When based on block time, it's really hard to engineer principled tests for activation of consensus changes. resolves #779 Tree-SHA512: c5672d54a3a906d1318c82197022b9effd39e951e3f9e5ca4dc92055f2fa638a6359797662014c4928be25795ddd6b3f401769d53a967cf08d4f564210926773
2 parents ef4231f + 6fc3fe0 commit ccf6697

File tree

4 files changed

+32
-6
lines changed

4 files changed

+32
-6
lines changed

src/chainparams.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class CMainParams : public CChainParams {
135135
g_con_elementsmode = false;
136136
g_con_blockheightinheader = false;
137137
consensus.total_valid_epochs = 0;
138+
consensus.elements_mode = g_con_elementsmode;
138139

139140
/**
140141
* The message start string is designed to be unlikely to occur in normal data.
@@ -265,6 +266,7 @@ class CTestNetParams : public CChainParams {
265266
g_con_elementsmode = false;
266267
g_con_blockheightinheader = false;
267268
consensus.total_valid_epochs = 0;
269+
consensus.elements_mode = g_con_elementsmode;
268270

269271
pchMessageStart[0] = 0x0b;
270272
pchMessageStart[1] = 0x11;
@@ -367,6 +369,7 @@ class CRegTestParams : public CChainParams {
367369
consensus.has_parent_chain = false;
368370
g_signed_blocks = false;
369371
g_con_elementsmode = false;
372+
consensus.elements_mode = g_con_elementsmode;
370373
g_con_blockheightinheader = false;
371374
consensus.total_valid_epochs = 0;
372375

@@ -552,6 +555,7 @@ class CCustomParams : public CRegTestParams {
552555
// Default to true for custom chains.
553556
g_con_blockheightinheader = args.GetBoolArg("-con_blockheightinheader", true);
554557
g_con_elementsmode = args.GetBoolArg("-con_elementsmode", true);
558+
consensus.elements_mode = g_con_elementsmode;
555559

556560
// No subsidy for custom chains by default
557561
consensus.genesis_subsidy = args.GetArg("-con_blocksubsidy", 0);
@@ -726,6 +730,7 @@ class CLiquidV1Params : public CChainParams {
726730

727731
g_con_blockheightinheader = true;
728732
g_con_elementsmode = true;
733+
consensus.elements_mode = g_con_elementsmode;
729734
// TODO: Pick appropriate value for this network.
730735
consensus.total_valid_epochs = 2;
731736

src/consensus/params.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ struct Params {
108108
// Used to allow M-epoch-old peg-in addresses as deposits
109109
// default 1 to not break legacy chains implicitly.
110110
size_t total_valid_epochs = 1;
111+
bool elements_mode = false;
111112
};
112113
} // namespace Consensus
113114

src/versionbits.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,20 @@
55
#include <versionbits.h>
66
#include <consensus/params.h>
77

8+
// Elements: We use height, not time!
9+
int64_t GetBIP9Time(const CBlockIndex* pindexPrev, const Consensus::Params& params) {
10+
if (params.elements_mode) {
11+
return pindexPrev->nHeight;
12+
} else {
13+
return pindexPrev->GetMedianTimePast();
14+
}
15+
}
16+
817
ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const
918
{
1019
int nPeriod = Period(params);
1120
int nThreshold = Threshold(params);
21+
// ELEMENTS: We interpret this as block height, not block time!
1222
int64_t nTimeStart = BeginTime(params);
1323
int64_t nTimeTimeout = EndTime(params);
1424

@@ -30,7 +40,7 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
3040
cache[pindexPrev] = ThresholdState::DEFINED;
3141
break;
3242
}
33-
if (pindexPrev->GetMedianTimePast() < nTimeStart) {
43+
if (GetBIP9Time(pindexPrev, params) < nTimeStart) {
3444
// Optimization: don't recompute down further, as we know every earlier block will be before the start time
3545
cache[pindexPrev] = ThresholdState::DEFINED;
3646
break;
@@ -51,15 +61,15 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
5161

5262
switch (state) {
5363
case ThresholdState::DEFINED: {
54-
if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) {
64+
if (GetBIP9Time(pindexPrev, params) >= nTimeTimeout) {
5565
stateNext = ThresholdState::FAILED;
56-
} else if (pindexPrev->GetMedianTimePast() >= nTimeStart) {
66+
} else if (GetBIP9Time(pindexPrev, params) >= nTimeStart) {
5767
stateNext = ThresholdState::STARTED;
5868
}
5969
break;
6070
}
6171
case ThresholdState::STARTED: {
62-
if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) {
72+
if (GetBIP9Time(pindexPrev, params) >= nTimeTimeout) {
6373
stateNext = ThresholdState::FAILED;
6474
break;
6575
}

test/functional/feature_dynafed.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def set_test_params(self):
6363
self.setup_clean_chain = True
6464
self.num_nodes = 2
6565
# We want to test activation of dynafed
66-
self.extra_args = [["-con_dyna_deploy_start=0", "-enforce_pak=1", "-con_parent_chain_signblockscript=51", "-peginconfirmationdepth=1", "-parentscriptprefix=75", "-parent_bech32_hrp=ert"] for i in range(self.num_nodes)]
66+
self.extra_args = [["-con_dyna_deploy_start=1000", "-enforce_pak=1", "-con_parent_chain_signblockscript=51", "-peginconfirmationdepth=1", "-parentscriptprefix=75", "-parent_bech32_hrp=ert"] for i in range(self.num_nodes)]
6767
# second node will not mine transactions
6868
self.extra_args[1].append("-blocksonly=1")
6969

@@ -105,8 +105,18 @@ def test_legacy_params(self):
105105
def test_dynafed_activation(self):
106106
self.log.info("Testing dynafed versionbits activation...")
107107

108+
# Signaling window is in height, not time, so first block that will signal is
109+
# at height 1008 which is evenly disible by 144(regtest bip9 window size)
110+
# Giving funds to node 1 to avoid a transaction size blowup when sweeping later
111+
blocks = self.nodes[0].generatetoaddress(1006, self.nodes[1].getnewaddress())
112+
assert_equal(self.nodes[0].getblockchaininfo()["bip9_softforks"]["dynafed"]["status"], "defined")
113+
blocks += self.nodes[0].generatetoaddress(1, self.nodes[0].getnewaddress())
114+
assert_equal(self.nodes[0].getblockchaininfo()["bip9_softforks"]["dynafed"]["status"], "started")
115+
blocks += self.nodes[0].generatetoaddress(144, self.nodes[0].getnewaddress())
116+
assert_equal(self.nodes[0].getblockchaininfo()["bip9_softforks"]["dynafed"]["status"], "locked_in")
117+
108118
# Move chain forward to activation, any new blocks will be enforced
109-
blocks = self.nodes[0].generatetoaddress(431, self.nodes[0].getnewaddress())
119+
blocks += self.nodes[0].generatetoaddress(144, self.nodes[0].getnewaddress())
110120
self.sync_all()
111121
assert_equal(self.nodes[0].getblockchaininfo()["bip9_softforks"]["dynafed"]["status"], "active")
112122

0 commit comments

Comments
 (0)