From c9deec99ae28491e32aba594b78137e700fd1fdc Mon Sep 17 00:00:00 2001 From: Marcin Sobczak <77129288+marcindsobczak@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:07:12 +0200 Subject: [PATCH] Fix json response in `engine_getBlobsV1` (#7650) --- .../EngineModuleTests.V3.cs | 29 +++++++++---------- .../Data/GetBlobsV1Result.cs | 11 ------- .../EngineRpcModule.Cancun.cs | 5 ++-- .../EngineRpcModule.cs | 2 +- .../Handlers/GetBlobsHandler.cs | 8 ++--- .../IEngineRpcModule.Cancun.cs | 3 +- 6 files changed, 24 insertions(+), 34 deletions(-) delete mode 100644 src/Nethermind/Nethermind.Merge.Plugin/Data/GetBlobsV1Result.cs diff --git a/src/Nethermind/Nethermind.Merge.Plugin.Test/EngineModuleTests.V3.cs b/src/Nethermind/Nethermind.Merge.Plugin.Test/EngineModuleTests.V3.cs index fc4e6d663ca..5fda932e45b 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin.Test/EngineModuleTests.V3.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin.Test/EngineModuleTests.V3.cs @@ -379,7 +379,7 @@ public async Task NewPayloadV3_should_verify_blob_versioned_hashes_again Substitute.For(), Substitute.For>(), Substitute.For, IEnumerable>>(), - Substitute.For>(), + Substitute.For>>(), chain.SpecProvider, new GCKeeper(NoGCStrategy.Instance, chain.LogManager), Substitute.For())); @@ -539,7 +539,7 @@ public async Task GetBlobsV1_should_throw_if_more_than_128_requested_blobs([Valu request.Add(Bytes.FromHexString(i.ToString("X64"))); } - ResultWrapper result = await rpcModule.engine_getBlobsV1(request.ToArray()); + ResultWrapper> result = await rpcModule.engine_getBlobsV1(request.ToArray()); if (requestSize > 128) { @@ -549,7 +549,7 @@ public async Task GetBlobsV1_should_throw_if_more_than_128_requested_blobs([Valu else { result.Result.Should().Be(Result.Success); - result.Data.BlobsAndProofs.Should().HaveCount(requestSize); + result.Data.Should().HaveCount(requestSize); } } @@ -559,10 +559,10 @@ public async Task GetBlobsV1_should_handle_empty_request() MergeTestBlockchain chain = await CreateBlockchain(releaseSpec: Cancun.Instance); IEngineRpcModule rpcModule = CreateEngineModule(chain, null, TimeSpan.FromDays(1)); - ResultWrapper result = await rpcModule.engine_getBlobsV1([]); + ResultWrapper> result = await rpcModule.engine_getBlobsV1([]); result.Result.Should().Be(Result.Success); - result.Data.Should().BeEquivalentTo(new GetBlobsV1Result(ArraySegment.Empty)); + result.Data.Should().BeEquivalentTo(ArraySegment.Empty); } [Test] @@ -580,11 +580,11 @@ public async Task GetBlobsV1_should_return_requested_blobs([Values(1, 2, 3, 4, 5 chain.TxPool.SubmitTx(blobTx, TxHandlingOptions.None).Should().Be(AcceptTxResult.Accepted); - ResultWrapper result = await rpcModule.engine_getBlobsV1(blobTx.BlobVersionedHashes!); + ResultWrapper> result = await rpcModule.engine_getBlobsV1(blobTx.BlobVersionedHashes!); ShardBlobNetworkWrapper wrapper = (ShardBlobNetworkWrapper)blobTx.NetworkWrapper!; - result.Data.BlobsAndProofs.Select(b => b!.Blob).Should().BeEquivalentTo(wrapper.Blobs); - result.Data.BlobsAndProofs.Select(b => b!.Proof).Should().BeEquivalentTo(wrapper.Proofs); + result.Data.Select(b => b!.Blob).Should().BeEquivalentTo(wrapper.Blobs); + result.Data.Select(b => b!.Proof).Should().BeEquivalentTo(wrapper.Proofs); } [Test] @@ -602,10 +602,10 @@ public async Task GetBlobsV1_should_return_nulls_when_blobs_not_found([Values(1, .SignedAndResolved(chain.EthereumEcdsa, TestItem.PrivateKeyA).TestObject; // requesting hashes that are not present in TxPool - ResultWrapper result = await rpcModule.engine_getBlobsV1(blobTx.BlobVersionedHashes!); + ResultWrapper> result = await rpcModule.engine_getBlobsV1(blobTx.BlobVersionedHashes!); - result.Data.BlobsAndProofs.Should().HaveCount(numberOfRequestedBlobs); - result.Data.BlobsAndProofs.Should().AllBeEquivalentTo(null); + result.Data.Should().HaveCount(numberOfRequestedBlobs); + result.Data.Should().AllBeEquivalentTo(null); } [Test] @@ -638,12 +638,11 @@ public async Task GetBlobsV1_should_return_mix_of_blobs_and_nulls([Values(1, 2, : null); blobVersionedHashesRequest.Add(addActualHash ? blobTx.BlobVersionedHashes![actualIndex++]! : Bytes.FromHexString(i.ToString("X64"))); } - GetBlobsV1Result expected = new(blobsAndProofs.ToArray()); - ResultWrapper result = await rpcModule.engine_getBlobsV1(blobVersionedHashesRequest.ToArray()); + ResultWrapper> result = await rpcModule.engine_getBlobsV1(blobVersionedHashesRequest.ToArray()); - result.Data.Should().BeEquivalentTo(expected); - BlobAndProofV1?[] resultBlobsAndProofs = result.Data.BlobsAndProofs.ToArray(); + result.Data.Should().BeEquivalentTo(blobsAndProofs); + BlobAndProofV1?[] resultBlobsAndProofs = result.Data.ToArray(); resultBlobsAndProofs.Length.Should().Be(requestSize); for (int i = 0; i < requestSize; i++) { diff --git a/src/Nethermind/Nethermind.Merge.Plugin/Data/GetBlobsV1Result.cs b/src/Nethermind/Nethermind.Merge.Plugin/Data/GetBlobsV1Result.cs deleted file mode 100644 index b5a414bebe6..00000000000 --- a/src/Nethermind/Nethermind.Merge.Plugin/Data/GetBlobsV1Result.cs +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System.Collections.Generic; - -namespace Nethermind.Merge.Plugin.Data; - -public class GetBlobsV1Result(IEnumerable blobsAndProofs) -{ - public IEnumerable BlobsAndProofs { get; } = blobsAndProofs; -} diff --git a/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.Cancun.cs b/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.Cancun.cs index da515d458ed..1599cda642b 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.Cancun.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.Cancun.cs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only +using System.Collections.Generic; using System.Threading.Tasks; using Nethermind.Consensus; using Nethermind.Consensus.Producers; @@ -14,7 +15,7 @@ namespace Nethermind.Merge.Plugin; public partial class EngineRpcModule : IEngineRpcModule { private readonly IAsyncHandler _getPayloadHandlerV3; - private readonly IAsyncHandler _getBlobsHandler; + private readonly IAsyncHandler> _getBlobsHandler; public Task> engine_forkchoiceUpdatedV3(ForkchoiceStateV1 forkchoiceState, PayloadAttributes? payloadAttributes = null) => ForkchoiceUpdated(forkchoiceState, payloadAttributes, EngineApiVersions.Cancun); @@ -25,6 +26,6 @@ public Task> engine_newPayloadV3(ExecutionPayload public async Task> engine_getPayloadV3(byte[] payloadId) => await _getPayloadHandlerV3.HandleAsync(payloadId); - public async Task> engine_getBlobsV1(byte[][] blobVersionedHashes) => + public async Task>> engine_getBlobsV1(byte[][] blobVersionedHashes) => await _getBlobsHandler.HandleAsync(blobVersionedHashes); } diff --git a/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.cs b/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.cs index 3ea4863fa05..a05441e68d7 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/EngineRpcModule.cs @@ -33,7 +33,7 @@ public EngineRpcModule( IGetPayloadBodiesByRangeV2Handler executionGetPayloadBodiesByRangeV2Handler, IHandler transitionConfigurationHandler, IHandler, IEnumerable> capabilitiesHandler, - IAsyncHandler getBlobsHandler, + IAsyncHandler> getBlobsHandler, ISpecProvider specProvider, GCKeeper gcKeeper, ILogManager logManager) diff --git a/src/Nethermind/Nethermind.Merge.Plugin/Handlers/GetBlobsHandler.cs b/src/Nethermind/Nethermind.Merge.Plugin/Handlers/GetBlobsHandler.cs index 957344aab15..4431b8b1fcd 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/Handlers/GetBlobsHandler.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/Handlers/GetBlobsHandler.cs @@ -9,19 +9,19 @@ namespace Nethermind.Merge.Plugin.Handlers; -public class GetBlobsHandler(ITxPool txPool) : IAsyncHandler +public class GetBlobsHandler(ITxPool txPool) : IAsyncHandler> { private const int MaxRequest = 128; - public Task> HandleAsync(byte[][] request) + public Task>> HandleAsync(byte[][] request) { if (request.Length > MaxRequest) { var error = $"The number of requested blobs must not exceed {MaxRequest}"; - return ResultWrapper.Fail(error, MergeErrorCodes.TooLargeRequest); + return ResultWrapper>.Fail(error, MergeErrorCodes.TooLargeRequest); } - return ResultWrapper.Success(new GetBlobsV1Result(GetBlobsAndProofs(request))); + return ResultWrapper>.Success(GetBlobsAndProofs(request)); } private IEnumerable GetBlobsAndProofs(byte[][] request) diff --git a/src/Nethermind/Nethermind.Merge.Plugin/IEngineRpcModule.Cancun.cs b/src/Nethermind/Nethermind.Merge.Plugin/IEngineRpcModule.Cancun.cs index 552956057da..1fde9feef46 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/IEngineRpcModule.Cancun.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/IEngineRpcModule.Cancun.cs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only +using System.Collections.Generic; using System.Threading.Tasks; using Nethermind.Consensus.Producers; using Nethermind.Core.Crypto; @@ -35,5 +36,5 @@ public partial interface IEngineRpcModule : IRpcModule Description = "Returns requested blobs and proofs.", IsSharable = true, IsImplemented = true)] - public Task> engine_getBlobsV1(byte[][] blobVersionedHashes); + public Task>> engine_getBlobsV1(byte[][] blobVersionedHashes); }