Synchronously check all `transactions` to have non-zero length (#6491)
Reject blocks with zero length transactions early when no EL connected. - https://github.com/ethereum/consensus-specs/pull/3885
This commit is contained in:
parent
ca8c2ceb24
commit
6f7c4fffe7
|
@ -13,7 +13,7 @@ import
|
|||
../sszdump
|
||||
|
||||
from std/deques import Deque, addLast, contains, initDeque, items, len, shrink
|
||||
from std/sequtils import mapIt
|
||||
from std/sequtils import anyIt, mapIt
|
||||
from ../consensus_object_pools/consensus_manager import
|
||||
ConsensusManager, checkNextProposer, optimisticExecutionBlockHash,
|
||||
runProposalForkchoiceUpdated, shouldSyncOptimistically, updateHead,
|
||||
|
@ -541,31 +541,32 @@ proc storeBlock(
|
|||
|
||||
if NewPayloadStatus.noResponse == payloadStatus:
|
||||
# When the execution layer is not available to verify the payload, we do the
|
||||
# required check on the CL side instead and proceed as if the EL was syncing
|
||||
|
||||
# TODO run https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/beacon-chain.md#blob-kzg-commitments
|
||||
# https://github.com/ethereum/execution-apis/blob/main/src/engine/experimental/blob-extension.md#specification
|
||||
# "This validation MUST be instantly run in all cases even during active
|
||||
# sync process."
|
||||
#
|
||||
# Client software MUST validate `blockHash` value as being equivalent to
|
||||
# `Keccak256(RLP(ExecutionBlockHeader))`
|
||||
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#specification
|
||||
#
|
||||
# This should simulate an unsynced EL, which still must perform these
|
||||
# checks. This means it must be able to do so without context, beyond
|
||||
# whatever data the block itself contains.
|
||||
# required checks on the CL instead and proceed as if the EL was syncing
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.4/specs/bellatrix/beacon-chain.md#verify_and_notify_new_payload
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.4/specs/deneb/beacon-chain.md#modified-verify_and_notify_new_payload
|
||||
when typeof(signedBlock).kind >= ConsensusFork.Bellatrix:
|
||||
template payload(): auto = signedBlock.message.body.execution_payload
|
||||
if signedBlock.message.is_execution_block and
|
||||
payload.block_hash !=
|
||||
if signedBlock.message.is_execution_block:
|
||||
template payload(): auto = signedBlock.message.body.execution_payload
|
||||
|
||||
template returnWithError(msg: string): untyped =
|
||||
debug msg, executionPayload = shortLog(payload)
|
||||
self[].dumpInvalidBlock(signedBlock)
|
||||
doAssert strictVerification notin dag.updateFlags
|
||||
self.consensusManager.quarantine[].addUnviable(signedBlock.root)
|
||||
return err((VerifierError.Invalid, ProcessingStatus.completed))
|
||||
|
||||
if payload.transactions.anyIt(it.len == 0):
|
||||
returnWithError "Execution block contains zero length transactions"
|
||||
|
||||
if payload.block_hash !=
|
||||
signedBlock.message.compute_execution_block_hash():
|
||||
debug "Execution block hash validation failed",
|
||||
execution_payload = shortLog(payload)
|
||||
self[].dumpInvalidBlock(signedBlock)
|
||||
doAssert strictVerification notin dag.updateFlags
|
||||
self.consensusManager.quarantine[].addUnviable(signedBlock.root)
|
||||
return err((VerifierError.Invalid, ProcessingStatus.completed))
|
||||
returnWithError "Execution block hash validation failed"
|
||||
|
||||
# [New in Deneb:EIP4844]
|
||||
# TODO run https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/beacon-chain.md#blob-kzg-commitments
|
||||
# https://github.com/ethereum/execution-apis/blob/main/src/engine/experimental/blob-extension.md#specification
|
||||
# "This validation MUST be instantly run in all cases even during active
|
||||
# sync process."
|
||||
|
||||
let newPayloadTick = Moment.now()
|
||||
|
||||
|
|
Loading…
Reference in New Issue