diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index 6f52dcbd5..cde306c63 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -345,6 +345,7 @@ type capella.SignedBeaconBlock | phase0.SignedBeaconBlock | DenebSignedBlockContents | + ElectraSignedBlockContents | ForkedMaybeBlindedBeaconBlock EncodeArrays* = @@ -403,8 +404,8 @@ type RestBlockTypes* = phase0.BeaconBlock | altair.BeaconBlock | bellatrix.BeaconBlock | capella.BeaconBlock | - deneb.BlockContents | capella_mev.BlindedBeaconBlock | - deneb_mev.BlindedBeaconBlock + deneb.BlockContents | deneb_mev.BlindedBeaconBlock | + electra.BlockContents | electra_mev.BlindedBeaconBlock func readStrictHexChar(c: char, radix: static[uint8]): Result[int8, cstring] = ## Converts an hex char to an int @@ -3970,14 +3971,8 @@ proc decodeBytes*[T: DecodeConsensysTypes]( forked = ForkedBlindedBeaconBlock( kind: ConsensusFork.Deneb, denebData: blck) ok(ProduceBlindedBlockResponse(forked)) - of ConsensusFork.Capella: - let - blck = ? readSszResBytes(capella_mev.BlindedBeaconBlock, value) - forked = ForkedBlindedBeaconBlock( - kind: ConsensusFork.Capella, capellaData: blck) - ok(ProduceBlindedBlockResponse(forked)) - of ConsensusFork.Bellatrix, ConsensusFork.Altair, ConsensusFork.Phase0: - err("Unable to decode blinded block for Bellatrix, Altair, and Phase0 forks") + of ConsensusFork.Phase0 .. ConsensusFork.Capella: + err("Unable to decode blinded block for pre-Deneb forks") else: err("Unsupported Content-Type") @@ -4036,10 +4031,7 @@ proc decodeBytes*[T: ProduceBlockResponseV3]( except ValueError: return err("Incorrect `Eth-Consensus-Block-Value` header value") withConsensusFork(fork): - when consensusFork >= ConsensusFork.Electra: - debugRaiseAssert "eth2 rest serialization" - return err("electra missing") - elif consensusFork >= ConsensusFork.Deneb: + when consensusFork >= ConsensusFork.Deneb: if blinded: let contents = ? readSszResBytes(consensusFork.BlindedBlockContents, value) diff --git a/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim b/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim index d02ddafca..651b4d5bc 100644 --- a/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim +++ b/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim @@ -148,6 +148,11 @@ proc publishBlock*(body: DenebSignedBlockContents): RestPlainResponse {. meth: MethodPost.} ## https://ethereum.github.io/beacon-APIs/#/Beacon/publishBlock +proc publishBlock*(body: ElectraSignedBlockContents): RestPlainResponse {. + rest, endpoint: "/eth/v1/beacon/blocks", + meth: MethodPost.} + ## https://ethereum.github.io/beacon-APIs/#/Beacon/publishBlock + proc publishSszBlock*( client: RestClientRef, blck: ForkySignedBeaconBlock diff --git a/beacon_chain/spec/forks.nim b/beacon_chain/spec/forks.nim index 504d390af..bf238b074 100644 --- a/beacon_chain/spec/forks.nim +++ b/beacon_chain/spec/forks.nim @@ -585,7 +585,9 @@ template BlockContents*( template BlindedBlockContents*( kind: static ConsensusFork): auto = - when kind == ConsensusFork.Deneb: + when kind == ConsensusFork.Electra: + typedesc[electra_mev.BlindedBeaconBlock] + elif kind == ConsensusFork.Deneb: typedesc[deneb_mev.BlindedBeaconBlock] else: {.error: "BlindedBlockContents does not support " & $kind.} @@ -1496,3 +1498,25 @@ template init*(T: type ForkedMaybeBlindedBeaconBlock, blindedData: blck), consensusValue: cvalue, executionValue: evalue) + +template init*(T: type ForkedMaybeBlindedBeaconBlock, + blck: electra.BlockContents, + evalue: Opt[UInt256], cvalue: Opt[UInt256]): T = + ForkedMaybeBlindedBeaconBlock( + kind: ConsensusFork.Electra, + electraData: electra_mev.MaybeBlindedBeaconBlock( + isBlinded: false, + data: blck), + consensusValue: cvalue, + executionValue: evalue) + +template init*(T: type ForkedMaybeBlindedBeaconBlock, + blck: electra_mev.BlindedBeaconBlock, + evalue: Opt[UInt256], cvalue: Opt[UInt256]): T = + ForkedMaybeBlindedBeaconBlock( + kind: ConsensusFork.Electra, + electraData: electra_mev.MaybeBlindedBeaconBlock( + isBlinded: true, + blindedData: blck), + consensusValue: cvalue, + executionValue: evalue) diff --git a/beacon_chain/validator_client/api.nim b/beacon_chain/validator_client/api.nim index 8c700dbca..ca9bb0881 100644 --- a/beacon_chain/validator_client/api.nim +++ b/beacon_chain/validator_client/api.nim @@ -2260,8 +2260,7 @@ proc publishBlock*( of ConsensusFork.Deneb: publishBlock(it, data.denebData) of ConsensusFork.Electra: - debugRaiseAssert "electra missing" - publishBlock(it, data.denebData) + publishBlock(it, data.electraData) do: if apiResponse.isErr(): handleCommunicationError()