Skip to content

Commit

Permalink
fix for fast sync regression on post-merge networks, ensure ranges co…
Browse files Browse the repository at this point in the history
…ntain rules for only pre- or post-merge blocks, not both

Signed-off-by: garyschulte <garyschulte@gmail.com>
  • Loading branch information
garyschulte committed Aug 5, 2022
1 parent 8f89580 commit b95fece
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
*/
package org.hyperledger.besu.ethereum.mainnet.headervalidationrules;

import org.hyperledger.besu.config.MergeConfigOptions;
import org.hyperledger.besu.ethereum.ProtocolContext;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.mainnet.AttachedBlockHeaderValidationRule;
Expand All @@ -37,9 +36,6 @@ public CalculatedDifficultyValidationRule(final DifficultyCalculator difficultyC
@Override
public boolean validate(
final BlockHeader header, final BlockHeader parent, final ProtocolContext context) {
if (MergeConfigOptions.isMergeEnabled()) {
return true;
}
final BigInteger actualDifficulty = new BigInteger(1, header.getDifficulty().toArray());
final BigInteger expectedDifficulty =
difficultyCalculator.nextDifficulty(header.getTimestamp(), parent, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

import static java.lang.Boolean.FALSE;

import org.hyperledger.besu.config.MergeConfigOptions;
import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.mainnet.DetachedBlockHeaderValidationRule;
Expand Down Expand Up @@ -70,12 +69,6 @@ public boolean validate(final BlockHeader header, final BlockHeader parent) {
return false;
}

// TODO: remove this rule bypass, use post-merge headervalidation rules
// https://github.com/hyperledger/besu/issues/2898
if (MergeConfigOptions.isMergeEnabled()) {
return true;
}

final Hash headerHash = hashHeader(header);
PoWSolution solution =
hasher.hash(header.getNonce(), header.getNumber(), epochCalculator, headerHash);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

import static com.google.common.base.Preconditions.checkArgument;

import org.hyperledger.besu.config.MergeConfigOptions;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.mainnet.DetachedBlockHeaderValidationRule;

Expand All @@ -36,9 +35,6 @@ public TimestampMoreRecentThanParent(final long minimumSecondsSinceParent) {

@Override
public boolean validate(final BlockHeader header, final BlockHeader parent) {
if (MergeConfigOptions.isMergeEnabled()) {
return true;
}
return validateTimestamp(header.getTimestamp(), parent.getTimestamp());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.hyperledger.besu.ethereum.chain.BadBlockManager;
import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.Difficulty;
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
import org.hyperledger.besu.ethereum.eth.manager.EthPeer;
import org.hyperledger.besu.ethereum.eth.manager.task.AbstractGetHeadersFromPeerTask;
Expand All @@ -43,6 +44,7 @@
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

import com.google.common.primitives.Ints;
import org.slf4j.Logger;
Expand Down Expand Up @@ -172,16 +174,37 @@ private CompletableFuture<PeerTaskResult<List<BlockHeader>>> downloadHeaders(
});
}

private List<BlockHeader> filterResultToSingleRuleset(final List<BlockHeader> headers) {

// ensure this range does not cross TTD, use difficulty as a proxy for header rules changes:
if (headers.size() > 1) {
// headers range are fetched in reverse chain order:
boolean rangeEnd = Difficulty.ZERO.lessThan(headers.get(0).getDifficulty());
boolean rangeStart =
Difficulty.ZERO.lessThan(headers.get(headers.size() - 1).getDifficulty());

if (rangeEnd != rangeStart) {
return headers.stream()
.filter(header -> !header.getDifficulty().equals(Difficulty.ZERO))
.collect(Collectors.toList());
}
}
return headers;
}

private CompletableFuture<List<BlockHeader>> processHeaders(
final PeerTaskResult<List<BlockHeader>> headersResult) {

final var sameRulesHeaders = filterResultToSingleRuleset(headersResult.getResult());

return executeWorkerSubTask(
ethContext.getScheduler(),
() -> {
final CompletableFuture<List<BlockHeader>> future = new CompletableFuture<>();
BlockHeader child = null;
boolean firstSkipped = false;
final int previousHeaderIndex = lastFilledHeaderIndex;
for (final BlockHeader header : headersResult.getResult()) {
for (final BlockHeader header : sameRulesHeaders) {
final int headerIndex =
Ints.checkedCast(
segmentLength - (referenceHeader.getNumber() - header.getNumber()));
Expand Down

0 comments on commit b95fece

Please sign in to comment.