Skip to content

Commit

Permalink
2209 testing using fast import working
Browse files Browse the repository at this point in the history
Signed-off-by: Justin Florentine <justin.florentine@consensys.net>
  • Loading branch information
jflo committed Jun 22, 2021
1 parent 8f86832 commit 196d3ee
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResult;
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.BlockDataGenerator;
import org.hyperledger.besu.ethereum.core.BlockImporter;
import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider;
import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode;
Expand All @@ -52,31 +53,49 @@ public class EthGetBlockByNumberLatestDesyncIntegrationTest {

private static JsonRpcMethod ethGetBlockNumber;
private static Long latestFullySyncdBlockNumber = 0L;
private static Long latestFastSyncdBlockNumber = 0L;

@BeforeClass
public static void setUpOnce() throws Exception {
final String genesisJson =
Resources.toString(BlockTestUtil.getTestGenesisUrl(), Charsets.UTF_8);
final BlockchainImporter importer =
new BlockchainImporter(BlockTestUtil.getTestBlockchainUrl(), genesisJson);

final BlockDataGenerator gen = new BlockDataGenerator();
final WorldStateArchive state =
InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive();
// TODO: run same test with coverage of Bonsai state?

importer.getGenesisState().writeStateTo(state.getMutable());
final Block genesis = importer.getGenesisBlock();
final MutableBlockchain blockchain =
InMemoryKeyValueStorageProvider.createInMemoryBlockchain(importer.getGenesisBlock());
final ProtocolContext ether = new ProtocolContext(blockchain, state, null);
final ProtocolSchedule protocolSchedule = importer.getProtocolSchedule();

final ProtocolSpec genesisSpec =
protocolSchedule.getByBlockNumber(genesis.getHeader().getNumber());
final BlockImporter genesisSpecBlockImporter = genesisSpec.getBlockImporter();
//genesisSpecBlockImporter.fastImportBlock(ether, genesis, gen.receipts(genesis),
// HeaderValidationMode.LIGHT_SKIP_DETACHED, HeaderValidationMode.LIGHT_SKIP_DETACHED);
genesisSpecBlockImporter.importBlock(ether, genesis, HeaderValidationMode.FULL, HeaderValidationMode.FULL);

for (final Block block : importer.getBlocks()) {
final ProtocolSpec protocolSpec =
protocolSchedule.getByBlockNumber(block.getHeader().getNumber());
final BlockImporter blockImporter = protocolSpec.getBlockImporter();
blockImporter.importBlock(ether, block, HeaderValidationMode.LIGHT);
//blockImporter.importBlock(ether, block, HeaderValidationMode.LIGHT);
blockImporter.fastImportBlock(ether, block,gen.receipts(block),
HeaderValidationMode.LIGHT_SKIP_DETACHED,HeaderValidationMode.LIGHT_SKIP_DETACHED);
latestFastSyncdBlockNumber = block.getHeader().getNumber();
}


int pivotBlockIndex = importer.getBlocks().size() / 3;
for(int i = pivotBlockIndex; i< pivotBlockIndex*2; i++) { //Then do a third of 'em FULL,
//TODO: the way we are establishing state isn't exactly analogous to what is happening in a fastsync.

for(int i = 0; i< pivotBlockIndex*2; i++) { //Then do a third of 'em FULL,
Block toReimportFully = importer.getBlocks().get(i);
final ProtocolSpec protocolSpec = protocolSchedule.getByBlockNumber(
toReimportFully.getHeader().getNumber());
Expand All @@ -95,6 +114,7 @@ public static void setUpOnce() throws Exception {
public void shouldReturnedLatestFullSynced() {

assertThat(latestFullySyncdBlockNumber.longValue()).isNotEqualTo(0L);
assertThat(latestFastSyncdBlockNumber.longValue()).isNotEqualTo(latestFullySyncdBlockNumber);
//otherwise our setup didn't work as expected
Object[] params = {"latest", false};
JsonRpcRequestContext ctx = new JsonRpcRequestContext(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,20 @@
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods;

import com.google.common.base.Suppliers;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.BlockParameter;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResult;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory;
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
import org.hyperledger.besu.ethereum.chain.ChainHead;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.Hash;


import java.util.function.Supplier;

import com.google.common.base.Suppliers;

public class EthGetBlockByNumber extends AbstractBlockParameterMethod {

Expand Down Expand Up @@ -66,9 +70,22 @@ protected Object resultByBlockNumber(

@Override
protected Object latestResult(final JsonRpcRequestContext request) {
//old behavior - throws exception when trransactions incomplete on head.
return resultByBlockNumber(request, blockchainQueries.get().headBlockNumber());
//old behavior - throws exception when transactions incomplete on head.
//return resultByBlockNumber(request, blockchainQueries.get().headBlockNumber());
//if head has state, return that.


final long headBlockNumber = blockchainQueries.get().headBlockNumber();
BlockHeader headHeader = blockchainQueries.get().getBlockchain().getBlockHeader(headBlockNumber).orElse(null);

Hash block = headHeader.getHash();
Hash stateRoot = headHeader.getStateRoot();

if(blockchainQueries.get().getWorldStateArchive().isWorldStateAvailable(stateRoot, block)) {
return resultByBlockNumber(request, headBlockNumber);
} else {
return resultByBlockNumber(request, blockchainQueries.get().getBlockchain().getGenesisBlock().getHeader().getNumber());
}
}

private BlockResult transactionComplete(final long blockNumber) {
Expand Down

0 comments on commit 196d3ee

Please sign in to comment.