Skip to content

Commit

Permalink
Merge pull request #2037 from rsksmart/increase-migration-activation-…
Browse files Browse the repository at this point in the history
…integration

Increase migration activation integration
  • Loading branch information
josedahlquist authored May 12, 2023
2 parents 8eb2a79 + cccfc25 commit e91cbec
Show file tree
Hide file tree
Showing 26 changed files with 301 additions and 213 deletions.
5 changes: 3 additions & 2 deletions rskj-core/src/main/java/co/rsk/config/BridgeConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public abstract class BridgeConstants {
protected Coin minimumPegoutTxValueInSatoshis;

protected long federationActivationAge;
protected long federationActivationAgeLegacy;

protected long fundsMigrationAgeSinceActivationBegin;
protected long fundsMigrationAgeSinceActivationEnd;
Expand Down Expand Up @@ -119,8 +120,8 @@ public int getRsk2BtcMinimumAcceptableConfirmations() {

public Coin getMinimumPegoutTxValueInSatoshis() { return minimumPegoutTxValueInSatoshis; }

public long getFederationActivationAge() {
return federationActivationAge;
public long getFederationActivationAge(ActivationConfig.ForBlock activations) {
return activations.isActive(ConsensusRule.RSKIP383)? federationActivationAge: federationActivationAgeLegacy;
}

public long getFundsMigrationAgeSinceActivationBegin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ public BridgeDevNetConstants(List<BtcECKey> federationPublicKeys) {
AddressBasedAuthorizer.MinimumRequiredCalculation.ONE
);

federationActivationAge = 10L;
federationActivationAgeLegacy = 10L;
federationActivationAge = 20L;

fundsMigrationAgeSinceActivationBegin = 15L;
fundsMigrationAgeSinceActivationEnd = 100L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ public class BridgeMainNetConstants extends BridgeConstants {
AddressBasedAuthorizer.MinimumRequiredCalculation.ONE
);

federationActivationAge = 18500L;
federationActivationAgeLegacy = 18500L;
federationActivationAge = 40320L;

fundsMigrationAgeSinceActivationBegin = 0L;
fundsMigrationAgeSinceActivationEnd = 10585L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ public BridgeRegTestConstants(List<BtcECKey> federationPublicKeys) {
AddressBasedAuthorizer.MinimumRequiredCalculation.MAJORITY
);

federationActivationAge = 10L;
federationActivationAgeLegacy = 10L;
federationActivationAge = 20L;

fundsMigrationAgeSinceActivationBegin = 15L;
fundsMigrationAgeSinceActivationEnd = 150L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ public class BridgeTestNetConstants extends BridgeConstants {
AddressBasedAuthorizer.MinimumRequiredCalculation.ONE
);

federationActivationAge = 60L;
federationActivationAgeLegacy = 60L;
federationActivationAge = 120L;

fundsMigrationAgeSinceActivationBegin = 60L;
fundsMigrationAgeSinceActivationEnd = 900L;
Expand Down
8 changes: 4 additions & 4 deletions rskj-core/src/main/java/co/rsk/peg/BridgeSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,7 @@ private void processFundsMigration(Transaction rskTx) throws IOException {
}

private boolean federationIsInMigrationAge(Federation federation) {
long federationActivationAge = bridgeConstants.getFederationActivationAge();
long federationActivationAge = bridgeConstants.getFederationActivationAge(activations);
long federationAge = rskExecutionBlock.getNumber() - federation.getCreationBlockNumber();
long ageBegin = federationActivationAge + bridgeConstants.getFundsMigrationAgeSinceActivationBegin();
long ageEnd = federationActivationAge + bridgeConstants.getFundsMigrationAgeSinceActivationEnd(activations);
Expand All @@ -1008,7 +1008,7 @@ private boolean federationIsInMigrationAge(Federation federation) {

private boolean federationIsPastMigrationAge(Federation federation) {
long federationAge = rskExecutionBlock.getNumber() - federation.getCreationBlockNumber();
long ageEnd = bridgeConstants.getFederationActivationAge() +
long ageEnd = bridgeConstants.getFederationActivationAge(activations) +
bridgeConstants.getFundsMigrationAgeSinceActivationEnd(activations);

return federationAge >= ageEnd;
Expand Down Expand Up @@ -1327,7 +1327,7 @@ private void updateFederationCreationBlockHeights() {
long nextFederationCreationBlockHeight = nextFederationCreationBlockHeightOpt.get();
long curBlockHeight = rskExecutionBlock.getNumber();

if (curBlockHeight >= nextFederationCreationBlockHeight + bridgeConstants.getFederationActivationAge()) {
if (curBlockHeight >= nextFederationCreationBlockHeight + bridgeConstants.getFederationActivationAge(activations)) {
provider.setActiveFederationCreationBlockHeight(nextFederationCreationBlockHeight);
provider.clearNextFederationCreationBlockHeight();
}
Expand Down Expand Up @@ -2678,7 +2678,7 @@ public long getActiveFederationCreationBlockHeight() {
if (nextFederationCreationBlockHeightOpt.isPresent()) {
long nextFederationCreationBlockHeight = nextFederationCreationBlockHeightOpt.get();
long curBlockHeight = rskExecutionBlock.getNumber();
if (curBlockHeight >= nextFederationCreationBlockHeight + bridgeConstants.getFederationActivationAge()) {
if (curBlockHeight >= nextFederationCreationBlockHeight + bridgeConstants.getFederationActivationAge(activations)) {
return nextFederationCreationBlockHeight;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public BridgeSupport newInstance(Repository repository, Block executionBlock,
activations
);

FederationSupport federationSupport = new FederationSupport(bridgeConstants, provider, executionBlock);
FederationSupport federationSupport = new FederationSupport(bridgeConstants, provider, executionBlock, activations);

BridgeEventLogger eventLogger;
if (logs == null) {
Expand Down
7 changes: 5 additions & 2 deletions rskj-core/src/main/java/co/rsk/peg/FederationSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import co.rsk.bitcoinj.core.BtcECKey;
import co.rsk.bitcoinj.core.UTXO;
import co.rsk.config.BridgeConstants;
import org.ethereum.config.blockchain.upgrades.ActivationConfig;
import org.ethereum.core.Block;

import javax.annotation.Nullable;
Expand All @@ -34,11 +35,13 @@ private enum StorageFederationReference { NONE, NEW, OLD, GENESIS }
private final BridgeStorageProvider provider;
private final BridgeConstants bridgeConstants;
private final Block executionBlock;
private final ActivationConfig.ForBlock activations;

public FederationSupport(BridgeConstants bridgeConstants, BridgeStorageProvider provider, Block executionBlock) {
public FederationSupport(BridgeConstants bridgeConstants, BridgeStorageProvider provider, Block executionBlock, ActivationConfig.ForBlock activations) {
this.provider = provider;
this.bridgeConstants = bridgeConstants;
this.executionBlock = executionBlock;
this.activations = activations;
}

/**
Expand Down Expand Up @@ -226,6 +229,6 @@ private StorageFederationReference getRetiringFederationReference() {

private boolean shouldFederationBeActive(Federation federation) {
long federationAge = executionBlock.getNumber() - federation.getCreationBlockNumber();
return federationAge >= bridgeConstants.getFederationActivationAge();
return federationAge >= bridgeConstants.getFederationActivationAge(activations);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public void logCommitFederation(Block executionBlock, Federation oldFederation,
String oldFederationBtcAddress = oldFederation.getAddress().toBase58();
byte[] newFederationFlatPubKeys = flatKeysAsByteArray(newFederation.getBtcPublicKeys());
String newFederationBtcAddress = newFederation.getAddress().toBase58();
long newFedActivationBlockNumber = executionBlock.getNumber() + this.bridgeConstants.getFederationActivationAge();
long newFedActivationBlockNumber = executionBlock.getNumber() + this.bridgeConstants.getFederationActivationAge(activations);

CallTransaction.Function event = BridgeEvents.COMMIT_FEDERATION.getEvent();
byte[][] encodedTopicsInBytes = event.encodeEventTopics();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void logCommitFederation(Block executionBlock, Federation oldFederation,
byte[] newFedFlatPubKeys = flatKeysAsRlpCollection(newFederation.getBtcPublicKeys());
byte[] newFedData = RLP.encodeList(RLP.encodeElement(newFederation.getAddress().getHash160()), RLP.encodeList(newFedFlatPubKeys));

long newFedActivationBlockNumber = executionBlock.getNumber() + this.bridgeConstants.getFederationActivationAge();
long newFedActivationBlockNumber = executionBlock.getNumber() + this.bridgeConstants.getFederationActivationAge(activations);

byte[] data = RLP.encodeList(oldFedData, newFedData, RLP.encodeString(Long.toString(newFedActivationBlockNumber)));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,15 @@ public RemascFederationProvider(
BridgeConstants bridgeConstants,
Repository repository,
Block processingBlock) {

ActivationConfig.ForBlock activations = activationConfig.forBlock(processingBlock.getNumber());
BridgeStorageProvider bridgeStorageProvider = new BridgeStorageProvider(
repository,
PrecompiledContracts.BRIDGE_ADDR,
bridgeConstants,
activationConfig.forBlock(processingBlock.getNumber())
activations
);
this.federationSupport = new FederationSupport(bridgeConstants, bridgeStorageProvider, processingBlock);
this.federationSupport = new FederationSupport(bridgeConstants, bridgeStorageProvider, processingBlock, activations);
}

public int getFederationSize() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public enum ConsensusRule {
RSKIP374("rskip374"),
RSKIP375("rskip375"),
RSKIP377("rskip377"),
RSKIP383("rskip383"),
RSKIP385("rskip385"),
;

Expand Down
1 change: 1 addition & 0 deletions rskj-core/src/main/resources/expected.conf
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ blockchain = {
rskip374 = <hardforkName>
rskip375 = <hardforkName>
rskip377 = <hardforkName>
rskip383 = <hardforkName>
rskip385 = <hardforkName>
}
}
Expand Down
1 change: 1 addition & 0 deletions rskj-core/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ blockchain = {
rskip374 = fingerroot500
rskip375 = fingerroot500
rskip377 = fingerroot500
rskip383 = fingerroot500
rskip385 = fingerroot500
}
}
Expand Down
41 changes: 34 additions & 7 deletions rskj-core/src/test/java/co/rsk/config/BridgeConstantsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
import static org.mockito.Mockito.when;

class BridgeConstantsTest {

private static Stream<Arguments> generator() {
private static Stream<Arguments> fundsMigrationAgeSinceActivationEndArgsProvider() {
return Stream.of(
Arguments.of(BridgeMainNetConstants.getInstance(), false),
Arguments.of(BridgeTestNetConstants.getInstance(), true),
Expand All @@ -23,8 +22,8 @@ private static Stream<Arguments> generator() {
}

@ParameterizedTest()
@MethodSource("generator")
void test_getFundsMigrationAgeSinceActivationEnd(BridgeConstants bridgeConstants, boolean hasSameValueForBothMigrationAges) {
@MethodSource("fundsMigrationAgeSinceActivationEndArgsProvider")
void test_getFundsMigrationAgeSinceActivationEnd(BridgeConstants bridgeConstants, boolean hasSameValueForBothFields) {
// Arrange
ActivationConfig.ForBlock activations = mock(ActivationConfig.ForBlock.class);

Expand All @@ -33,11 +32,11 @@ void test_getFundsMigrationAgeSinceActivationEnd(BridgeConstants bridgeConstants

// assert
assertEquals(fundsMigrationAgeSinceActivationEnd, bridgeConstants.fundsMigrationAgeSinceActivationEnd);
assertEquals(hasSameValueForBothMigrationAges, fundsMigrationAgeSinceActivationEnd == bridgeConstants.specialCaseFundsMigrationAgeSinceActivationEnd);
assertEquals(hasSameValueForBothFields, fundsMigrationAgeSinceActivationEnd == bridgeConstants.specialCaseFundsMigrationAgeSinceActivationEnd);
}

@ParameterizedTest()
@MethodSource("generator")
@MethodSource("fundsMigrationAgeSinceActivationEndArgsProvider")
void test_getFundsMigrationAgeSinceActivationEnd_post_RSKIP357(BridgeConstants bridgeConstants, boolean hasSameValueForBothMigrationAges) {
// Arrange
ActivationConfig.ForBlock activations = mock(ActivationConfig.ForBlock.class);
Expand All @@ -52,7 +51,7 @@ void test_getFundsMigrationAgeSinceActivationEnd_post_RSKIP357(BridgeConstants b
}

@ParameterizedTest()
@MethodSource("generator")
@MethodSource("fundsMigrationAgeSinceActivationEndArgsProvider")
void test_getFundsMigrationAgeSinceActivationEnd_post_RSKIP374(BridgeConstants bridgeConstants, boolean hasSameValueForBothMigrationAges) {
// Arrange
ActivationConfig.ForBlock activations = mock(ActivationConfig.ForBlock.class);
Expand All @@ -66,4 +65,32 @@ void test_getFundsMigrationAgeSinceActivationEnd_post_RSKIP374(BridgeConstants b
assertEquals(fundsMigrationAgeSinceActivationEnd, bridgeConstants.fundsMigrationAgeSinceActivationEnd);
assertEquals(hasSameValueForBothMigrationAges, fundsMigrationAgeSinceActivationEnd == bridgeConstants.specialCaseFundsMigrationAgeSinceActivationEnd);
}

private static Stream<Arguments> federationActivationAgeArgProvider() {
return Stream.of(
Arguments.of(BridgeMainNetConstants.getInstance(), false),
Arguments.of(BridgeTestNetConstants.getInstance(), false),
Arguments.of(BridgeRegTestConstants.getInstance(), false),
Arguments.of(BridgeMainNetConstants.getInstance(), true),
Arguments.of(BridgeTestNetConstants.getInstance(), true),
Arguments.of(BridgeRegTestConstants.getInstance(), true)
);
}

@ParameterizedTest()
@MethodSource("federationActivationAgeArgProvider")
void test_getFederationActivationAge(BridgeConstants bridgeConstants, boolean isRSKIP383Active) {
// Arrange
ActivationConfig.ForBlock activations = mock(ActivationConfig.ForBlock.class);
when(activations.isActive(ConsensusRule.RSKIP383)).thenReturn(isRSKIP383Active);
// Act
long federationActivationAge = bridgeConstants.getFederationActivationAge(activations);

// assert
if (isRSKIP383Active){
assertEquals(bridgeConstants.federationActivationAge, federationActivationAge);
} else {
assertEquals(bridgeConstants.federationActivationAgeLegacy, federationActivationAge);
}
}
}
Loading

0 comments on commit e91cbec

Please sign in to comment.