Skip to content

Commit f37cccd

Browse files
fix: update SetL1OriginSignature API to use byte[] and add validation (#10625)
fix(taiko): update SetL1OriginSignature API to use byte[] and add validation Change Signature field from int[] to byte[] to match taiko-geth PR #531 hex-encoded types. Add 65-byte length validation in the RPC handler. Co-authored-by: smartprogrammer93 <smartprogrammer93@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent dcf432f commit f37cccd

File tree

5 files changed

+14
-9
lines changed

5 files changed

+14
-9
lines changed

src/Nethermind/Nethermind.Taiko.Test/L1OriginStoreTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public void Head_key_uses_correct_prefix()
164164
public void Can_store_and_retrieve_signature()
165165
{
166166
UInt256 blockId = 123;
167-
int[] signature = Enumerable.Range(0, 65).ToArray();
167+
byte[] signature = Enumerable.Range(0, 65).Select(i => (byte)i).ToArray();
168168
L1Origin origin = new(blockId, Hash256.Zero, 456, Hash256.Zero, null) { Signature = signature };
169169

170170
_store.WriteL1Origin(blockId, origin);
@@ -196,7 +196,7 @@ public void Can_write_and_read_l1_origin_with_null_block_height()
196196
[TestCase(L1OriginDecoder.SignatureLength * 2)]
197197
public void Fails_for_invalid_length_signature(int signatureLength)
198198
{
199-
int[] signature = Enumerable.Range(0, signatureLength).ToArray();
199+
byte[] signature = Enumerable.Range(0, signatureLength).Select(i => (byte)i).ToArray();
200200
L1Origin origin = new(1, Hash256.Zero, 456, Hash256.Zero, null) { Signature = signature };
201201

202202
Action act = () => _decoder.Encode(origin);
@@ -210,7 +210,7 @@ public void Encode_produces_RLP_with_correct_sequence_length(
210210
[Values(false, true)] bool withSignature)
211211
{
212212
int[]? buildPayloadArgsId = withBuildPayload ? Enumerable.Range(0, 8).ToArray() : null;
213-
int[]? signature = withSignature ? Enumerable.Range(0, 65).ToArray() : null;
213+
byte[]? signature = withSignature ? Enumerable.Range(0, 65).Select(i => (byte)i).ToArray() : null;
214214
L1Origin origin = new(123, Hash256.Zero, 456, Hash256.Zero, buildPayloadArgsId, withForcedInclusion, signature);
215215

216216
Rlp encoded = _decoder.Encode(origin);

src/Nethermind/Nethermind.Taiko/L1Origin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class L1Origin(UInt256 blockId,
1212
ValueHash256 l1BlockHash,
1313
int[]? buildPayloadArgsId,
1414
bool isForcedInclusion = false,
15-
int[]? signature = null)
15+
byte[]? signature = null)
1616
{
1717
public UInt256 BlockId { get; set; } = blockId;
1818
public ValueHash256? L2BlockHash { get; set; } = l2BlockHash;
@@ -22,7 +22,7 @@ public class L1Origin(UInt256 blockId,
2222
// Taiko uses int-like serializer (Go's default encoding for byte arrays)
2323
public int[]? BuildPayloadArgsId { get; set; } = buildPayloadArgsId;
2424
public bool IsForcedInclusion { get; set; } = isForcedInclusion;
25-
public int[]? Signature { get; set; } = signature;
25+
public byte[]? Signature { get; set; } = signature;
2626

2727
/// <summary>
2828
/// IsPreconfBlock returns true if the L1Origin is for a preconfirmation block.

src/Nethermind/Nethermind.Taiko/L1OriginDecoder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected override L1Origin DecodeInternal(RlpStream rlpStream, RlpBehaviors rlp
3232
}
3333

3434
bool isForcedInclusion = itemsCount >= 6 && rlpStream.DecodeBool();
35-
int[]? signature = itemsCount >= 7 ? Array.ConvertAll(rlpStream.DecodeByteArray(), Convert.ToInt32) : null;
35+
byte[]? signature = itemsCount >= 7 ? rlpStream.DecodeByteArray() : null;
3636

3737
return new(blockId, l2BlockHash, l1BlockHeight, l1BlockHash, buildPayloadArgsId, isForcedInclusion, signature);
3838
}
@@ -87,7 +87,7 @@ public override void Encode(RlpStream stream, L1Origin item, RlpBehaviors rlpBeh
8787
throw new RlpException($"{nameof(item.Signature)} should be exactly {SignatureLength}");
8888
}
8989

90-
stream.Encode(Array.ConvertAll(item.Signature, Convert.ToByte));
90+
stream.Encode(item.Signature);
9191
}
9292
}
9393

src/Nethermind/Nethermind.Taiko/Rpc/ITaikoEngineRpcModule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Task<ResultWrapper<PayloadStatusV1>> engine_newPayloadV3(TaikoExecutionPayloadV3
8888
Description = "Sets the L1 origin signature for the given block ID.",
8989
IsSharable = true,
9090
IsImplemented = true)]
91-
ResultWrapper<L1Origin> taikoAuth_setL1OriginSignature(UInt256 blockId, int[] signature);
91+
ResultWrapper<L1Origin> taikoAuth_setL1OriginSignature(UInt256 blockId, byte[] signature);
9292

9393
/// <summary>
9494
/// Clears txpool state (hash cache, account cache, pending transactions) after a chain reorg.

src/Nethermind/Nethermind.Taiko/Rpc/TaikoEngineRpcModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,13 @@ public ResultWrapper<UInt256> taikoAuth_setBatchToLastBlock(UInt256 batchId, UIn
370370
return ResultWrapper<UInt256>.Success(batchId);
371371
}
372372

373-
public ResultWrapper<L1Origin> taikoAuth_setL1OriginSignature(UInt256 blockId, int[] signature)
373+
public ResultWrapper<L1Origin> taikoAuth_setL1OriginSignature(UInt256 blockId, byte[] signature)
374374
{
375+
if (signature.Length != L1OriginDecoder.SignatureLength)
376+
{
377+
return ResultWrapper<L1Origin>.Fail($"signature must be exactly {L1OriginDecoder.SignatureLength} bytes, got {signature.Length}");
378+
}
379+
375380
L1Origin? l1Origin = l1OriginStore.ReadL1Origin(blockId);
376381
if (l1Origin is null)
377382
{

0 commit comments

Comments
 (0)