diff --git a/Makefile b/Makefile index 51659117e..cfd8c432c 100644 --- a/Makefile +++ b/Makefile @@ -57,12 +57,6 @@ TOOLS_CSV := $(subst $(SPACE),$(COMMA),$(TOOLS)) testnet1 \ clean \ libbacktrace \ - clean-schlesi \ - schlesi \ - schlesi-dev \ - clean-witti \ - witti \ - witti-dev \ book \ publish-book @@ -158,20 +152,11 @@ clean-altona: rm -rf build/data/shared_altona* altona: | build deps - NIM_PARAMS="$(NIM_PARAMS)" LOG_LEVEL="$(LOG_LEVEL)" $(ENV_SCRIPT) nim $(NIM_PARAMS) scripts/connect_to_testnet.nims --spec=v0.12.1 $(SCRIPT_PARAMS) shared/altona + NIM_PARAMS="$(NIM_PARAMS)" LOG_LEVEL="$(LOG_LEVEL)" $(ENV_SCRIPT) nim $(NIM_PARAMS) scripts/connect_to_testnet.nims $(SCRIPT_PARAMS) shared/altona altona-dev: | build deps NIM_PARAMS="$(NIM_PARAMS)" LOG_LEVEL="DEBUG; TRACE:discv5,networking; REQUIRED:none; DISABLED:none" $(ENV_SCRIPT) nim $(NIM_PARAMS) scripts/connect_to_testnet.nims $(SCRIPT_PARAMS) shared/altona -clean-witti: - rm -rf build/data/shared_witti* - -witti: | build deps - NIM_PARAMS="$(NIM_PARAMS)" LOG_LEVEL="$(LOG_LEVEL)" $(ENV_SCRIPT) nim $(NIM_PARAMS) scripts/connect_to_testnet.nims --spec=v0.11.3 $(SCRIPT_PARAMS) shared/witti - -witti-dev: | build deps - NIM_PARAMS="$(NIM_PARAMS)" LOG_LEVEL="DEBUG; TRACE:discv5,networking; REQUIRED:none; DISABLED:none" $(ENV_SCRIPT) nim $(NIM_PARAMS) scripts/connect_to_testnet.nims --spec=v0.11.3 $(SCRIPT_PARAMS) shared/witti - ctail: | build deps mkdir -p vendor/.nimble/bin/ $(ENV_SCRIPT) nim -d:danger -o:vendor/.nimble/bin/ctail c vendor/nim-chronicles-tail/ctail.nim diff --git a/beacon_chain.nimble b/beacon_chain.nimble index e9636dfd5..bd8468a3b 100644 --- a/beacon_chain.nimble +++ b/beacon_chain.nimble @@ -49,7 +49,7 @@ proc buildAndRunBinary(name: string, srcDir = "./", params = "", cmdParams = "", task moduleTests, "Run all module tests": buildAndRunBinary "beacon_node", "beacon_chain/", "-d:chronicles_log_level=TRACE " & - "-d:const_preset=minimal -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\" " & + "-d:const_preset=minimal " & "-d:testutils_test_build" ### tasks @@ -59,30 +59,22 @@ task test, "Run all tests": # price we pay for that. # Just the part of minimal config which explicitly differs from mainnet - buildAndRunBinary "test_fixture_const_sanity_check", "tests/official/", "-d:const_preset=minimal -d:ETH2_SPEC=\"v0.11.3\" -d:BLS_ETH2_SPEC=\"v0.11.x\"" - buildAndRunBinary "test_fixture_const_sanity_check", "tests/official/", "-d:const_preset=minimal -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" + buildAndRunBinary "test_fixture_const_sanity_check", "tests/official/", "-d:const_preset=minimal" # Mainnet config - buildAndRunBinary "proto_array", "beacon_chain/fork_choice/", "-d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" - buildAndRunBinary "fork_choice", "beacon_chain/fork_choice/", "-d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" - buildAndRunBinary "all_tests", "tests/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" + buildAndRunBinary "proto_array", "beacon_chain/fork_choice/", "-d:const_preset=mainnet" + buildAndRunBinary "fork_choice", "beacon_chain/fork_choice/", "-d:const_preset=mainnet" + buildAndRunBinary "all_tests", "tests/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet" # Generic SSZ test, doesn't use consensus objects minimal/mainnet presets buildAndRunBinary "test_fixture_ssz_generic_types", "tests/official/", "-d:chronicles_log_level=TRACE" # Consensus object SSZ tests - # 0.11.3 - buildAndRunBinary "test_fixture_ssz_consensus_objects", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet -d:ETH2_SPEC=\"v0.11.3\" -d:BLS_ETH2_SPEC=\"v0.11.x\"" + buildAndRunBinary "test_fixture_ssz_consensus_objects", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet" # 0.12.1 - buildAndRunBinary "test_fixture_ssz_consensus_objects", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" - - # 0.11.3 - buildAndRunBinary "all_fixtures_require_ssz", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet -d:ETH2_SPEC=\"v0.11.3\" -d:BLS_ETH2_SPEC=\"v0.11.x\"" - - # 0.12.1 - buildAndRunBinary "all_fixtures_require_ssz", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" - - # State sim; getting into 4th epoch useful to trigger consensus checks - buildAndRunBinary "state_sim", "research/", "-d:const_preset=mainnet -d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"", "--validators=2000 --slots=128" + buildAndRunBinary "all_fixtures_require_ssz", "tests/official/", "-d:chronicles_log_level=TRACE -d:const_preset=mainnet" + # State and block sims; getting to 4th epoch triggers consensus checks + buildAndRunBinary "state_sim", "research/", "-d:const_preset=mainnet", "--validators=2000 --slots=128" + buildAndRunBinary "block_sim", "research/", "-d:const_preset=mainnet", "--validators=2000 --slots=128" diff --git a/beacon_chain/attestation_aggregation.nim b/beacon_chain/attestation_aggregation.nim index 4322b09da..cc5110210 100644 --- a/beacon_chain/attestation_aggregation.nim +++ b/beacon_chain/attestation_aggregation.nim @@ -136,30 +136,21 @@ proc isValidAttestation*( pool.blockPool.withState( pool.blockPool.tmpState, BlockSlot(blck: attestationBlck, slot: attestation.data.slot)): - when ETH2_SPEC == "v0.12.1": - # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestation-subnets - # [REJECT] The attestation is for the correct subnet (i.e. - # compute_subnet_for_attestation(state, attestation) == subnet_id). - let - epochInfo = blck.getEpochInfo(state) - requiredSubnetIndex = - compute_subnet_for_attestation( - epochInfo.shuffled_active_validator_indices.len.uint64, attestation) + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestation-subnets + # [REJECT] The attestation is for the correct subnet (i.e. + # compute_subnet_for_attestation(state, attestation) == subnet_id). + let + epochInfo = blck.getEpochInfo(state) + requiredSubnetIndex = + compute_subnet_for_attestation( + epochInfo.shuffled_active_validator_indices.len.uint64, attestation) - if requiredSubnetIndex != topicCommitteeIndex: - debug "isValidAttestation: attestation's committee index not for the correct subnet", - topicCommitteeIndex = topicCommitteeIndex, - attestation_data_index = attestation.data.index, - requiredSubnetIndex = requiredSubnetIndex - return false - else: - # The attestation's committee index (attestation.data.index) is for the - # correct subnet. - if attestation.data.index != topicCommitteeIndex: - debug "isValidAttestation: attestation's committee index not for the correct subnet", - topicCommitteeIndex = topicCommitteeIndex, - attestation_data_index = attestation.data.index - return false + if requiredSubnetIndex != topicCommitteeIndex: + debug "isValidAttestation: attestation's committee index not for the correct subnet", + topicCommitteeIndex = topicCommitteeIndex, + attestation_data_index = attestation.data.index, + requiredSubnetIndex = requiredSubnetIndex + return false # The signature of attestation is valid. var cache = getEpochCache(blck, state) diff --git a/beacon_chain/beacon_node.nim b/beacon_chain/beacon_node.nim index 8370e77c4..ec3f39fe7 100644 --- a/beacon_chain/beacon_node.nim +++ b/beacon_chain/beacon_node.nim @@ -745,7 +745,7 @@ proc installAttestationHandlers(node: BeaconNode) = proc attestationValidator(attestation: Attestation, committeeIndex: uint64): bool = - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.1/specs/phase0/p2p-interface.md#attestation-subnets + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestation-subnets let (afterGenesis, slot) = node.beaconClock.now().toSlot() if not afterGenesis: return false @@ -753,34 +753,16 @@ proc installAttestationHandlers(node: BeaconNode) = var attestationSubscriptions: seq[Future[void]] = @[] - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.1/specs/phase0/p2p-interface.md#mainnet-3 + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestations-and-aggregation for it in 0'u64 ..< ATTESTATION_SUBNET_COUNT.uint64: closureScope: let ci = it - when ETH2_SPEC == "v0.12.1": - attestationSubscriptions.add(node.network.subscribe( - getAttestationTopic(node.forkDigest, ci), attestationHandler, - # This proc needs to be within closureScope; don't lift out of loop. - proc(attestation: Attestation): bool = - attestationValidator(attestation, ci) - )) - else: - attestationSubscriptions.add(node.network.subscribe( - getMainnetAttestationTopic(node.forkDigest, ci), attestationHandler, - # This proc needs to be within closureScope; don't lift out of loop. - proc(attestation: Attestation): bool = - attestationValidator(attestation, ci) - )) - - when ETH2_SPEC == "v0.11.3": - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.1/specs/phase0/p2p-interface.md#interop-3 - attestationSubscriptions.add(node.network.subscribe( - getInteropAttestationTopic(node.forkDigest), attestationHandler, - proc(attestation: Attestation): bool = - # isValidAttestation checks attestation.data.index == topicCommitteeIndex - # which doesn't make sense here, so rig that check to vacuously pass. - attestationValidator(attestation, attestation.data.index) - )) + attestationSubscriptions.add(node.network.subscribe( + getAttestationTopic(node.forkDigest, ci), attestationHandler, + # This proc needs to be within closureScope; don't lift out of loop. + proc(attestation: Attestation): bool = + attestationValidator(attestation, ci) + )) waitFor allFutures(attestationSubscriptions) diff --git a/beacon_chain/inspector.nim b/beacon_chain/inspector.nim index 5f5e80ea2..a25d24ec0 100644 --- a/beacon_chain/inspector.nim +++ b/beacon_chain/inspector.nim @@ -52,10 +52,8 @@ type next_fork_version*: Version next_fork_epoch*: Epoch - # TODO remove InteropAttestations when Altona launches TopicFilter* {.pure.} = enum - Blocks, Attestations, Exits, ProposerSlashing, AttesterSlashings, - InteropAttestations + Blocks, Attestations, Exits, ProposerSlashing, AttesterSlashings BootstrapKind* {.pure.} = enum Enr, MultiAddr @@ -197,22 +195,12 @@ func getTopics(forkDigest: ForkDigest, of TopicFilter.AttesterSlashings: let topic = getAttesterSlashingsTopic(forkDigest) @[topic, topic & "_snappy"] - of TopicFilter.InteropAttestations: - when ETH2_SPEC == "v0.11.3": - let topic = getInteropAttestationTopic(forkDigest) - @[topic, topic & "_snappy"] - else: - @[] of TopicFilter.Attestations: var topics = newSeq[string](ATTESTATION_SUBNET_COUNT * 2) var offset = 0 for i in 0'u64 ..< ATTESTATION_SUBNET_COUNT.uint64: - when ETH2_SPEC == "v0.12.1": - topics[offset] = getAttestationTopic(forkDigest, i) - topics[offset + 1] = getAttestationTopic(forkDigest, i) & "_snappy" - else: - topics[offset] = getMainnetAttestationTopic(forkDigest, i) - topics[offset + 1] = getMainnetAttestationTopic(forkDigest, i) & "_snappy" + topics[offset] = getAttestationTopic(forkDigest, i) + topics[offset + 1] = getAttestationTopic(forkDigest, i) & "_snappy" offset += 2 topics @@ -541,10 +529,6 @@ proc pubsubLogger(conf: InspectorConf, switch: Switch, elif topic.endsWith(topicAggregateAndProofsSuffix) or topic.endsWith(topicAggregateAndProofsSuffix & "_snappy"): info "AggregateAndProof", msg = SSZ.decode(buffer, AggregateAndProof) - when ETH2_SPEC == "v0.11.3": - if topic.endsWith(topicInteropAttestationSuffix) or - topic.endsWith(topicInteropAttestationSuffix & "_snappy"): - info "Attestation", msg = SSZ.decode(buffer, Attestation) except CatchableError as exc: info "Unable to decode message", errMsg = exc.msg @@ -712,8 +696,6 @@ proc run(conf: InspectorConf) {.async.} = topics.incl({TopicFilter.Blocks, TopicFilter.Attestations, TopicFilter.Exits, TopicFilter.ProposerSlashing, TopicFilter.AttesterSlashings}) - when ETH2_SPEC == "v0.11.3": - topics.incl({TopicFilter.AttesterSlashings}) break elif lcitem == "a": topics.incl(TopicFilter.Attestations) @@ -727,16 +709,10 @@ proc run(conf: InspectorConf) {.async.} = topics.incl(TopicFilter.AttesterSlashings) else: discard - - when ETH2_SPEC == "v0.11.3": - if lcitem == "ia": - topics.incl(TopicFilter.InteropAttestations) else: topics.incl({TopicFilter.Blocks, TopicFilter.Attestations, TopicFilter.Exits, TopicFilter.ProposerSlashing, TopicFilter.AttesterSlashings}) - when ETH2_SPEC == "v0.11.3": - topics.incl({TopicFilter.AttesterSlashings}) proc pubsubTrampoline(topic: string, data: seq[byte]): Future[void] {.gcsafe.} = diff --git a/beacon_chain/spec/datatypes.nim b/beacon_chain/spec/datatypes.nim index dca28c8a7..16cbcc50a 100644 --- a/beacon_chain/spec/datatypes.nim +++ b/beacon_chain/spec/datatypes.nim @@ -46,24 +46,14 @@ export # Eventually, we could also differentiate between user/tainted data and # internal state that's gone through sanity checks already. - -const ETH2_SPEC* {.strdefine.} = "v0.12.1" -static: doAssert: ETH2_SPEC == "v0.11.3" or ETH2_SPEC == "v0.12.1" - # Constant presets const const_preset* {.strdefine.} = "mainnet" when const_preset == "mainnet": - when ETH2_SPEC == "v0.12.1": - import ./presets/v0_12_1/mainnet - else: - import ./presets/v0_11_3/mainnet + import ./presets/v0_12_1/mainnet export mainnet elif const_preset == "minimal": - when ETH2_SPEC == "v0.12.1": - import ./presets/v0_12_1/minimal - else: - import ./presets/v0_11_3/minimal + import ./presets/v0_12_1/minimal export minimal else: type @@ -74,11 +64,7 @@ else: loadCustomPreset const_preset const - SPEC_VERSION* = - when ETH2_SPEC == "v0.12.1": - "0.12.1" - else: - "0.11.3" ## \ + SPEC_VERSION* = "0.12.1" ## \ ## Spec version we're aiming to be compatible with, right now GENESIS_SLOT* = Slot(0) @@ -284,6 +270,11 @@ type state_root*: Eth2Digest body_root*: Eth2Digest + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#signingdata + SigningData* = object + object_root*: Eth2Digest + domain*: Domain + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#beaconblockbody BeaconBlockBody* = object randao_reveal*: ValidatorSig @@ -424,6 +415,13 @@ type deposit_count*: uint64 block_hash*: Eth2Digest + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#eth1block + Eth1Block* = object + timestamp*: uint64 + deposit_root*: Eth2Digest + deposit_count*: uint64 + # All other eth1 block fields + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#signedvoluntaryexit SignedVoluntaryExit* = object message*: VoluntaryExit @@ -465,29 +463,6 @@ type committee_count_cache*: Table[Epoch, uint64] beacon_proposer_indices*: Table[Slot, Option[ValidatorIndex]] -# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#signingdata -# TODO move back into big `type` block -when ETH2_SPEC == "v0.12.1": - type SigningData* = object - object_root*: Eth2Digest - domain*: Domain -else: - type SigningRoot* = object - object_root*: Eth2Digest - domain*: Domain - -# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#eth1block -when ETH2_SPEC == "v0.12.1": - type Eth1Block* = object - timestamp*: uint64 - deposit_root*: Eth2Digest - deposit_count*: uint64 - # All other eth1 block fields -else: - type Eth1Block* = object - timestamp*: uint64 - # All other eth1 block fields - func shortValidatorKey*(state: BeaconState, validatorIdx: int): string = ($state.validators[validatorIdx].pubkey)[0..7] diff --git a/beacon_chain/spec/helpers.nim b/beacon_chain/spec/helpers.nim index 2526cb3fa..ce33dae2a 100644 --- a/beacon_chain/spec/helpers.nim +++ b/beacon_chain/spec/helpers.nim @@ -188,16 +188,10 @@ func get_domain*( func compute_signing_root*(ssz_object: auto, domain: Domain): Eth2Digest = # Return the signing root of an object by calculating the root of the # object-domain tree. - when ETH2_SPEC == "v0.12.1": - let domain_wrapped_object = SigningData( - object_root: hash_tree_root(ssz_object), - domain: domain - ) - else: - let domain_wrapped_object = SigningRoot( - object_root: hash_tree_root(ssz_object), - domain: domain - ) + let domain_wrapped_object = SigningData( + object_root: hash_tree_root(ssz_object), + domain: domain + ) hash_tree_root(domain_wrapped_object) # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/specs/phase0/beacon-chain.md#get_seed diff --git a/beacon_chain/spec/network.nim b/beacon_chain/spec/network.nim index 3f1e7426c..ba451075c 100644 --- a/beacon_chain/spec/network.nim +++ b/beacon_chain/spec/network.nim @@ -9,7 +9,7 @@ import strformat, - datatypes + datatypes, helpers const # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#topics-and-messages @@ -30,9 +30,6 @@ const # This is not part of the spec yet! defaultEth2RpcPort* = 9090 -when ETH2_SPEC == "v0.11.3": - const topicInteropAttestationSuffix* = "beacon_attestation/ssz" - func getBeaconBlocksTopic*(forkDigest: ForkDigest): string = try: &"/eth2/{$forkDigest}/{topicBeaconBlocksSuffix}" @@ -63,51 +60,33 @@ func getAggregateAndProofsTopic*(forkDigest: ForkDigest): string = except ValueError as e: raiseAssert e.msg -when ETH2_SPEC == "v0.11.3": - func getInteropAttestationTopic*(forkDigest: ForkDigest): string = - try: - &"/eth2/{$forkDigest}/{topicInteropAttestationSuffix}" - except ValueError as e: - raiseAssert e.msg +# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#broadcast-attestation +func compute_subnet_for_attestation*( + num_active_validators: uint64, attestation: Attestation): uint64 = + # Compute the correct subnet for an attestation for Phase 0. + # Note, this mimics expected Phase 1 behavior where attestations will be + # mapped to their shard subnet. + # + # The spec version has params (state: BeaconState, attestation: Attestation), + # but it's only to call get_committee_count_at_slot(), which needs only epoch + # and the number of active validators. + let + slots_since_epoch_start = attestation.data.slot mod SLOTS_PER_EPOCH + committees_since_epoch_start = + get_committee_count_at_slot(num_active_validators) * slots_since_epoch_start -# https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/specs/phase0/p2p-interface.md#mainnet-3 -func getMainnetAttestationTopic*(forkDigest: ForkDigest, committeeIndex: uint64): string = - let topicIndex = committeeIndex mod ATTESTATION_SUBNET_COUNT + (committees_since_epoch_start + attestation.data.index) mod ATTESTATION_SUBNET_COUNT + +# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#broadcast-attestation +func getAttestationTopic*(forkDigest: ForkDigest, subnetIndex: uint64): + string = + # This is for subscribing or broadcasting manually to a known index. try: - &"/eth2/{$forkDigest}/committee_index{topicIndex}{topicMainnetAttestationsSuffix}" + &"/eth2/{$forkDigest}/beacon_attestation_{subnetIndex}/ssz" except ValueError as e: raiseAssert e.msg -when ETH2_SPEC == "v0.12.1": - import helpers - - # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#broadcast-attestation - func compute_subnet_for_attestation*( - num_active_validators: uint64, attestation: Attestation): uint64 = - # Compute the correct subnet for an attestation for Phase 0. - # Note, this mimics expected Phase 1 behavior where attestations will be - # mapped to their shard subnet. - # - # The spec version has params (state: BeaconState, attestation: Attestation), - # but it's only to call get_committee_count_at_slot(), which needs only epoch - # and the number of active validators. - let - slots_since_epoch_start = attestation.data.slot mod SLOTS_PER_EPOCH - committees_since_epoch_start = - get_committee_count_at_slot(num_active_validators) * slots_since_epoch_start - - (committees_since_epoch_start + attestation.data.index) mod ATTESTATION_SUBNET_COUNT - - # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/validator.md#broadcast-attestation - func getAttestationTopic*(forkDigest: ForkDigest, subnetIndex: uint64): - string = - # This is for subscribing or broadcasting manually to a known index. - try: - &"/eth2/{$forkDigest}/beacon_attestation_{subnetIndex}/ssz" - except ValueError as e: - raiseAssert e.msg - - func getAttestationTopic*(forkDigest: ForkDigest, attestation: Attestation, num_active_validators: uint64): string = - getAttestationTopic( - forkDigest, - compute_subnet_for_attestation(num_active_validators, attestation)) +func getAttestationTopic*(forkDigest: ForkDigest, attestation: Attestation, num_active_validators: uint64): string = + getAttestationTopic( + forkDigest, + compute_subnet_for_attestation(num_active_validators, attestation)) diff --git a/beacon_chain/spec/presets/custom.nim b/beacon_chain/spec/presets/custom.nim index 428c472de..7571a16b7 100644 --- a/beacon_chain/spec/presets/custom.nim +++ b/beacon_chain/spec/presets/custom.nim @@ -73,14 +73,12 @@ type MIN_EPOCHS_TO_INACTIVITY_PENALTY MIN_GASPRICE MIN_GENESIS_ACTIVE_VALIDATOR_COUNT - MIN_GENESIS_DELAY # TODO BLS_SPEC == "v0.11.3" remove MIN_GENESIS_TIME MIN_PER_EPOCH_CHURN_LIMIT MIN_SEED_LOOKAHEAD MIN_SLASHING_PENALTY_QUOTIENT MIN_VALIDATOR_WITHDRAWABILITY_DELAY ONLINE_PERIOD - PERSISTENT_COMMITTEE_PERIOD # TODO BLS_SPEC == "v0.11.3" remove PHASE_1_FORK_VERSION PHASE_1_GENESIS_SLOT PROPOSER_REWARD_QUOTIENT @@ -142,7 +140,6 @@ const MIN_DEPOSIT_AMOUNT: "'u64", MIN_EPOCHS_TO_INACTIVITY_PENALTY: "'u64", MIN_VALIDATOR_WITHDRAWABILITY_DELAY: "'u64", - PERSISTENT_COMMITTEE_PERIOD: "'u64", PHASE_1_FORK_VERSION: forkVersionConversionFn, PROPOSER_REWARD_QUOTIENT: "'u64", SECONDS_PER_SLOT: "'u64", diff --git a/beacon_chain/spec/presets/v0_11_3/mainnet.nim b/beacon_chain/spec/presets/v0_11_3/mainnet.nim deleted file mode 100644 index 98f3cb6de..000000000 --- a/beacon_chain/spec/presets/v0_11_3/mainnet.nim +++ /dev/null @@ -1,211 +0,0 @@ -# beacon_chain -# Copyright (c) 2018-2020 Status Research & Development GmbH -# Licensed and distributed under either of -# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). -# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). -# at your option. This file may not be copied, modified, or distributed except according to those terms. - -# This file contains constants that are part of the spec and thus subject to -# serialization and spec updates. - -import - math - -type - Slot* = distinct uint64 - Epoch* = distinct uint64 - -{.experimental: "codeReordering".} # SLOTS_PER_EPOCH is use before being defined in spec - -const - # Misc - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L6 - - MAX_COMMITTEES_PER_SLOT* {.intdefine.} = 64 - - TARGET_COMMITTEE_SIZE* = 2^7 ##\ - ## Number of validators in the committee attesting to one shard - ## Per spec: - ## For the safety of crosslinks `TARGET_COMMITTEE_SIZE` exceeds - ## [the recommended minimum committee size of 111](https://vitalik.ca/files/Ithaca201807_Sharding.pdf); - ## with sufficient active validators (at least - ## `SLOTS_PER_EPOCH * TARGET_COMMITTEE_SIZE`), the shuffling algorithm ensures - ## committee sizes at least `TARGET_COMMITTEE_SIZE`. (Unbiasable randomness - ## with a Verifiable Delay Function (VDF) will improve committee robustness - ## and lower the safe minimum committee size.) - - MAX_VALIDATORS_PER_COMMITTEE* = 2048 ##\ - ## votes - - MIN_PER_EPOCH_CHURN_LIMIT* = 4 - CHURN_LIMIT_QUOTIENT* = 2^16 - SHUFFLE_ROUND_COUNT* = 90 - MIN_GENESIS_ACTIVE_VALIDATOR_COUNT* {.intdefine.} = 16384 - MIN_GENESIS_TIME* {.intdefine.} = 1578009600 - - HYSTERESIS_QUOTIENT* = 4 - HYSTERESIS_DOWNWARD_MULTIPLIER* = 1 - HYSTERESIS_UPWARD_MULTIPLIER* = 5 - - # Gwei values - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L58 - - MIN_DEPOSIT_AMOUNT* = 2'u64^0 * 10'u64^9 ##\ - ## Minimum amounth of ETH that can be deposited in one call - deposits can - ## be used either to top up an existing validator or commit to a new one - - MAX_EFFECTIVE_BALANCE* = 2'u64^5 * 10'u64^9 ##\ - ## Maximum amounth of ETH that can be deposited in one call - - EJECTION_BALANCE* = 2'u64^4 * 10'u64^9 ##\ - ## Once the balance of a validator drops below this, it will be ejected from - ## the validator pool - - EFFECTIVE_BALANCE_INCREMENT* = 2'u64^0 * 10'u64^9 - - # Initial values - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L70 - GENESIS_FORK_VERSION* = [0'u8, 0'u8, 0'u8, 0'u8] - BLS_WITHDRAWAL_PREFIX* = 0'u8 - - # Time parameters - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L77 - MIN_GENESIS_DELAY* = 86400 # 86400 seconds (1 day) - - SECONDS_PER_SLOT*{.intdefine.} = 12'u64 # Compile with -d:SECONDS_PER_SLOT=1 for 12x faster slots - ## TODO consistent time unit across projects, similar to C++ chrono? - - MIN_ATTESTATION_INCLUSION_DELAY* = 1 ##\ - ## (12 seconds) - ## Number of slots that attestations stay in the attestation - ## pool before being added to a block. - ## The attestation delay exists so that there is time for attestations to - ## propagate before the block is created. - ## When creating an attestation, the validator will look at the best - ## information known to at that time, and may not revise it during the same - ## slot (see `is_double_vote`) - the delay gives the validator a chance to - ## wait towards the end of the slot and still have time to publish the - ## attestation. - - SLOTS_PER_EPOCH* {.intdefine.} = 32 ##\ - ## (~6.4 minutes) - ## slots that make up an epoch, at the end of which more heavy - ## processing is done - ## Compile with -d:SLOTS_PER_EPOCH=4 for shorter epochs - - MIN_SEED_LOOKAHEAD* = 1 ##\ - ## epochs (~6.4 minutes) - - MAX_SEED_LOOKAHEAD* = 4 ##\ - ## epochs (~25.6 minutes) - - EPOCHS_PER_ETH1_VOTING_PERIOD* = 32 ##\ - ## epochs (~3.4 hours) - - SLOTS_PER_HISTORICAL_ROOT* = 8192 ##\ - ## slots (13 hours) - - MIN_VALIDATOR_WITHDRAWABILITY_DELAY* = 2'u64^8 ##\ - ## epochs (~27 hours) - - PERSISTENT_COMMITTEE_PERIOD* = 2'u64^11 ##\ - ## epochs (9 days) - - MAX_EPOCHS_PER_CROSSLINK* = 2'u64^6 ##\ - ## epochs (~7 hours) - - MIN_EPOCHS_TO_INACTIVITY_PENALTY* = 2'u64^2 ##\ - ## epochs (25.6 minutes) - - # State vector lengths - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L105 - - EPOCHS_PER_HISTORICAL_VECTOR* = 65536 ##\ - ## epochs (~0.8 years) - - EPOCHS_PER_SLASHINGS_VECTOR* = 8192 ##\ - ## epochs (~36 days) - - HISTORICAL_ROOTS_LIMIT* = 16777216 ##\ - ## epochs (~26,131 years) - - VALIDATOR_REGISTRY_LIMIT* = 1099511627776 - - # Reward and penalty quotients - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L117 - BASE_REWARD_FACTOR* = 2'u64^6 - WHISTLEBLOWER_REWARD_QUOTIENT* = 2'u64^9 - PROPOSER_REWARD_QUOTIENT* = 2'u64^3 - INACTIVITY_PENALTY_QUOTIENT* = 2'u64^25 - MIN_SLASHING_PENALTY_QUOTIENT* = 32 # 2^5 - - # Max operations per block - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L131 - MAX_PROPOSER_SLASHINGS* = 2^4 - MAX_ATTESTER_SLASHINGS* = 2^0 - MAX_ATTESTATIONS* = 2^7 - MAX_DEPOSITS* = 2^4 - MAX_VOLUNTARY_EXITS* = 2^4 - - # Fork choice - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L32 - SAFE_SLOTS_TO_UPDATE_JUSTIFIED* = 8 # 96 seconds - - # Validators - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L38 - ETH1_FOLLOW_DISTANCE* {.intdefine.} = 1024 # blocks ~ 4 hours - TARGET_AGGREGATORS_PER_COMMITTEE* = 16 # validators - RANDOM_SUBNETS_PER_VALIDATOR* = 1 # subnet - EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION* = 256 # epochs ~ 27 hours - SECONDS_PER_ETH1_BLOCK* {.intdefine.} = 14 # (estimate from Eth1 mainnet) - - # Phase 1: Upgrade from Phase 0 - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L161 - PHASE_1_FORK_VERSION* = 1 - INITIAL_ACTIVE_SHARDS* = 64 - - # Phase 1: General - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L166 - MAX_SHARDS* = 1024 - ONLINE_PERIOD* = 8 # epochs (~51 min) - LIGHT_CLIENT_COMMITTEE_SIZE* = 128 - LIGHT_CLIENT_COMMITTEE_PERIOD* = 256 # epochs (~27 hours) - SHARD_COMMITTEE_PERIOD* = 256 # epochs (~27 hours) - SHARD_BLOCK_CHUNK_SIZE* = 262144 - MAX_SHARD_BLOCK_CHUNKS* = 4 - TARGET_SHARD_BLOCK_SIZE* = 196608 - MAX_SHARD_BLOCKS_PER_ATTESTATION* = 12 - MAX_GASPRICE* = 16384 # Gwei - MIN_GASPRICE* = 8 # Gwei - GASPRICE_ADJUSTMENT_COEFFICIENT* = 8 - - # Phase 1: Custody game - # --------------------------------------------------------------- - # Time parameters - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L199 - RANDAO_PENALTY_EPOCHS* = 2 # epochs (12.8 minutes) - EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS* = 16384 # epochs (~73 days) - EPOCHS_PER_CUSTODY_PERIOD* = 2048 # epochs (~9 days) - CUSTODY_PERIOD_TO_RANDAO_PADDING* = 2048 # epochs (~9 days) - MAX_REVEAL_LATENESS_DECREMENT* = 128 # epochs (~14 hours) - - # Max operations - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L211 - MAX_CUSTODY_KEY_REVEALS* = 256 - MAX_EARLY_DERIVED_SECRET_REVEALS* = 1 - MAX_CUSTODY_SLASHINGS* = 1 - - # Reward and penalty quotients - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/mainnet.yaml#L217 - EARLY_DERIVED_SECRET_REVEAL_SLOT_REWARD_MULTIPLE* = 2 - MINOR_REWARD_QUOTIENT* = 256 diff --git a/beacon_chain/spec/presets/v0_11_3/minimal.nim b/beacon_chain/spec/presets/v0_11_3/minimal.nim deleted file mode 100644 index 6207b977b..000000000 --- a/beacon_chain/spec/presets/v0_11_3/minimal.nim +++ /dev/null @@ -1,190 +0,0 @@ -# beacon_chain -# Copyright (c) 2018-2020 Status Research & Development GmbH -# Licensed and distributed under either of -# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). -# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). -# at your option. This file may not be copied, modified, or distributed except according to those terms. - -# This file contains constants that are part of the spec and thus subject to -# serialization and spec updates. - -import - math - -type - Slot* = distinct uint64 - Epoch* = distinct uint64 - -{.experimental: "codeReordering".} # SLOTS_PER_EPOCH is use before being defined in spec - -const - # Misc - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L4 - - # Changed - MAX_COMMITTEES_PER_SLOT* = 4 - TARGET_COMMITTEE_SIZE* = 4 - - # Unchanged - MAX_VALIDATORS_PER_COMMITTEE* = 2048 - MIN_PER_EPOCH_CHURN_LIMIT* = 4 - CHURN_LIMIT_QUOTIENT* = 2^16 - - # Changed - SHUFFLE_ROUND_COUNT* = 10 - MIN_GENESIS_ACTIVE_VALIDATOR_COUNT* {.intdefine.} = 64 - MIN_GENESIS_TIME* {.intdefine.} = 1578009600 # 3 Jan, 2020 - - # Unchanged - HYSTERESIS_QUOTIENT* = 4 - HYSTERESIS_DOWNWARD_MULTIPLIER* = 1 - HYSTERESIS_UPWARD_MULTIPLIER* = 5 - - # Gwei values - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L58 - - # Unchanged - MIN_DEPOSIT_AMOUNT* = 2'u64^0 * 10'u64^9 - MAX_EFFECTIVE_BALANCE* = 2'u64^5 * 10'u64^9 - EJECTION_BALANCE* = 2'u64^4 * 10'u64^9 - EFFECTIVE_BALANCE_INCREMENT* = 2'u64^0 * 10'u64^9 - - # Initial values - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L70 - - GENESIS_FORK_VERSION* = [0'u8, 0'u8, 0'u8, 1'u8] - BLS_WITHDRAWAL_PREFIX* = 0'u8 - - # Time parameters - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L77 - # Changed: Faster to spin up testnets, but does not give validator - # reasonable warning time for genesis - MIN_GENESIS_DELAY* = 300 - - # Unchanged - SECONDS_PER_SLOT*{.intdefine.} = 6'u64 - - # Unchanged - MIN_ATTESTATION_INCLUSION_DELAY* = 1 - - # Changed - SLOTS_PER_EPOCH* {.intdefine.} = 8 - - # Unchanged - MIN_SEED_LOOKAHEAD* = 1 - MAX_SEED_LOOKAHEAD* = 4 - - # Changed - EPOCHS_PER_ETH1_VOTING_PERIOD* = 2 - SLOTS_PER_HISTORICAL_ROOT* = 64 - - # Unchanged - MIN_VALIDATOR_WITHDRAWABILITY_DELAY* = 2'u64^8 - - # Changed - PERSISTENT_COMMITTEE_PERIOD* = 128 - - # Unchanged - MAX_EPOCHS_PER_CROSSLINK* = 4 - - # Changed - MIN_EPOCHS_TO_INACTIVITY_PENALTY* = 2'u64^2 - - # State vector lengths - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L105 - - # Changed - EPOCHS_PER_HISTORICAL_VECTOR* = 64 - EPOCHS_PER_SLASHINGS_VECTOR* = 64 - - # Unchanged - HISTORICAL_ROOTS_LIMIT* = 16777216 - VALIDATOR_REGISTRY_LIMIT* = 1099511627776 - - # Reward and penalty quotients - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L117 - - BASE_REWARD_FACTOR* = 2'u64^6 - WHISTLEBLOWER_REWARD_QUOTIENT* = 2'u64^9 - PROPOSER_REWARD_QUOTIENT* = 2'u64^3 - INACTIVITY_PENALTY_QUOTIENT* = 2'u64^25 - MIN_SLASHING_PENALTY_QUOTIENT* = 32 # 2^5 - - # Max operations per block - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L131 - - MAX_PROPOSER_SLASHINGS* = 2^4 - MAX_ATTESTER_SLASHINGS* = 2^0 - MAX_ATTESTATIONS* = 2^7 - MAX_DEPOSITS* = 2^4 - MAX_VOLUNTARY_EXITS* = 2^4 - - # Fork choice - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L32 - - # Changed - SAFE_SLOTS_TO_UPDATE_JUSTIFIED* = 2 - - # Validators - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L38 - - # Changed - ETH1_FOLLOW_DISTANCE* {.intdefine.} = 16 # blocks - - # Unchanged - TARGET_AGGREGATORS_PER_COMMITTEE* = 16 # validators - RANDOM_SUBNETS_PER_VALIDATOR* = 1 # subnet - EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION* = 256 # epochs ~ 27 hours - SECONDS_PER_ETH1_BLOCK* {.intdefine.} = 14 # estimate from Eth1 mainnet) - - # Phase 1: Upgrade from Phase 0 - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L161 - PHASE_1_FORK_VERSION* = 16777217 - INITIAL_ACTIVE_SHARDS* = 4 - - # Phase 1: General - # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L169 - MAX_SHARDS* = 8 - ONLINE_PERIOD* = 8 # epochs ~ 51 minutes - LIGHT_CLIENT_COMMITTEE_SIZE* = 128 - LIGHT_CLIENT_COMMITTEE_PERIOD* = 256 # epochs - SHARD_COMMITTEE_PERIOD* = 256 # epochs - SHARD_BLOCK_CHUNK_SIZE* = 262144 - MAX_SHARD_BLOCK_CHUNKS* = 4 - TARGET_SHARD_BLOCK_SIZE* = 196608 - MAX_SHARD_BLOCKS_PER_ATTESTATION* = 12 - MAX_GASPRICE* = 16384 # Gwei - MIN_GASPRICE* = 8 # Gwei - GASPRICE_ADJUSTMENT_COEFFICIENT* = 8 - - # Phase 1 - Custody game - # --------------------------------------------------------------- - # Time parameters - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L202 - RANDAO_PENALTY_EPOCHS* = 2 - EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS* = 4096 # epochs - EPOCHS_PER_CUSTODY_PERIOD* = 2048 - CUSTODY_PERIOD_TO_RANDAO_PADDING* = 2048 - MAX_REVEAL_LATENESS_DECREMENT* = 128 - - # Max operations - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L214 - MAX_CUSTODY_KEY_REVEALS* = 256 - MAX_EARLY_DERIVED_SECRET_REVEALS* = 1 - MAX_CUSTODY_SLASHINGS* = 1 - - # Reward and penalty quotients - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/configs/minimal.yaml#L220 - EARLY_DERIVED_SECRET_REVEAL_SLOT_REWARD_MULTIPLE* = 2 - MINOR_REWARD_QUOTIENT* = 256 diff --git a/beacon_chain/spec/state_transition_block.nim b/beacon_chain/spec/state_transition_block.nim index 9cfd4a07d..880dab84a 100644 --- a/beacon_chain/spec/state_transition_block.nim +++ b/beacon_chain/spec/state_transition_block.nim @@ -283,16 +283,10 @@ proc process_voluntary_exit*( return false # Verify the validator has been active long enough - when ETH2_SPEC == "v0.12.1": - if not (get_current_epoch(state) >= validator.activation_epoch + - SHARD_COMMITTEE_PERIOD): - notice "Exit: not in validator set long enough" - return false - else: - if not (get_current_epoch(state) >= validator.activation_epoch + - PERSISTENT_COMMITTEE_PERIOD): - notice "Exit: not in validator set long enough" - return false + if not (get_current_epoch(state) >= validator.activation_epoch + + SHARD_COMMITTEE_PERIOD): + notice "Exit: not in validator set long enough" + return false # Verify signature if skipBlsValidation notin flags: diff --git a/beacon_chain/spec/state_transition_epoch.nim b/beacon_chain/spec/state_transition_epoch.nim index 922aa03f7..c77bb93ee 100644 --- a/beacon_chain/spec/state_transition_epoch.nim +++ b/beacon_chain/spec/state_transition_epoch.nim @@ -393,122 +393,25 @@ func get_inactivity_penalty_deltas(state: BeaconState, cache: var StateCache): # Spec constructs rewards anyway; this doesn't penalties -when ETH2_SPEC == "v0.12.1": - # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#get_attestation_deltas - func get_attestation_deltas(state: BeaconState, cache: var StateCache): tuple[a: seq[Gwei], b: seq[Gwei]] = - # Return attestation reward/penalty deltas for each validator. - let - (source_rewards, source_penalties) = get_source_deltas(state, cache) - (target_rewards, target_penalties) = get_target_deltas(state, cache) - (head_rewards, head_penalties) = get_head_deltas(state, cache) - inclusion_delay_rewards = get_inclusion_delay_deltas(state, cache) - inactivity_penalties = get_inactivity_penalty_deltas(state, cache) +# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#get_attestation_deltas +func get_attestation_deltas(state: BeaconState, cache: var StateCache): tuple[a: seq[Gwei], b: seq[Gwei]] = + # Return attestation reward/penalty deltas for each validator. + let + (source_rewards, source_penalties) = get_source_deltas(state, cache) + (target_rewards, target_penalties) = get_target_deltas(state, cache) + (head_rewards, head_penalties) = get_head_deltas(state, cache) + inclusion_delay_rewards = get_inclusion_delay_deltas(state, cache) + inactivity_penalties = get_inactivity_penalty_deltas(state, cache) - let rewards = mapIt(0 ..< len(state.validators), - source_rewards[it] + target_rewards[it] + head_rewards[it] + - inclusion_delay_rewards[it]) + let rewards = mapIt(0 ..< len(state.validators), + source_rewards[it] + target_rewards[it] + head_rewards[it] + + inclusion_delay_rewards[it]) - let penalties = mapIt(0 ..< len(state.validators), - source_penalties[it] + target_penalties[it] + head_penalties[it] + - inactivity_penalties[it]) + let penalties = mapIt(0 ..< len(state.validators), + source_penalties[it] + target_penalties[it] + head_penalties[it] + + inactivity_penalties[it]) - (rewards, penalties) -else: - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/specs/phase0/beacon-chain.md#rewards-and-penalties-1 - func get_attestation_deltas(state: BeaconState, stateCache: var StateCache): - tuple[a: seq[Gwei], b: seq[Gwei]] {.nbench.}= - let - previous_epoch = get_previous_epoch(state) - total_balance = get_total_active_balance(state, stateCache) - var - rewards = repeat(0'u64, len(state.validators)) - penalties = repeat(0'u64, len(state.validators)) - eligible_validator_indices : seq[ValidatorIndex] = @[] - - for index, v in state.validators: - if is_active_validator(v, previous_epoch) or - (v.slashed and previous_epoch + 1 < v.withdrawable_epoch): - eligible_validator_indices.add index.ValidatorIndex - - # Micro-incentives for matching FFG source, FFG target, and head - let - matching_source_attestations = - get_matching_source_attestations(state, previous_epoch) - matching_target_attestations = - get_matching_target_attestations(state, previous_epoch) - matching_head_attestations = - get_matching_head_attestations(state, previous_epoch) - - for attestations in - [matching_source_attestations, matching_target_attestations, - matching_head_attestations]: - let - unslashed_attesting_indices = - get_unslashed_attesting_indices(state, attestations, stateCache) - attesting_balance = get_total_balance(state, unslashed_attesting_indices) - for index in eligible_validator_indices: - if index in unslashed_attesting_indices: - # Factored out from balance totals to avoid uint64 overflow - const increment = EFFECTIVE_BALANCE_INCREMENT - let reward_numerator = get_base_reward(state, index, total_balance) * - (attesting_balance div increment) - rewards[index] += reward_numerator div (total_balance div increment) - else: - penalties[index] += get_base_reward(state, index, total_balance) - - # Proposer and inclusion delay micro-rewards - ## This depends on matching_source_attestations being an indexable seq, not a - ## set, hash table, etc. - let source_attestation_attesting_indices = - mapIt( - matching_source_attestations, - get_attesting_indices(state, it.data, it.aggregation_bits, stateCache)) - - for index in get_unslashed_attesting_indices( - state, matching_source_attestations, stateCache): - # Translation of attestation = min([...]) - doAssert matching_source_attestations.len > 0 - - # Start by filtering the right attestations - var filtered_matching_source_attestations: seq[PendingAttestation] - - for source_attestation_index, a in matching_source_attestations: - if index notin - source_attestation_attesting_indices[source_attestation_index]: - continue - filtered_matching_source_attestations.add a - - # The first filtered attestation serves as min until we find something - # better - var attestation = filtered_matching_source_attestations[0] - for source_attestation_index, a in filtered_matching_source_attestations: - if a.inclusion_delay < attestation.inclusion_delay: - attestation = a - - let - base_reward = get_base_reward(state, index, total_balance) - proposer_reward = (base_reward div PROPOSER_REWARD_QUOTIENT).Gwei - - rewards[attestation.proposer_index.int] += proposer_reward - let max_attester_reward = base_reward - proposer_reward - - rewards[index] += max_attester_reward div attestation.inclusion_delay - - # Inactivity penalty - let finality_delay = previous_epoch - state.finalized_checkpoint.epoch - if finality_delay > MIN_EPOCHS_TO_INACTIVITY_PENALTY: - let matching_target_attesting_indices = - get_unslashed_attesting_indices( - state, matching_target_attestations, stateCache) - for index in eligible_validator_indices: - penalties[index] += - BASE_REWARDS_PER_EPOCH.uint64 * get_base_reward(state, index, total_balance) - if index notin matching_target_attesting_indices: - penalties[index] += - state.validators[index].effective_balance * - finality_delay div INACTIVITY_PENALTY_QUOTIENT - - (rewards, penalties) + (rewards, penalties) # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#process_rewards_and_penalties func process_rewards_and_penalties( diff --git a/beacon_chain/validator_duties.nim b/beacon_chain/validator_duties.nim index 8a2832488..793842a7e 100644 --- a/beacon_chain/validator_duties.nim +++ b/beacon_chain/validator_duties.nim @@ -103,16 +103,10 @@ proc sendAttestation*( node: BeaconNode, attestation: Attestation, num_active_validators: uint64) = logScope: pcs = "send_attestation" - when ETH2_SPEC == "v0.12.1": - # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestations-and-aggregation - node.network.broadcast( - getAttestationTopic(node.forkDigest, attestation, num_active_validators), - attestation) - else: - # https://github.com/ethereum/eth2.0-specs/blob/v0.11.3/specs/phase0/validator.md#broadcast-attestation - node.network.broadcast( - getMainnetAttestationTopic(node.forkDigest, attestation.data.index), - attestation) + # https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/p2p-interface.md#attestations-and-aggregation + node.network.broadcast( + getAttestationTopic(node.forkDigest, attestation, num_active_validators), + attestation) beacon_attestations_sent.inc() diff --git a/scripts/connect_to_testnet.nims b/scripts/connect_to_testnet.nims index 60f12fd38..a248cf212 100644 --- a/scripts/connect_to_testnet.nims +++ b/scripts/connect_to_testnet.nims @@ -230,13 +230,8 @@ cli do (skipGoerliKey {. validatorsDir = dataDir / "validators" secretsDir = dataDir / "secrets" beaconNodeBinary = buildDir / "beacon_node_" & dataDirName - specDefines = - if specVersion == "v0.12.1": - &"-d:ETH2_SPEC=\"v0.12.1\" -d:BLS_ETH2_SPEC=\"v0.12.x\"" - else: - &"-d:ETH2_SPEC=\"v0.11.3\" -d:BLS_ETH2_SPEC=\"v0.11.x\"" var - nimFlags = &"-d:chronicles_log_level=TRACE {specDefines} " & getEnv("NIM_PARAMS") + nimFlags = &"-d:chronicles_log_level=TRACE " & getEnv("NIM_PARAMS") if writeLogFile: # write the logs to a file diff --git a/tests/official/test_fixture_ssz_consensus_objects.nim b/tests/official/test_fixture_ssz_consensus_objects.nim index cad2ca4d8..b926c2747 100644 --- a/tests/official/test_fixture_ssz_consensus_objects.nim +++ b/tests/official/test_fixture_ssz_consensus_objects.nim @@ -117,11 +117,7 @@ proc runSSZtests() = checkSSZ(SignedBeaconBlockHeader, path, hash) of "SignedVoluntaryExit": checkSSZ(SignedVoluntaryExit, path, hash) of "SigningData": - when ETH2_SPEC == "v0.12.1": - checkSSZ(SigningData, path, hash) - of "SigningRoot": - when ETH2_SPEC == "v0.11.3": - checkSSZ(SigningRoot, path, hash) + checkSSZ(SigningData, path, hash) of "Validator": checkSSZ(Validator, path, hash) of "VoluntaryExit": checkSSZ(VoluntaryExit, path, hash) else: diff --git a/tests/test_honest_validator.nim b/tests/test_honest_validator.nim index 1ae8b90b5..fba43d658 100644 --- a/tests/test_honest_validator.nim +++ b/tests/test_honest_validator.nim @@ -13,95 +13,47 @@ suiteReport "Honest validator": getVoluntaryExitsTopic(forkDigest) == "/eth2/00000000/voluntary_exit/ssz" getProposerSlashingsTopic(forkDigest) == "/eth2/00000000/proposer_slashing/ssz" getAttesterSlashingsTopic(forkDigest) == "/eth2/00000000/attester_slashing/ssz" - when ETH2_SPEC == "v0.11.3": - getInteropAttestationTopic(forkDigest) == "/eth2/00000000/beacon_attestation/ssz" - else: - true getAggregateAndProofsTopic(forkDigest) == "/eth2/00000000/beacon_aggregate_and_proof/ssz" - when ETH2_SPEC == "v0.11.3": - timedTest "Mainnet attestation topics": - check: - getMainnetAttestationTopic(forkDigest, 0) == - "/eth2/00000000/committee_index0_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 9) == - "/eth2/00000000/committee_index9_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 10) == - "/eth2/00000000/committee_index10_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 11) == - "/eth2/00000000/committee_index11_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 14) == - "/eth2/00000000/committee_index14_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 22) == - "/eth2/00000000/committee_index22_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 34) == - "/eth2/00000000/committee_index34_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 46) == - "/eth2/00000000/committee_index46_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 60) == - "/eth2/00000000/committee_index60_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 63) == - "/eth2/00000000/committee_index63_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 200) == - "/eth2/00000000/committee_index8_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 400) == - "/eth2/00000000/committee_index16_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 469) == - "/eth2/00000000/committee_index21_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 550) == - "/eth2/00000000/committee_index38_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 600) == - "/eth2/00000000/committee_index24_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 613) == - "/eth2/00000000/committee_index37_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 733) == - "/eth2/00000000/committee_index29_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 775) == - "/eth2/00000000/committee_index7_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 888) == - "/eth2/00000000/committee_index56_beacon_attestation/ssz" - getMainnetAttestationTopic(forkDigest, 995) == - "/eth2/00000000/committee_index35_beacon_attestation/ssz" - else: - timedTest "Mainnet attestation topics": - check: - getAttestationTopic(forkDigest, 0) == - "/eth2/00000000/beacon_attestation_0/ssz" - getAttestationTopic(forkDigest, 5) == - "/eth2/00000000/beacon_attestation_5/ssz" - getAttestationTopic(forkDigest, 7) == - "/eth2/00000000/beacon_attestation_7/ssz" - getAttestationTopic(forkDigest, 9) == - "/eth2/00000000/beacon_attestation_9/ssz" - getAttestationTopic(forkDigest, 13) == - "/eth2/00000000/beacon_attestation_13/ssz" - getAttestationTopic(forkDigest, 19) == - "/eth2/00000000/beacon_attestation_19/ssz" - getAttestationTopic(forkDigest, 20) == - "/eth2/00000000/beacon_attestation_20/ssz" - getAttestationTopic(forkDigest, 22) == - "/eth2/00000000/beacon_attestation_22/ssz" - getAttestationTopic(forkDigest, 25) == - "/eth2/00000000/beacon_attestation_25/ssz" - getAttestationTopic(forkDigest, 27) == - "/eth2/00000000/beacon_attestation_27/ssz" - getAttestationTopic(forkDigest, 31) == - "/eth2/00000000/beacon_attestation_31/ssz" - getAttestationTopic(forkDigest, 39) == - "/eth2/00000000/beacon_attestation_39/ssz" - getAttestationTopic(forkDigest, 45) == - "/eth2/00000000/beacon_attestation_45/ssz" - getAttestationTopic(forkDigest, 47) == - "/eth2/00000000/beacon_attestation_47/ssz" - getAttestationTopic(forkDigest, 48) == - "/eth2/00000000/beacon_attestation_48/ssz" - getAttestationTopic(forkDigest, 50) == - "/eth2/00000000/beacon_attestation_50/ssz" - getAttestationTopic(forkDigest, 53) == - "/eth2/00000000/beacon_attestation_53/ssz" - getAttestationTopic(forkDigest, 54) == - "/eth2/00000000/beacon_attestation_54/ssz" - getAttestationTopic(forkDigest, 62) == - "/eth2/00000000/beacon_attestation_62/ssz" - getAttestationTopic(forkDigest, 63) == - "/eth2/00000000/beacon_attestation_63/ssz" + timedTest "Mainnet attestation topics": + check: + getAttestationTopic(forkDigest, 0) == + "/eth2/00000000/beacon_attestation_0/ssz" + getAttestationTopic(forkDigest, 5) == + "/eth2/00000000/beacon_attestation_5/ssz" + getAttestationTopic(forkDigest, 7) == + "/eth2/00000000/beacon_attestation_7/ssz" + getAttestationTopic(forkDigest, 9) == + "/eth2/00000000/beacon_attestation_9/ssz" + getAttestationTopic(forkDigest, 13) == + "/eth2/00000000/beacon_attestation_13/ssz" + getAttestationTopic(forkDigest, 19) == + "/eth2/00000000/beacon_attestation_19/ssz" + getAttestationTopic(forkDigest, 20) == + "/eth2/00000000/beacon_attestation_20/ssz" + getAttestationTopic(forkDigest, 22) == + "/eth2/00000000/beacon_attestation_22/ssz" + getAttestationTopic(forkDigest, 25) == + "/eth2/00000000/beacon_attestation_25/ssz" + getAttestationTopic(forkDigest, 27) == + "/eth2/00000000/beacon_attestation_27/ssz" + getAttestationTopic(forkDigest, 31) == + "/eth2/00000000/beacon_attestation_31/ssz" + getAttestationTopic(forkDigest, 39) == + "/eth2/00000000/beacon_attestation_39/ssz" + getAttestationTopic(forkDigest, 45) == + "/eth2/00000000/beacon_attestation_45/ssz" + getAttestationTopic(forkDigest, 47) == + "/eth2/00000000/beacon_attestation_47/ssz" + getAttestationTopic(forkDigest, 48) == + "/eth2/00000000/beacon_attestation_48/ssz" + getAttestationTopic(forkDigest, 50) == + "/eth2/00000000/beacon_attestation_50/ssz" + getAttestationTopic(forkDigest, 53) == + "/eth2/00000000/beacon_attestation_53/ssz" + getAttestationTopic(forkDigest, 54) == + "/eth2/00000000/beacon_attestation_54/ssz" + getAttestationTopic(forkDigest, 62) == + "/eth2/00000000/beacon_attestation_62/ssz" + getAttestationTopic(forkDigest, 63) == + "/eth2/00000000/beacon_attestation_63/ssz" diff --git a/tests/test_interop.nim b/tests/test_interop.nim index 2a57e5da0..07509a0a7 100644 --- a/tests/test_interop.nim +++ b/tests/test_interop.nim @@ -156,21 +156,12 @@ suiteReport "Interop": # https://github.com/ethereum/eth2.0-pm/tree/6e41fcf383ebeb5125938850d8e9b4e9888389b4/interop/mocked_start#create-genesis-state initialState.genesis_time = genesis_time - when ETH2_SPEC == "v0.12.1": - let expected = - when const_preset == "minimal": - "051d1a9c0fb61fce627e3990b930791fd17cb9fa7fb84a9a0051e55bf1759ec8" - elif const_preset == "mainnet": - "ffe85e9b0e3af1b86a177e5b9dc28d5e1237ff5a046482cb45cbd036e918c676" - else: - "unimplemented" - else: - let expected = - when const_preset == "minimal": - "410c8758710155b49208d52c9e4bd2f11aa16a7c7521e560a2d05dcd69a023b3" - elif const_preset == "mainnet": - "95a0b1e7b0b77d0cbe2bcd12c90469e68edb141424b1a6126f1d55498afe3ae6" - else: - "unimplemented" + let expected = + when const_preset == "minimal": + "051d1a9c0fb61fce627e3990b930791fd17cb9fa7fb84a9a0051e55bf1759ec8" + elif const_preset == "mainnet": + "ffe85e9b0e3af1b86a177e5b9dc28d5e1237ff5a046482cb45cbd036e918c676" + else: + "unimplemented" check: hash_tree_root(initialState[]).data.toHex() == expected diff --git a/vendor/nim-eth2-scenarios b/vendor/nim-eth2-scenarios index 3a8b4dacd..d22fabdb9 160000 --- a/vendor/nim-eth2-scenarios +++ b/vendor/nim-eth2-scenarios @@ -1 +1 @@ -Subproject commit 3a8b4dacd08814d0afa6731ea53cc282b78c6854 +Subproject commit d22fabdb91521df5f1d4392be39fc3569145229c