This repository has been archived by the owner on Sep 26, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 130
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
186 additions
and
0 deletions.
There are no files selected for viewing
120 changes: 120 additions & 0 deletions
120
.../ibft/src/main/java/tech/pegasys/pantheon/consensus/ibft/statemachine/IbftFinalState.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/* | ||
* Copyright 2018 ConsenSys AG. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
*/ | ||
package tech.pegasys.pantheon.consensus.ibft.statemachine; | ||
|
||
import static tech.pegasys.pantheon.consensus.ibft.IbftHelpers.calculateRequiredValidatorQuorum; | ||
|
||
import tech.pegasys.pantheon.consensus.common.ValidatorProvider; | ||
import tech.pegasys.pantheon.consensus.common.VoteTally; | ||
import tech.pegasys.pantheon.consensus.ibft.BlockTimer; | ||
import tech.pegasys.pantheon.consensus.ibft.ConsensusRoundIdentifier; | ||
import tech.pegasys.pantheon.consensus.ibft.IbftContext; | ||
import tech.pegasys.pantheon.consensus.ibft.RoundTimer; | ||
import tech.pegasys.pantheon.consensus.ibft.blockcreation.IbftBlockCreatorFactory; | ||
import tech.pegasys.pantheon.consensus.ibft.blockcreation.ProposerSelector; | ||
import tech.pegasys.pantheon.consensus.ibft.ibftmessagedata.MessageFactory; | ||
import tech.pegasys.pantheon.consensus.ibft.network.IbftNetworkPeers; | ||
import tech.pegasys.pantheon.crypto.SECP256K1.KeyPair; | ||
import tech.pegasys.pantheon.ethereum.core.Address; | ||
import tech.pegasys.pantheon.ethereum.mainnet.BlockHeaderValidator; | ||
|
||
import java.util.Collection; | ||
|
||
/** This is the full data set, or context, required for many of the aspects of the IBFT workflow. */ | ||
public class IbftFinalState { | ||
private final ValidatorProvider validatorProvider; | ||
private final KeyPair nodeKeys; | ||
private final Address localAddress; | ||
private final ProposerSelector proposerSelector; | ||
private final IbftNetworkPeers peers; | ||
private final RoundTimer roundTimer; | ||
private final BlockTimer blockTimer; | ||
private final IbftBlockCreatorFactory blockCreatorFactory; | ||
private final MessageFactory messageFactory; | ||
private final BlockHeaderValidator<IbftContext> ibftContextBlockHeaderValidator; | ||
|
||
public IbftFinalState( | ||
final VoteTally validatorProvider, | ||
final KeyPair nodeKeys, | ||
final Address localAddress, | ||
final ProposerSelector proposerSelector, | ||
final IbftNetworkPeers peers, | ||
final RoundTimer roundTimer, | ||
final BlockTimer blockTimer, | ||
final IbftBlockCreatorFactory blockCreatorFactory, | ||
final MessageFactory messageFactory, | ||
final BlockHeaderValidator<IbftContext> ibftContextBlockHeaderValidator) { | ||
this.validatorProvider = validatorProvider; | ||
this.nodeKeys = nodeKeys; | ||
this.localAddress = localAddress; | ||
this.proposerSelector = proposerSelector; | ||
this.peers = peers; | ||
this.roundTimer = roundTimer; | ||
this.blockTimer = blockTimer; | ||
this.blockCreatorFactory = blockCreatorFactory; | ||
this.messageFactory = messageFactory; | ||
this.ibftContextBlockHeaderValidator = ibftContextBlockHeaderValidator; | ||
} | ||
|
||
public int getQuorumSize() { | ||
return calculateRequiredValidatorQuorum(validatorProvider.getValidators().size()); | ||
} | ||
|
||
public Collection<Address> getValidators() { | ||
return validatorProvider.getValidators(); | ||
} | ||
|
||
public KeyPair getNodeKeys() { | ||
return nodeKeys; | ||
} | ||
|
||
public Address getLocalAddress() { | ||
return localAddress; | ||
} | ||
|
||
public ProposerSelector getProposerSelector() { | ||
return proposerSelector; | ||
} | ||
|
||
public boolean isLocalNodeProposerForRound(final ConsensusRoundIdentifier roundIdentifier) { | ||
return getProposerForRound(roundIdentifier).equals(localAddress); | ||
} | ||
|
||
public IbftNetworkPeers getPeers() { | ||
return peers; | ||
} | ||
|
||
public RoundTimer getRoundTimer() { | ||
return roundTimer; | ||
} | ||
|
||
public BlockTimer getBlockTimer() { | ||
return blockTimer; | ||
} | ||
|
||
public IbftBlockCreatorFactory getBlockCreatorFactory() { | ||
return blockCreatorFactory; | ||
} | ||
|
||
public MessageFactory getMessageFactory() { | ||
return messageFactory; | ||
} | ||
|
||
public Address getProposerForRound(final ConsensusRoundIdentifier roundIdentifier) { | ||
return proposerSelector.selectProposerForRound(roundIdentifier); | ||
} | ||
|
||
public BlockHeaderValidator<IbftContext> getBlockHeaderValidator() { | ||
return ibftContextBlockHeaderValidator; | ||
} | ||
} |
66 changes: 66 additions & 0 deletions
66
consensus/ibft/src/test/java/tech/pegasys/pantheon/consensus/ibft/IbftHelpersTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
* Copyright 2018 ConsenSys AG. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
*/ | ||
package tech.pegasys.pantheon.consensus.ibft; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static tech.pegasys.pantheon.consensus.ibft.IbftHelpers.calculateRequiredValidatorQuorum; | ||
|
||
import org.junit.Test; | ||
|
||
public class IbftHelpersTest { | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum1Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(1)).isEqualTo(1); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum2Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(2)).isEqualTo(2); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum3Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(3)).isEqualTo(2); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum4Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(4)).isEqualTo(3); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum5Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(5)).isEqualTo(4); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum7Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(7)).isEqualTo(5); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum10Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(10)).isEqualTo(7); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum15Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(15)).isEqualTo(10); | ||
} | ||
|
||
@Test | ||
public void calculateRequiredValidatorQuorum20Validator() { | ||
assertThat(calculateRequiredValidatorQuorum(20)).isEqualTo(14); | ||
} | ||
} |