Skip to content

Commit ce8f2d4

Browse files
authored
Merge pull request #524 from rsksmart/powpeg-refactors-integration
Powpeg refactors integration
2 parents 05793e7 + 0982da2 commit ce8f2d4

File tree

43 files changed

+671
-3152
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+671
-3152
lines changed

src/main/java/co/rsk/federate/FedNodeRunner.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
import co.rsk.federate.bitcoin.BitcoinWrapperImpl;
3030
import co.rsk.federate.bitcoin.Kit;
3131
import co.rsk.federate.btcreleaseclient.BtcReleaseClient;
32-
import co.rsk.federate.btcreleaseclient.BtcReleaseClientStorageAccessor;
33-
import co.rsk.federate.btcreleaseclient.BtcReleaseClientStorageSynchronizer;
3432
import co.rsk.federate.config.PowpegNodeSystemProperties;
3533
import co.rsk.federate.signing.config.SignerConfig;
3634
import co.rsk.federate.signing.config.SignerType;
@@ -69,10 +67,6 @@
6967
import java.util.List;
7068
import java.util.stream.Stream;
7169

72-
/**
73-
* Created by mario on 31/03/17.
74-
*/
75-
7670
public class FedNodeRunner implements NodeRunner {
7771
private static final Logger logger = LoggerFactory.getLogger(FedNodeRunner.class);
7872
private final BtcToRskClient btcToRskClientActive;
@@ -320,10 +314,8 @@ private void startFederate() throws Exception {
320314
hsmBookkeepingService.start();
321315
}
322316
federateLogger.log();
323-
BtcReleaseClientStorageAccessor btcReleaseClientStorageAccessor = new BtcReleaseClientStorageAccessor(config);
324317
btcReleaseClient.setup(
325318
signer,
326-
config.getActivationConfig(),
327319
new SignerMessageBuilderFactory(
328320
fedNodeContext.getReceiptStore()
329321
),
@@ -336,14 +328,6 @@ private void startFederate() throws Exception {
336328
fedNodeContext.getBlockStore(),
337329
hsmBookkeepingClient
338330
)
339-
),
340-
btcReleaseClientStorageAccessor,
341-
new BtcReleaseClientStorageSynchronizer(
342-
fedNodeContext.getBlockStore(),
343-
fedNodeContext.getReceiptStore(),
344-
fedNodeContext.getNodeBlockProcessor(),
345-
btcReleaseClientStorageAccessor,
346-
config.getBtcReleaseClientInitializationMaxDepth()
347331
)
348332
);
349333

src/main/java/co/rsk/federate/FederationProviderFromFederatorSupport.java

Lines changed: 47 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import static co.rsk.peg.federation.FederationChangeResponseCode.FEDERATION_NON_EXISTENT;
2121
import static co.rsk.peg.federation.FederationMember.KeyType;
22-
import static org.ethereum.config.blockchain.upgrades.ConsensusRule.*;
2322

2423
import co.rsk.bitcoinj.core.Address;
2524
import co.rsk.bitcoinj.core.BtcECKey;
@@ -64,31 +63,22 @@ public FederationProviderFromFederatorSupport(
6463
public Federation getActiveFederation() {
6564
List<FederationMember> members = new ArrayList<>();
6665
int federationSize = federatorSupport.getFederationSize();
67-
boolean useTypedPublicKeyGetter = federatorSupport.getConfigForBestBlock().isActive(RSKIP123);
6866
for (int i = 0; i < federationSize; i++) {
69-
// Select method depending on network configuration for best block
70-
FederationMember member;
71-
if (useTypedPublicKeyGetter) {
72-
BtcECKey btcKey = BtcECKey.fromPublicOnly(federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.BTC).getPubKey());
73-
ECKey rskKey = federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.RSK);
74-
ECKey mstKey = federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.MST);
75-
76-
member = new FederationMember(btcKey, rskKey, mstKey);
77-
} else {
78-
// Before the fork, all of BTC, RSK and MST keys are the same
79-
BtcECKey btcKey = federatorSupport.getFederatorPublicKey(i);
80-
ECKey rskMstKey = ECKey.fromPublicOnly(btcKey.getPubKey());
81-
member = new FederationMember(btcKey, rskMstKey, rskMstKey);
82-
}
67+
BtcECKey btcKey = BtcECKey.fromPublicOnly(federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.BTC).getPubKey());
68+
ECKey rskKey = federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.RSK);
69+
ECKey mstKey = federatorSupport.getFederatorPublicKeyOfType(i, FederationMember.KeyType.MST);
8370

