Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Commit

Permalink
Added the IbftFinalState (#385)
Browse files Browse the repository at this point in the history
  • Loading branch information
Errorific authored Dec 10, 2018
1 parent cf13676 commit ddca7c4
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 0 deletions.
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;
}
}
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);
}
}

0 comments on commit ddca7c4

Please sign in to comment.