diff --git a/beacon_chain/beacon_node_light_client.nim b/beacon_chain/beacon_node_light_client.nim index a2038a2a7..b77f16a4f 100644 --- a/beacon_chain/beacon_node_light_client.nim +++ b/beacon_chain/beacon_node_light_client.nim @@ -48,7 +48,9 @@ proc initLightClient*( dag = node.dag.head.bid, wallSlot = node.currentSlot withBlck(signedBlock): - when stateFork >= BeaconStateFork.Bellatrix: + when stateFork == BeaconStateFork.EIP4844: + debugRaiseAssert $eip4844ImplementationMissing & ": beacon_node_light_client.nim:initLightClient" + elif stateFork >= BeaconStateFork.Bellatrix: if blck.message.is_execution_block: template payload(): auto = blck.message.body.execution_payload diff --git a/beacon_chain/era_db.nim b/beacon_chain/era_db.nim index da2987a26..b0f9f14fe 100644 --- a/beacon_chain/era_db.nim +++ b/beacon_chain/era_db.nim @@ -385,9 +385,9 @@ iterator getBlockIds*( if not getPartialState(db, historical_roots, stateSlot, state[]): state = nil # No `return` in iterators of BeaconStateFork.Capella: - raiseAssert $capellaImplementationMissing + debugRaiseAssert $capellaImplementationMissing & ": era_db.nim: getBlockIds" of BeaconStateFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + debugRaiseAssert $eip4844ImplementationMissing & ": era_db.nim: getBlockIds" if state == nil: break diff --git a/beacon_chain/gossip_processing/block_processor.nim b/beacon_chain/gossip_processing/block_processor.nim index 2333fe676..d521d6cb0 100644 --- a/beacon_chain/gossip_processing/block_processor.nim +++ b/beacon_chain/gossip_processing/block_processor.nim @@ -290,6 +290,17 @@ proc newExecutionPayload*( error "newPayload failed", msg = err.msg return Opt.none PayloadExecutionStatus +# TODO investigate why this seems to allow compilation even though it doesn't +# directly address eip4844.ExecutionPayload when complaint was that it didn't +# know about "eip4844" +from ../spec/datatypes/eip4844 import SignedBeaconBlock, asTrusted, shortLog + +proc newExecutionPayload*( + eth1Monitor: Eth1Monitor, + executionPayload: eip4844.ExecutionPayload): + Future[Opt[PayloadExecutionStatus]] {.async.} = + debugRaiseAssert $eip4844ImplementationMissing & ": block_processor.nim:newExecutionPayload" + proc getExecutionValidity( eth1Monitor: Eth1Monitor, blck: phase0.SignedBeaconBlock | altair.SignedBeaconBlock): @@ -332,6 +343,12 @@ proc getExecutionValidity( error "getExecutionValidity: newPayload failed", err = err.msg return NewPayloadStatus.noResponse +proc getExecutionValidity( + eth1Monitor: Eth1Monitor, + blck: eip4844.SignedBeaconBlock): + Future[NewPayloadStatus] {.async.} = + debugRaiseAssert $eip4844ImplementationMissing & ": block_processor.nim:getExecutionValidity" + proc storeBlock*( self: ref BlockProcessor, src: MsgSource, wallTime: BeaconTime, signedBlock: ForkySignedBeaconBlock, queueTick: Moment = Moment.now(), diff --git a/beacon_chain/gossip_processing/gossip_validation.nim b/beacon_chain/gossip_processing/gossip_validation.nim index fa8db91a3..7ec329fc1 100644 --- a/beacon_chain/gossip_processing/gossip_validation.nim +++ b/beacon_chain/gossip_processing/gossip_validation.nim @@ -387,6 +387,15 @@ proc validateBeaconBlock*( ok() +from ../spec/datatypes/eip4844 import SignedBeaconBlock + +proc validateBeaconBlock*( + dag: ChainDAGRef, quarantine: ref Quarantine, + signed_beacon_block: eip4844.SignedBeaconBlock, + wallTime: BeaconTime, flags: UpdateFlags): Result[void, ValidationError] = + debugRaiseAssert $eip4844ImplementationMissing & ": gossip_validation.nim: validateBeaconBlock not how EIP4844 works anymore" + err(default(ValidationError)) + # https://github.com/ethereum/consensus-specs/blob/v1.1.9/specs/phase0/p2p-interface.md#beacon_attestation_subnet_id proc validateAttestation*( pool: ref AttestationPool, diff --git a/beacon_chain/networking/eth2_network.nim b/beacon_chain/networking/eth2_network.nim index 8dd800341..494ae1d9e 100644 --- a/beacon_chain/networking/eth2_network.nim +++ b/beacon_chain/networking/eth2_network.nim @@ -2632,9 +2632,22 @@ proc broadcastBeaconBlock*( let topic = getBeaconBlocksTopic(node.forkDigests.capella) node.broadcast(topic, blck) +from ../spec/datatypes/eip4844 import SignedBeaconBlock + +proc broadcastBeaconBlock*( + node: Eth2Node, blck: eip4844.SignedBeaconBlock): Future[SendResult] = + debugRaiseAssert $eip4844ImplementationMissing & ": eth2_network.nim:broadcastBeaconBlock EIP4844 uses different approach (1)" + proc broadcastBeaconBlock*( node: Eth2Node, forked: ForkedSignedBeaconBlock): Future[SendResult] = - withBlck(forked): node.broadcastBeaconBlock(blck) + withBlck(forked): + when stateFork == BeaconStateFork.EIP4844: + debugRaiseAssert $eip4844ImplementationMissing & ": eth2_network.nim:broadcastBeaconBlock EIP4844 uses different approach (2)" + let f = newFuture[SendResult]() + f.fail(new CatchableError) + f + else: + node.broadcastBeaconBlock(blck) proc broadcastSyncCommitteeMessage*( node: Eth2Node, msg: SyncCommitteeMessage, diff --git a/beacon_chain/rpc/rest_utils.nim b/beacon_chain/rpc/rest_utils.nim index c908b7d1b..6249af128 100644 --- a/beacon_chain/rpc/rest_utils.nim +++ b/beacon_chain/rpc/rest_utils.nim @@ -301,11 +301,8 @@ proc getBlockRefOptimistic*(node: BeaconNode, blck: BlockRef): bool = case blck.kind of BeaconBlockFork.Phase0, BeaconBlockFork.Altair: false - of BeaconBlockFork.Bellatrix, BeaconBlockFork.Capella: + of BeaconBlockFork.Bellatrix, BeaconBlockFork.Capella, BeaconBlockFork.EIP4844: node.dag.is_optimistic(blck.root) - of BeaconBlockFork.EIP4844: - if true: raiseAssert $eip4844ImplementationMissing - true const jsonMediaType* = MediaType.init("application/json") diff --git a/beacon_chain/spec/datatypes/base.nim b/beacon_chain/spec/datatypes/base.nim index 65008f05d..2f38e3f31 100644 --- a/beacon_chain/spec/datatypes/base.nim +++ b/beacon_chain/spec/datatypes/base.nim @@ -984,3 +984,6 @@ func checkForkConsistency*(cfg: RuntimeConfig) = const capellaImplementationMissing* = false const eip4844ImplementationMissing* = false + +#template debugRaiseAssert*(x: string) = raiseAssert x +template debugRaiseAssert*(x: string) = discard diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index e9df0f5e7..b393714dd 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -1160,7 +1160,8 @@ proc writeValue*[ writer.writeField("version", forkIdentifier "capella") writer.writeField("data", value.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + writer.writeField("version", forkIdentifier "eip4844") + writer.writeField("data", value.eip4844Data) writer.endRecord() ## RestPublishedBeaconBlockBody @@ -1591,7 +1592,8 @@ proc writeValue*(writer: var JsonWriter[RestJson], writer.writeField("version", "capella") writer.writeField("data", value.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + writer.writeField("version", "eip4844") + writer.writeField("data", value.eip4844Data) writer.endRecord() # ForkedHashedBeaconState is used where a `ForkedBeaconState` normally would diff --git a/beacon_chain/spec/forks.nim b/beacon_chain/spec/forks.nim index 9ffa2c4ff..ce6b89697 100644 --- a/beacon_chain/spec/forks.nim +++ b/beacon_chain/spec/forks.nim @@ -686,8 +686,8 @@ template withBlck*( template blck: untyped {.inject.} = x.capellaData body of BeaconBlockFork.EIP4844: - const stateFork {.inject, used.} = BeaconStateFork.Capella - template blck: untyped {.inject.} = x.capellaData + const stateFork {.inject, used.} = BeaconStateFork.EIP4844 + template blck: untyped {.inject.} = x.eip4844Data body func proposer_index*(x: ForkedBeaconBlock): uint64 = diff --git a/beacon_chain/spec/state_transition.nim b/beacon_chain/spec/state_transition.nim index c00522abb..a044cdce7 100644 --- a/beacon_chain/spec/state_transition.nim +++ b/beacon_chain/spec/state_transition.nim @@ -584,7 +584,7 @@ proc makeBeaconBlock*[T: bellatrix.ExecutionPayload | capella.ExecutionPayload]( BeaconStateFork.Bellatrix, BeaconStateFork.Capella: raiseAssert "Attempt to use EIP4844 payload with non-EIP4844 state" of BeaconStateFork.EIP4844: - raiseAssert $eip4844ImplementationMissing & ": state_transition" + debugRaiseAssert $eip4844ImplementationMissing & ": state_transition" # workaround for https://github.com/nim-lang/Nim/issues/20900 rather than have # these be default arguments diff --git a/beacon_chain/trusted_node_sync.nim b/beacon_chain/trusted_node_sync.nim index fd1ae4359..a7823e025 100644 --- a/beacon_chain/trusted_node_sync.nim +++ b/beacon_chain/trusted_node_sync.nim @@ -46,6 +46,8 @@ proc fetchDepositSnapshot(client: RestClientRef): return ok snapshot +from ./spec/datatypes/eip4844 import asSigVerified, shortLog + proc doTrustedNodeSync*( cfg: RuntimeConfig, databaseDir: string, diff --git a/beacon_chain/validator_client/api.nim b/beacon_chain/validator_client/api.nim index a6abb9ca7..3975ba9f5 100644 --- a/beacon_chain/validator_client/api.nim +++ b/beacon_chain/validator_client/api.nim @@ -1688,7 +1688,10 @@ proc publishBlock*( of BeaconBlockFork.Capella: publishBlock(it, data.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + debugRaiseAssert $eip4844ImplementationMissing & ": validator_client/api.nim:publishBlock (1)" + let f = newFuture[RestPlainResponse]("") + f.fail(new RestError) + f do: if apiResponse.isErr(): @@ -1740,7 +1743,10 @@ proc publishBlock*( of BeaconBlockFork.Capella: publishBlock(it, data.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + debugRaiseAssert $eip4844ImplementationMissing & ": validator_client/api.nim:publishBlock (2)" + let f = newFuture[RestPlainResponse]("") + f.fail(new RestError) + f do: if apiResponse.isErr(): debug ErrorMessage, endpoint = node, error = apiResponse.error() @@ -1887,7 +1893,10 @@ proc publishBlindedBlock*( of BeaconBlockFork.Capella: publishBlindedBlock(it, data.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + debugRaiseAssert $eip4844ImplementationMissing & ": validator_client/api.nim:publishBlindedBlock (1)" + let f = newFuture[RestPlainResponse]("") + f.fail(new RestError) + f do: if apiResponse.isErr(): debug ErrorMessage, endpoint = node, error = apiResponse.error() @@ -1938,7 +1947,10 @@ proc publishBlindedBlock*( of BeaconBlockFork.Capella: publishBlindedBlock(it, data.capellaData) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + debugRaiseAssert $eip4844ImplementationMissing & ": validator_client/api.nim:publishBlindedBlock (2)" + let f = newFuture[RestPlainResponse]("") + f.fail(new RestError) + f do: if apiResponse.isErr(): debug ErrorMessage, endpoint = node, error = apiResponse.error() diff --git a/beacon_chain/validators/validator_duties.nim b/beacon_chain/validators/validator_duties.nim index 48a5eb0a1..12f67697e 100644 --- a/beacon_chain/validators/validator_duties.nim +++ b/beacon_chain/validators/validator_duties.nim @@ -321,7 +321,8 @@ proc get_execution_payload[EP]( asConsensusExecutionPayload( await execution_engine.getPayload(payload_id.get)) else: - raiseAssert $capellaImplementationMissing & ": implement getPayload V2" + debugRaiseAssert $capellaImplementationMissing & ": implement getPayload V2" + default(EP) proc getFeeRecipient(node: BeaconNode, pubkey: ValidatorPubKey, @@ -795,6 +796,8 @@ proc makeBlindedBeaconBlockForHeadAndSlot*( return ok constructPlainBlindedBlock[BlindedBeaconBlock]( forkedBlck, executionPayloadHeader) +from ../spec/datatypes/eip4844 import shortLog + proc proposeBlock(node: BeaconNode, validator: AttachedValidator, validator_index: ValidatorIndex, @@ -895,6 +898,9 @@ proc proposeBlock(node: BeaconNode, elif blck is capella.BeaconBlock: capella.SignedBeaconBlock( message: blck, signature: signature, root: blockRoot) + elif blck is eip4844.BeaconBlock: + eip4844.SignedBeaconBlock( + message: blck, signature: signature, root: blockRoot) else: static: doAssert "Unknown SignedBeaconBlock type" newBlockRef = diff --git a/beacon_chain/validators/validator_monitor.nim b/beacon_chain/validators/validator_monitor.nim index 8acd76eb3..68627bc82 100644 --- a/beacon_chain/validators/validator_monitor.nim +++ b/beacon_chain/validators/validator_monitor.nim @@ -725,6 +725,8 @@ proc registerAttestationInBlock*( update_if_lt( epochSummary.attestation_min_block_inclusion_distance, inclusion_lag) +from ../spec/datatypes/eip4844 import shortLog + proc registerBeaconBlock*( self: var ValidatorMonitor, src: MsgSource, diff --git a/beacon_chain/validators/validator_pool.nim b/beacon_chain/validators/validator_pool.nim index c078d48e1..2a3c5393a 100644 --- a/beacon_chain/validators/validator_pool.nim +++ b/beacon_chain/validators/validator_pool.nim @@ -389,7 +389,9 @@ proc getBlockSignature*(v: AttachedValidator, fork: Fork, kind: BeaconBlockFork.Capella, capellaData: blck.capellaData.toBeaconBlockHeader) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + Web3SignerForkedBeaconBlock( + kind: BeaconBlockFork.EIP4844, + eip4844Data: blck.eip4844Data.toBeaconBlockHeader) request = Web3SignerRequest.init( fork, genesis_validators_root, web3SignerBlock) @@ -422,7 +424,9 @@ proc getBlockSignature*(v: AttachedValidator, fork: Fork, kind: BeaconBlockFork.Capella, capellaData: blck.capellaData.toBeaconBlockHeader) of BeaconBlockFork.EIP4844: - raiseAssert $eip4844ImplementationMissing + Web3SignerForkedBeaconBlock( + kind: BeaconBlockFork.EIP4844, + eip4844Data: blck.eip4844Data.toBeaconBlockHeader) request = Web3SignerRequest.init( fork, genesis_validators_root, web3SignerBlock) diff --git a/ncli/ncli_db.nim b/ncli/ncli_db.nim index 98734ab42..e27673c6e 100644 --- a/ncli/ncli_db.nim +++ b/ncli/ncli_db.nim @@ -1000,7 +1000,7 @@ proc cmdValidatorDb(conf: DbConf, cfg: RuntimeConfig) = withState(tmpState[]): var stateData = newClone(forkyState.data) when stateFork == BeaconStateFork.EIP4844: - raiseAssert $eip4844ImplementationMissing & ": ncli_db.nim:cmdValidatorDb" + debugRaiseAssert $eip4844ImplementationMissing & ": ncli_db.nim:cmdValidatorDb" else: rewardsAndPenalties.collectEpochRewardsAndPenalties( stateData[], cache, cfg, flags) diff --git a/tests/consensus_spec/altair/test_fixture_fork.nim b/tests/consensus_spec/altair/test_fixture_fork.nim index b7ebfa4f7..acf79e6bc 100644 --- a/tests/consensus_spec/altair/test_fixture_fork.nim +++ b/tests/consensus_spec/altair/test_fixture_fork.nim @@ -8,8 +8,6 @@ {.used.} import - # Standard library - os, # Beacon chain internals ../../../beacon_chain/spec/[beaconstate, helpers], ../../../beacon_chain/spec/datatypes/[phase0, altair], @@ -18,6 +16,8 @@ import ../fixtures_utils, ../../helpers/debug_state +from std/os import walkDir, `/` + const OpForkDir = SszTestsDir/const_preset/"altair"/"fork"/"fork"/"pyspec_tests" proc runTest(identifier: string) = diff --git a/tests/consensus_spec/bellatrix/test_fixture_fork.nim b/tests/consensus_spec/bellatrix/test_fixture_fork.nim index f68fa33f0..ec90541bb 100644 --- a/tests/consensus_spec/bellatrix/test_fixture_fork.nim +++ b/tests/consensus_spec/bellatrix/test_fixture_fork.nim @@ -8,8 +8,6 @@ {.used.} import - # Standard library - os, # Beacon chain internals ../../../beacon_chain/spec/[beaconstate, helpers], ../../../beacon_chain/spec/datatypes/[altair, bellatrix], @@ -18,6 +16,8 @@ import ../fixtures_utils, ../../helpers/debug_state +from std/os import walkDir, `/` + const OpForkDir = SszTestsDir/const_preset/"bellatrix"/"fork"/"fork"/"pyspec_tests" proc runTest(identifier: string) = diff --git a/tests/consensus_spec/bellatrix/test_fixture_operations.nim b/tests/consensus_spec/bellatrix/test_fixture_operations.nim index 69b46df76..2c8800862 100644 --- a/tests/consensus_spec/bellatrix/test_fixture_operations.nim +++ b/tests/consensus_spec/bellatrix/test_fixture_operations.nim @@ -8,8 +8,6 @@ {.used.} import - # Standard library - std/[os, sequtils, sets, strutils], # Utilities chronicles, unittest2, @@ -22,6 +20,10 @@ import ../fixtures_utils, ../../helpers/debug_state +from std/os import fileExists, walkDir, `/` +from std/sequtils import mapIt, toSeq +from std/strutils import contains + const OpDir = SszTestsDir/const_preset/"bellatrix"/"operations" OpAttestationsDir = OpDir/"attestation" diff --git a/tests/consensus_spec/bellatrix/test_fixture_ssz_consensus_objects.nim b/tests/consensus_spec/bellatrix/test_fixture_ssz_consensus_objects.nim index 8136552f2..b609a35cb 100644 --- a/tests/consensus_spec/bellatrix/test_fixture_ssz_consensus_objects.nim +++ b/tests/consensus_spec/bellatrix/test_fixture_ssz_consensus_objects.nim @@ -8,9 +8,6 @@ {.used.} import - # Standard library - os, strutils, streams, strformat, - macros, sets, # Third-party yaml, # Beacon chain internals @@ -20,6 +17,11 @@ import # Test utilities ../../testutil, ../fixtures_utils +from std/os import dirExists, pcDir, walkDir, `/` +from std/streams import close, openFileStream +from std/strformat import `&` +from std/strutils import toLowerAscii + # SSZ tests of consensus objects (minimal/mainnet preset specific) # Parsing definitions diff --git a/tests/consensus_spec/capella/test_fixture_transition.nim b/tests/consensus_spec/capella/test_fixture_transition.nim index 0834ad36f..1b7d75802 100644 --- a/tests/consensus_spec/capella/test_fixture_transition.nim +++ b/tests/consensus_spec/capella/test_fixture_transition.nim @@ -10,8 +10,6 @@ import chronicles, yaml, - # Standard library - std/[os, sequtils, strutils], # Status internal faststreams, streams, # Beacon chain internals @@ -21,6 +19,9 @@ import ../../testutil, ../fixtures_utils +from std/os import walkDir, walkPattern, `/` +from std/sequtils import toSeq + const TransitionDir = SszTestsDir/const_preset/"capella"/"transition"/"core"/"pyspec_tests"