71+
FederationMember member = new FederationMember(btcKey, rskKey, mstKey);
8472
members.add(member);
8573
}
8674
Instant creationTime = federatorSupport.getFederationCreationTime();
8775
long creationBlockNumber = federatorSupport.getFederationCreationBlockNumber();
8876
NetworkParameters btcParams = federatorSupport.getBtcParams();
8977
FederationArgs federationArgs = new FederationArgs(members, creationTime, creationBlockNumber, btcParams);
9078

91-
return getExpectedFederation(federationArgs, getActiveFederationAddress());
79+
Address activeFederationAddress = getActiveFederationAddress();
80+
logger.debug("[getActiveFederation] Attempting to get active federation with address {}", activeFederationAddress);
81+
return buildFederation(federationArgs, activeFederationAddress);
9282
}
9383

9484
@Override
@@ -105,25 +95,13 @@ public Optional<Federation> getRetiringFederation() {
10595
}
10696

10797
Address retiringFederationAddress = getRetiringFederationAddress().orElseThrow(IllegalStateException::new);
108-
boolean useTypedPublicKeyGetter = federatorSupport.getConfigForBestBlock().isActive(RSKIP123);
10998
List<FederationMember> members = new ArrayList<>();
11099
for (int i = 0; i < federationSize; i++) {
111-
// Select method depending on network configuration for best block
112-
FederationMember member;
113-
if (useTypedPublicKeyGetter) {
114-
BtcECKey btcKey = BtcECKey.fromPublicOnly(federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.BTC).getPubKey());
115-
ECKey rskKey = federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.RSK);
116-
ECKey mstKey = federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.MST);
117-
118-
member = new FederationMember(btcKey, rskKey, mstKey);
119-
} else {
120-
// Before the fork, all of BTC, RSK and MST keys are the same
121-
BtcECKey btcKey = federatorSupport.getRetiringFederatorPublicKey(i);
122-
ECKey rskMstKey = ECKey.fromPublicOnly(btcKey.getPubKey());
123-
124-
member = new FederationMember(btcKey, rskMstKey, rskMstKey);
125-
}
100+
BtcECKey btcKey = BtcECKey.fromPublicOnly(federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.BTC).getPubKey());
101+
ECKey rskKey = federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.RSK);
102+
ECKey mstKey = federatorSupport.getRetiringFederatorPublicKeyOfType(i, FederationMember.KeyType.MST);
126103

104+
FederationMember member = new FederationMember(btcKey, rskKey, mstKey);
127105
members.add(member);
128106
}
129107

@@ -132,7 +110,8 @@ public Optional<Federation> getRetiringFederation() {
132110
NetworkParameters btcParams = federatorSupport.getBtcParams();
133111
FederationArgs federationArgs = new FederationArgs(members, creationTime, creationBlockNumber, btcParams);
134112

135-
Federation retiringFederation = getExpectedFederation(federationArgs, retiringFederationAddress);
113+
logger.debug("[getRetiringFederation] Attempting to get retiring federation with address {}", retiringFederationAddress);
114+
Federation retiringFederation = buildFederation(federationArgs, retiringFederationAddress);
136115
return Optional.of(retiringFederation);
137116
}
138117

