From fa212515f54e72ed501f9d542172a598e376fde4 Mon Sep 17 00:00:00 2001 From: henridf Date: Fri, 23 Jun 2023 11:30:16 +0200 Subject: [PATCH] Implement validor client proposals for Deneb (#5094) --- .../eth2_apis/eth2_rest_serialization.nim | 3 +- .../spec/eth2_apis/rest_beacon_calls.nim | 5 ++ beacon_chain/spec/eth2_apis/rest_types.nim | 2 +- beacon_chain/validator_client/api.nim | 22 ++---- .../validator_client/block_service.nim | 79 ++++++++++++++++--- beacon_chain/validators/validator_pool.nim | 2 +- 6 files changed, 85 insertions(+), 28 deletions(-) diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index a185cd928..17fae6cc1 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -110,7 +110,8 @@ type altair.SignedBeaconBlock | bellatrix.SignedBeaconBlock | capella.SignedBeaconBlock | - phase0.SignedBeaconBlock + phase0.SignedBeaconBlock | + DenebSignedBlockContents EncodeArrays* = seq[Attestation] | diff --git a/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim b/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim index 33f5579a3..895b6ae87 100644 --- a/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim +++ b/beacon_chain/spec/eth2_apis/rest_beacon_calls.nim @@ -167,6 +167,11 @@ proc publishBlock*(body: capella.SignedBeaconBlock): RestPlainResponse {. meth: MethodPost.} ## https://ethereum.github.io/beacon-APIs/#/Beacon/publishBlock +proc publishBlock*(body: DenebSignedBlockContents): 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/eth2_apis/rest_types.nim b/beacon_chain/spec/eth2_apis/rest_types.nim index 1d3d97c58..96944b2e6 100644 --- a/beacon_chain/spec/eth2_apis/rest_types.nim +++ b/beacon_chain/spec/eth2_apis/rest_types.nim @@ -331,7 +331,7 @@ type DenebBlockContents* = object `block`*: deneb.BeaconBlock - blob_sidecars*: List[SignedBlobSidecar, Limit MAX_BLOBS_PER_BLOCK] + blob_sidecars*: List[BlobSidecar, Limit MAX_BLOBS_PER_BLOCK] ProduceBlockResponseV2* = object case kind*: ConsensusFork diff --git a/beacon_chain/validator_client/api.nim b/beacon_chain/validator_client/api.nim index 8d9af862d..f56c1398f 100644 --- a/beacon_chain/validator_client/api.nim +++ b/beacon_chain/validator_client/api.nim @@ -1842,7 +1842,7 @@ proc produceBlockV2*( proc publishBlock*( vc: ValidatorClientRef, - data: ForkedSignedBeaconBlock, + data: RestPublishedSignedBlockContents, strategy: ApiStrategyKind ): Future[bool] {.async.} = const @@ -1869,12 +1869,7 @@ proc publishBlock*( of ConsensusFork.Capella: publishBlock(it, data.capellaData) of ConsensusFork.Deneb: - debugRaiseAssert $denebImplementationMissing & - ": validator_client/api.nim:publishBlock (1)" - let f = newFuture[RestPlainResponse]("") - f.fail(new RestError) - f - + publishBlock(it, data.denebData) do: if apiResponse.isErr(): handleCommunicationError() @@ -1885,7 +1880,8 @@ proc publishBlock*( of 200: ApiResponse[bool].ok(true) of 202: - debug BlockBroadcasted, node = node, blck = shortLog(data) + debug BlockBroadcasted, node = node, + blck = shortLog(ForkedSignedBeaconBlock.init(data)) ApiResponse[bool].ok(true) of 400: handle400() @@ -1919,11 +1915,8 @@ proc publishBlock*( of ConsensusFork.Capella: publishBlock(it, data.capellaData) of ConsensusFork.Deneb: - debugRaiseAssert $denebImplementationMissing & - ": validator_client/api.nim:publishBlock (2)" - let f = newFuture[RestPlainResponse]("") - f.fail(new RestError) - f + publishBlock(it, data.denebData) + do: if apiResponse.isErr(): handleCommunicationError() @@ -1934,7 +1927,8 @@ proc publishBlock*( of 200: return true of 202: - debug BlockBroadcasted, node = node, blck = shortLog(data) + debug BlockBroadcasted, node = node, + blck = shortLog(ForkedSignedBeaconBlock.init(data)) return true of 400: handle400() diff --git a/beacon_chain/validator_client/block_service.nim b/beacon_chain/validator_client/block_service.nim index 285078538..dda16f93f 100644 --- a/beacon_chain/validator_client/block_service.nim +++ b/beacon_chain/validator_client/block_service.nim @@ -21,9 +21,12 @@ const logScope: service = ServiceName type + BlobList = List[BlobSidecar, Limit MAX_BLOBS_PER_BLOCK] + PreparedBeaconBlock = object blockRoot*: Eth2Digest data*: ForkedBeaconBlock + blobsOpt*: Opt[BlobList] PreparedBlindedBeaconBlock = object blockRoot*: Eth2Digest @@ -59,25 +62,29 @@ proc produceBlock( of ConsensusFork.Phase0: let blck = produceBlockResponse.phase0Data return Opt.some(PreparedBeaconBlock(blockRoot: hash_tree_root(blck), - data: ForkedBeaconBlock.init(blck))) + data: ForkedBeaconBlock.init(blck), + blobsOpt: Opt.none(BlobList))) of ConsensusFork.Altair: let blck = produceBlockResponse.altairData return Opt.some(PreparedBeaconBlock(blockRoot: hash_tree_root(blck), - data: ForkedBeaconBlock.init(blck))) + data: ForkedBeaconBlock.init(blck), + blobsOpt: Opt.none(BlobList))) of ConsensusFork.Bellatrix: let blck = produceBlockResponse.bellatrixData return Opt.some(PreparedBeaconBlock(blockRoot: hash_tree_root(blck), - data: ForkedBeaconBlock.init(blck))) + data: ForkedBeaconBlock.init(blck), + blobsOpt: Opt.none(BlobList))) of ConsensusFork.Capella: let blck = produceBlockResponse.capellaData return Opt.some(PreparedBeaconBlock(blockRoot: hash_tree_root(blck), - data: ForkedBeaconBlock.init(blck))) + data: ForkedBeaconBlock.init(blck), + blobsOpt: Opt.none(BlobList))) of ConsensusFork.Deneb: - debugRaiseAssert $denebImplementationMissing - # TODO return blobs as well let blck = produceBlockResponse.denebData.`block` + let blobs = produceBlockResponse.denebData.blob_sidecars return Opt.some(PreparedBeaconBlock(blockRoot: hash_tree_root(blck), - data: ForkedBeaconBlock.init(blck))) + data: ForkedBeaconBlock.init(blck), + blobsOpt: Opt.some(blobs))) proc produceBlindedBlock( @@ -298,13 +305,63 @@ proc publishBlock(vc: ValidatorClientRef, currentSlot, slot: Slot, error "An unexpected error occurred while signing block", error_name = exc.name, error_msg = exc.msg return - signedBlock = ForkedSignedBeaconBlock.init(preparedBlock.data, - preparedBlock.blockRoot, - signature) + + signedBlockContents = + case preparedBlock.data.kind + of ConsensusFork.Phase0: + RestPublishedSignedBlockContents(kind: ConsensusFork.Phase0, + phase0Data: phase0.SignedBeaconBlock( + message: preparedBlock.data.phase0Data, + root: preparedBlock.blockRoot, + signature: signature)) + of ConsensusFork.Altair: + RestPublishedSignedBlockContents(kind: ConsensusFork.Altair, + altairData: altair.SignedBeaconBlock( + message: preparedBlock.data.altairData, + root: preparedBlock.blockRoot, + signature: signature)) + of ConsensusFork.Bellatrix: + RestPublishedSignedBlockContents(kind: ConsensusFork.Bellatrix, + bellatrixData: bellatrix.SignedBeaconBlock( + message: preparedBlock.data.bellatrixData, + root: preparedBlock.blockRoot, + signature: signature)) + of ConsensusFork.Capella: + RestPublishedSignedBlockContents(kind: ConsensusFork.Capella, + capellaData: capella.SignedBeaconBlock( + message: preparedBlock.data.capellaData, + root: preparedBlock.blockRoot, + signature: signature)) + of ConsensusFork.Deneb: + let blobs = preparedBlock.blobsOpt.get() + var signed: seq[SignedBlobSidecar] = @[] + for i in 0..