Skip to content

Commit 3db054f

Browse files
fix: RlpStream.WriteZero to honor length and zero-fill (#9652)
Fix RlpStream.WriteZero to honor length and zero-fill Co-authored-by: Lukasz Rozmej <[email protected]>
1 parent 53f1560 commit 3db054f

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/Nethermind/Ethereum.Rlp.Test/RlpTests.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ namespace Ethereum.Rlp.Test
1818
[TestFixture]
1919
public class RlpTests
2020
{
21+
private sealed class TestRlpStream : Nethermind.Serialization.Rlp.RlpStream
22+
{
23+
public TestRlpStream(int length) : base(length) { }
24+
public TestRlpStream(byte[] data) : base(data) { }
25+
public void CallWriteZero(int length) => base.WriteZero(length);
26+
}
27+
2128
private class RlpTestJson
2229
{
2330
public object In { get; set; }
@@ -120,6 +127,45 @@ public void TestCast()
120127
Assert.That(Nethermind.Serialization.Rlp.Rlp.Encode((UInt256)1UL, HeaderDecoder.NonceLength).Bytes, Is.EqualTo(expectedNonce), "nonce bytes");
121128
}
122129

130+
[Test]
131+
public void WriteZero_ClearsAndAdvances_OnPreFilledBuffer()
132+
{
133+
byte[] buffer = Enumerable.Repeat((byte)0xAB, 32).ToArray();
134+
var stream = new TestRlpStream(buffer);
135+
stream.Position = 5;
136+
stream.CallWriteZero(7);
137+
138+
Assert.That(stream.Position, Is.EqualTo(12));
139+
Assert.That(buffer.AsSpan(5, 7).ToArray(), Is.EqualTo(new byte[7]));
140+
Assert.That(buffer.AsSpan(0, 5).ToArray(), Is.EqualTo(Enumerable.Repeat((byte)0xAB, 5).ToArray()));
141+
Assert.That(buffer.AsSpan(12).ToArray(), Is.EqualTo(Enumerable.Repeat((byte)0xAB, 20).ToArray()));
142+
}
143+
144+
[Test]
145+
public void WriteZero_AdvancesByRequestedLength_OnNewBuffer()
146+
{
147+
var stream = new TestRlpStream(16);
148+
stream.Position = 3;
149+
stream.CallWriteZero(4);
150+
Assert.That(stream.Position, Is.EqualTo(7));
151+
Assert.That(stream.Data.AsSpan(3, 4).ToArray(), Is.EqualTo(new byte[4]));
152+
}
153+
154+
[Test]
155+
public void EncodeBloom_Empty_Writes256Zeros()
156+
{
157+
int total = Nethermind.Serialization.Rlp.Rlp.LengthOf(Bloom.Empty);
158+
var stream = new TestRlpStream(total);
159+
stream.Encode(Bloom.Empty);
160+
var bytes = stream.Data.AsSpan().ToArray();
161+
162+
Assert.That(bytes.Length, Is.EqualTo(total));
163+
Assert.That(bytes[0], Is.EqualTo(185));
164+
Assert.That(bytes[1], Is.EqualTo(1));
165+
Assert.That(bytes[2], Is.EqualTo(0));
166+
Assert.That(bytes.AsSpan(3, 256).ToArray(), Is.EqualTo(new byte[256]));
167+
}
168+
123169
[Test]
124170
public void TestNonce()
125171
{

src/Nethermind/Nethermind.Serialization.Rlp/RlpStream.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,11 @@ public void Encode(Bloom? bloom)
345345
}
346346
}
347347

348-
protected virtual void WriteZero(int length) => Position += 256;
348+
protected virtual void WriteZero(int length)
349+
{
350+
Data.AsSpan(Position, length).Clear();
351+
Position += length;
352+
}
349353

350354
public void Encode(byte value)
351355
{

0 commit comments

Comments
 (0)