@@ -143,10 +122,6 @@ public Optional<Address> getRetiringFederationAddress() {
143122

144123
@Override
145124
public Optional<Federation> getProposedFederation() {
146-
if (!federatorSupport.getConfigForBestBlock().isActive(RSKIP419)) {
147-
return Optional.empty();
148-
}
149-
150125
int federationSize = federatorSupport.getProposedFederationSize()
151126
.orElse(FEDERATION_NON_EXISTENT.getCode());
152127
if (federationSize == FEDERATION_NON_EXISTENT.getCode()) {
@@ -175,68 +150,61 @@ public Optional<Federation> getProposedFederation() {
175150
federatorSupport.getBtcParams()
176151
);
177152

178-
Federation proposedFederation = buildProposedFederation(federationArgs);
179-
return Optional.of(proposedFederation);
180-
}
181-
182-
private Federation buildProposedFederation(FederationArgs federationArgs) {
183-
if (!federatorSupport.getConfigForBestBlock().isActive(RSKIP305)) {
184-
return FederationFactory.buildP2shErpFederation(
185-
federationArgs,
186-
federationConstants.getErpFedPubKeysList(),
187-
federationConstants.getErpFedActivationDelay());
188-
}
189-
190-
return FederationFactory.buildP2shP2wshErpFederation(
153+
Federation proposedFederation = FederationFactory.buildP2shP2wshErpFederation(
191154
federationArgs,
192155
federationConstants.getErpFedPubKeysList(),
193156
federationConstants.getErpFedActivationDelay());
157+
return Optional.of(proposedFederation);
194158
}
195159

196160
@Override
197161
public Optional<Address> getProposedFederationAddress() {
198162
return Optional.of(federatorSupport)
199-
.filter(fedSupport -> fedSupport.getConfigForBestBlock().isActive(RSKIP419))
200163
.flatMap(FederatorSupport::getProposedFederationAddress);
201164
}
202165

203-
private Federation getExpectedFederation(FederationArgs federationArgs, Address expectedFederationAddress) {
204-
logger.debug("[getExpectedFederation] Going to get expected federation with address {}", expectedFederationAddress);
166+
private Federation buildFederation(FederationArgs federationArgs, Address expectedFederationAddress) {
167+
return tryBuildingStandardMultiSigFederation(federationArgs, expectedFederationAddress)
168+
.or(() -> tryBuildingP2shP2wshErpFederation(federationArgs,
169+
expectedFederationAddress))
170+
.orElseThrow(() ->
171+
new IllegalStateException(
172+
String.format(
173+
"Cannot determine federation type for federation with address %s. Tried: standard multiSig, and P2SH-P2WSH ERP federations.",
174+
expectedFederationAddress
175+
)
176+
)
177+
);
178+
}
205179

180+
private Optional<Federation> tryBuildingStandardMultiSigFederation(FederationArgs federationArgs, Address expectedFederationAddress) {
206181
Federation standardMultiSigFederation = FederationFactory.buildStandardMultiSigFederation(federationArgs);
207-
if (standardMultiSigFederation.getAddress().equals(expectedFederationAddress)) {
208-
logger.debug("[getExpectedFederation] Expected federation is a standard multiSig one.");
209-
return standardMultiSigFederation;
182+
if (!standardMultiSigFederation.getAddress().equals(expectedFederationAddress)) {
183+
logger.debug("[tryBuildingStandardMultiSigFederation] Expected federation is not a standard multiSig one.");
184+
return Optional.empty();
210185
}
211186

212-
logger.debug("[getExpectedFederation] Expected federation is not a standard multiSig one.");
213-
List<BtcECKey> erpPubKeys = federationConstants.getErpFedPubKeysList();
214-
long activationDelay = federationConstants.getErpFedActivationDelay();
187+
logger.debug("[tryBuildingStandardMultiSigFederation] Expected federation is a standard multiSig one.");
188+
return Optional.of(standardMultiSigFederation);
189+
}
215190

191+
private Optional<Federation> tryBuildingP2shP2wshErpFederation(FederationArgs federationArgs, Address expectedFederationAddress) {
192+
ErpFederation p2shP2wshErpFederation;
216193
try {
217-
ErpFederation p2shErpFederation =
218-
FederationFactory.buildP2shErpFederation(federationArgs, erpPubKeys, activationDelay);
219-
220-
if (p2shErpFederation.getAddress().equals(expectedFederationAddress)) {
221-
logger.debug("[getExpectedFederation] Expected federation is a p2sh erp one.");
222-
return p2shErpFederation;
223-
}
194+
p2shP2wshErpFederation = FederationFactory.buildP2shP2wshErpFederation(
195+
federationArgs, federationConstants.getErpFedPubKeysList(),
196+
federationConstants.getErpFedActivationDelay());
224197
} catch (ErpFederationCreationException | ScriptCreationException e) {
225-
logger.debug("[getExpectedFederation] Expected federation is not a p2sh erp one.", e);
198+
logger.debug("[tryBuildingP2shP2wshErpFederation] Failed to build p2sh-p2wsh erp federation.", e);
199+
return Optional.empty();
226200
}
227201

228-
try {
229-
ErpFederation p2shP2wshErpFederation =
230-
FederationFactory.buildP2shP2wshErpFederation(federationArgs, erpPubKeys, activationDelay);
231-
232-
if (p2shP2wshErpFederation.getAddress().equals(expectedFederationAddress)) {
233-
logger.debug("[getExpectedFederation] Expected federation is a p2sh-p2wsh erp one.");
234-
return p2shP2wshErpFederation;
235-
}
236-
} catch (ErpFederationCreationException | ScriptCreationException e) {
237-
logger.error("[getExpectedFederation] Expected federation is not a p2sh-p2wsh erp one.", e);
202+
if (!p2shP2wshErpFederation.getAddress().equals(expectedFederationAddress)) {
203+
logger.debug("[tryBuildingP2shP2wshErpFederation] Expected federation is not a p2sh-p2wsh erp one.");
204+
return Optional.empty();
238205
}
239206

240-
throw new IllegalStateException("[getExpectedFederation] Cannot get expected federation.");
207+
logger.debug("[tryBuildingP2shP2wshErpFederation] Expected federation is a p2sh-p2wsh erp one.");
208+
return Optional.of(p2shP2wshErpFederation);
241209
}
242210
}

0 commit comments

Comments
 (0)