diff --git a/fluffy/network/history/content/content_values.nim b/fluffy/network/history/content/content_values.nim index 7cab498fc..f524e4294 100644 --- a/fluffy/network/history/content/content_values.nim +++ b/fluffy/network/history/content/content_values.nim @@ -9,7 +9,6 @@ import std/math, nimcrypto/hash, ssz_serialization -from beacon_chain/spec/datatypes/capella import Withdrawal from beacon_chain/spec/presets/mainnet import MAX_WITHDRAWALS_PER_PAYLOAD export ssz_serialization, hash @@ -21,7 +20,7 @@ const MAX_TRANSACTION_LENGTH = 2 ^ 24 # ~= 16 million MAX_TRANSACTION_COUNT = 2 ^ 14 # ~= 16k MAX_RECEIPT_LENGTH = 2 ^ 27 # ~= 134 million - MAX_HEADER_LENGTH = 2 ^ 13 # = 8192 + MAX_HEADER_LENGTH = 2 ^ 11 # = 2048 MAX_ENCODED_UNCLES_LENGTH = MAX_HEADER_LENGTH * 2 ^ 4 # = 2 ^ 17 ~= 131k MAX_WITHDRAWAL_LENGTH = 64 MAX_WITHDRAWALS_COUNT = MAX_WITHDRAWALS_PER_PAYLOAD @@ -42,31 +41,31 @@ type accumulatorProof*: AccumulatorProof BlockHeaderWithProof* = object - header*: List[byte, 2048] # RLP data + header*: ByteList[MAX_HEADER_LENGTH] # RLP data proof*: BlockHeaderProof ## BlockBody types - TransactionByteList* = List[byte, MAX_TRANSACTION_LENGTH] # RLP data + TransactionByteList* = ByteList[MAX_TRANSACTION_LENGTH] # RLP data Transactions* = List[TransactionByteList, MAX_TRANSACTION_COUNT] - Uncles* = List[byte, MAX_ENCODED_UNCLES_LENGTH] # RLP data + Uncles* = ByteList[MAX_ENCODED_UNCLES_LENGTH] # RLP data - WithdrawalByteList* = List[byte, MAX_WITHDRAWAL_LENGTH] # RLP data + WithdrawalByteList* = ByteList[MAX_WITHDRAWAL_LENGTH] # RLP data Withdrawals* = List[WithdrawalByteList, MAX_WITHDRAWALS_COUNT] # Pre-shanghai block body PortalBlockBodyLegacy* = object transactions*: Transactions - uncles*: Uncles # Post Paris/TheMerge, this list is required to be empty + uncles*: Uncles # Post Paris/TheMerge, this RLP list must be empty # Post-shanghai block body PortalBlockBodyShanghai* = object transactions*: Transactions - uncles*: Uncles # Must be empty list + uncles*: Uncles # Must be empty RLP list withdrawals*: Withdrawals # new field ## Receipts types - ReceiptByteList* = List[byte, MAX_RECEIPT_LENGTH] # RLP data + ReceiptByteList* = ByteList[MAX_RECEIPT_LENGTH] # RLP data PortalReceipts* = List[ReceiptByteList, MAX_TRANSACTION_COUNT] func init*(T: type BlockHeaderProof, proof: AccumulatorProof): T = diff --git a/fluffy/network/history/history_network.nim b/fluffy/network/history/history_network.nim index b361ff91c..e2b423e95 100644 --- a/fluffy/network/history/history_network.nim +++ b/fluffy/network/history/history_network.nim @@ -72,7 +72,7 @@ func fromPortalBlockBody*( ok( BlockBody( transactions: transactions, - uncles: @[], # Uncles must be empty: TODO where validation? + uncles: @[], # Uncles must be empty, this is verified in `validateBlockBody` withdrawals: Opt.some(withdrawals), ) ) @@ -85,7 +85,6 @@ func fromPortalBlockBodyOrRaise*( ## Get the EL BlockBody from one of the SSZ-decoded Portal BlockBody types. ## Will raise Assertion in case of invalid RLP encodings. Only use of data ## has been validated before! - # TODO: Using ValueOr here gives compile error let res = BlockBody.fromPortalBlockBody(body) if res.isOk(): res.get() @@ -149,11 +148,6 @@ func encode*(blockBody: BlockBody): seq[byte] = else: SSZ.encode(PortalBlockBodyLegacy.fromBlockBody(blockBody)) -func encode*(blockBody: BlockBody, T: type PortalBlockBodyShanghai): seq[byte] = - let portalBlockBody = PortalBlockBodyShanghai.fromBlockBody(blockBody) - - SSZ.encode(portalBlockBody) - func encode*(receipts: seq[Receipt]): seq[byte] = let portalReceipts = PortalReceipts.fromReceipts(receipts) @@ -168,9 +162,9 @@ proc calcRootHash(items: Transactions | PortalReceipts | Withdrawals): Hash256 = for i, item in items: try: tr.put(rlp.encode(i.uint), item.asSeq()) - except CatchableError as e: - # tr.put now is a generic interface to whatever underlying db - # and it can raise exception if the backend db is something like aristo + except RlpError as e: + # RlpError should not occur + # TODO: trace down why it might raise this raiseAssert(e.msg) return tr.rootHash @@ -310,7 +304,8 @@ proc validateReceipts*( proc validateReceiptsBytes*( bytes: openArray[byte], receiptsRoot: KeccakHash ): Result[seq[Receipt], string] = - ## Fully decode the SSZ Block Body and validate it against the header. + ## Fully decode the SSZ encoded receipts and validate it against the header's + ## receipts root. let receipts = ?decodeSsz(bytes, PortalReceipts) ?validateReceipts(receipts, receiptsRoot)