fix safeBlockHash handling in engine_forkchoiceUpdatedV1

This commit is contained in:
jangko 2022-03-23 21:08:25 +07:00
parent 1008e87ec2
commit 54724b87dc
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
1 changed files with 34 additions and 9 deletions

View File

@ -115,8 +115,6 @@ proc setupEngineAPI*(
var payload: ExecutionPayloadV1
if not api.get(payloadId, payload):
raise (ref InvalidRequest)(code: engineApiUnknownPayload, msg: "Unknown payload")
#raise newException(ValueError, "Unknown payload")
return payload
# https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.7/src/engine/specification.md#engine_exchangeTransitionConfigurationV1
@ -229,7 +227,9 @@ proc setupEngineAPI*(
error "Refusing beacon update to pre-merge",
number = blockNumber,
hash = blockHash.data.toHex,
diff = header.difficulty
diff = header.difficulty,
ptd = ptd,
ttd = ttd
return simpleFCU(PayloadExecutionStatus.invalid_terminal_block)
@ -256,13 +256,38 @@ proc setupEngineAPI*(
var finalBlock: EthBlockHeader
if not db.getBlockHeader(finalizedBlockHash, finalBlock):
warn "Final block not available in database",
hash = finalizedBlockHash.data.toHex
return simpleFCU(PayloadExecutionStatus.invalid, "final block not available")
elif not db.getBlockHash(finalBlock.blockNumber, canonHash) or canonHash != finalizedBlockHash:
hash=finalizedBlockHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "finalized block header not available")
var finalHash: Hash256
if not db.getBlockHash(finalBlock.blockNumber, finalHash):
warn "Final block not in canonical chain",
number = finalBlock.blockNumber,
hash = finalizedBlockHash.data.toHex
return simpleFCU(PayloadExecutionStatus.invalid, "final block not canonical")
number=finalBlock.blockNumber,
hash=finalizedBlockHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "finalized block hash not available")
if finalHash != finalizedBlockHash:
warn "Final block not in canonical chain",
number=finalBlock.blockNumber,
finalHash=finalHash.data.toHex,
finalizedBlockHash=finalizedBlockHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "finalilized block not canonical")
let safeBlockHash = update.safeBlockHash.asEthHash
if safeBlockHash != Hash256():
var safeBlock: EthBlockHeader
if not db.getBlockHeader(safeBlockHash, safeBlock):
warn "Safe block not available in database",
hash = safeBlockHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "safe head not available")
var safeHash: Hash256
if not db.getBlockHash(safeBlock.blockNumber, safeHash):
warn "Safe block hash not available in database",
hash = safeHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "safe block hash not available")
if safeHash != safeBlockHash:
warn "Safe block not in canonical chain",
safeHash=safeHash.data.toHex,
safeBlockHash=safeBlockHash.data.toHex
raise (ref InvalidRequest)(code: engineApiInvalidParams, msg: "safe head not canonical")
# If payload generation was requested, create a new block to be potentially
# sealed by the beacon client. The payload will be requested later, and we