diff --git a/hildr-node/src/main/java/io/optimism/common/BlockInfo.java b/hildr-node/src/main/java/io/optimism/common/BlockInfo.java index 6d0b0bce..f9c42d05 100644 --- a/hildr-node/src/main/java/io/optimism/common/BlockInfo.java +++ b/hildr-node/src/main/java/io/optimism/common/BlockInfo.java @@ -4,6 +4,7 @@ import java.math.BigInteger; import java.util.Objects; import org.web3j.protocol.core.methods.response.EthBlock.Block; +import org.web3j.utils.Numeric; /** * The type BlockInfo. @@ -19,6 +20,9 @@ */ public record BlockInfo(String hash, BigInteger number, String parentHash, BigInteger timestamp) { + public static final BlockInfo EMPTY = new BlockInfo( + Numeric.toHexString(new byte[32]), BigInteger.ZERO, Numeric.toHexString(new byte[32]), BigInteger.ZERO); + /** * From block info. * diff --git a/hildr-node/src/main/java/io/optimism/driver/Driver.java b/hildr-node/src/main/java/io/optimism/driver/Driver.java index a7f3e297..7d476798 100644 --- a/hildr-node/src/main/java/io/optimism/driver/Driver.java +++ b/hildr-node/src/main/java/io/optimism/driver/Driver.java @@ -38,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Optional; +import java.util.TreeMap; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; @@ -210,29 +211,16 @@ public static Driver from(Config config, CountDownLatch latch) l1StartBlock.compareTo(BigInteger.ZERO) < 0 ? BigInteger.ZERO : l1StartBlock, finalizedHead.number(), config); + TreeMap> l2Refs; + if (config.syncMode().isEl()) { + finalizedHead = BlockInfo.EMPTY; + l2Refs = new TreeMap<>(); + } else { + l2Refs = io.optimism.derive.State.initL2Refs(finalizedHead.number(), config.chainConfig(), l2Provider); + } - var l2Refs = io.optimism.derive.State.initL2Refs(finalizedHead.number(), config.chainConfig(), l2Provider); - var l2Fetcher = (Function>) blockNum -> { - try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { - StructuredTaskScope.Subtask blockTask = scope.fork(TracerTaskWrapper.wrap(() -> l2Provider - .ethGetBlockByNumber(DefaultBlockParameter.valueOf(blockNum), true) - .send())); - scope.join(); - scope.throwIfFailed(); - - var block = blockTask.get(); - if (block == null || block.getBlock() == null) { - return null; - } - final HeadInfo l2BlockInfo = HeadInfo.from(block.getBlock()); - return new Tuple2<>(l2BlockInfo.l2BlockInfo(), l2BlockInfo.l1Epoch()); - } catch (Exception e) { - LOGGER.error("failed to fetch L2 block", e); - return null; - } - }; - AtomicReference state = new AtomicReference<>( - io.optimism.derive.State.create(l2Refs, l2Fetcher, finalizedHead, finalizedEpoch, config)); + AtomicReference state = new AtomicReference<>(io.optimism.derive.State.create( + l2Refs, Driver.l2Fetcher(l2Provider), finalizedHead, finalizedEpoch, config)); EngineDriver engineDriver = new EngineDriver<>(finalizedHead, finalizedEpoch, l2Provider, config); @@ -302,6 +290,9 @@ public RollupConfigResult getRollupConfig() { * @return result of sync status. */ public SyncStatusResult getSyncStatus() { + if (this.engineDriver.isEngineSyncing()) { + return null; + } // CurrentL1 final var currentL1 = this.chainWatcher.getCurrentL1(); // CurrentL1Finalized @@ -362,7 +353,9 @@ protected void startUp() { LOGGER.error("driver start fatal error", e); throw new HildrServiceExecutionException(e); } - this.chainWatcher.start(); + if (!Driver.this.config.syncMode().isEl()) { + this.chainWatcher.start(); + } } @Override @@ -482,19 +475,30 @@ private void advanceUnsafeHead() throws ExecutionException, InterruptedException BigInteger unsafeBlockNum = payload.blockNumber(); BigInteger syncedBlockNum = Driver.this.engineDriver.getUnsafeHead().number(); + if (Driver.this.engineDriver.isEngineSyncing()) { + return unsafeBlockNum.compareTo(syncedBlockNum) > 0; + } return unsafeBlockNum.compareTo(syncedBlockNum) > 0 && unsafeBlockNum.subtract(syncedBlockNum).compareTo(BigInteger.valueOf(1024L)) < 0; }) .collect(Collectors.toList()); - Optional nextUnsafePayload = Iterables.tryFind( - this.futureUnsafeBlocks, input -> input.parentHash() - .equalsIgnoreCase( - Driver.this.engineDriver.getUnsafeHead().hash())) - .toJavaUtil(); + Optional nextUnsafePayload; + if (Driver.this.engineDriver.isEngineSyncing() && !this.futureUnsafeBlocks.isEmpty()) { + nextUnsafePayload = Optional.of(this.futureUnsafeBlocks.getLast()); + } else { + nextUnsafePayload = Iterables.tryFind(this.futureUnsafeBlocks, input -> input.parentHash() + .equalsIgnoreCase( + Driver.this.engineDriver.getUnsafeHead().hash())) + .toJavaUtil(); + } if (nextUnsafePayload.isPresent()) { this.engineDriver.handleUnsafePayload(nextUnsafePayload.get()); + if (this.config.syncMode().isEl() && !this.engineDriver.isEngineSyncing()) { + LOGGER.info("execution layer syncing is done, restarting chain watcher."); + this.restartChainWatcher(false); + } } } @@ -529,25 +533,28 @@ private void handleNextBlockUpdate() { case BlockUpdate.Reorg ignored -> { LOGGER.warn("reorg detected, purging pipeline"); Driver.this.unfinalizedBlocks.clear(); - - Driver.this.chainWatcher.restart( - Driver.this.engineDriver.getFinalizedEpoch().number().subtract(this.channelTimeout), - Driver.this.engineDriver.getFinalizedHead().number()); - - Driver.this.state.getAndUpdate(state -> { - state.purge( - Driver.this.engineDriver.getFinalizedHead(), Driver.this.engineDriver.getFinalizedEpoch()); - return state; - }); - - Driver.this.pipeline.purge(); - Driver.this.engineDriver.reorg(); + Driver.this.restartChainWatcher(true); } case BlockUpdate.FinalityUpdate num -> Driver.this.finalizedL1BlockNumber = num.get(); default -> throw new IllegalArgumentException("unknown block update type"); } } + private void restartChainWatcher(boolean isReorg) { + Driver.this.chainWatcher.restart( + Driver.this.engineDriver.getFinalizedEpoch().number().subtract(this.channelTimeout), + Driver.this.engineDriver.getFinalizedHead().number()); + + Driver.this.state.getAndUpdate(state -> { + state.purge(Driver.this.engineDriver.getFinalizedHead(), Driver.this.engineDriver.getFinalizedEpoch()); + return state; + }); + Driver.this.pipeline.purge(); + if (isReorg) { + Driver.this.engineDriver.reorg(); + } + } + private void updateFinalized() { UnfinalizedBlock newFinalized = Iterables.getLast( this.unfinalizedBlocks.stream() @@ -639,6 +646,28 @@ public static L2BlockRef payloadToRef(ExecutionPayload payload, Config.ChainConf sequenceNumber); } + private static Function> l2Fetcher(final Web3j l2Provider) { + return blockNum -> { + try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { + StructuredTaskScope.Subtask blockTask = scope.fork(TracerTaskWrapper.wrap(() -> l2Provider + .ethGetBlockByNumber(DefaultBlockParameter.valueOf(blockNum), true) + .send())); + scope.join(); + scope.throwIfFailed(); + + var block = blockTask.get(); + if (block == null || block.getBlock() == null) { + return null; + } + final HeadInfo l2BlockInfo = HeadInfo.from(block.getBlock()); + return new Tuple2<>(l2BlockInfo.l2BlockInfo(), l2BlockInfo.l1Epoch()); + } catch (Exception e) { + LOGGER.error("failed to fetch L2 block", e); + return null; + } + }; + } + /** * The type Unfinalized block. * diff --git a/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java b/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java index 7e4fcd58..61a403e6 100644 --- a/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java +++ b/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java @@ -184,7 +184,7 @@ public void handleUnsafePayload(ExecutionPayload payload) throws ExecutionExcept var l2Finalized = l2Client.ethGetBlockByNumber(DefaultBlockParameterName.FINALIZED, true) .sendAsync() .get(); - if (l2Finalized != null && l2Finalized.getBlock() != null) { + if (l2Finalized.hasError() && l2Finalized.getError().getMessage().contains("block not found")) { this.syncStatus = SyncStatus.StartedEL; LOGGER.info("Starting EL sync"); } else if (this.chainConfig.l2Genesis().number().compareTo(BigInteger.ZERO) != 0 @@ -241,6 +241,10 @@ public void reorg() { * @throws InterruptedException the interrupted exception */ public boolean engineReady() throws InterruptedException { + if (this.syncModeEl) { + // Skip check if EL sync is enabled + return true; + } ForkchoiceState forkchoiceState = createForkchoiceState(); try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { @@ -324,7 +328,7 @@ private void updateForkchoice() throws InterruptedException, ExecutionException this.syncStatus = SyncStatus.FinishedELNotFinalized; } // Allow SYNCING if engine P2P sync is enabled - if (forkChoiceUpdateStatus != Status.VALID && forkChoiceUpdateStatus != Status.SYNCING) { + if (forkChoiceUpdateStatus == Status.INVALID || forkChoiceUpdateStatus == Status.INVALID_BLOCK_HASH) { throw new ForkchoiceUpdateException(String.format( "could not accept new forkchoice: %s", forkChoiceUpdate.payloadStatus().getValidationError())); diff --git a/hildr-node/src/main/java/io/optimism/engine/EngineApi.java b/hildr-node/src/main/java/io/optimism/engine/EngineApi.java index 29211431..0f8b4164 100644 --- a/hildr-node/src/main/java/io/optimism/engine/EngineApi.java +++ b/hildr-node/src/main/java/io/optimism/engine/EngineApi.java @@ -88,7 +88,7 @@ public EngineApi fromEnv(Config config) { String baseUrlParm = System.getenv("ENGINE_API_URL"); if (StringUtils.isBlank(baseUrlParm)) { throw new RuntimeException( - """ + """ ENGINE_API_URL environment variable not set. Please set this to the base url of the engine api """); @@ -96,7 +96,7 @@ public EngineApi fromEnv(Config config) { String secretKey = System.getenv("JWT_SECRET"); if (StringUtils.isBlank(secretKey)) { throw new RuntimeException( - """ + """ JWT_SECRET environment variable not set. Please set this to the 256 bit hex-encoded secret key used to authenticate with the engine api. @@ -146,15 +146,15 @@ protected static String generateJws(Key key) { Date nowDate = Date.from(now); Date expirationDate = Date.from(now.plusSeconds(60)); return Jwts.builder() - .setIssuedAt(nowDate) - .setExpiration(expirationDate) - .signWith(key, SignatureAlgorithm.HS256) - .compact(); + .setIssuedAt(nowDate) + .setExpiration(expirationDate) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); } @Override public OpEthForkChoiceUpdate forkchoiceUpdated(ForkchoiceState forkchoiceState, PayloadAttributes payloadAttributes) - throws IOException { + throws IOException { var method = ENGINE_FORKCHOICE_UPDATED_V2; var ecotoneTime = this.config.chainConfig().ecotoneTime(); if (payloadAttributes == null || payloadAttributes.timestamp().compareTo(ecotoneTime) >= 0) { @@ -162,10 +162,10 @@ public OpEthForkChoiceUpdate forkchoiceUpdated(ForkchoiceState forkchoiceState, } web3jService.addHeader("authorization", String.format("Bearer %1$s", generateJws(key))); Request r = new Request<>( - method, - Arrays.asList(forkchoiceState, payloadAttributes != null ? payloadAttributes.toReq() : null), - web3jService, - OpEthForkChoiceUpdate.class); + method, + Arrays.asList(forkchoiceState, payloadAttributes != null ? payloadAttributes.toReq() : null), + web3jService, + OpEthForkChoiceUpdate.class); return r.send(); } @@ -197,11 +197,11 @@ public OpEthExecutionPayload getPayload(BigInteger timestamp, BigInteger payload } web3jService.addHeader("authorization", String.format("Bearer %1$s", generateJws(key))); Request r = new Request<>( - method, - Collections.singletonList( - payloadId != null ? Numeric.toHexStringWithPrefixZeroPadded(payloadId, 16) : null), - web3jService, - OpEthExecutionPayload.class); + method, + Collections.singletonList( + payloadId != null ? Numeric.toHexStringWithPrefixZeroPadded(payloadId, 16) : null), + web3jService, + OpEthExecutionPayload.class); return r.send(); } diff --git a/hildr-node/src/main/java/io/optimism/network/OpStackNetwork.java b/hildr-node/src/main/java/io/optimism/network/OpStackNetwork.java index 1a6feb8a..1eff8360 100644 --- a/hildr-node/src/main/java/io/optimism/network/OpStackNetwork.java +++ b/hildr-node/src/main/java/io/optimism/network/OpStackNetwork.java @@ -46,33 +46,50 @@ public class OpStackNetwork { private static final List BOOTNODES = List.of( "enr:-J64QBbwPjPLZ6IOOToOLsSjtFUjjzN66qmBZdUexpO32Klrc458Q24kbty2PdRaLacHM5z-cZQr8mjeQu3pik6jPSOGAYYFIqBfgmlkgnY0gmlwhDaRWFWHb3BzdGFja4SzlAUAiXNlY3AyNTZrMaECmeSnJh7zjKrDSPoNMGXoopeDF4hhpj5I0OsQUUt4u8uDdGNwgiQGg3VkcIIkBg", "enr:-J64QAlTCDa188Hl1OGv5_2Kj2nWCsvxMVc_rEnLtw7RPFbOfqUOV6khXT_PH6cC603I2ynY31rSQ8sI9gLeJbfFGaWGAYYFIrpdgmlkgnY0gmlwhANWgzCHb3BzdGFja4SzlAUAiXNlY3AyNTZrMaECkySjcg-2v0uWAsFsZZu43qNHppGr2D5F913Qqs5jDCGDdGNwgiQGg3VkcIIkBg", - "enr:-J24QGEzN4mJgLWNTUNwj7riVJ2ZjRLenOFccl2dbRFxHHOCCZx8SXWzgf-sLzrGs6QgqSFCvGXVgGPBkRkfOWlT1-iGAYe6Cu93gmlkgnY0gmlwhCJBEUSHb3BzdGFja4OkAwCJc2VjcDI1NmsxoQLuYIwaYOHg3CUQhCkS-RsSHmUd1b_x93-9yQ5ItS6udIN0Y3CCIyuDdWRwgiMr", - "enr:-Ku4QHqVeJ8PPICcWk1vSn_XcSkjOkNiTg6Fmii5j6vUQgvzMc9L1goFnLKgXqBJspJjIsB91LTOleFmyWWrFVATGngBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhAMRHkWJc2VjcDI1NmsxoQKLVXFOhp2uX6jeT0DvvDpPcU8FWMjQdR4wMuORMhpX24N1ZHCCIyg", - "enr:-Ku4QG-2_Md3sZIAUebGYT6g0SMskIml77l6yR-M_JXc-UdNHCmHQeOiMLbylPejyJsdAPsTHJyjJB2sYGDLe0dn8uYBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhBLY-NyJc2VjcDI1NmsxoQORcM6e19T1T9gi7jxEZjk_sjVLGFscUNqAY9obgZaxbIN1ZHCCIyg", - "enr:-Ku4QPn5eVhcoF1opaFEvg1b6JNFD2rqVkHQ8HApOKK61OIcIXD127bKWgAtbwI7pnxx6cDyk_nI88TrZKQaGMZj0q0Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDayLMaJc2VjcDI1NmsxoQK2sBOLGcUb4AwuYzFuAVCaNHA-dy24UuEKkeFNgCVCsIN1ZHCCIyg", - "enr:-Ku4QEWzdnVtXc2Q0ZVigfCGggOVB2Vc1ZCPEc6j21NIFLODSJbvNaef1g4PxhPwl_3kax86YPheFUSLXPRs98vvYsoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDZBrP2Jc2VjcDI1NmsxoQM6jr8Rb1ktLEsVcKAPa08wCsKUmvoQ8khiOl_SLozf9IN1ZHCCIyg", + // + // "enr:-J24QGEzN4mJgLWNTUNwj7riVJ2ZjRLenOFccl2dbRFxHHOCCZx8SXWzgf-sLzrGs6QgqSFCvGXVgGPBkRkfOWlT1-iGAYe6Cu93gmlkgnY0gmlwhCJBEUSHb3BzdGFja4OkAwCJc2VjcDI1NmsxoQLuYIwaYOHg3CUQhCkS-RsSHmUd1b_x93-9yQ5ItS6udIN0Y3CCIyuDdWRwgiMr", + // + // "enr:-Ku4QHqVeJ8PPICcWk1vSn_XcSkjOkNiTg6Fmii5j6vUQgvzMc9L1goFnLKgXqBJspJjIsB91LTOleFmyWWrFVATGngBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhAMRHkWJc2VjcDI1NmsxoQKLVXFOhp2uX6jeT0DvvDpPcU8FWMjQdR4wMuORMhpX24N1ZHCCIyg", + // + // "enr:-Ku4QG-2_Md3sZIAUebGYT6g0SMskIml77l6yR-M_JXc-UdNHCmHQeOiMLbylPejyJsdAPsTHJyjJB2sYGDLe0dn8uYBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhBLY-NyJc2VjcDI1NmsxoQORcM6e19T1T9gi7jxEZjk_sjVLGFscUNqAY9obgZaxbIN1ZHCCIyg", + // + // "enr:-Ku4QPn5eVhcoF1opaFEvg1b6JNFD2rqVkHQ8HApOKK61OIcIXD127bKWgAtbwI7pnxx6cDyk_nI88TrZKQaGMZj0q0Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDayLMaJc2VjcDI1NmsxoQK2sBOLGcUb4AwuYzFuAVCaNHA-dy24UuEKkeFNgCVCsIN1ZHCCIyg", + // + // "enr:-Ku4QEWzdnVtXc2Q0ZVigfCGggOVB2Vc1ZCPEc6j21NIFLODSJbvNaef1g4PxhPwl_3kax86YPheFUSLXPRs98vvYsoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDZBrP2Jc2VjcDI1NmsxoQM6jr8Rb1ktLEsVcKAPa08wCsKUmvoQ8khiOl_SLozf9IN1ZHCCIyg", // Base "enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG", "enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG", "enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG", "enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG", - "enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG", + "enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG" // Teku team (Consensys) - "enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", - "enr:-KG4QDyytgmE4f7AnvW-ZaUOIi9i79qX4JwjRAiXBZCU65wOfBu-3Nb5I7b_Rmg3KCOcZM_C3y5pg7EBU5XGrcLTduQEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaEDKnz_-ps3UUOfHWVYaskI5kWYO_vtYMGYCQRAR3gHDouDdGNwgiMog3VkcIIjKA", - // PegaSys Teku - "enr:-KG4QJRlj4pHagfNIm-Fsx9EVjW4rviuZYzle3tyddm2KAWMJBDGAhxfM2g-pDaaiwE8q19uvLSH4jyvWjypLMr3TIcEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", - "enr:-KG4QL-eqFoHy0cI31THvtZjpYUu_Jdw_MO7skQRJxY1g5HTN1A0epPCU6vi0gLGUgrzpU-ygeMSS8ewVxDpKfYmxMMGhGV0aDKQtTA_KgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaED8GJ2vzUqgL6-KD1xalo1CsmY4X1HaDnyl6Y_WayCo9GDdGNwgiMog3VkcIIjKA", - // Prysmatic Labs - "enr:-Ku4QImhMc1z8yCiNJ1TyUxdcfNucje3BGwEHzodEZUan8PherEo4sF7pPHPSIB1NNuSg5fZy7qFsjmUKs2ea1Whi0EBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQOVphkDqal4QzPMksc5wnpuC3gvSC8AfbFOnZY_On34wIN1ZHCCIyg", - "enr:-Ku4QP2xDnEtUXIjzJ_DhlCRN9SN99RYQPJL92TMlSv7U5C1YnYLjwOQHgZIUXw6c-BvRg2Yc2QsZxxoS_pPRVe0yK8Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMeFF5GrS7UZpAH2Ly84aLK-TyvH-dRo0JM1i8yygH50YN1ZHCCJxA", - "enr:-Ku4QPp9z1W4tAO8Ber_NQierYaOStqhDqQdOPY3bB3jDgkjcbk6YrEnVYIiCBbTxuar3CzS528d2iE7TdJsrL-dEKoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMw5fqqkw2hHC4F5HZZDPsNmPdB1Gi8JPQK7pRc9XHh-oN1ZHCCKvg", - // Sigp Lighthouse - "enr:-Jq4QItoFUuug_n_qbYbU0OY04-np2wT8rUCauOOXNi0H3BWbDj-zbfZb7otA7jZ6flbBpx1LNZK2TDebZ9dEKx84LYBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISsaa0ZiXNlY3AyNTZrMaEDHAD2JKYevx89W0CcFJFiskdcEzkH_Wdv9iW42qLK79ODdWRwgiMo", - "enr:-Jq4QN_YBsUOqQsty1OGvYv48PMaiEt1AzGD1NkYQHaxZoTyVGqMYXg0K9c0LPNWC9pkXmggApp8nygYLsQwScwAgfgBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISLosQxiXNlY3AyNTZrMaEDBJj7_dLFACaxBfaI8KZTh_SSJUjhyAyfshimvSqo22WDdWRwgiMo", - // Nimbus - "enr:-LK4QA8FfhaAjlb_BXsXxSfiysR7R52Nhi9JBt4F8SPssu8hdE1BXQQEtVDC3qStCW60LSO7hEsVHv5zm8_6Vnjhcn0Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhAN4aBKJc2VjcDI1NmsxoQJerDhsJ-KxZ8sHySMOCmTO6sHM3iCFQ6VMvLTe948MyYN0Y3CCI4yDdWRwgiOM", - "enr:-LK4QKWrXTpV9T78hNG6s8AM6IO4XH9kFT91uZtFg1GcsJ6dKovDOr1jtAAFPnS2lvNltkOGA9k29BUN7lFh_sjuc9QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhANAdd-Jc2VjcDI1NmsxoQLQa6ai7y9PMN5hpLe5HmiJSlYzMuzP7ZhwRiwHvqNXdoN0Y3CCI4yDdWRwgiOM"); + // + // "enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", + // + // "enr:-KG4QDyytgmE4f7AnvW-ZaUOIi9i79qX4JwjRAiXBZCU65wOfBu-3Nb5I7b_Rmg3KCOcZM_C3y5pg7EBU5XGrcLTduQEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaEDKnz_-ps3UUOfHWVYaskI5kWYO_vtYMGYCQRAR3gHDouDdGNwgiMog3VkcIIjKA", + // // PegaSys Teku + // + // "enr:-KG4QJRlj4pHagfNIm-Fsx9EVjW4rviuZYzle3tyddm2KAWMJBDGAhxfM2g-pDaaiwE8q19uvLSH4jyvWjypLMr3TIcEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", + // + // "enr:-KG4QL-eqFoHy0cI31THvtZjpYUu_Jdw_MO7skQRJxY1g5HTN1A0epPCU6vi0gLGUgrzpU-ygeMSS8ewVxDpKfYmxMMGhGV0aDKQtTA_KgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaED8GJ2vzUqgL6-KD1xalo1CsmY4X1HaDnyl6Y_WayCo9GDdGNwgiMog3VkcIIjKA", + // // Prysmatic Labs + // + // "enr:-Ku4QImhMc1z8yCiNJ1TyUxdcfNucje3BGwEHzodEZUan8PherEo4sF7pPHPSIB1NNuSg5fZy7qFsjmUKs2ea1Whi0EBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQOVphkDqal4QzPMksc5wnpuC3gvSC8AfbFOnZY_On34wIN1ZHCCIyg", + // + // "enr:-Ku4QP2xDnEtUXIjzJ_DhlCRN9SN99RYQPJL92TMlSv7U5C1YnYLjwOQHgZIUXw6c-BvRg2Yc2QsZxxoS_pPRVe0yK8Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMeFF5GrS7UZpAH2Ly84aLK-TyvH-dRo0JM1i8yygH50YN1ZHCCJxA", + // + // "enr:-Ku4QPp9z1W4tAO8Ber_NQierYaOStqhDqQdOPY3bB3jDgkjcbk6YrEnVYIiCBbTxuar3CzS528d2iE7TdJsrL-dEKoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMw5fqqkw2hHC4F5HZZDPsNmPdB1Gi8JPQK7pRc9XHh-oN1ZHCCKvg", + // // Sigp Lighthouse + // + // "enr:-Jq4QItoFUuug_n_qbYbU0OY04-np2wT8rUCauOOXNi0H3BWbDj-zbfZb7otA7jZ6flbBpx1LNZK2TDebZ9dEKx84LYBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISsaa0ZiXNlY3AyNTZrMaEDHAD2JKYevx89W0CcFJFiskdcEzkH_Wdv9iW42qLK79ODdWRwgiMo", + // + // "enr:-Jq4QN_YBsUOqQsty1OGvYv48PMaiEt1AzGD1NkYQHaxZoTyVGqMYXg0K9c0LPNWC9pkXmggApp8nygYLsQwScwAgfgBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISLosQxiXNlY3AyNTZrMaEDBJj7_dLFACaxBfaI8KZTh_SSJUjhyAyfshimvSqo22WDdWRwgiMo", + // // Nimbus + // + // "enr:-LK4QA8FfhaAjlb_BXsXxSfiysR7R52Nhi9JBt4F8SPssu8hdE1BXQQEtVDC3qStCW60LSO7hEsVHv5zm8_6Vnjhcn0Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhAN4aBKJc2VjcDI1NmsxoQJerDhsJ-KxZ8sHySMOCmTO6sHM3iCFQ6VMvLTe948MyYN0Y3CCI4yDdWRwgiOM", + // + // "enr:-LK4QKWrXTpV9T78hNG6s8AM6IO4XH9kFT91uZtFg1GcsJ6dKovDOr1jtAAFPnS2lvNltkOGA9k29BUN7lFh_sjuc9QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhANAdd-Jc2VjcDI1NmsxoQLQa6ai7y9PMN5hpLe5HmiJSlYzMuzP7ZhwRiwHvqNXdoN0Y3CCI4yDdWRwgiOM" + ); private final P2PNetwork p2pNetwork; private final List topicHandlers; diff --git a/hildr-utilities/src/main/java/io/optimism/utilities/TxDecoder.java b/hildr-utilities/src/main/java/io/optimism/utilities/TxDecoder.java index bcb04eaf..5810462f 100644 --- a/hildr-utilities/src/main/java/io/optimism/utilities/TxDecoder.java +++ b/hildr-utilities/src/main/java/io/optimism/utilities/TxDecoder.java @@ -52,14 +52,14 @@ public static DepositTransaction decodeToDeposit(final String hexTransaction) { final RlpList rlpList = RlpDecoder.decode(encodedTx); var values = ((RlpList) rlpList.getValues().getFirst()).getValues(); final String sourceHash = ((RlpString) values.getFirst()).asString(); - final String from = ((RlpString) values.getFirst()).asString(); - final String to = ((RlpString) values.getFirst()).asString(); - final BigInteger mint = ((RlpString) values.getFirst()).asPositiveBigInteger(); - final BigInteger value = ((RlpString) values.getFirst()).asPositiveBigInteger(); - final BigInteger gas = ((RlpString) values.getFirst()).asPositiveBigInteger(); + final String from = ((RlpString) values.get(1)).asString(); + final String to = ((RlpString) values.get(2)).asString(); + final BigInteger mint = ((RlpString) values.get(3)).asPositiveBigInteger(); + final BigInteger value = ((RlpString) values.get(4)).asPositiveBigInteger(); + final BigInteger gas = ((RlpString) values.get(5)).asPositiveBigInteger(); final boolean isSystemTx = - ((RlpString) values.getFirst()).asPositiveBigInteger().compareTo(BigInteger.ONE) == 0; - final String data = ((RlpString) values.getFirst()).asString(); + ((RlpString) values.get(6)).asPositiveBigInteger().compareTo(BigInteger.ONE) == 0; + final String data = ((RlpString) values.getLast()).asString(); return new DepositTransaction(sourceHash, from, to, mint, value, gas, isSystemTx, data); } } diff --git a/hildr-utilities/src/main/java/io/optimism/utilities/rpc/Web3jProvider.java b/hildr-utilities/src/main/java/io/optimism/utilities/rpc/Web3jProvider.java index e2d74937..34f54794 100644 --- a/hildr-utilities/src/main/java/io/optimism/utilities/rpc/Web3jProvider.java +++ b/hildr-utilities/src/main/java/io/optimism/utilities/rpc/Web3jProvider.java @@ -59,7 +59,7 @@ public static Tuple2 create(String url, Function create(String url, Function