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
|
../sszdump
|
||||||
|
|
||||||
from std/deques import Deque, addLast, contains, initDeque, items, len, shrink
|
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
|
from ../consensus_object_pools/consensus_manager import
|
||||||
ConsensusManager, checkNextProposer, optimisticExecutionBlockHash,
|
ConsensusManager, checkNextProposer, optimisticExecutionBlockHash,
|
||||||
runProposalForkchoiceUpdated, shouldSyncOptimistically, updateHead,
|
runProposalForkchoiceUpdated, shouldSyncOptimistically, updateHead,
|
||||||
|
@ -541,32 +541,33 @@ proc storeBlock(
|
||||||
|
|
||||||
if NewPayloadStatus.noResponse == payloadStatus:
|
if NewPayloadStatus.noResponse == payloadStatus:
|
||||||
# When the execution layer is not available to verify the payload, we do the
|
# 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
|
# 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
|
||||||
# TODO run https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/beacon-chain.md#blob-kzg-commitments
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.4/specs/deneb/beacon-chain.md#modified-verify_and_notify_new_payload
|
||||||
# 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.
|
|
||||||
when typeof(signedBlock).kind >= ConsensusFork.Bellatrix:
|
when typeof(signedBlock).kind >= ConsensusFork.Bellatrix:
|
||||||
|
if signedBlock.message.is_execution_block:
|
||||||
template payload(): auto = signedBlock.message.body.execution_payload
|
template payload(): auto = signedBlock.message.body.execution_payload
|
||||||
if signedBlock.message.is_execution_block and
|
|
||||||
payload.block_hash !=
|
template returnWithError(msg: string): untyped =
|
||||||
signedBlock.message.compute_execution_block_hash():
|
debug msg, executionPayload = shortLog(payload)
|
||||||
debug "Execution block hash validation failed",
|
|
||||||
execution_payload = shortLog(payload)
|
|
||||||
self[].dumpInvalidBlock(signedBlock)
|
self[].dumpInvalidBlock(signedBlock)
|
||||||
doAssert strictVerification notin dag.updateFlags
|
doAssert strictVerification notin dag.updateFlags
|
||||||
self.consensusManager.quarantine[].addUnviable(signedBlock.root)
|
self.consensusManager.quarantine[].addUnviable(signedBlock.root)
|
||||||
return err((VerifierError.Invalid, ProcessingStatus.completed))
|
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():
|
||||||
|
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()
|
let newPayloadTick = Moment.now()
|
||||||
|
|
||||||
# TODO with v1.4.0, not sure this is still relevant
|
# TODO with v1.4.0, not sure this is still relevant
|
||||||
|
|
Loading…
Reference in New Issue