Small cleanup/refactor on Portal history network (#2521)
This commit is contained in:
parent
1841fe7c4a
commit
3a7f025fd9
|
@ -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 =
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue