Skip to content

Commit e4e9ac0

Browse files
committed
Preserve RLP cleanup behavior
1 parent 1845ea9 commit e4e9ac0

5 files changed

Lines changed: 31 additions & 91 deletions

File tree

src/Nethermind/Nethermind.Blockchain.Test/Proofs/ReceiptTrieTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ private void VerifyProof(byte[][] proof, Hash256 receiptRoot)
8484
{
8585
TrieNode node = new(NodeType.Unknown, proof.Last());
8686
node.ResolveNode(Substitute.For<ITrieNodeResolver>(), TreePath.Empty);
87-
RlpReader ctx = new(node.Value.ToArray());
87+
RlpReader ctx = new(node.Value.AsSpan());
8888
TxReceipt receipt = _decoder.Decode(ref ctx);
8989
Assert.That(receipt.Bloom, Is.Not.Null);
9090

src/Nethermind/Nethermind.EraE.Test/Archive/EraWriterTests.cs

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
// SPDX-License-Identifier: LGPL-3.0-only
33

44
using Nethermind.Core;
5-
using Nethermind.Core.Crypto;
65
using Nethermind.Core.Specs;
76
using Nethermind.Core.Test.Builders;
87
using Nethermind.Core.Test.IO;
98
using Nethermind.Era1.Exceptions;
10-
using Nethermind.EraE.Proofs;
119
using Nethermind.Int256;
1210
using NSubstitute;
1311
using NUnit.Framework;
@@ -72,21 +70,6 @@ public Task Add_PostMergeBlockWithoutTotalDifficulty_Succeeds()
7270
return Task.CompletedTask;
7371
}
7472

75-
[Test]
76-
public async Task Add_WhenBeaconRootsProviderThrows_DoesNotAdvanceBufferedBlock()
77-
{
78-
ThrowOnceBeaconRootsProvider beaconRootsProvider = new();
79-
ISpecProvider specProvider = Substitute.For<ISpecProvider>();
80-
specProvider.BeaconChainGenesisTimestamp.Returns((ulong?)0UL);
81-
using EraWriter sut = new(new MemoryStream(), specProvider, beaconRootsProvider);
82-
83-
Block block = Build.A.Block.WithNumber(0).WithPostMergeRules().TestObject;
84-
85-
Assert.That(async () => await sut.Add(block, []), Throws.TypeOf<InvalidOperationException>());
86-
Assert.That(async () => await sut.Add(block, []), Throws.Nothing);
87-
Assert.That(async () => await sut.Finalize(), Throws.Nothing);
88-
}
89-
9073
[Test]
9174
public async Task Add_AfterFinalized_ThrowsEraException()
9275
{
@@ -199,26 +182,4 @@ public void Dispose_WhenCalled_DisposesInnerStream()
199182
}
200183

201184
private static EraWriter CreateSut() => new(new MemoryStream(), Substitute.For<ISpecProvider>());
202-
203-
private sealed class ThrowOnceBeaconRootsProvider : IBeaconRootsProvider
204-
{
205-
private bool _shouldThrow = true;
206-
207-
public Task<(ValueHash256 BeaconBlockRoot, ValueHash256 StateRoot)?> GetBeaconRoots(
208-
long slot,
209-
CancellationToken cancellationToken = default)
210-
{
211-
if (_shouldThrow)
212-
{
213-
_shouldThrow = false;
214-
throw new InvalidOperationException("Beacon roots lookup failed.");
215-
}
216-
217-
return Task.FromResult<(ValueHash256 BeaconBlockRoot, ValueHash256 StateRoot)?>(null);
218-
}
219-
220-
public void Dispose()
221-
{
222-
}
223-
}
224185
}

src/Nethermind/Nethermind.EraE/Archive/EraWriter.cs

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,13 @@ public async Task Add(Block block, TxReceipt[] receipts, CancellationToken cance
131131

132132
RlpBehaviors rlpBehaviors = spec.IsEip658Enabled ? RlpBehaviors.Eip658Receipts : RlpBehaviors.None;
133133

134-
(ValueHash256 BeaconBlockRoot, ValueHash256 StateRoot)? roots = null;
134+
AddEncodedPayloads(block, receipts, rlpBehaviors, spec.IsEip658Enabled);
135135

136136
if (isPostMerge && _beaconRootsProvider is not null && _slotTime is not null)
137137
{
138138
long slot = (long)_slotTime.GetSlot(block.Header.Timestamp * MillisecondsPerSecond);
139-
roots = await _beaconRootsProvider.GetBeaconRoots(slot, cancellation);
140-
}
141-
142-
AddEncodedPayloads(block, receipts, rlpBehaviors, spec.IsEip658Enabled);
143-
144-
if (isPostMerge)
145-
{
139+
(ValueHash256 BeaconBlockRoot, ValueHash256 StateRoot)? roots =
140+
await _beaconRootsProvider.GetBeaconRoots(slot, cancellation);
146141
_blocksRootContext!.ProcessBlock(block, roots?.BeaconBlockRoot, roots?.StateRoot);
147142
}
148143
else
@@ -399,56 +394,38 @@ private static void DisposePayloads(ArrayPoolList<ArrayPoolSpan<byte>> payloads)
399394
payloads.Clear();
400395
}
401396

