Skip to content
This repository has been archived by the owner on Dec 5, 2024. It is now read-only.

Commit

Permalink
Use BeaconValidator interface for beacon validations
Browse files Browse the repository at this point in the history
  • Loading branch information
zilm13 committed Nov 14, 2018
1 parent 583d51d commit 9324ce2
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,15 @@
import org.ethereum.sharding.processing.state.StateRepository;
import org.ethereum.sharding.processing.validation.AttestationsValidator;
import org.ethereum.sharding.processing.validation.BeaconValidator;
import org.ethereum.sharding.processing.validation.BeaconValidatorImpl;
import org.ethereum.sharding.processing.validation.StateValidator;
import org.ethereum.sharding.pubsub.Publisher;
import org.ethereum.sharding.registration.ValidatorRepository;
import org.ethereum.sharding.validator.BeaconAttester;

import java.util.ArrayList;
import java.util.List;

/**
* A factory that creates {@link BeaconChain} instance.
*
Expand All @@ -52,14 +56,15 @@ public class BeaconChainFactory {
public static BeaconChain create(DbFlushManager beaconDbFlusher, BeaconStore store,
StateRepository repository, StateTransition<BeaconState> genesisStateTransition,
StateTransition<BeaconState> stateTransitionFunction, Sign sign) {

BeaconValidator beaconValidator = new BeaconValidator(store);
List<BeaconValidator> beaconValidators = new ArrayList<BeaconValidator>() {{
add(new BeaconValidatorImpl(store));
add(new AttestationsValidator(store, repository, sign));
}};
StateValidator stateValidator = new StateValidator();
AttestationsValidator attestationsValidator = new AttestationsValidator(store, repository, sign);
ScoreFunction scoreFunction = new MaximumVotesAsScore(store);

return new BeaconChainImpl(beaconDbFlusher, store, stateTransitionFunction, repository,
beaconValidator, stateValidator, attestationsValidator, scoreFunction, genesisStateTransition);
beaconValidators, stateValidator, scoreFunction, genesisStateTransition);
}

public static BeaconChain create(DbFlushManager beaconDbFlusher, BeaconStore store, StateRepository repository,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.ethereum.core.Block;
import org.ethereum.db.DbFlushManager;
import org.ethereum.sharding.processing.consensus.GenesisTransition;
import org.ethereum.sharding.processing.validation.AttestationsValidator;
import org.ethereum.sharding.pubsub.Event;
import org.ethereum.sharding.pubsub.Publisher;
import org.ethereum.sharding.processing.consensus.ScoreFunction;
Expand All @@ -38,6 +37,7 @@
import org.springframework.beans.factory.annotation.Autowired;

import java.math.BigInteger;
import java.util.List;

import static org.ethereum.sharding.pubsub.Events.onBeaconBlock;
import static org.ethereum.sharding.pubsub.Events.onBeaconChainLoaded;
Expand All @@ -58,8 +58,7 @@ public class BeaconChainImpl implements BeaconChain {

StateTransition<BeaconState> transitionFunction;
StateTransition<BeaconState> genesisStateTransition;
BeaconValidator beaconValidator;
AttestationsValidator attestationsValidator;
List<BeaconValidator> beaconValidators;
StateValidator stateValidator;
StateRepository repository;
ScoreFunction scoreFunction;
Expand All @@ -70,16 +69,14 @@ public class BeaconChainImpl implements BeaconChain {

public BeaconChainImpl(DbFlushManager beaconDbFlusher, BeaconStore store,
StateTransition<BeaconState> transitionFunction, StateRepository repository,
BeaconValidator beaconValidator, StateValidator stateValidator,
AttestationsValidator attestationsValidator, ScoreFunction scoreFunction,
StateTransition<BeaconState> genesisStateTransition) {
List<BeaconValidator> beaconValidators, StateValidator stateValidator,
ScoreFunction scoreFunction, StateTransition<BeaconState> genesisStateTransition) {
this.beaconDbFlusher = beaconDbFlusher;
this.store = store;
this.transitionFunction = transitionFunction;
this.repository = repository;
this.beaconValidator = beaconValidator;
this.beaconValidators = beaconValidators;
this.stateValidator = stateValidator;
this.attestationsValidator = attestationsValidator;
this.scoreFunction = scoreFunction;
this.genesisStateTransition = genesisStateTransition;
}
Expand Down Expand Up @@ -121,10 +118,10 @@ public Beacon getCanonicalHead() {
@Override
public synchronized ProcessingResult insert(Beacon block) {
ValidationResult vRes;
if ((vRes = beaconValidator.validateAndLog(block)) != ValidationResult.Success)
return ProcessingResult.fromValidation(vRes);
if ((vRes = attestationsValidator.validateAndLog(block)) != ValidationResult.Success)
return ProcessingResult.fromValidation(vRes);
for (BeaconValidator validator : beaconValidators) {
if ((vRes = validator.validateAndLog(block)) != ValidationResult.Success)
return ProcessingResult.fromValidation(vRes);
}

// apply state transition
Beacon parent = pullParent(block);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package org.ethereum.sharding.processing.validation;

import org.ethereum.sharding.crypto.DummySign;
import org.ethereum.sharding.crypto.Sign;
import org.ethereum.sharding.domain.Beacon;
import org.ethereum.sharding.processing.db.BeaconStore;
Expand All @@ -35,7 +34,6 @@

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static org.ethereum.sharding.processing.consensus.BeaconConstants.CYCLE_LENGTH;
Expand All @@ -46,7 +44,7 @@
/**
* Validates block attestations
*/
public class AttestationsValidator {
public class AttestationsValidator implements BeaconValidator {

private static final Logger logger = LoggerFactory.getLogger("beacon");

Expand All @@ -69,10 +67,6 @@ private AttestationsValidator(BeaconStore store, StateRepository repository,
this.rules = rules;
}

public static AttestationsValidator createDummy() {
return new AttestationsValidator(null, null, new DummySign(), Collections.emptyList());
}

/**
* Basic proposer attestation validation:
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,50 +15,14 @@
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/

package org.ethereum.sharding.processing.validation;

import org.ethereum.sharding.domain.Beacon;
import org.ethereum.sharding.processing.db.BeaconStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

import static org.ethereum.sharding.processing.validation.ValidationResult.Exist;
import static org.ethereum.sharding.processing.validation.ValidationResult.NoParent;
import static org.ethereum.sharding.processing.validation.ValidationResult.Success;

/**
* Runs a set of basic validations that is triggered before block processing.
*
* @author Mikhail Kalinin
* @since 16.08.2018
* Runs a validation or a set of validations of beacon block
*/
public class BeaconValidator {

private static final Logger logger = LoggerFactory.getLogger("beacon");

BeaconStore store;
List<ValidationRule<BeaconStore>> rules;

public BeaconValidator(BeaconStore store) {
this.store = store;

rules = new ArrayList<>();
rules.add((block, st) -> st.exist(block.getHash()) ? Exist : Success);
rules.add((block, st) -> st.exist(block.getParentHash()) ? Success : NoParent);
}

public ValidationResult validateAndLog(Beacon block) {
for (ValidationRule<BeaconStore> rule : rules) {
ValidationResult res = rule.apply(block, store);
if (res != Success) {
logger.info("Process block {}, status: {}", block.toString(), res);
return res;
}
}

return Success;
}
public interface BeaconValidator {
ValidationResult validateAndLog(Beacon block);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.sharding.processing.validation;

import org.ethereum.sharding.domain.Beacon;
import org.ethereum.sharding.processing.db.BeaconStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

import static org.ethereum.sharding.processing.validation.ValidationResult.Exist;
import static org.ethereum.sharding.processing.validation.ValidationResult.NoParent;
import static org.ethereum.sharding.processing.validation.ValidationResult.Success;

/**
* Runs a set of basic validations that is triggered before block processing.
*
* @author Mikhail Kalinin
* @since 16.08.2018
*/
public class BeaconValidatorImpl implements BeaconValidator {

private static final Logger logger = LoggerFactory.getLogger("beacon");

BeaconStore store;
List<ValidationRule<BeaconStore>> rules;

public BeaconValidatorImpl(BeaconStore store) {
this.store = store;

rules = new ArrayList<>();
rules.add((block, st) -> st.exist(block.getHash()) ? Exist : Success);
rules.add((block, st) -> st.exist(block.getParentHash()) ? Success : NoParent);
}

@Override
public ValidationResult validateAndLog(Beacon block) {
for (ValidationRule<BeaconStore> rule : rules) {
ValidationResult res = rule.apply(block, store);
if (res != Success) {
logger.info("Process block {}, status: {}", block.toString(), res);
return res;
}
}

return Success;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,15 @@
import org.ethereum.sharding.processing.state.BeaconState;
import org.ethereum.sharding.processing.state.BeaconStateRepository;
import org.ethereum.sharding.processing.state.StateRepository;
import org.ethereum.sharding.processing.validation.AttestationsValidator;
import org.ethereum.sharding.processing.validation.BeaconValidator;
import org.ethereum.sharding.processing.validation.BeaconValidatorImpl;
import org.ethereum.sharding.processing.validation.StateValidator;
import org.junit.Test;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Future;

Expand Down Expand Up @@ -188,8 +189,11 @@ static Helper newInstance() {
inst.store = new IndexedBeaconStore(new HashMapDB<>(), new HashMapDB<>());
inst.repository = new BeaconStateRepository(new HashMapDB<>(), new HashMapDB<>(),
new HashMapDB<>(), new HashMapDB<>(), new HashMapDB<>());
inst.beaconChain = new BeaconChainImpl(new DummyFlusher(), inst.store, new NoTransition(), inst.repository,
new BeaconValidator(inst.store), new StateValidator(), AttestationsValidator.createDummy(),
List<BeaconValidator> beaconValidators = new ArrayList<BeaconValidator>() {{
add(new BeaconValidatorImpl(inst.store));
}};
inst.beaconChain = new BeaconChainImpl(new DummyFlusher(), inst.store, new NoTransition(),
inst.repository, beaconValidators, new StateValidator(),
(block, state) -> BigInteger.valueOf(block.getMainChainRef()[0]), new NoTransition());
return inst;
}
Expand Down

0 comments on commit 9324ce2

Please sign in to comment.