Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove SSZ Union usage in BlockHeaderWithProof type #3019

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions fluffy/network/history/content/content_values.nim
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,15 @@ const
MAX_WITHDRAWALS_COUNT = MAX_WITHDRAWALS_PER_PAYLOAD

MAX_EPHEMERAL_HEADER_PAYLOAD = 256
MAX_HEADER_PROOF_LENGTH* = 1024

type
## BlockHeader types
HistoricalHashesAccumulatorProof* = array[15, Digest]

BlockHeaderProofType* = enum
none = 0x00 # An SSZ Union None
historicalHashesAccumulatorProof = 0x01

BlockHeaderProof* = object
case proofType*: BlockHeaderProofType
of none:
discard
of historicalHashesAccumulatorProof:
historicalHashesAccumulatorProof*: HistoricalHashesAccumulatorProof

BlockHeaderWithProof* = object
header*: ByteList[MAX_HEADER_LENGTH] # RLP data
proof*: BlockHeaderProof
proof*: ByteList[MAX_HEADER_PROOF_LENGTH]

## Ephemeral BlockHeader list
EphemeralBlockHeaderList* =
Expand Down Expand Up @@ -73,11 +63,3 @@ type
## Receipts types
ReceiptByteList* = ByteList[MAX_RECEIPT_LENGTH] # RLP data
PortalReceipts* = List[ReceiptByteList, MAX_TRANSACTION_COUNT]

func init*(T: type BlockHeaderProof, proof: HistoricalHashesAccumulatorProof): T =
BlockHeaderProof(
proofType: historicalHashesAccumulatorProof, historicalHashesAccumulatorProof: proof
)

func init*(T: type BlockHeaderProof): T =
BlockHeaderProof(proofType: none)
29 changes: 16 additions & 13 deletions fluffy/network/history/history_validation.nim
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,23 @@ func validateHeaderBytes*(
ok(header)

func verifyBlockHeaderProof*(
a: FinishedHistoricalHashesAccumulator, header: Header, proof: BlockHeaderProof
a: FinishedHistoricalHashesAccumulator,
header: Header,
proof: ByteList[MAX_HEADER_PROOF_LENGTH],
): Result[void, string] =
case proof.proofType
of BlockHeaderProofType.historicalHashesAccumulatorProof:
a.verifyAccumulatorProof(header, proof.historicalHashesAccumulatorProof)
of BlockHeaderProofType.none:
if header.isPreMerge():
err("Pre merge header requires HistoricalHashesAccumulatorProof")
else:
# TODO:
# Add verification post merge based on historical_roots & historical_summaries
# Lets for now no longer accept other headers without a proof and the most
# recent ones are now a different type.
err("Post merge header proofs not yet activated")
let timestamp = Moment.init(header.timestamp.int64, Second)

if isShanghai(chainConfig, timestamp):
# TODO: Add verification post merge based on historical_summaries
err("Shanghai block verification not implemented")
elif isPoSBlock(chainConfig, header.number):
# TODO: Add verification post merge based on historical_roots
err("PoS block verification not implemented")
else:
let accumulatorProof = decodeSsz(proof.asSeq(), HistoricalHashesAccumulatorProof).valueOr:
return err("Failed decoding accumulator proof: " & error)

a.verifyAccumulatorProof(header, accumulatorProof)

func validateCanonicalHeaderBytes*(
bytes: openArray[byte], id: uint64 | Hash32, a: FinishedHistoricalHashesAccumulator
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Nimbus
# Copyright (c) 2022-2024 Status Research & Development GmbH
# Copyright (c) 2022-2025 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
Expand Down Expand Up @@ -198,7 +198,7 @@ func buildHeaderWithProof*(

ok(
BlockHeaderWithProof(
header: ByteList[2048].init(rlp.encode(header)),
proof: BlockHeaderProof.init(proof),
header: ByteList[MAX_HEADER_LENGTH].init(rlp.encode(header)),
proof: ByteList[MAX_HEADER_PROOF_LENGTH].init(SSZ.encode(proof)),
)
)
5 changes: 3 additions & 2 deletions fluffy/tests/rpc_tests/test_portal_rpc_client.nim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Nimbus - Portal Network
# Copyright (c) 2021-2024 Status Research & Development GmbH
# Copyright (c) 2021-2025 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
Expand Down Expand Up @@ -63,7 +63,8 @@ proc store*(hn: HistoryNode, blockHash: Hash32, blockHeader: Header) =
let
headerRlp = rlp.encode(blockHeader)
blockHeaderWithProof = BlockHeaderWithProof(
header: ByteList[2048].init(headerRlp), proof: BlockHeaderProof.init()
header: ByteList[MAX_HEADER_LENGTH].init(headerRlp),
proof: ByteList[MAX_HEADER_PROOF_LENGTH].init(@[]),
)
contentKeyBytes = blockHeaderContentKey(blockHash).encode()
contentId = history_content.toContentId(contentKeyBytes)
Expand Down
5 changes: 3 additions & 2 deletions fluffy/tests/state_network_tests/state_test_helpers.nim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Fluffy
# Copyright (c) 2021-2024 Status Research & Development GmbH
# Copyright (c) 2021-2025 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
Expand Down Expand Up @@ -154,7 +154,8 @@ proc mockStateRootLookup*(
blockHeader = Header(stateRoot: stateRoot)
headerRlp = rlp.encode(blockHeader)
blockHeaderWithProof = BlockHeaderWithProof(
header: ByteList[2048].init(headerRlp), proof: BlockHeaderProof.init()
header: ByteList[MAX_HEADER_LENGTH].init(headerRlp),
proof: ByteList[MAX_HEADER_PROOF_LENGTH].init(@[]),
)
contentKeyBytes = blockHeaderContentKey(blockNumOrHash).encode()
contentId = history_content.toContentId(contentKeyBytes)
Expand Down
Loading