402-
private static void DisposeAddedOrOwned(
403-
ArrayPoolList<ArrayPoolSpan<byte>> payloads,
404-
int originalCount,
405-
ArrayPoolSpan<byte> payload,
406-
bool ownsPayload)
397+
private void AddEncodedPayloads(Block block, TxReceipt[] receipts, RlpBehaviors rlpBehaviors, bool isEip658)
407398
{
408-
if (payloads.Count > originalCount)
399+
ArrayPoolSpan<byte> headerRlp = _headerDecoder.EncodeToArrayPoolSpan(block.Header, rlpBehaviors);
400+
try
409401
{
410-
payloads[^1].Dispose();
411-
payloads.RemoveAt(payloads.Count - 1);
402+
_headers.Add(headerRlp);
412403
}
413-
else if (ownsPayload)
404+
catch
414405
{
415-
payload.Dispose();
406+
headerRlp.Dispose();
407+
throw;
416408
}
417-
}
418-
419-
private void AddEncodedPayloads(Block block, TxReceipt[] receipts, RlpBehaviors rlpBehaviors, bool isEip658)
420-
{
421-
ArrayPoolSpan<byte> headerRlp = _headerDecoder.EncodeToArrayPoolSpan(block.Header, rlpBehaviors);
422-
ArrayPoolSpan<byte> bodyRlp = default;
423-
ArrayPoolSpan<byte> receiptRlp = default;
424-
425-
bool ownsHeader = true;
426-
bool ownsBody = false;
427-
bool ownsReceipt = false;
428-
429-
int headersCount = _headers.Count;
430-
int bodiesCount = _bodies.Count;
431-
int receiptsCount = _receipts.Count;
432409

410+
ArrayPoolSpan<byte> bodyRlp = _blockBodyDecoder.EncodeToArrayPoolSpan(block.Body, rlpBehaviors);
433411
try
434412
{
435-
bodyRlp = _blockBodyDecoder.EncodeToArrayPoolSpan(block.Body, rlpBehaviors);
436-
ownsBody = true;
437-
receiptRlp = EncodeSlimReceipts(receipts, isEip658);
438-
ownsReceipt = true;
439-
440-
_headers.Add(headerRlp);
441-
ownsHeader = false;
442413
_bodies.Add(bodyRlp);
443-
ownsBody = false;
414+
}
415+
catch
416+
{
417+
bodyRlp.Dispose();
418+
throw;
419+
}
420+
421+
ArrayPoolSpan<byte> receiptRlp = EncodeSlimReceipts(receipts, isEip658);
422+
try
423+
{
444424
_receipts.Add(receiptRlp);
445-
ownsReceipt = false;
446425
}
447426
catch
448427
{
449-
DisposeAddedOrOwned(_headers, headersCount, headerRlp, ownsHeader);
450-
DisposeAddedOrOwned(_bodies, bodiesCount, bodyRlp, ownsBody);
451-
DisposeAddedOrOwned(_receipts, receiptsCount, receiptRlp, ownsReceipt);
428+
receiptRlp.Dispose();
452429
throw;
453430
}
454431
}

src/Nethermind/Nethermind.Serialization.Rlp/RlpReader.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,10 @@ public bool TryDecodeValueKeccak(out ValueHash256 keccak)
285285
}
286286

287287
ReadOnlySpan<byte> theSpan = DecodeByteArraySpan(RlpLimit.L32);
288-
byte[] keccakByte = new byte[32];
289-
theSpan.CopyTo(keccakByte.AsSpan(32 - theSpan.Length));
290-
return new Hash256(keccakByte);
288+
Span<byte> keccakBytes = stackalloc byte[32];
289+
keccakBytes.Clear();
290+
theSpan.CopyTo(keccakBytes[(32 - theSpan.Length)..]);
291+
return new Hash256(keccakBytes);
291292
}
292293

293294
public void DecodeKeccakStructRef(out Hash256StructRef keccak)
@@ -376,8 +377,7 @@ public void DecodeZeroPrefixedKeccakStructRef(out Hash256StructRef keccak, Span<
376377
RlpHelpers.ThrowUnexpectedPrefix(prefix);
377378
}
378379

379-
byte[] buffer = Read(20).ToArray();
380-
return new Address(buffer);
380+
return new Address(Read(20));
381381
}
382382

383383
public void DecodeAddressStructRef(out AddressStructRef address)

src/Nethermind/Nethermind.Serialization.Rlp/RlpWriterExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,9 @@ public void Encode(string? value)
357357
}
358358
else
359359
{
360-
writer.Encode(Encoding.ASCII.GetBytes(value));
360+
using ArrayPoolSpan<byte> bytes = new(value.Length);
361+
Encoding.ASCII.GetBytes(value.AsSpan(), bytes);
362+
writer.Encode(bytes);
361363
}
362364
}
363365

0 commit comments

Comments
 (0)