diff --git a/src/Nethermind/Nethermind.Blockchain/BlockTree.cs b/src/Nethermind/Nethermind.Blockchain/BlockTree.cs index d2a96800259..69404c62a4e 100644 --- a/src/Nethermind/Nethermind.Blockchain/BlockTree.cs +++ b/src/Nethermind/Nethermind.Blockchain/BlockTree.cs @@ -628,32 +628,6 @@ as it does not require the step of resolving number -> hash */ return result; } - public BlockHeader? FindLowestCommonAncestor(BlockHeader firstDescendant, BlockHeader secondDescendant, - long maxSearchDepth) - { - if (firstDescendant.Number > secondDescendant.Number) - { - firstDescendant = GetAncestorAtNumber(firstDescendant, secondDescendant.Number); - } - else if (secondDescendant.Number > firstDescendant.Number) - { - secondDescendant = GetAncestorAtNumber(secondDescendant, firstDescendant.Number); - } - - long currentSearchDepth = 0; - while ( - firstDescendant is not null - && secondDescendant is not null - && firstDescendant.Hash != secondDescendant.Hash) - { - if (currentSearchDepth++ >= maxSearchDepth) return null; - firstDescendant = this.FindParentHeader(firstDescendant, BlockTreeLookupOptions.TotalDifficultyNotNeeded); - secondDescendant = this.FindParentHeader(secondDescendant, BlockTreeLookupOptions.TotalDifficultyNotNeeded); - } - - return firstDescendant; - } - private BlockHeader? GetAncestorAtNumber(BlockHeader header, long number) { BlockHeader? result = header; diff --git a/src/Nethermind/Nethermind.Blockchain/IBlockTree.cs b/src/Nethermind/Nethermind.Blockchain/IBlockTree.cs index 1bfbfaa6f87..006f2de938b 100644 --- a/src/Nethermind/Nethermind.Blockchain/IBlockTree.cs +++ b/src/Nethermind/Nethermind.Blockchain/IBlockTree.cs @@ -153,8 +153,6 @@ AddBlockResult Insert(Block block, BlockTreeInsertBlockOptions insertBlockOption IOwnedReadOnlyList FindHeaders(Hash256 hash, int numberOfBlocks, int skip, bool reverse); - BlockHeader FindLowestCommonAncestor(BlockHeader firstDescendant, BlockHeader secondDescendant, long maxSearchDepth); - void DeleteInvalidBlock(Block invalidBlock); void ForkChoiceUpdated(Hash256? finalizedBlockHash, Hash256? safeBlockBlockHash); diff --git a/src/Nethermind/Nethermind.Blockchain/ReadOnlyBlockTree.cs b/src/Nethermind/Nethermind.Blockchain/ReadOnlyBlockTree.cs index 5ceaacf2495..7b5f21f81b8 100644 --- a/src/Nethermind/Nethermind.Blockchain/ReadOnlyBlockTree.cs +++ b/src/Nethermind/Nethermind.Blockchain/ReadOnlyBlockTree.cs @@ -106,8 +106,6 @@ public void UpdateHeadBlock(Hash256 blockHash) public IOwnedReadOnlyList FindHeaders(Hash256 hash, int numberOfBlocks, int skip, bool reverse) => _wrapped.FindHeaders(hash, numberOfBlocks, skip, reverse); - public BlockHeader FindLowestCommonAncestor(BlockHeader firstDescendant, BlockHeader secondDescendant, long maxSearchDepth) => _wrapped.FindLowestCommonAncestor(firstDescendant, secondDescendant, maxSearchDepth); - public Block FindBlock(long blockNumber, BlockTreeLookupOptions options) => _wrapped.FindBlock(blockNumber, options); public void DeleteInvalidBlock(Block invalidBlock) => throw new InvalidOperationException($"{nameof(ReadOnlyBlockTree)} does not expect {nameof(DeleteInvalidBlock)} calls"); diff --git a/src/Nethermind/Nethermind.Db.Rocks/Config/DbConfig.cs b/src/Nethermind/Nethermind.Db.Rocks/Config/DbConfig.cs index 71cb99f3e43..630bf656c6d 100644 --- a/src/Nethermind/Nethermind.Db.Rocks/Config/DbConfig.cs +++ b/src/Nethermind/Nethermind.Db.Rocks/Config/DbConfig.cs @@ -153,19 +153,6 @@ public class DbConfig : IDbConfig public long? BloomDbMaxBytesPerSec { get; set; } public IDictionary? BloomDbAdditionalRocksDbOptions { get; set; } - // TODO - profile and customize - public ulong CanonicalHashTrieDbWriteBufferSize { get; set; } = (ulong)2.MB(); - public uint CanonicalHashTrieDbWriteBufferNumber { get; set; } = 4; - public ulong CanonicalHashTrieDbBlockCacheSize { get; set; } = 0; - public bool CanonicalHashTrieDbCacheIndexAndFilterBlocks { get; set; } = false; - public int? CanonicalHashTrieDbMaxOpenFiles { get; set; } - public long? CanonicalHashTrieDbMaxBytesPerSec { get; set; } - public int? CanonicalHashTrieDbBlockSize { get; set; } - public bool? CanonicalHashTrieUseDirectReads { get; set; } - public bool? CanonicalHashTrieUseDirectIoForFlushAndCompactions { get; set; } - public ulong? CanonicalHashTrieCompactionReadAhead { get; set; } - public IDictionary? CanonicalHashTrieDbAdditionalRocksDbOptions { get; set; } - public ulong MetadataDbWriteBufferSize { get; set; } = (ulong)1.KiB(); public uint MetadataDbWriteBufferNumber { get; set; } = 4; public ulong MetadataDbBlockCacheSize { get; set; } = 0; diff --git a/src/Nethermind/Nethermind.Db.Rocks/Config/IDbConfig.cs b/src/Nethermind/Nethermind.Db.Rocks/Config/IDbConfig.cs index f77c991ad07..912dec55060 100644 --- a/src/Nethermind/Nethermind.Db.Rocks/Config/IDbConfig.cs +++ b/src/Nethermind/Nethermind.Db.Rocks/Config/IDbConfig.cs @@ -154,18 +154,6 @@ public interface IDbConfig : IConfig long? BloomDbMaxBytesPerSec { get; set; } IDictionary? BloomDbAdditionalRocksDbOptions { get; set; } - ulong CanonicalHashTrieDbWriteBufferSize { get; set; } - uint CanonicalHashTrieDbWriteBufferNumber { get; set; } - ulong CanonicalHashTrieDbBlockCacheSize { get; set; } - bool CanonicalHashTrieDbCacheIndexAndFilterBlocks { get; set; } - int? CanonicalHashTrieDbMaxOpenFiles { get; set; } - long? CanonicalHashTrieDbMaxBytesPerSec { get; set; } - int? CanonicalHashTrieDbBlockSize { get; set; } - bool? CanonicalHashTrieUseDirectReads { get; set; } - bool? CanonicalHashTrieUseDirectIoForFlushAndCompactions { get; set; } - ulong? CanonicalHashTrieCompactionReadAhead { get; set; } - IDictionary? CanonicalHashTrieDbAdditionalRocksDbOptions { get; set; } - ulong MetadataDbWriteBufferSize { get; set; } uint MetadataDbWriteBufferNumber { get; set; } ulong MetadataDbBlockCacheSize { get; set; } diff --git a/src/Nethermind/Nethermind.Db.Test/Config/PerTableDbConfigTests.cs b/src/Nethermind/Nethermind.Db.Test/Config/PerTableDbConfigTests.cs index fffea25d6a3..22f78e51939 100644 --- a/src/Nethermind/Nethermind.Db.Test/Config/PerTableDbConfigTests.cs +++ b/src/Nethermind/Nethermind.Db.Test/Config/PerTableDbConfigTests.cs @@ -13,8 +13,8 @@ public class PerTableDbConfigTests public void CanReadAllConfigForAllTable() { DbConfig dbConfig = new DbConfig(); - string[] tables = new[] - { + string[] tables = + [ DbNames.Storage, DbNames.State, DbNames.Code, @@ -23,9 +23,8 @@ public void CanReadAllConfigForAllTable() DbNames.Receipts, DbNames.BlockInfos, DbNames.Bloom, - DbNames.CHT, - DbNames.Metadata, - }; + DbNames.Metadata + ]; foreach (string table in tables) { diff --git a/src/Nethermind/Nethermind.Db.Test/StandardDbInitializerTests.cs b/src/Nethermind/Nethermind.Db.Test/StandardDbInitializerTests.cs index 7c5dd5f1582..6b927954aae 100644 --- a/src/Nethermind/Nethermind.Db.Test/StandardDbInitializerTests.cs +++ b/src/Nethermind/Nethermind.Db.Test/StandardDbInitializerTests.cs @@ -85,7 +85,6 @@ private void AssertStandardDbs(IDbProvider dbProvider, Type dbType, Type receipt dbProvider.BlockInfosDb.Should().BeOfType(dbType); dbProvider.BlocksDb.Should().BeOfType(dbType); dbProvider.BloomDb.Should().BeOfType(dbType); - dbProvider.ChtDb.Should().BeOfType(dbType); dbProvider.HeadersDb.Should().BeOfType(dbType); dbProvider.ReceiptsDb.Should().BeOfType(receiptsDb); dbProvider.CodeDb.Should().BeOfType(dbType); diff --git a/src/Nethermind/Nethermind.Db/DbNames.cs b/src/Nethermind/Nethermind.Db/DbNames.cs index acd051ac5c6..7b8459430f9 100644 --- a/src/Nethermind/Nethermind.Db/DbNames.cs +++ b/src/Nethermind/Nethermind.Db/DbNames.cs @@ -15,7 +15,6 @@ public static class DbNames public const string BlockInfos = "blockInfos"; public const string BadBlocks = "badBlocks"; public const string Bloom = "bloom"; - public const string CHT = "canonicalHashTrie"; public const string Metadata = "metadata"; public const string BlobTransactions = "blobTransactions"; } diff --git a/src/Nethermind/Nethermind.Db/IDbProvider.cs b/src/Nethermind/Nethermind.Db/IDbProvider.cs index 4c502d4b7c9..7786271bc74 100644 --- a/src/Nethermind/Nethermind.Db/IDbProvider.cs +++ b/src/Nethermind/Nethermind.Db/IDbProvider.cs @@ -20,9 +20,6 @@ public interface IDbProvider : IDisposable // BloomDB progress / config (does not contain blooms - they are kept in bloom storage) public IDb BloomDb => GetDb(DbNames.Bloom); - // LES (ignore) - public IDb ChtDb => GetDb(DbNames.CHT); - public IDb MetadataDb => GetDb(DbNames.Metadata); public IColumnsDb BlobTransactionsDb => GetColumnDb(DbNames.BlobTransactions); diff --git a/src/Nethermind/Nethermind.Db/StandardDbInitializer.cs b/src/Nethermind/Nethermind.Db/StandardDbInitializer.cs index dc78ea2e4a5..c5fe7f0bf3d 100644 --- a/src/Nethermind/Nethermind.Db/StandardDbInitializer.cs +++ b/src/Nethermind/Nethermind.Db/StandardDbInitializer.cs @@ -52,7 +52,6 @@ DbFactory is not MemDbFactory RegisterDb(BuildDbSettings(DbNames.Code)); RegisterDb(BuildDbSettings(DbNames.Bloom)); - RegisterDb(BuildDbSettings(DbNames.CHT)); if (useReceiptsDb) { RegisterColumnsDb(BuildDbSettings(DbNames.Receipts)); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs index 5b747c50a9b..c3c79865a07 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs @@ -35,10 +35,8 @@ using Nethermind.Stats.Model; using Nethermind.Synchronization; using Nethermind.Synchronization.Blocks; -using Nethermind.Synchronization.LesSync; using Nethermind.Synchronization.ParallelSync; using Nethermind.Synchronization.Peers; -using Nethermind.Synchronization.Reporting; using Nethermind.Synchronization.SnapSync; using Nethermind.Synchronization.Trie; using Nethermind.TxPool; @@ -102,8 +100,6 @@ private async Task Initialize(CancellationToken cancellationToken) NetworkDiagTracer.Start(_api.LogManager); } - CanonicalHashTrie cht = new CanonicalHashTrie(_api.DbProvider!.ChtDb); - _api.BetterPeerStrategy = new TotalDifficultyBetterPeerStrategy(_api.LogManager); int maxPeersCount = _networkConfig.ActivePeersMaxCount; @@ -181,10 +177,8 @@ private async Task Initialize(CancellationToken cancellationToken) _api.Config(), _api.GossipPolicy, _api.SpecProvider!, - _api.LogManager, - cht); + _api.LogManager); - _ = syncServer.BuildCHT(); _api.DisposeStack.Push(syncServer); InitDiscovery(); diff --git a/src/Nethermind/Nethermind.Network.Contract/P2P/Protocol.cs b/src/Nethermind/Nethermind.Network.Contract/P2P/Protocol.cs index 25528489c6f..4175cc638a8 100644 --- a/src/Nethermind/Nethermind.Network.Contract/P2P/Protocol.cs +++ b/src/Nethermind/Nethermind.Network.Contract/P2P/Protocol.cs @@ -30,10 +30,6 @@ public static class Protocol /// public const string Bzz = "bzz"; /// - /// Lightweight Clients - /// - public const string Les = "les"; - /// /// Parity Warp Sync /// public const string Par = "par"; diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/AnnounceMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/AnnounceMessageSerializerTests.cs deleted file mode 100644 index ab1384d86dc..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/AnnounceMessageSerializerTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class AnnounceMessageSerializerTests - { - [Test] - public void RoundTripWithRequiredData() - { - using AnnounceMessage announceMessage = new(); - announceMessage.HeadHash = Keccak.Compute("1"); - announceMessage.HeadBlockNo = 4; - announceMessage.TotalDifficulty = 131200; - announceMessage.ReorgDepth = 0; - - AnnounceMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, announceMessage, "e8a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6048302008080c0"); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockBodiesSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockBodiesSerializerTests.cs deleted file mode 100644 index 38723f845dc..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockBodiesSerializerTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -/// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core; -using Nethermind.Core.Test.Builders; -using Nethermind.Crypto; -using Nethermind.Logging; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using Nethermind.Specs; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class BlockBodiesSerializerTests - { - [Test] - public void RoundTrip() - { - BlockHeader header = Build.A.BlockHeader.TestObject; - Address to = Build.An.Address.FromNumber(1).TestObject; - Transaction tx = Build.A.Transaction.WithTo(to).SignedAndResolved(new EthereumEcdsa(MainnetSpecProvider.Instance.ChainId, LimboLogs.Instance), TestItem.PrivateKeyA).TestObject; - tx.SenderAddress = null; - var ethMessage = new Network.P2P.Subprotocols.Eth.V62.Messages.BlockBodiesMessage(); - ethMessage.Bodies = new(new[] { new BlockBody(new[] { tx }, new[] { header }) }); - - using BlockBodiesMessage message = new(ethMessage, 1, 1000); - - BlockBodiesMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockHeadersMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockHeadersMessageSerializerTests.cs deleted file mode 100644 index 538ad03f5b6..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/BlockHeadersMessageSerializerTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core; -using Nethermind.Core.Collections; -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class BlockHeadersMessageSerializerTests - { - [Test] - public void RoundTrip() - { - var ethMessage = new Network.P2P.Subprotocols.Eth.V62.Messages.BlockHeadersMessage(); - ethMessage.BlockHeaders = new ArrayPoolList(1) { Build.A.BlockHeader.TestObject }; - using BlockHeadersMessage message = new(ethMessage, 2, 3000); - - BlockHeadersMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ContractCodesMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ContractCodesMessageSerializerTests.cs deleted file mode 100644 index 0c0e4427a73..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ContractCodesMessageSerializerTests.cs +++ /dev/null @@ -1,25 +0,0 @@ -/// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Collections; -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class ContractCodesMessageSerializerTests - { - [Test] - public void RoundTrip() - { - ArrayPoolList data = new(3) { TestItem.KeccakA.BytesToArray(), TestItem.KeccakB.BytesToArray(), TestItem.KeccakC.BytesToArray() }; - using ContractCodesMessage message = new(data, 13452, 134); - - ContractCodesMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockBodiesMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockBodiesMessageSerializerTests.cs deleted file mode 100644 index 444d47a032b..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockBodiesMessageSerializerTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class GetBlockBodiesMessageSerializerTests - { - [Test] - public void RoundTrip() - { - var ethMessage = new Network.P2P.Subprotocols.Eth.V62.Messages.GetBlockBodiesMessage(Keccak.OfAnEmptySequenceRlp, Keccak.Zero, Keccak.EmptyTreeHash); - var message = new GetBlockBodiesMessage(ethMessage, 1); - - GetBlockBodiesMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message, "f86601f863a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347a00000000000000000000000000000000000000000000000000000000000000000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockHeadersMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockHeadersMessageSerializerTests.cs deleted file mode 100644 index bbef9b11c24..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetBlockHeadersMessageSerializerTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class GetBlockHeadersMessageSerializerTests - { - [Test] - public void RoundTripWithHash() - { - var ethMessage = new Network.P2P.Subprotocols.Eth.V62.Messages.GetBlockHeadersMessage(); - ethMessage.StartBlockHash = Keccak.Compute("1"); - ethMessage.MaxHeaders = 10; - ethMessage.Skip = 2; - ethMessage.Reverse = 0; - - var message = new GetBlockHeadersMessage(ethMessage, 2); - - GetBlockHeadersMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message, "e602e4a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc60a0280"); - } - - [Test] - public void RoundTripWithNumber() - { - var ethMessage = new Network.P2P.Subprotocols.Eth.V62.Messages.GetBlockHeadersMessage(); - ethMessage.StartBlockNumber = 1; - ethMessage.MaxHeaders = 10; - ethMessage.Skip = 2; - ethMessage.Reverse = 0; - - var message = new GetBlockHeadersMessage(ethMessage, 2); - - GetBlockHeadersMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message, "c602c4010a0280"); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetContractCodesMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetContractCodesMessageSerializerTests.cs deleted file mode 100644 index dd88c9e3d90..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetContractCodesMessageSerializerTests.cs +++ /dev/null @@ -1,30 +0,0 @@ -/// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class GetContractCodesMessageSerializerTests - { - [Test] - public void RoundTrip() - { - CodeRequest[] requests = new CodeRequest[] - { - new(TestItem.KeccakA, TestItem.KeccakB), - new(TestItem.KeccakC, TestItem.KeccakD), - }; - - using GetContractCodesMessage message = new(requests, 774); - - GetContractCodesMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetHelperTrieProofsMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetHelperTrieProofsMessageSerializerTests.cs deleted file mode 100644 index f58ba84a90f..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetHelperTrieProofsMessageSerializerTests.cs +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class GetHelperTrieProofsMessageSerializerTests - { - [Test] - public void RoundTrip() - { - HelperTrieRequest[] requests = new HelperTrieRequest[] - { - new(HelperTrieType.CHT, 177, TestItem.RandomDataA, 2, 1), - new(HelperTrieType.BloomBits, 77, TestItem.RandomDataB, 4, 0), - }; - using GetHelperTrieProofsMessage message = new(); - message.RequestId = 100; - message.Requests = requests; - - GetHelperTrieProofsMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetReceiptsMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetReceiptsMessageSerializerTests.cs deleted file mode 100644 index eb07234cd78..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/GetReceiptsMessageSerializerTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Core.Extensions; -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class GetReceiptsMessageSerializerTests - { - [Test] - public void RoundTrip() - { - Hash256[] hashes = { TestItem.KeccakA, TestItem.KeccakB, TestItem.KeccakC }; - var ethMessage = new Network.P2P.Subprotocols.Eth.V63.Messages.GetReceiptsMessage(hashes.ToPooledList()); - - using GetReceiptsMessage getReceiptsMessage = new(ethMessage, 1); - - GetReceiptsMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, getReceiptsMessage); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/HelperTrieProofsMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/HelperTrieProofsMessageSerializerTests.cs deleted file mode 100644 index 0386738a5c2..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/HelperTrieProofsMessageSerializerTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using Nethermind.Serialization.Rlp; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class HelperTrieProofsMessageSerializerTests - { - [Test] - public void RoundTrip() - { - byte[][] proofs = new byte[][] - { - TestItem.KeccakA.BytesToArray(), - TestItem.KeccakB.BytesToArray(), - TestItem.KeccakC.BytesToArray(), - TestItem.KeccakD.BytesToArray(), - TestItem.KeccakE.BytesToArray(), - TestItem.KeccakF.BytesToArray(), - }; - byte[][] auxData = new byte[][] - { - TestItem.KeccakG.BytesToArray(), - TestItem.KeccakH.BytesToArray(), - Rlp.Encode(Build.A.BlockHeader.TestObject).Bytes, - }; - var message = new HelperTrieProofsMessage(proofs, auxData, 324, 734); - - HelperTrieProofsMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, message); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ReceiptsMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ReceiptsMessageSerializerTests.cs deleted file mode 100644 index 614e8d840c9..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/ReceiptsMessageSerializerTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core; -using Nethermind.Core.Extensions; -using Nethermind.Specs; -using Nethermind.Core.Test.Builders; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class ReceiptsMessageSerializerTests - { - [Test] - public void RoundTrip() - { - TxReceipt[][] data = { new[] { Build.A.Receipt.WithAllFieldsFilled.TestObject, Build.A.Receipt.WithAllFieldsFilled.WithBlockNumber(0).TestObject }, new[] { Build.A.Receipt.WithAllFieldsFilled.TestObject, Build.A.Receipt.WithAllFieldsFilled.TestObject }, new[] { Build.A.Receipt.WithAllFieldsFilled.WithTxType(TxType.AccessList).TestObject, Build.A.Receipt.WithAllFieldsFilled.TestObject } }; - using Network.P2P.Subprotocols.Eth.V63.Messages.ReceiptsMessage ethMessage = new(data.ToPooledList()); - using ReceiptsMessage receiptsMessage = new(ethMessage, 1, 2000); - - ReceiptsMessageSerializer serializer = new(MainnetSpecProvider.Instance); - - // Eth.ReceiptsMessageSerializer intentionally excludes fields when deserializing. - // I think it's probably best to not copy the test logic checking for this here. - byte[] bytes = serializer.Serialize(receiptsMessage); - using ReceiptsMessage deserialized = serializer.Deserialize(bytes); - - Assert.That(deserialized.RequestId, Is.EqualTo(receiptsMessage.RequestId), "RequestId"); - Assert.That(deserialized.BufferValue, Is.EqualTo(receiptsMessage.BufferValue), "BufferValue"); - } - } -} diff --git a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/StatusMessageSerializerTests.cs b/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/StatusMessageSerializerTests.cs deleted file mode 100644 index 2b8652d7a6a..00000000000 --- a/src/Nethermind/Nethermind.Network.Test/P2P/Subprotocols/Les/StatusMessageSerializerTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.Subprotocols.Les; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using NUnit.Framework; - -namespace Nethermind.Network.Test.P2P.Subprotocols.Les -{ - [TestFixture] - public class StatusMessageSerializerTests - { - [Test] - public void RoundTripWithAllData() - { - using StatusMessage statusMessage = new(); - statusMessage.ProtocolVersion = 3; - statusMessage.NetworkId = 1; - statusMessage.TotalDifficulty = 131200; - statusMessage.BestHash = Keccak.Compute("1"); - statusMessage.HeadBlockNo = 4; - statusMessage.GenesisHash = Keccak.Compute("0"); - statusMessage.AnnounceType = 1; - statusMessage.ServeHeaders = true; - statusMessage.ServeChainSince = 0; - statusMessage.ServeRecentChain = 1000; - statusMessage.ServeStateSince = 1; - statusMessage.ServeRecentState = 500; - statusMessage.TxRelay = true; - statusMessage.BufferLimit = 1000; - statusMessage.MaximumRechargeRate = 100; - statusMessage.MaximumRequestCosts = CostTracker.DefaultRequestCostTable; - - StatusMessageSerializer serializer = new(); - - SerializerTester.TestZero(serializer, statusMessage, "f90176d18f70726f746f636f6c56657273696f6e03cb896e6574776f726b496401cb8668656164546483020080ea886865616448617368a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6c987686561644e756d04ed8b67656e6573697348617368a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116dce8c616e6e6f756e63655479706501ce8c736572766548656164657273c0d18f7365727665436861696e53696e636580d4907365727665526563656e74436861696e8203e8d18f7365727665537461746553696e636501d4907365727665526563656e7453746174658201f4c987747852656c6179c0d28e666c6f77436f6e74726f6c2f424c8203e8d18f666c6f77436f6e74726f6c2f4d525264f84c8f666c6f77436f6e74726f6c2f4d5243f83ac802830249f0827530c60480830aae60c60680830f4240c60a808306ddd0c60f80830927c0c61180830f4240c613808306ddd0c614808303d090"); - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/P2PMessageKey.cs b/src/Nethermind/Nethermind.Network/P2P/P2PMessageKey.cs index 0514107acb8..8166c0cb8aa 100644 --- a/src/Nethermind/Nethermind.Network/P2P/P2PMessageKey.cs +++ b/src/Nethermind/Nethermind.Network/P2P/P2PMessageKey.cs @@ -12,7 +12,6 @@ using Nethermind.Network.P2P.Subprotocols.Eth.V65; using Nethermind.Network.P2P.Subprotocols.Eth.V66; using Nethermind.Network.P2P.Subprotocols.Eth.V68; -using Nethermind.Network.P2P.Subprotocols.Les; using Nethermind.Network.P2P.Subprotocols.NodeData; using Nethermind.Network.P2P.Subprotocols.Snap; @@ -32,7 +31,6 @@ public record struct P2PMessageKey(VersionedProtocol Protocol, int PacketType) : .Concat(FromMessageCodeClass(Contract.P2P.Protocol.Eth, typeof(Eth68MessageCode))) .Concat(FromMessageCodeClass(Contract.P2P.Protocol.NodeData, typeof(NodeDataMessageCode))) - .Concat(FromMessageCodeClass(Contract.P2P.Protocol.Les, typeof(LesMessageCode))) .Concat(FromMessageCodeClass(Contract.P2P.Protocol.Snap, typeof(SnapMessageCode))) diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CodeRequest.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CodeRequest.cs deleted file mode 100644 index 778928450b3..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CodeRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public class CodeRequest - { - public Hash256 BlockHash; - public Hash256 AccountKey; - - public CodeRequest() - { - } - - public CodeRequest(Hash256 blockHash, Hash256 accountKey) - { - BlockHash = blockHash; - AccountKey = accountKey; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CostTracker.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CostTracker.cs deleted file mode 100644 index 576383f449f..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/CostTracker.cs +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - class CostTracker - { - // These are the initial defaults from geth. - // It probably doesn't make sense to define them here in the finished implementation, since the client will want to use the values supplied by the server - - // TODO: Benchmark finished implementation and update based on our actual serve times. - // TODO: Implement cost scaling to account for users with different capabilities - https://github.com/ethereum/go-ethereum/blob/01d92531ee0993c0e6e5efe877a1242bfd808626/les/costtracker.go#L437 - // TODO: Implement multiple cost lists, so it can be limited based on the minimum of available bandwidth, cpu time, etc. - https://github.com/ethereum/go-ethereum/blob/01d92531ee0993c0e6e5efe877a1242bfd808626/les/costtracker.go#L186 - // TODO: This might be better as a dictionary - public static RequestCostItem[] DefaultRequestCostTable = new RequestCostItem[] - { - new(LesMessageCode.GetBlockHeaders, 150_000, 30_000), - new(LesMessageCode.GetBlockBodies, 0, 700_000), - new(LesMessageCode.GetReceipts, 0, 1_000_000), - new(LesMessageCode.GetContractCodes, 0, 450_000), - new(LesMessageCode.GetProofsV2, 0, 600_000), - new(LesMessageCode.GetHelperTrieProofs, 0, 1_000_000), - new(LesMessageCode.SendTxV2, 0, 450_000), - new(LesMessageCode.GetTxStatus, 0, 250_000) - }; - - } - -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieRequest.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieRequest.cs deleted file mode 100644 index 594f208600f..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieRequest.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public class HelperTrieRequest - { - public HelperTrieType SubType; - public long SectionIndex; - public byte[] Key; - public long FromLevel; - public int AuxiliaryData; - - public HelperTrieRequest() - { - } - - public HelperTrieRequest(HelperTrieType subType, long sectionIndex, byte[] key, long fromLevel, int auxiliaryData) - { - SubType = subType; - SectionIndex = sectionIndex; - Key = key; - FromLevel = fromLevel; - AuxiliaryData = auxiliaryData; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieType.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieType.cs deleted file mode 100644 index 3095020682f..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/HelperTrieType.cs +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public enum HelperTrieType - { - CHT = 0, - BloomBits = 1, - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesAnnounceType.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesAnnounceType.cs deleted file mode 100644 index 69fedcd3027..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesAnnounceType.cs +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public enum LesAnnounceType - { - None = 0x00, - Simple = 0x01, - Signed = 0x02 - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesMessageCode.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesMessageCode.cs deleted file mode 100644 index ccf4812d5ad..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesMessageCode.cs +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public static class LesMessageCode - { - public const int Status = 0x00; - public const int Announce = 0x01; - public const int GetBlockHeaders = 0x02; - public const int BlockHeaders = 0x03; - public const int GetBlockBodies = 0x04; - public const int BlockBodies = 0x05; - public const int GetReceipts = 0x06; - public const int Receipts = 0x07; - public const int GetProofs = 0x08; // deprecated - public const int Proofs = 0x09; // deprecated - public const int GetContractCodes = 0x0a; - public const int ContractCodes = 0x0b; - public const int SendTx = 0x0c; // deprecated - public const int GetHeaderProofs = 0x0d; // deprecated - public const int HeaderProofs = 0x0e; // deprecated - public const int GetProofsV2 = 0x0f; - public const int ProofsV2 = 0x10; - public const int GetHelperTrieProofs = 0x11; - public const int HelperTrieProofs = 0x12; - public const int SendTxV2 = 0x13; - public const int GetTxStatus = 0x14; - public const int TxStatus = 0x15; - public const int Stop = 0x16; - public const int Resume = 0x17; - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolHandler.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolHandler.cs deleted file mode 100644 index d1d71d1f40a..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolHandler.cs +++ /dev/null @@ -1,314 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Nethermind.Blockchain; -using Nethermind.Blockchain.Synchronization; -using Nethermind.Consensus.Scheduler; -using Nethermind.Core; -using Nethermind.Core.Collections; -using Nethermind.Core.Crypto; -using Nethermind.Core.Extensions; -using Nethermind.Int256; -using Nethermind.Logging; -using Nethermind.Network.Contract.P2P; -using Nethermind.Network.P2P.EventArg; -using Nethermind.Network.P2P.ProtocolHandlers; -using Nethermind.Network.P2P.Subprotocols.Les.Messages; -using Nethermind.Network.Rlpx; -using Nethermind.Serialization.Rlp; -using Nethermind.Stats; -using Nethermind.Synchronization; -using Nethermind.Synchronization.FastSync; -using CancellationToken = System.Threading.CancellationToken; - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public class LesProtocolHandler : SyncPeerProtocolHandlerBase, ISyncPeer - { - public override string Name => "les3"; - public override bool IncludeInTxPool => false; - - public LesProtocolHandler( - ISession session, - IMessageSerializationService serializer, - INodeStatsManager statsManager, - ISyncServer syncServer, - IBackgroundTaskScheduler backgroundTaskScheduler, - ILogManager logManager) : base(session, serializer, statsManager, syncServer, backgroundTaskScheduler, logManager) - { - _lastSentBlock = SyncServer.Head; - } - - public override void Init() - { - if (Logger.IsTrace) Logger.Trace($"{ProtocolCode} v{ProtocolVersion} subprotocol initializing with {Session.Node:c}"); - if (SyncServer.Head is null) - { - throw new InvalidOperationException($"Cannot initialize {ProtocolCode} v{ProtocolVersion} protocol without the head block set"); - } - - BlockHeader head = SyncServer.Head; - StatusMessage statusMessage = new() - { - ProtocolVersion = ProtocolVersion, - NetworkId = (UInt256)SyncServer.NetworkId, - TotalDifficulty = head.TotalDifficulty ?? head.Difficulty, - BestHash = head.Hash, - HeadBlockNo = head.Number, - GenesisHash = SyncServer.Genesis.Hash, - - // TODO - implement config option for these - ServeHeaders = true, - ServeChainSince = 0x00, - //if (config.recentchain is not null) - // ServeRecentChain = Config.recentchain - ServeStateSince = 0x00, - //if (Config.serverecentstate is not null) - // ServeRecentState = Config.RecentState - TxRelay = true, - // TODO - should allow setting to infinite - BufferLimit = int.MaxValue, - MaximumRechargeRate = int.MaxValue - }; - Send(statusMessage); - - CheckProtocolInitTimeout().ContinueWith(x => - { - if (x.IsFaulted && Logger.IsError) - { - Logger.Error("Error during lesProtocol handler timeout logic", x.Exception); - } - }); - } - - - public override byte ProtocolVersion => 3; - - public override string ProtocolCode => Protocol.Les; - - public override int MessageIdSpaceSize => 23; - - protected override TimeSpan InitTimeout => Timeouts.Les3Status; - - public LesAnnounceType RequestedAnnounceType; - - public override event EventHandler ProtocolInitialized; - public override event EventHandler SubprotocolRequested - { - add { } - remove { } - } - - bool _statusReceived; - public override void HandleMessage(ZeroPacket message) - { - if (message.PacketType != LesMessageCode.Status && !_statusReceived) - { - throw new SubprotocolException($"No {nameof(StatusMessage)} received prior to communication with {Session.Node:c}."); - } - - int size = message.Content.ReadableBytes; - - switch (message.PacketType) - { - case LesMessageCode.Status: - { - using StatusMessage statusMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, statusMessage.ToString(), size); - Handle(statusMessage); - break; - } - case LesMessageCode.GetBlockHeaders: - GetBlockHeadersMessage getBlockHeadersMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getBlockHeadersMessage.ToString(), size); - BackgroundTaskScheduler.ScheduleSyncServe(getBlockHeadersMessage, Handle); - break; - case LesMessageCode.GetBlockBodies: - GetBlockBodiesMessage getBlockBodiesMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getBlockBodiesMessage.ToString(), size); - BackgroundTaskScheduler.ScheduleSyncServe(getBlockBodiesMessage, Handle); - break; - case LesMessageCode.GetReceipts: - GetReceiptsMessage getReceiptsMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getReceiptsMessage.ToString(), size); - BackgroundTaskScheduler.ScheduleSyncServe(getReceiptsMessage, Handle); - break; - case LesMessageCode.GetContractCodes: - GetContractCodesMessage getContractCodesMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getContractCodesMessage.ToString(), size); - BackgroundTaskScheduler.ScheduleSyncServe(getContractCodesMessage, Handle); - break; - case LesMessageCode.GetHelperTrieProofs: - GetHelperTrieProofsMessage getHelperTrieProofsMessage = Deserialize(message.Content); - if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getHelperTrieProofsMessage.ToString(), size); - BackgroundTaskScheduler.ScheduleSyncServe(getHelperTrieProofsMessage, Handle); - break; - } - } - - public void Handle(StatusMessage status) - { - // set defaults - if (!status.AnnounceType.HasValue) status.AnnounceType = 1; - - if (_statusReceived) - { - throw new SubprotocolException($"{nameof(StatusMessage)} has already been received in the past"); - } - - _statusReceived = true; - if (Logger.IsTrace) - Logger.Trace($"LES received status from {Session.Node:c} with" + - Environment.NewLine + $" prot version\t{status.ProtocolVersion}" + - Environment.NewLine + $" network ID\t{status.NetworkId}," + - Environment.NewLine + $" genesis hash\t{status.GenesisHash}," + - Environment.NewLine + $" best hash\t{status.BestHash}," + - Environment.NewLine + $" head blockno\t{status.HeadBlockNo}," + - Environment.NewLine + $" difficulty\t{status.TotalDifficulty}" + - Environment.NewLine + $" announce type\t{status.AnnounceType}" + - Environment.NewLine + $" serve headers\t{status.ServeHeaders}" + - Environment.NewLine + $" serve chain since\t{status.ServeChainSince}" + - Environment.NewLine + $" serve recent chain\t{status.ServeRecentChain}" + - Environment.NewLine + $" serve state since\t{status.ServeStateSince}" + - Environment.NewLine + $" serve recent state\t{status.ServeRecentState}" + - Environment.NewLine + $" transaction relay\t{status.TxRelay}" + - Environment.NewLine + $" buffer limit\t{status.BufferLimit}" + - Environment.NewLine + $" max recharge\t{status.MaximumRechargeRate}"); - // todo - log max request costs table - - _remoteHeadBlockHash = status.BestHash; - - ReceivedProtocolInitMsg(status); - SyncPeerProtocolInitializedEventArgs eventArgs = new(this) - { - NetworkId = (ulong)status.NetworkId, - BestHash = status.BestHash, - GenesisHash = status.GenesisHash, - Protocol = status.Protocol, - ProtocolVersion = status.ProtocolVersion, - TotalDifficulty = status.TotalDifficulty - }; - - TotalDifficulty = status.TotalDifficulty; - RequestedAnnounceType = (LesAnnounceType)status.AnnounceType.Value; - if (RequestedAnnounceType == LesAnnounceType.Signed) throw new NotImplementedException("Signed announcements are not yet supported."); - - ProtocolInitialized?.Invoke(this, eventArgs); - } - - public async Task Handle(GetBlockHeadersMessage getBlockHeaders, CancellationToken cancellationToken) - { - using var message = getBlockHeaders; - Eth.V62.Messages.BlockHeadersMessage ethBlockHeadersMessage = await FulfillBlockHeadersRequest(message.EthMessage, cancellationToken); - // todo - implement cost tracking - return new BlockHeadersMessage(ethBlockHeadersMessage, message.RequestId, int.MaxValue); - } - - public async Task Handle(GetBlockBodiesMessage getBlockBodies, CancellationToken cancellationToken) - { - using var message = getBlockBodies; - Eth.V62.Messages.BlockBodiesMessage ethBlockBodiesMessage = await FulfillBlockBodiesRequest(message.EthMessage, cancellationToken); - // todo - implement cost tracking - return new BlockBodiesMessage(ethBlockBodiesMessage, message.RequestId, int.MaxValue); - } - - public async Task Handle(GetReceiptsMessage getReceipts, CancellationToken cancellationToken) - { - using var message = getReceipts; - Eth.V63.Messages.ReceiptsMessage ethReceiptsMessage = await FulfillReceiptsRequest(message.EthMessage, cancellationToken); - // todo - implement cost tracking - return new ReceiptsMessage(ethReceiptsMessage, message.RequestId, int.MaxValue); - } - - public Task Handle(GetContractCodesMessage getContractCodes, CancellationToken cancellationToken) - { - using var message = getContractCodes; - var codes = SyncServer.GetNodeData(message.RequestAddresses, cancellationToken, NodeDataType.Code); - // todo - implement cost tracking - return Task.FromResult(new ContractCodesMessage(codes, message.RequestId, int.MaxValue)); - } - - public Task Handle(GetHelperTrieProofsMessage getHelperTrieProofs, CancellationToken cancellationToken) - { - using var message = getHelperTrieProofs; - List proofNodes = new(); - List auxData = new(); - - for (int requestNo = 0; requestNo < message.Requests.Length; requestNo++) - { - var request = message.Requests[requestNo]; - switch (request.SubType) - { - case HelperTrieType.CHT: - GetCHTData(request, proofNodes, auxData); - break; - case HelperTrieType.BloomBits: - throw new SubprotocolException("bloom bits trie not yet supported"); - } - } - - return Task.FromResult(new HelperTrieProofsMessage(proofNodes.Distinct().ToArray(), auxData.ToArray(), message.RequestId, int.MaxValue)); - } - - public void GetCHTData(HelperTrieRequest request, List proofNodes, List auxData) - { - var cht = SyncServer.GetCHT(); - // todo - enum? - if (request.AuxiliaryData == 1) - { - auxData.Add(cht.RootHash.BytesToArray()); - return; - } - else if (request.AuxiliaryData == 2) - { - (Hash256 hash, _) = cht.Get(request.Key); - using IOwnedReadOnlyList headerResult = SyncServer.FindHeaders(hash, 1, 0, false); - if (headerResult.Count != 1) throw new SubprotocolException($"Unable to find header for block {request.Key.WithoutLeadingZeros().ToArray().ToLongFromBigEndianByteArrayWithoutLeadingZeros()} for GetHelperProofs response."); - auxData.Add(Rlp.Encode(headerResult[0]).Bytes); - } - proofNodes.AddRange(Synchronization.LesSync.CanonicalHashTrie.BuildProof(request.Key, request.SectionIndex, request.FromLevel)); - } - - private BlockHeader _lastSentBlock; - - public override void NotifyOfNewBlock(Block block, SendBlockMode mode) - { - if (RequestedAnnounceType == LesAnnounceType.None) return; - if (!block.TotalDifficulty.HasValue) - { - throw new InvalidOperationException($"Trying to send a block {block.Hash} with null total difficulty"); - } - - if (block.TotalDifficulty <= _lastSentBlock.TotalDifficulty) return; - - AnnounceMessage announceMessage = new(); - announceMessage.HeadHash = block.Hash; - announceMessage.HeadBlockNo = block.Number; - announceMessage.TotalDifficulty = block.TotalDifficulty.Value; - if (_lastSentBlock is null || block.ParentHash == _lastSentBlock.Hash) - announceMessage.ReorgDepth = 0; - else - { - BlockHeader firstCommonAncestor = SyncServer.FindLowestCommonAncestor(block.Header, _lastSentBlock); - if (firstCommonAncestor is null) - throw new SubprotocolException($"Unable to send announcement to LES peer - No common ancestor found between {block.Header} and {_lastSentBlock}"); - announceMessage.ReorgDepth = _lastSentBlock.Number - firstCommonAncestor.Number; - } - - _lastSentBlock = block.Header; - - Send(announceMessage); - } - - Task ISyncPeer.GetHeadBlockHeader(Hash256? hash, CancellationToken token) - { - return Task.FromResult(_lastSentBlock); - } - - protected override void OnDisposed() { } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolInitializedEventArgs.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolInitializedEventArgs.cs deleted file mode 100644 index 32d73f020de..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/LesProtocolInitializedEventArgs.cs +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System.Numerics; -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.EventArg; - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - // todo - I don't think we actually need all of these. prune later. - public class LesProtocolInitializedEventArgs : ProtocolInitializedEventArgs - { - public string Protocol { get; set; } - public byte ProtocolVersion { get; set; } - public long ChainId { get; set; } - public BigInteger TotalDifficulty { get; set; } - public Hash256 BestHash { get; set; } - public long HeadBlockNo { get; set; } - public Hash256 GenesisHash { get; set; } - public byte AnnounceType { get; set; } - public bool ServeHeaders { get; set; } - public long? ServeChainSince { get; set; } - public long? ServeRecentChain { get; set; } - public long? ServeStateSince { get; set; } - public long? ServeRecentState { get; set; } - public bool TxRelay { get; set; } - public int? BufferLimit { get; set; } - public int? MaximumRechargeRate { get; set; } - public RequestCostItem[] MaximumRequestCosts { get; set; } - public LesProtocolInitializedEventArgs(LesProtocolHandler protocolHandler) : base(protocolHandler) - { - - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessage.cs deleted file mode 100644 index b4081912c5d..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessage.cs +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Int256; -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class AnnounceMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.Announce; - public override string Protocol => Contract.P2P.Protocol.Les; - public Hash256 HeadHash; - public long HeadBlockNo; - public UInt256 TotalDifficulty; - public long ReorgDepth; - // todo - add optional items - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessageSerializer.cs deleted file mode 100644 index d91b2bf3905..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/AnnounceMessageSerializer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class AnnounceMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, AnnounceMessage message) - { - int length = GetLength(message, out int contentLength); - byteBuffer.EnsureWritable(length); - NettyRlpStream rlpStream = new(byteBuffer); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.HeadHash); - rlpStream.Encode(message.HeadBlockNo); - rlpStream.Encode(message.TotalDifficulty); - rlpStream.Encode(message.ReorgDepth); - rlpStream.Encode(Rlp.OfEmptySequence); - } - - public AnnounceMessage Deserialize(IByteBuffer byteBuffer) - { - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - return Deserialize(rlpStream); - } - - private static int GetLength(AnnounceMessage message, out int contentLength) - { - contentLength = - Rlp.LengthOf(message.HeadHash) + - Rlp.LengthOf(message.HeadBlockNo) + - Rlp.LengthOf(message.TotalDifficulty) + - Rlp.LengthOf(message.ReorgDepth) + - Rlp.OfEmptySequence.Length; - - return Rlp.LengthOfSequence(contentLength); - } - - private static AnnounceMessage Deserialize(RlpStream rlpStream) - { - AnnounceMessage announceMessage = new(); - rlpStream.ReadSequenceLength(); - announceMessage.HeadHash = rlpStream.DecodeKeccak(); - announceMessage.HeadBlockNo = rlpStream.DecodeLong(); - announceMessage.TotalDifficulty = rlpStream.DecodeUInt256(); - announceMessage.ReorgDepth = rlpStream.DecodeLong(); - rlpStream.ReadSequenceLength(); - return announceMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessage.cs deleted file mode 100644 index 39faff48984..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessage.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class BlockBodiesMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.BlockBodies; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public Eth.V62.Messages.BlockBodiesMessage EthMessage { get; set; } - public long RequestId { get; set; } - public int BufferValue { get; set; } - - public BlockBodiesMessage() - { - } - - public BlockBodiesMessage(Eth.V62.Messages.BlockBodiesMessage ethMessage, long requestId, int bufferValue) - { - EthMessage = ethMessage; - RequestId = requestId; - BufferValue = bufferValue; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessageSerializer.cs deleted file mode 100644 index 3211a9705d0..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockBodiesMessageSerializer.cs +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class BlockBodiesMessageSerializer : IZeroMessageSerializer - { - private readonly Eth.V62.Messages.BlockBodiesMessageSerializer _baseDeserializer = new(); - - public void Serialize(IByteBuffer byteBuffer, BlockBodiesMessage message) - { - Eth.V62.Messages.BlockBodiesMessageSerializer ethSerializer = new(); - int ethMessageTotalLength = ethSerializer.GetLength(message.EthMessage, out _); - int contentLength = Rlp.LengthOf(message.RequestId) + Rlp.LengthOf(message.BufferValue) + ethMessageTotalLength; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(message.BufferValue); - ethSerializer.Serialize(byteBuffer, message.EthMessage); - } - - public BlockBodiesMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - BlockBodiesMessage blockBodiesMessage = new(); - rlpStream.ReadSequenceLength(); - blockBodiesMessage.RequestId = rlpStream.DecodeLong(); - blockBodiesMessage.BufferValue = rlpStream.DecodeInt(); - blockBodiesMessage.EthMessage = _baseDeserializer.Deserialize(byteBuffer); - return blockBodiesMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessage.cs deleted file mode 100644 index 06d65d96b49..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessage.cs +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class BlockHeadersMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.BlockHeaders; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public Eth.V62.Messages.BlockHeadersMessage EthMessage { get; set; } - public long RequestId { get; set; } - public int BufferValue { get; set; } - - public BlockHeadersMessage() - { - } - public BlockHeadersMessage(Eth.V62.Messages.BlockHeadersMessage ethMessage, long requestId, int bufferValue) - { - EthMessage = ethMessage; - RequestId = requestId; - BufferValue = bufferValue; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessageSerializer.cs deleted file mode 100644 index 7a80cba9989..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/BlockHeadersMessageSerializer.cs +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class BlockHeadersMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, BlockHeadersMessage message) - { - Eth.V62.Messages.BlockHeadersMessageSerializer ethSerializer = new(); - Rlp ethMessage = new(ethSerializer.Serialize(message.EthMessage)); - int contentLength = - Rlp.LengthOf(message.RequestId) + - Rlp.LengthOf(message.BufferValue) + - ethMessage.Length; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(message.BufferValue); - rlpStream.Encode(ethMessage); - } - - public BlockHeadersMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - private static BlockHeadersMessage Deserialize(RlpStream rlpStream) - { - BlockHeadersMessage blockHeadersMessage = new(); - rlpStream.ReadSequenceLength(); - blockHeadersMessage.RequestId = rlpStream.DecodeLong(); - blockHeadersMessage.BufferValue = rlpStream.DecodeInt(); - blockHeadersMessage.EthMessage = Eth.V62.Messages.BlockHeadersMessageSerializer.Deserialize(rlpStream); - return blockHeadersMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessage.cs deleted file mode 100644 index 3c01e93dbfd..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessage.cs +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Collections; -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class ContractCodesMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.ContractCodes; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public int BufferValue; - public IOwnedReadOnlyList Codes; - - public ContractCodesMessage() - { - } - - public ContractCodesMessage(IOwnedReadOnlyList codes, long requestId, int bufferValue) - { - Codes = codes; - RequestId = requestId; - BufferValue = bufferValue; - } - - public override void Dispose() - { - base.Dispose(); - Codes.Dispose(); - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessageSerializer.cs deleted file mode 100644 index 274d453311d..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ContractCodesMessageSerializer.cs +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class ContractCodesMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, ContractCodesMessage message) - { - int innerLength = 0; - for (int i = 0; i < message.Codes.Count; i++) - { - innerLength += Rlp.LengthOf(message.Codes[i]); - } - int contentLength = - Rlp.LengthOf(message.RequestId) + - Rlp.LengthOf(message.BufferValue) + - Rlp.LengthOfSequence(innerLength); - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(message.BufferValue); - rlpStream.StartSequence(innerLength); - for (int i = 0; i < message.Codes.Count; i++) - { - rlpStream.Encode(message.Codes[i]); - } - } - - public ContractCodesMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public static ContractCodesMessage Deserialize(RlpStream rlpStream) - { - ContractCodesMessage contractCodesMessage = new(); - rlpStream.ReadSequenceLength(); - contractCodesMessage.RequestId = rlpStream.DecodeLong(); - contractCodesMessage.BufferValue = rlpStream.DecodeInt(); - contractCodesMessage.Codes = rlpStream.DecodeArrayPoolList(stream => stream.DecodeByteArray()); - return contractCodesMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessage.cs deleted file mode 100644 index 31fd5323bd6..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetBlockBodiesMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.GetBlockBodies; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public Eth.V62.Messages.GetBlockBodiesMessage EthMessage; - - public GetBlockBodiesMessage() - { - } - - public GetBlockBodiesMessage(Eth.V62.Messages.GetBlockBodiesMessage ethMessage, long requestId) - { - EthMessage = ethMessage; - RequestId = requestId; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessageSerializer.cs deleted file mode 100644 index 75d9a1a54f2..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockBodiesMessageSerializer.cs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetBlockBodiesMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, GetBlockBodiesMessage message) - { - Eth.V62.Messages.GetBlockBodiesMessageSerializer ethSerializer = new(); - Rlp ethMessage = new(ethSerializer.Serialize(message.EthMessage)); - int contentLength = Rlp.LengthOf(message.RequestId) + ethMessage.Length; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(ethMessage); - } - - public GetBlockBodiesMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - private static GetBlockBodiesMessage Deserialize(RlpStream rlpStream) - { - GetBlockBodiesMessage getBlockBodiesMessage = new(); - rlpStream.ReadSequenceLength(); - getBlockBodiesMessage.RequestId = rlpStream.DecodeLong(); - getBlockBodiesMessage.EthMessage = Eth.V62.Messages.GetBlockBodiesMessageSerializer.Deserialize(rlpStream); - return getBlockBodiesMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessage.cs deleted file mode 100644 index ba7ba020278..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessage.cs +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetBlockHeadersMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.GetBlockHeaders; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public Eth.V62.Messages.GetBlockHeadersMessage EthMessage; - - public GetBlockHeadersMessage() - { - } - - public GetBlockHeadersMessage(Eth.V62.Messages.GetBlockHeadersMessage ethMessage, long requestId) - { - EthMessage = ethMessage; - RequestId = requestId; - } - - public override void Dispose() - { - base.Dispose(); - EthMessage?.Dispose(); - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessageSerializer.cs deleted file mode 100644 index e522b890213..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetBlockHeadersMessageSerializer.cs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetBlockHeadersMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, GetBlockHeadersMessage message) - { - Eth.V62.Messages.GetBlockHeadersMessageSerializer ethSerializer = new(); - Rlp ethMessage = new(ethSerializer.Serialize(message.EthMessage)); - int contentLength = Rlp.LengthOf(message.RequestId) + ethMessage.Length; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(ethMessage); - } - - public GetBlockHeadersMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - private static GetBlockHeadersMessage Deserialize(RlpStream rlpStream) - { - GetBlockHeadersMessage getBlockHeadersMessage = new(); - rlpStream.ReadSequenceLength(); - getBlockHeadersMessage.RequestId = rlpStream.DecodeLong(); - getBlockHeadersMessage.EthMessage = Eth.V62.Messages.GetBlockHeadersMessageSerializer.Deserialize(rlpStream); - return getBlockHeadersMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessage.cs deleted file mode 100644 index 8e157088bc3..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessage.cs +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System.Linq; -using Nethermind.Core.Crypto; -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetContractCodesMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.GetContractCodes; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public CodeRequest[] Requests; - - public Hash256[] RequestAddresses => - Requests.Select(request => request.AccountKey).ToArray(); - - public GetContractCodesMessage() - { - } - - public GetContractCodesMessage(CodeRequest[] requests, long requestId) - { - Requests = requests; - RequestId = requestId; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessageSerializer.cs deleted file mode 100644 index 125a8ae9b4b..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetContractCodesMessageSerializer.cs +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Core.Crypto; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetContractCodesMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, GetContractCodesMessage message) - { - // note: If there are any changes to how a hash is encoded, this will break (compression?) - // calling LengthOf for each hash would be more resistant to future changes, if we think there will be any - int requestLength = Rlp.LengthOf(Keccak.OfAnEmptyString) * 2; - int allRequestsLength = Rlp.LengthOfSequence(requestLength) * message.Requests.Length; - int contentLength = - Rlp.LengthOf(message.RequestId) + - Rlp.LengthOfSequence(allRequestsLength); - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - - rlpStream.StartSequence(allRequestsLength); - foreach (CodeRequest request in message.Requests) - { - rlpStream.StartSequence(requestLength); - rlpStream.Encode(request.BlockHash); - rlpStream.Encode(request.AccountKey); - } - } - - public GetContractCodesMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public static GetContractCodesMessage Deserialize(RlpStream rlpStream) - { - GetContractCodesMessage getContractCodesMessage = new(); - rlpStream.ReadSequenceLength(); - getContractCodesMessage.RequestId = rlpStream.DecodeLong(); - getContractCodesMessage.Requests = rlpStream.DecodeArray(stream => - { - CodeRequest request = new(); - stream.ReadSequenceLength(); - request.BlockHash = stream.DecodeKeccak(); - request.AccountKey = stream.DecodeKeccak(); - return request; - }); - - return getContractCodesMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessage.cs deleted file mode 100644 index 6b12d29e277..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessage.cs +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetHelperTrieProofsMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.GetHelperTrieProofs; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public HelperTrieRequest[] Requests; - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessageSerializer.cs deleted file mode 100644 index af4c3756c8d..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetHelperTrieProofsMessageSerializer.cs +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetHelperTrieProofsMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, GetHelperTrieProofsMessage message) - { - int innerLength = 0; - foreach (var request in message.Requests) - { - innerLength += Rlp.LengthOfSequence(GetRequestLength(request)); - } - int contentLength = Rlp.LengthOf(message.RequestId) + - Rlp.LengthOfSequence(innerLength); - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.StartSequence(innerLength); - foreach (var request in message.Requests) - { - rlpStream.StartSequence(GetRequestLength(request)); - rlpStream.Encode((int)request.SubType); - rlpStream.Encode(request.SectionIndex); - rlpStream.Encode(request.Key); - rlpStream.Encode(request.FromLevel); - rlpStream.Encode(request.AuxiliaryData); - } - } - - private static int GetRequestLength(HelperTrieRequest request) - { - return - Rlp.LengthOf((int)request.SubType) + - Rlp.LengthOf(request.SectionIndex) + - Rlp.LengthOf(request.Key) + - Rlp.LengthOf(request.FromLevel) + - Rlp.LengthOf(request.AuxiliaryData); - } - - public GetHelperTrieProofsMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public static GetHelperTrieProofsMessage Deserialize(RlpStream rlpStream) - { - GetHelperTrieProofsMessage message = new(); - rlpStream.ReadSequenceLength(); - message.RequestId = rlpStream.DecodeLong(); - message.Requests = rlpStream.DecodeArray(stream => - { - HelperTrieRequest request = new(); - stream.ReadSequenceLength(); - request.SubType = (HelperTrieType)stream.DecodeInt(); - request.SectionIndex = stream.DecodeLong(); - request.Key = stream.DecodeByteArray(); - request.FromLevel = stream.DecodeLong(); - request.AuxiliaryData = stream.DecodeInt(); - return request; - }); - return message; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessage.cs deleted file mode 100644 index 1fcccd3af48..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetReceiptsMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.GetReceipts; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public Eth.V63.Messages.GetReceiptsMessage EthMessage; - - public GetReceiptsMessage() - { - } - - public GetReceiptsMessage(Eth.V63.Messages.GetReceiptsMessage ethMessage, long requestId) - { - EthMessage = ethMessage; - RequestId = requestId; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessageSerializer.cs deleted file mode 100644 index e8d0f3decad..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/GetReceiptsMessageSerializer.cs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class GetReceiptsMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, GetReceiptsMessage message) - { - Eth.V63.Messages.GetReceiptsMessageSerializer ethSerializer = new(); - Rlp ethMessage = new(ethSerializer.Serialize(message.EthMessage)); - int contentLength = Rlp.LengthOf(message.RequestId) + ethMessage.Length; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(ethMessage); - } - - public GetReceiptsMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public static GetReceiptsMessage Deserialize(RlpStream rlpStream) - { - GetReceiptsMessage getReceiptsMessage = new(); - rlpStream.ReadSequenceLength(); - getReceiptsMessage.RequestId = rlpStream.DecodeLong(); - getReceiptsMessage.EthMessage = Eth.V63.Messages.GetReceiptsMessageSerializer.Deserialize(rlpStream); - return getReceiptsMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessage.cs deleted file mode 100644 index 961644f654d..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessage.cs +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class HelperTrieProofsMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.HelperTrieProofs; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public int BufferValue; - - public byte[][] ProofNodes; - public byte[][] AuxiliaryData; - - public HelperTrieProofsMessage() - { - } - - public HelperTrieProofsMessage(byte[][] proofNodes, byte[][] auxiliaryData, long requestId, int bufferValue) - { - ProofNodes = proofNodes; - AuxiliaryData = auxiliaryData; - RequestId = requestId; - BufferValue = bufferValue; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessageSerializer.cs deleted file mode 100644 index 14a11ba6d70..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/HelperTrieProofsMessageSerializer.cs +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Core.Crypto; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class HelperTrieProofsMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, HelperTrieProofsMessage message) - { - Hash256[] proofNodesKeccak = new Hash256[message.ProofNodes.Length]; - int proofNodesContentLength = 0; - for (int i = 0; i < message.ProofNodes.Length; i++) - { - proofNodesKeccak[i] = new Hash256(message.ProofNodes[i]); - proofNodesContentLength += Rlp.LengthOf(proofNodesKeccak[i]); - } - - int tempAuxContentLength = 0; - for (int i = 0; i < message.AuxiliaryData.Length; i++) - { - tempAuxContentLength += Rlp.LengthOf(message.AuxiliaryData[i]); - } - - int innerContentLength = Rlp.LengthOfSequence(proofNodesContentLength) + Rlp.LengthOfSequence(tempAuxContentLength); - int contentLength = - Rlp.LengthOf(message.RequestId) + - Rlp.LengthOf(message.BufferValue) + - Rlp.LengthOfSequence(innerContentLength); - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(message.BufferValue); - rlpStream.StartSequence(innerContentLength); - rlpStream.StartSequence(proofNodesContentLength); - for (int i = 0; i < message.ProofNodes.Length; i++) - { - rlpStream.Encode(proofNodesKeccak[i]); - } - rlpStream.StartSequence(tempAuxContentLength); - for (int i = 0; i < message.AuxiliaryData.Length; i++) - { - rlpStream.Encode(message.AuxiliaryData[i]); - } - } - - public HelperTrieProofsMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public static HelperTrieProofsMessage Deserialize(RlpStream rlpStream) - { - HelperTrieProofsMessage message = new(); - rlpStream.ReadSequenceLength(); - message.RequestId = rlpStream.DecodeLong(); - message.BufferValue = rlpStream.DecodeInt(); - rlpStream.ReadSequenceLength(); - message.ProofNodes = rlpStream.DecodeArray(stream => stream.DecodeByteArray()); - message.AuxiliaryData = rlpStream.DecodeArray(stream => stream.DecodeByteArray()); - return message; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessage.cs deleted file mode 100644 index e7dbc49ddac..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessage.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class ReceiptsMessage : P2PMessage - { - public override int PacketType { get; } = LesMessageCode.Receipts; - public override string Protocol { get; } = Contract.P2P.Protocol.Les; - public long RequestId; - public int BufferValue; - public Eth.V63.Messages.ReceiptsMessage EthMessage; - - public ReceiptsMessage() - { - } - - public ReceiptsMessage(Eth.V63.Messages.ReceiptsMessage ethMessage, long requestId, int bufferValue) - { - EthMessage = ethMessage; - RequestId = requestId; - BufferValue = bufferValue; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessageSerializer.cs deleted file mode 100644 index 8504c7df3b2..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/ReceiptsMessageSerializer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using DotNetty.Buffers; -using Nethermind.Core.Specs; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class ReceiptsMessageSerializer : IZeroMessageSerializer - { - private readonly ISpecProvider _specProvider; - - public ReceiptsMessageSerializer(ISpecProvider specProvider) - { - _specProvider = specProvider ?? throw new ArgumentNullException(nameof(specProvider)); - } - - public void Serialize(IByteBuffer byteBuffer, ReceiptsMessage message) - { - Eth.V63.Messages.ReceiptsMessageSerializer ethSerializer = new(_specProvider); - Rlp ethMessage = new(ethSerializer.Serialize(message.EthMessage)); - int contentLength = Rlp.LengthOf(message.RequestId) + Rlp.LengthOf(message.BufferValue) + ethMessage.Length; - - int totalLength = Rlp.LengthOfSequence(contentLength); - - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - byteBuffer.EnsureWritable(totalLength); - - rlpStream.StartSequence(contentLength); - rlpStream.Encode(message.RequestId); - rlpStream.Encode(message.BufferValue); - rlpStream.Encode(ethMessage); - } - - public ReceiptsMessage Deserialize(IByteBuffer byteBuffer) - { - NettyRlpStream rlpStream = new(byteBuffer); - return Deserialize(rlpStream); - } - - public ReceiptsMessage Deserialize(RlpStream rlpStream) - { - ReceiptsMessage receiptsMessage = new(); - Eth.V63.Messages.ReceiptsMessageSerializer ethSerializer = new(_specProvider); - - rlpStream.ReadSequenceLength(); - receiptsMessage.RequestId = rlpStream.DecodeLong(); - receiptsMessage.BufferValue = rlpStream.DecodeInt(); - receiptsMessage.EthMessage = ethSerializer.Deserialize(rlpStream); - return receiptsMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessage.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessage.cs deleted file mode 100644 index a3f4c79d97c..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessage.cs +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.Core.Crypto; -using Nethermind.Int256; -using Nethermind.Network.P2P.Messages; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class StatusMessage : P2PMessage - { - public static class KeyNames - { - public const string ProtocolVersion = "protocolVersion"; - public const string NetworkId = "networkId"; - public const string TotalDifficulty = "headTd"; - public const string BestHash = "headHash"; - public const string HeadBlockNo = "headNum"; - public const string GenesisHash = "genesisHash"; - public const string AnnounceType = "announceType"; - public const string ServeHeaders = "serveHeaders"; - public const string ServeChainSince = "serveChainSince"; - public const string ServeRecentChain = "serveRecentChain"; - public const string ServeStateSince = "serveStateSince"; - public const string ServeRecentState = "serveRecentState"; - public const string TxRelay = "txRelay"; - public const string BufferLimit = "flowControl/BL"; - public const string MaximumRechargeRate = "flowControl/MRR"; - public const string MaximumRequestCosts = "flowControl/MRC"; - } - - public override int PacketType { get; } = LesMessageCode.Status; - public override string Protocol => Contract.P2P.Protocol.Les; - public byte ProtocolVersion { get; set; } - public UInt256 NetworkId { get; set; } - public UInt256 TotalDifficulty { get; set; } - public Hash256 BestHash { get; set; } - public long HeadBlockNo { get; set; } - public Hash256 GenesisHash { get; set; } - #region optional - public byte? AnnounceType { get; set; } // sent from client only - public bool ServeHeaders { get; set; } - public long? ServeChainSince { get; set; } - public long? ServeRecentChain { get; set; } - public long? ServeStateSince { get; set; } - public long? ServeRecentState { get; set; } - public bool TxRelay { get; set; } - public int? BufferLimit { get; set; } - public int? MaximumRechargeRate { get; set; } - // These are the initial defaults from geth. - // It probably doesn't make sense to define them here in the finished implementation, since the client will want to use the values supplied by the server - - // TODO: Benchmark finished implementation and update based on our actual serve times. - // TODO: Implement cost scaling to account for users with different capabilities - https://github.com/ethereum/go-ethereum/blob/01d92531ee0993c0e6e5efe877a1242bfd808626/les/costtracker.go#L437 - // TODO: Implement multiple cost lists, so it can be limited based on the minimum of available bandwidth, cpu time, etc. - https://github.com/ethereum/go-ethereum/blob/01d92531ee0993c0e6e5efe877a1242bfd808626/les/costtracker.go#L186 - // TODO: This might be better as a dictionary - public RequestCostItem[] MaximumRequestCosts = CostTracker.DefaultRequestCostTable; - #endregion - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessageSerializer.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessageSerializer.cs deleted file mode 100644 index 279233a99a9..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/Messages/StatusMessageSerializer.cs +++ /dev/null @@ -1,304 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using DotNetty.Buffers; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Network.P2P.Subprotocols.Les.Messages -{ - public class StatusMessageSerializer : IZeroMessageSerializer - { - public void Serialize(IByteBuffer byteBuffer, StatusMessage message) - { - NettyRlpStream rlpStream = new(byteBuffer); - - #region Find Lengths - int totalContentLength = 0; - int protocolVersionLength = Rlp.LengthOf(StatusMessage.KeyNames.ProtocolVersion) + Rlp.LengthOf(message.ProtocolVersion); - totalContentLength += Rlp.LengthOfSequence(protocolVersionLength); - - int networkIdLength = Rlp.LengthOf(StatusMessage.KeyNames.NetworkId) + Rlp.LengthOf(message.NetworkId); - totalContentLength += Rlp.LengthOfSequence(networkIdLength); - - int headTdLength = Rlp.LengthOf(StatusMessage.KeyNames.TotalDifficulty) + Rlp.LengthOf(message.TotalDifficulty); - totalContentLength += Rlp.LengthOfSequence(headTdLength); - - int headHashLength = Rlp.LengthOf(StatusMessage.KeyNames.BestHash) + Rlp.LengthOf(message.BestHash); - totalContentLength += Rlp.LengthOfSequence(headHashLength); - - int headNumLength = Rlp.LengthOf(StatusMessage.KeyNames.HeadBlockNo) + Rlp.LengthOf(message.HeadBlockNo); - totalContentLength += Rlp.LengthOfSequence(headNumLength); - - int genesisHashLength = Rlp.LengthOf(StatusMessage.KeyNames.GenesisHash) + Rlp.LengthOf(message.GenesisHash); - totalContentLength += Rlp.LengthOfSequence(genesisHashLength); - - int announceTypeLength = 0; - if (message.AnnounceType.HasValue) - { - announceTypeLength = Rlp.LengthOf(StatusMessage.KeyNames.AnnounceType) + Rlp.LengthOf(message.AnnounceType.Value); - totalContentLength += Rlp.LengthOfSequence(announceTypeLength); - } - - int serveHeadersLength = 0; - if (message.ServeHeaders) - { - serveHeadersLength = Rlp.LengthOf(StatusMessage.KeyNames.ServeHeaders) + Rlp.OfEmptySequence.Length; - totalContentLength += Rlp.LengthOfSequence(serveHeadersLength); - } - - int serveChainSinceLength = 0; - if (message.ServeChainSince.HasValue) - { - serveChainSinceLength = Rlp.LengthOf(StatusMessage.KeyNames.ServeChainSince) + Rlp.LengthOf(message.ServeChainSince.Value); - totalContentLength += Rlp.LengthOfSequence(serveChainSinceLength); - } - - int serveRecentChainLength = 0; - if (message.ServeRecentChain.HasValue) - { - serveRecentChainLength = Rlp.LengthOf(StatusMessage.KeyNames.ServeRecentChain) + Rlp.LengthOf(message.ServeRecentChain.Value); - totalContentLength += Rlp.LengthOfSequence(serveRecentChainLength); - } - - int serveStateSinceLength = 0; - if (message.ServeStateSince.HasValue) - { - serveStateSinceLength = Rlp.LengthOf(StatusMessage.KeyNames.ServeStateSince) + Rlp.LengthOf(message.ServeStateSince.Value); - totalContentLength += Rlp.LengthOfSequence(serveStateSinceLength); - } - - int serveRecentStateLength = 0; - if (message.ServeRecentState.HasValue) - { - serveRecentStateLength = Rlp.LengthOf(StatusMessage.KeyNames.ServeRecentState) + Rlp.LengthOf(message.ServeRecentState.Value); - totalContentLength += Rlp.LengthOfSequence(serveRecentStateLength); - } - - int txRelayLength = 0; - if (message.TxRelay) - { - txRelayLength = Rlp.LengthOf(StatusMessage.KeyNames.TxRelay) + Rlp.OfEmptySequence.Length; - totalContentLength += Rlp.LengthOfSequence(txRelayLength); - } - - int bufferLimitLength = 0; - if (message.BufferLimit.HasValue) - { - bufferLimitLength = Rlp.LengthOf(StatusMessage.KeyNames.BufferLimit) + Rlp.LengthOf(message.BufferLimit.Value); - totalContentLength += Rlp.LengthOfSequence(bufferLimitLength); - } - - int maxRechargeRateLength = 0; - if (message.MaximumRechargeRate.HasValue) - { - maxRechargeRateLength = Rlp.LengthOf(StatusMessage.KeyNames.MaximumRechargeRate) + Rlp.LengthOf(message.MaximumRechargeRate.Value); - totalContentLength += Rlp.LengthOfSequence(maxRechargeRateLength); - } - - int maxRequestCostsLength = 0; - int innerCostListLength = 0; - if (message.MaximumRequestCosts is not null) - { - // todo - what's the best way to do this? Calculating the length twice is definitely less than ideal. - // Maybe build RLP for them here, and append bytes below? - maxRequestCostsLength += Rlp.LengthOf(StatusMessage.KeyNames.MaximumRequestCosts); - foreach (var item in message.MaximumRequestCosts) - { - int costContentLength = Rlp.LengthOf(item.MessageCode) + Rlp.LengthOf(item.BaseCost) + Rlp.LengthOf(item.RequestCost); - innerCostListLength += Rlp.LengthOfSequence(costContentLength); - } - maxRequestCostsLength += Rlp.LengthOfSequence(innerCostListLength); - totalContentLength += Rlp.LengthOfSequence(maxRequestCostsLength); - } - #endregion - - #region Encode Values - int totalLength = Rlp.LengthOfSequence(totalContentLength); - byteBuffer.EnsureWritable(totalLength); - rlpStream.StartSequence(totalContentLength); - - rlpStream.StartSequence(protocolVersionLength); - rlpStream.Encode(StatusMessage.KeyNames.ProtocolVersion); - rlpStream.Encode(message.ProtocolVersion); - - rlpStream.StartSequence(networkIdLength); - rlpStream.Encode(StatusMessage.KeyNames.NetworkId); - rlpStream.Encode(message.NetworkId); - - rlpStream.StartSequence(headTdLength); - rlpStream.Encode(StatusMessage.KeyNames.TotalDifficulty); - rlpStream.Encode(message.TotalDifficulty); - - rlpStream.StartSequence(headHashLength); - rlpStream.Encode(StatusMessage.KeyNames.BestHash); - rlpStream.Encode(message.BestHash); - - rlpStream.StartSequence(headNumLength); - rlpStream.Encode(StatusMessage.KeyNames.HeadBlockNo); - rlpStream.Encode(message.HeadBlockNo); - - rlpStream.StartSequence(genesisHashLength); - rlpStream.Encode(StatusMessage.KeyNames.GenesisHash); - rlpStream.Encode(message.GenesisHash); - - if (message.AnnounceType.HasValue) - { - rlpStream.StartSequence(announceTypeLength); - rlpStream.Encode(StatusMessage.KeyNames.AnnounceType); - rlpStream.Encode(message.AnnounceType.Value); - } - - if (message.ServeHeaders) - { - rlpStream.StartSequence(serveHeadersLength); - rlpStream.Encode(StatusMessage.KeyNames.ServeHeaders); - rlpStream.Encode(Rlp.OfEmptySequence); - } - - if (message.ServeChainSince.HasValue) - { - rlpStream.StartSequence(serveChainSinceLength); - rlpStream.Encode(StatusMessage.KeyNames.ServeChainSince); - rlpStream.Encode(message.ServeChainSince.Value); - } - - if (message.ServeRecentChain.HasValue) - { - rlpStream.StartSequence(serveRecentChainLength); - rlpStream.Encode(StatusMessage.KeyNames.ServeRecentChain); - rlpStream.Encode(message.ServeRecentChain.Value); - } - - if (message.ServeStateSince.HasValue) - { - rlpStream.StartSequence(serveStateSinceLength); - rlpStream.Encode(StatusMessage.KeyNames.ServeStateSince); - rlpStream.Encode(message.ServeStateSince.Value); - } - - if (message.ServeRecentState.HasValue) - { - rlpStream.StartSequence(serveRecentStateLength); - rlpStream.Encode(StatusMessage.KeyNames.ServeRecentState); - rlpStream.Encode(message.ServeRecentState.Value); - } - - if (message.TxRelay) - { - rlpStream.StartSequence(txRelayLength); - rlpStream.Encode(StatusMessage.KeyNames.TxRelay); - rlpStream.Encode(Rlp.OfEmptySequence); - } - - if (message.BufferLimit.HasValue) - { - rlpStream.StartSequence(bufferLimitLength); - rlpStream.Encode(StatusMessage.KeyNames.BufferLimit); - rlpStream.Encode(message.BufferLimit.Value); - } - - if (message.MaximumRechargeRate.HasValue) - { - rlpStream.StartSequence(maxRechargeRateLength); - rlpStream.Encode(StatusMessage.KeyNames.MaximumRechargeRate); - rlpStream.Encode(message.MaximumRechargeRate.Value); - } - - if (message.MaximumRequestCosts is not null) - { - rlpStream.StartSequence(maxRequestCostsLength); - rlpStream.Encode(StatusMessage.KeyNames.MaximumRequestCosts); - rlpStream.StartSequence(innerCostListLength); - foreach (var item in message.MaximumRequestCosts) - { - int length = Rlp.LengthOf(item.MessageCode) + Rlp.LengthOf(item.BaseCost) + Rlp.LengthOf(item.RequestCost); - rlpStream.StartSequence(length); - rlpStream.Encode(item.MessageCode); - rlpStream.Encode(item.BaseCost); - rlpStream.Encode(item.RequestCost); - } - } - #endregion - } - - public StatusMessage Deserialize(IByteBuffer byteBuffer) - { - RlpStream rlpStream = new NettyRlpStream(byteBuffer); - return Deserialize(rlpStream); - } - - private static StatusMessage Deserialize(RlpStream rlpStream) - { - StatusMessage statusMessage = new(); - (int prefixLength, int contentLength) = rlpStream.PeekPrefixAndContentLength(); - var totalLength = contentLength; - rlpStream.Position += prefixLength; - var readLength = prefixLength; - while (totalLength > readLength) - { - (prefixLength, contentLength) = rlpStream.PeekPrefixAndContentLength(); - readLength += prefixLength + contentLength; - rlpStream.Position += prefixLength; - string key = rlpStream.DecodeString(); - switch (key) - { - case StatusMessage.KeyNames.ProtocolVersion: - statusMessage.ProtocolVersion = rlpStream.DecodeByte(); - break; - case StatusMessage.KeyNames.NetworkId: - statusMessage.NetworkId = rlpStream.DecodeUInt256(); - break; - case StatusMessage.KeyNames.TotalDifficulty: - statusMessage.TotalDifficulty = rlpStream.DecodeUInt256(); - break; - case StatusMessage.KeyNames.BestHash: - statusMessage.BestHash = rlpStream.DecodeKeccak(); - break; - case StatusMessage.KeyNames.HeadBlockNo: - statusMessage.HeadBlockNo = rlpStream.DecodeLong(); - break; - case StatusMessage.KeyNames.GenesisHash: - statusMessage.GenesisHash = rlpStream.DecodeKeccak(); - break; - case StatusMessage.KeyNames.AnnounceType: - statusMessage.AnnounceType = rlpStream.DecodeByte(); - break; - case StatusMessage.KeyNames.ServeHeaders: - statusMessage.ServeHeaders = true; - rlpStream.SkipItem(); - break; - case StatusMessage.KeyNames.ServeChainSince: - statusMessage.ServeChainSince = rlpStream.DecodeLong(); - break; - case StatusMessage.KeyNames.ServeRecentChain: - statusMessage.ServeRecentChain = rlpStream.DecodeLong(); - break; - case StatusMessage.KeyNames.ServeStateSince: - statusMessage.ServeStateSince = rlpStream.DecodeLong(); - break; - case StatusMessage.KeyNames.ServeRecentState: - statusMessage.ServeRecentState = rlpStream.DecodeLong(); - break; - case StatusMessage.KeyNames.TxRelay: - statusMessage.TxRelay = true; - rlpStream.SkipItem(); - break; - case StatusMessage.KeyNames.BufferLimit: - statusMessage.BufferLimit = rlpStream.DecodeInt(); - break; - case StatusMessage.KeyNames.MaximumRechargeRate: - statusMessage.MaximumRechargeRate = rlpStream.DecodeInt(); - break; - case StatusMessage.KeyNames.MaximumRequestCosts: - // todo - default: - // Ignore unknown keys - rlpStream.Position = readLength; - break; - } - } - - return statusMessage; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/RequestCost.cs b/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/RequestCost.cs deleted file mode 100644 index d9aa502fac8..00000000000 --- a/src/Nethermind/Nethermind.Network/P2P/Subprotocols/Les/RequestCost.cs +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Network.P2P.Subprotocols.Les -{ - public class RequestCostItem - { - public int MessageCode; - public int BaseCost; - public int RequestCost; - public RequestCostItem(int messageCode, int baseCost, int requestCost) - { - MessageCode = messageCode; - BaseCost = baseCost; - RequestCost = requestCost; - } - } -} diff --git a/src/Nethermind/Nethermind.Network/ProtocolValidator.cs b/src/Nethermind/Nethermind.Network/ProtocolValidator.cs index 782347ba20c..1b26c75d553 100644 --- a/src/Nethermind/Nethermind.Network/ProtocolValidator.cs +++ b/src/Nethermind/Nethermind.Network/ProtocolValidator.cs @@ -35,7 +35,7 @@ public bool DisconnectOnInvalid(string protocol, ISession session, ProtocolIniti return protocol switch { Protocol.P2P => ValidateP2PProtocol(session, eventArgs), - Protocol.Eth or Protocol.Les => ValidateEthProtocol(session, eventArgs), + Protocol.Eth => ValidateEthProtocol(session, eventArgs), _ => true, }; } diff --git a/src/Nethermind/Nethermind.Network/ProtocolsManager.cs b/src/Nethermind/Nethermind.Network/ProtocolsManager.cs index c178f101ab7..236acec43ed 100644 --- a/src/Nethermind/Nethermind.Network/ProtocolsManager.cs +++ b/src/Nethermind/Nethermind.Network/ProtocolsManager.cs @@ -20,7 +20,6 @@ using Nethermind.Network.P2P.Subprotocols.Eth.V66; using Nethermind.Network.P2P.Subprotocols.Eth.V67; using Nethermind.Network.P2P.Subprotocols.Eth.V68; -using Nethermind.Network.P2P.Subprotocols.Les; using Nethermind.Network.P2P.Subprotocols.NodeData; using Nethermind.Network.P2P.Subprotocols.Snap; using Nethermind.Network.Rlpx; @@ -235,13 +234,6 @@ private IDictionary> GetProtocolFa }; InitSatelliteProtocol(session, handler); - return handler; - }, - [Protocol.Les] = (session, version) => - { - LesProtocolHandler handler = new(session, _serializer, _stats, _syncServer, _backgroundTaskScheduler, _logManager); - InitSyncPeerProtocol(session, handler); - return handler; } }; diff --git a/src/Nethermind/Nethermind.Synchronization/ISyncServer.cs b/src/Nethermind/Nethermind.Synchronization/ISyncServer.cs index 53601852fb9..3a14b7b96f9 100644 --- a/src/Nethermind/Nethermind.Synchronization/ISyncServer.cs +++ b/src/Nethermind/Nethermind.Synchronization/ISyncServer.cs @@ -10,7 +10,6 @@ using Nethermind.Core.Collections; using Nethermind.Core.Crypto; using Nethermind.Synchronization.FastSync; -using Nethermind.Synchronization.LesSync; namespace Nethermind.Synchronization { @@ -21,9 +20,6 @@ public interface ISyncServer : IDisposable void StopNotifyingPeersAboutNewBlocks(); TxReceipt[] GetReceipts(Hash256 blockHashes); Block? Find(Hash256 hash); - BlockHeader FindLowestCommonAncestor(BlockHeader firstDescendant, BlockHeader secondDescendant); - public Task BuildCHT(); - public CanonicalHashTrie? GetCHT(); Hash256? FindHash(long number); IOwnedReadOnlyList FindHeaders(Hash256 hash, int numberOfBlocks, int skip, bool reverse); IOwnedReadOnlyList GetNodeData(IReadOnlyList keys, CancellationToken cancellationToken, NodeDataType includedTypes = NodeDataType.Code | NodeDataType.State); diff --git a/src/Nethermind/Nethermind.Synchronization/LesSync/CanonicalHashTrie.cs b/src/Nethermind/Nethermind.Synchronization/LesSync/CanonicalHashTrie.cs deleted file mode 100644 index 73374859419..00000000000 --- a/src/Nethermind/Nethermind.Synchronization/LesSync/CanonicalHashTrie.cs +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nethermind.Core; -using Nethermind.Core.Crypto; -using Nethermind.Core.Extensions; -using Nethermind.Logging; -using Nethermind.Int256; -using Nethermind.Serialization.Rlp; -using Nethermind.Trie; - -namespace Nethermind.Synchronization.LesSync -{ - public class CanonicalHashTrie : PatriciaTree - { - private static readonly ChtDecoder _decoder = new(); - public static readonly int SectionSize = 32768; // 2**15 - - private static readonly byte[] MaxSectionKey = Encoding.ASCII.GetBytes("MaxSection"); - - public CanonicalHashTrie(IKeyValueStoreWithBatching db) - : base(db, GetMaxRootHash(db), true, true, NullLogManager.Instance) - { - } - - public CanonicalHashTrie(IKeyValueStoreWithBatching db, Hash256 rootHash) - : base(db, rootHash, true, true, NullLogManager.Instance) - { - } - - public void CommitSectionIndex(long sectionIndex) - { - StoreRootHash(sectionIndex); - } - - public static long GetMaxSectionIndex() - { - //return GetMaxSectionIndex(_keyValueStore); - return -1; - } - - public static long GetSectionFromBlockNo(long blockNo) => (blockNo / SectionSize) - 1L; - - public static byte[][] BuildProof(long blockNo, long sectionIndex, long fromLevel) - { - return BuildProof(GetKey(blockNo), sectionIndex, fromLevel); - } - - public static byte[][] BuildProof(byte[] key, long sectionIndex, long fromLevel) - { - ChtProofCollector proofCollector = new(key, fromLevel); - //Accept(proofCollector, GetRootHash(sectionIndex), false); - return proofCollector.BuildResult(); - } - - private void StoreRootHash(long sectionIndex) - { - UpdateRootHash(); - //_keyValueStore[GetRootHashKey(sectionIndex)] = RootHash.Bytes; - //if (GetMaxSectionIndex(_keyValueStore) < sectionIndex) - //{ - // SetMaxSectionIndex(sectionIndex); - //} - } - - private static long GetMaxSectionIndex(IKeyValueStore db) - { - byte[]? storeValue = null; - try - { - storeValue = db[MaxSectionKey]; - } - catch (KeyNotFoundException) { } - return storeValue?.ToLongFromBigEndianByteArrayWithoutLeadingZeros() ?? -1L; - } - - private static Hash256 GetRootHash(IKeyValueStore db, long sectionIndex) - { - byte[]? hash = db[GetRootHashKey(sectionIndex)]; - return hash is null ? EmptyTreeHash : new Hash256(hash); - } - - private static Hash256 GetMaxRootHash(IKeyValueStore db) - { - long maxSection = GetMaxSectionIndex(db); - return maxSection == 0L ? EmptyTreeHash : GetRootHash(db, maxSection); - } - - public void Set(BlockHeader header) - { - Set(GetKey(header), GetValue(header)); - } - - public (Hash256?, UInt256) Get(long key) - { - return Get(GetKey(key)); - } - - public (Hash256?, UInt256) Get(Span key) - { - ReadOnlySpan val = base.Get(key); - if (val.IsEmpty) - { - throw new InvalidDataException("Missing CHT data"); - } - - return _decoder.Decode(val); - } - - private static byte[] GetKey(BlockHeader header) - { - return GetKey(header.Number); - } - - private static byte[] GetKey(long key) - { - return key.ToBigEndianByteArrayWithoutLeadingZeros().PadLeft(8); - } - - private static byte[] GetRootHashKey(long key) - { - return Bytes.Concat(Encoding.ASCII.GetBytes("RootHash"), GetKey(key)); - } - - private static Rlp GetValue(BlockHeader header) - { - if (!header.TotalDifficulty.HasValue) - { - throw new ArgumentException("Trying to use a header with a null total difficulty in LES Canonical Hash Trie"); - } - - (Hash256? Hash, UInt256 Value) item = (header.Hash, header.TotalDifficulty.Value); - RlpStream stream = new(_decoder.GetLength(item, RlpBehaviors.None)); - _decoder.Encode(stream, item); - return new Rlp(stream.Data.ToArray()); - } - } -} diff --git a/src/Nethermind/Nethermind.Synchronization/LesSync/ChtDecoder.cs b/src/Nethermind/Nethermind.Synchronization/LesSync/ChtDecoder.cs deleted file mode 100644 index 7fbfbb7e82e..00000000000 --- a/src/Nethermind/Nethermind.Synchronization/LesSync/ChtDecoder.cs +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using Nethermind.Core.Crypto; -using Nethermind.Int256; -using Nethermind.Serialization.Rlp; - -namespace Nethermind.Synchronization.LesSync -{ - public class ChtDecoder : IRlpStreamDecoder<(Hash256?, UInt256)>, IRlpValueDecoder<(Hash256?, UInt256)> - { - public (Hash256?, UInt256) Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) - { - if (rlpStream.IsNextItemNull()) - { - rlpStream.ReadByte(); - return (null, 0); - } - - rlpStream.ReadSequenceLength(); - Hash256 hash = rlpStream.DecodeKeccak(); - UInt256 totalDifficulty = rlpStream.DecodeUInt256(); - return (hash, totalDifficulty); - } - - public void Encode(RlpStream stream, (Hash256?, UInt256) item, RlpBehaviors rlpBehaviors = RlpBehaviors.None) - { - (Hash256? hash, UInt256 totalDifficulty) = item; - int contentLength = GetContentLength(item, RlpBehaviors.None); - stream.StartSequence(contentLength); - stream.Encode(hash); - stream.Encode(totalDifficulty); - } - - public (Hash256?, UInt256) Decode(byte[] bytes) - { - return Decode(new RlpStream(bytes)); - } - - public Rlp Encode((Hash256?, UInt256) item, RlpBehaviors rlpBehaviors = RlpBehaviors.None) - { - throw new NotImplementedException(); - } - - public int GetLength((Hash256?, UInt256) item, RlpBehaviors rlpBehaviors) - { - return Rlp.LengthOfSequence(GetContentLength(item, rlpBehaviors)); - } - - private static int GetContentLength((Hash256?, UInt256) item, RlpBehaviors rlpBehaviors) - { - (Hash256? hash, UInt256 totalDifficulty) = item; - return Rlp.LengthOf(hash) + Rlp.LengthOf(totalDifficulty); - } - - public (Hash256?, UInt256) Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) - { - if (decoderContext.IsNextItemNull()) - { - decoderContext.ReadByte(); - return (null, 0); - } - - decoderContext.ReadSequenceLength(); - Hash256 hash = decoderContext.DecodeKeccak(); - UInt256 totalDifficulty = decoderContext.DecodeUInt256(); - return (hash, totalDifficulty); - } - } -} diff --git a/src/Nethermind/Nethermind.Synchronization/LesSync/ChtProofCollector.cs b/src/Nethermind/Nethermind.Synchronization/LesSync/ChtProofCollector.cs deleted file mode 100644 index 910c5a1473e..00000000000 --- a/src/Nethermind/Nethermind.Synchronization/LesSync/ChtProofCollector.cs +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using Nethermind.State.Proofs; -using Nethermind.Trie; - -namespace Nethermind.Synchronization.LesSync -{ - class ChtProofCollector : ProofCollector - { - readonly long _fromLevel; - long _level; - public ChtProofCollector(byte[] key, long fromLevel) : base(key) - { - _fromLevel = fromLevel; - _level = 0; - } - - protected override void AddProofBits(TrieNode node) - { - if (_level < _fromLevel) - { - _level++; - } - else - { - base.AddProofBits(node); - } - } - } -} diff --git a/src/Nethermind/Nethermind.Synchronization/SyncServer.cs b/src/Nethermind/Nethermind.Synchronization/SyncServer.cs index 12f94ab05e0..30ed536806e 100644 --- a/src/Nethermind/Nethermind.Synchronization/SyncServer.cs +++ b/src/Nethermind/Nethermind.Synchronization/SyncServer.cs @@ -22,9 +22,7 @@ using Nethermind.Core.Specs; using Nethermind.Int256; using Nethermind.Logging; -using Nethermind.State; using Nethermind.Synchronization.FastSync; -using Nethermind.Synchronization.LesSync; using Nethermind.Synchronization.ParallelSync; using Nethermind.Synchronization.Peers; @@ -46,7 +44,6 @@ public class SyncServer : ISyncServer private readonly IReadOnlyKeyValueStore _codeDb; private readonly IGossipPolicy _gossipPolicy; private readonly ISpecProvider _specProvider; - private readonly CanonicalHashTrie? _cht; private bool _gossipStopped = false; private readonly Random _broadcastRandomizer = new(); @@ -68,8 +65,7 @@ public SyncServer( ISyncConfig syncConfig, IGossipPolicy gossipPolicy, ISpecProvider specProvider, - ILogManager logManager, - CanonicalHashTrie? cht = null) + ILogManager logManager) { ISyncConfig config = syncConfig ?? throw new ArgumentNullException(nameof(syncConfig)); _gossipPolicy = gossipPolicy ?? throw new ArgumentNullException(nameof(gossipPolicy)); @@ -83,7 +79,6 @@ public SyncServer( _receiptFinder = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder)); _blockValidator = blockValidator ?? throw new ArgumentNullException(nameof(blockValidator)); _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); - _cht = cht; _pivotNumber = config.PivotNumberParsed; _pivotHash = new Hash256(config.PivotHash ?? Keccak.Zero.ToString()); @@ -392,11 +387,6 @@ public IOwnedReadOnlyList FindHeaders(Hash256 hash, int numberOfBlo return values; } - public BlockHeader FindLowestCommonAncestor(BlockHeader firstDescendant, BlockHeader secondDescendant) - { - return _blockTree.FindLowestCommonAncestor(firstDescendant, secondDescendant, Sync.MaxReorgLength); - } - public Block Find(Hash256 hash) => _blockTree.FindBlock(hash, BlockTreeLookupOptions.TotalDifficultyNotNeeded | BlockTreeLookupOptions.ExcludeTxHashes); public Hash256? FindHash(long number) @@ -455,49 +445,5 @@ public void Dispose() { StopNotifyingPeersAboutNewBlocks(); } - - private readonly object _chtLock = new(); - - // TODO - Cancellation token? - // TODO - not a fan of this function name - CatchUpCHT, AddMissingCHTBlocks, ...? - public Task BuildCHT() - { - return Task.CompletedTask; // removing LES code - -#pragma warning disable 162 - return Task.Run(() => - { - lock (_chtLock) - { - if (_cht is null) - { - throw new InvalidAsynchronousStateException("CHT reference is null when building CHT."); - } - - // Note: The spec says this should be 2048, but I don't think we'd ever want it to be higher than the max reorg depth we allow. - long maxSection = - CanonicalHashTrie.GetSectionFromBlockNo(_blockTree.FindLatestHeader().Number - - Sync.MaxReorgLength); - long maxKnownSection = CanonicalHashTrie.GetMaxSectionIndex(); - - for (long section = (maxKnownSection + 1); section <= maxSection; section++) - { - long sectionStart = section * CanonicalHashTrie.SectionSize; - for (int blockOffset = 0; blockOffset < CanonicalHashTrie.SectionSize; blockOffset++) - { - _cht.Set(_blockTree.FindHeader(sectionStart + blockOffset)); - } - - _cht.Commit(section); - } - } - }); -#pragma warning restore 162 - } - - public CanonicalHashTrie? GetCHT() - { - return _cht; - } } }