diff --git a/.gitmodules b/.gitmodules index 6afe37f01..14fab9c25 100644 --- a/.gitmodules +++ b/.gitmodules @@ -116,11 +116,6 @@ url = https://github.com/tormund/news.git ignore = dirty branch = master -[submodule "vendor/nim-result"] - path = vendor/nim-result - url = https://github.com/arnetheduck/nim-result.git - ignore = dirty - branch = master [submodule "vendor/nim-prompt"] path = vendor/nim-prompt url = https://github.com/status-im/nim-prompt.git diff --git a/beacon_chain/attestation_aggregation.nim b/beacon_chain/attestation_aggregation.nim index 3aecdd5e7..060fe9308 100644 --- a/beacon_chain/attestation_aggregation.nim +++ b/beacon_chain/attestation_aggregation.nim @@ -12,7 +12,7 @@ # The other part is arguably part of attestation pool -- the validation's # something that should be happing on receipt, not aggregation per se. In # that part, check that messages conform -- so, check for each type -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/networking/p2p-interface.md#topics-and-messages +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/p2p-interface.md#topics-and-messages # specifies. So by the time this calls attestation pool, all validation's # already done. # @@ -30,7 +30,7 @@ import # https://github.com/status-im/nim-beacon-chain/issues/122#issuecomment-562479965 const - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/networking/p2p-interface.md#configuration + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/p2p-interface.md#configuration ATTESTATION_PROPAGATION_SLOT_RANGE = 32 # https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/validator/0_beacon-chain-validator.md#aggregation-selection @@ -72,7 +72,7 @@ proc aggregate_attestations*( let attestation_data = makeAttestationData(state, slot, index, get_block_root_at_slot(state, slot)) - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/validator/0_beacon-chain-validator.md#construct-aggregate + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/validator.md#construct-aggregate for attestation in getAttestationsForBlock(pool, state, slot): if attestation.data == attestation_data: # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/validator.md#aggregateandproof diff --git a/beacon_chain/attestation_pool.nim b/beacon_chain/attestation_pool.nim index 6e4c0138c..e535295d5 100644 --- a/beacon_chain/attestation_pool.nim +++ b/beacon_chain/attestation_pool.nim @@ -162,7 +162,7 @@ proc addResolved(pool: var AttestationPool, blck: BlockRef, attestation: Attesta # voted for.. if blck.slot > attestation.data.slot: notice "Invalid attestation (too new!)", - attestationData = shortLog(attestation.data), + attestation = shortLog(attestation), blockSlot = shortLog(blck.slot) return @@ -174,10 +174,8 @@ proc addResolved(pool: var AttestationPool, blck: BlockRef, attestation: Attesta if not validate(state, attestation): notice "Invalid attestation", - attestationData = shortLog(attestation.data), + attestation = shortLog(attestation), current_epoch = get_current_epoch(state), - target_epoch = attestation.data.target.epoch, - stateSlot = state.slot, cat = "filtering" return @@ -231,11 +229,10 @@ proc addResolved(pool: var AttestationPool, blck: BlockRef, attestation: Attesta pool.updateLatestVotes(state, attestationSlot, participants, a.blck) info "Attestation resolved", - attestationData = shortLog(attestation.data), + attestation = shortLog(attestation), validations = a.validations.len(), current_epoch = get_current_epoch(state), - target_epoch = attestation.data.target.epoch, - stateSlot = state.slot, + blockSlot = shortLog(blck.slot), cat = "filtering" found = true @@ -251,11 +248,10 @@ proc addResolved(pool: var AttestationPool, blck: BlockRef, attestation: Attesta pool.updateLatestVotes(state, attestationSlot, participants, blck) info "Attestation resolved", - attestationData = shortLog(attestation.data), + attestation = shortLog(attestation), current_epoch = get_current_epoch(state), - target_epoch = attestation.data.target.epoch, - stateSlot = state.slot, validations = 1, + blockSlot = shortLog(blck.slot), cat = "filtering" proc add*(pool: var AttestationPool, attestation: Attestation) = @@ -401,6 +397,7 @@ func lmdGhost*( if (let vote = pool.latestAttestation(pubKey); not vote.isNil): latest_messages.add((i, vote)) + # TODO: update to 0.10.1: https://github.com/ethereum/eth2.0-specs/pull/1589/files#diff-9fc3792aa94456eb29506fa77f77b918R143 template get_latest_attesting_balance(blck: BlockRef): uint64 = var res: uint64 for validator_index, target in latest_messages.items(): diff --git a/beacon_chain/beacon_node.nim b/beacon_chain/beacon_node.nim index 6a38b1215..3b5a6def2 100644 --- a/beacon_chain/beacon_node.nim +++ b/beacon_chain/beacon_node.nim @@ -393,9 +393,8 @@ proc sendAttestation(node: BeaconNode, ".ssz", attestation) info "Attestation sent", - attestationData = shortLog(attestationData), + attestation = shortLog(attestation), validator = shortLog(validator), - signature = shortLog(validatorSignature), indexInCommittee = indexInCommittee, cat = "consensus" @@ -501,15 +500,17 @@ proc onAttestation(node: BeaconNode, attestation: Attestation) = # we're on, or that it follows the rules of the protocol logScope: pcs = "on_attestation" - debug "Attestation received", - attestationData = shortLog(attestation.data), - signature = shortLog(attestation.signature), - cat = "consensus" # Tag "consensus|attestation"? - let wallSlot = node.beaconClock.now().toSlot() head = node.blockPool.head + debug "Attestation received", + attestation = shortLog(attestation), + headRoot = shortLog(head.blck.root), + headSlot = shortLog(head.blck.slot), + wallSlot = shortLog(wallSlot.slot), + cat = "consensus" # Tag "consensus|attestation"? + if not wallSlot.afterGenesis or wallSlot.slot < head.blck.slot: warn "Received attestation before genesis or head - clock is wrong?", afterGenesis = wallSlot.afterGenesis, diff --git a/beacon_chain/block_pool.nim b/beacon_chain/block_pool.nim index d6676d312..49137d7eb 100644 --- a/beacon_chain/block_pool.nim +++ b/beacon_chain/block_pool.nim @@ -89,7 +89,7 @@ func getAncestorAt*(blck: BlockRef, slot: Slot): BlockRef = blck = blck.parent func get_ancestor*(blck: BlockRef, slot: Slot): BlockRef = - ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/fork-choice.md#get_ancestor + ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/fork-choice.md#get_ancestor ## Return ancestor at slot, or nil if queried block is older var blck = blck @@ -206,7 +206,7 @@ proc init*(T: type BlockPool, db: BeaconChainDB): BlockPool = tmpState[] = db.getState(latestStateRoot.get().stateRoot) let finalizedSlot = - tmpState[].get().current_justified_checkpoint.epoch.compute_start_slot_at_epoch() + tmpState[].get().finalized_checkpoint.epoch.compute_start_slot_at_epoch() finalizedHead = headRef.findAncestorBySlot(finalizedSlot) justifiedSlot = tmpState[].get().current_justified_checkpoint.epoch.compute_start_slot_at_epoch() diff --git a/beacon_chain/eth2_network.nim b/beacon_chain/eth2_network.nim index 4787d742e..4c3a93046 100644 --- a/beacon_chain/eth2_network.nim +++ b/beacon_chain/eth2_network.nim @@ -57,84 +57,7 @@ proc setupNat(conf: BeaconNodeConf): tuple[ip: IpAddress, if extPorts.isSome: (result.tcpPort, result.udpPort) = extPorts.get() -when networkBackend == rlpx: - import - os, - eth/[rlp, p2p, keys], gossipsub_protocol, - eth/p2p/peer_pool # for log on connected peers - - export - p2p, rlp, gossipsub_protocol - - const - netBackendName* = "rlpx" - IrrelevantNetwork* = UselessPeer - - type - Eth2Node* = EthereumNode - Eth2NodeIdentity* = KeyPair - BootstrapAddr* = ENode - - proc getPersistentNetIdentity*(conf: BeaconNodeConf): Eth2NodeIdentity = - let privateKeyFile = conf.dataDir / "network.privkey" - var privKey: PrivateKey - if not fileExists(privateKeyFile): - privKey = newPrivateKey() - createDir conf.dataDir.string - writeFile(privateKeyFile, $privKey) - else: - privKey = initPrivateKey(readFile(privateKeyFile).string) - - KeyPair(seckey: privKey, pubkey: privKey.getPublicKey()) - - proc getPersistenBootstrapAddr*(conf: BeaconNodeConf, - ip: IpAddress, port: Port): BootstrapAddr = - let - identity = getPersistentNetIdentity(conf) - address = Address(ip: ip, tcpPort: port, udpPort: port) - - initENode(identity.pubKey, address) - - proc isSameNode*(bootstrapNode: BootstrapAddr, id: Eth2NodeIdentity): bool = - bootstrapNode.pubKey == id.pubKey - - proc shortForm*(id: Eth2NodeIdentity): string = - ($id.pubKey)[0..5] - - proc writeValue*(writer: var JsonWriter, value: BootstrapAddr) {.inline.} = - writer.writeValue $value - - proc readValue*(reader: var JsonReader, value: var BootstrapAddr) {.inline.} = - value = initENode reader.readValue(string) - - proc createEth2Node*(conf: BeaconNodeConf, - bootstrapNodes: seq[BootstrapAddr]): Future[EthereumNode] {.async.} = - let - keys = getPersistentNetIdentity(conf) - (ip, tcpPort, udpPort) = setupNat(conf) - address = Address(ip: ip, - tcpPort: tcpPort, - udpPort: udpPort) - - # TODO there are more networking options to add here: local bind ip, ipv6 - # etc. - return newEthereumNode(keys, address, 0, - nil, clientId) - - proc saveConnectionAddressFile*(node: Eth2Node, filename: string) = - writeFile(filename, $node.listeningAddress) - - proc initAddress*(T: type BootstrapAddr, str: string): T = - initENode(str) - - proc initAddress*(T: type BootstrapAddr, ip: IpAddress, tcpPort: Port): T = - # TODO - discard - - func peersCount*(node: Eth2Node): int = - node.peerPool.len - -else: +when networkBackend in [libp2p, libp2pDaemon]: import os, random, stew/io, eth/async_utils, @@ -362,3 +285,5 @@ else: shuffle peers if peers.len > maxPeers: peers.setLen(maxPeers) for p in peers: yield p +else: + {.fatal: "Unsupported network backend".} diff --git a/beacon_chain/gossipsub_protocol.nim b/beacon_chain/gossipsub_protocol.nim deleted file mode 100644 index 47db96048..000000000 --- a/beacon_chain/gossipsub_protocol.nim +++ /dev/null @@ -1,103 +0,0 @@ -import - tables, sets, macros, base64, - chronos, nimcrypto/sysrand, chronicles, json_serialization, - eth/[p2p, rlp, async_utils], eth/p2p/[rlpx, peer_pool], - spec/[datatypes, crypto], - tracing/stacktraces - -type - TopicMsgHandler = proc (msg: string) - - GossipSubPeer* = ref object - sentMessages: HashSet[string] - subscribedFor: HashSet[string] - - GossipSubNetwork* = ref object - topicSubscribers: Table[string, TopicMsgHandler] - handledMessages: HashSet[string] - -proc initProtocolState*(network: GossipSubNetwork, _: EthereumNode) = - network.topicSubscribers = initTable[string, TopicMsgHandler]() - network.handledMessages = initSet[string]() - -proc initProtocolState*(peer: GossipSubPeer, _: Peer) = - peer.sentMessages = initSet[string]() - peer.subscribedFor = initSet[string]() - -proc trySubscribing(peer: Peer, topic: string) {.gcsafe.} -proc tryEmitting(peer: Peer, topic: string, - msgId: string, msg: string): Future[void] {.gcsafe.} - -p2pProtocol GossipSub(version = 1, - rlpxName = "gss", - peerState = GossipSubPeer, - networkState = GossipSubNetwork): - # This is a very barebones emulation of the GossipSub protocol - # available in LibP2P: - - onPeerConnected do (peer: Peer): - info "GossipSub Peer connected", peer - let gossipNet = peer.networkState - for topic, _ in gossipNet.topicSubscribers: - peer.trySubscribing(topic) - - onPeerDisconnected do (peer: Peer, reason: DisconnectionReason): - info "GossipSub Peer disconnected", peer, reason - - proc subscribeFor(peer: Peer, topic: string) = - peer.state.subscribedFor.incl topic - - proc emit(peer: Peer, topic: string, msgId: string, msg: string) = - if msgId in peer.networkState.handledMessages: - trace "Ignored previously handled message", msgId - return - - peer.networkState.handledMessages.incl msgId - - for p in peer.network.peers(GossipSub): - if msgId notin p.state.sentMessages and topic in p.state.subscribedFor: - p.state.sentMessages.incl msgId - traceAsyncErrors p.tryEmitting(topic, msgId, msg) - - {.gcsafe.}: - let handler = peer.networkState.topicSubscribers.getOrDefault(topic) - if handler != nil: - handler(msg) - -proc trySubscribing(peer: Peer, topic: string) = - var fut = peer.subscribeFor(topic) - fut.addCallback do (arg: pointer): - if fut.failed: - debug "Failed to subscribe to topic with GossipSub peer", topic, peer - -proc tryEmitting(peer: Peer, topic: string, - msgId: string, msg: string): Future[void] = - var fut = peer.emit(topic, msgId, msg) - fut.addCallback do (arg: pointer): - if fut.failed: - debug "GossipSub message not delivered to Peer", peer - return fut - -proc subscribe*[MsgType](node: EthereumNode, - topic: string, - userHandler: proc(msg: MsgType)) {.async.}= - var gossipNet = node.protocolState(GossipSub) - gossipNet.topicSubscribers[topic] = proc (msg: string) = - userHandler Json.decode(msg, MsgType) - - for peer in node.peers(GossipSub): - peer.trySubscribing(topic) - -proc broadcast*(node: EthereumNode, topic: string, msg: auto) = - var randBytes: array[10, byte]; - if randomBytes(randBytes) != 10: - warn "Failed to generate random message id" - - let msg = Json.encode(msg) - let msgId = base64.encode(randBytes) - trace "Sending GossipSub message", msgId - - for peer in node.peers(GossipSub): - if topic in peer.state(GossipSub).subscribedFor: - traceAsyncErrors peer.tryEmitting(topic, msgId, msg) - diff --git a/beacon_chain/interop.nim b/beacon_chain/interop.nim index cf4986f72..a4a457803 100644 --- a/beacon_chain/interop.nim +++ b/beacon_chain/interop.nim @@ -39,7 +39,7 @@ const eth1BlockHash* = block: for v in x.data.mitems: v = 0x42 x -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/deposit-contract.md#withdrawal-credentials +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/deposit-contract.md#withdrawal-credentials func makeWithdrawalCredentials*(k: ValidatorPubKey): Eth2Digest = var bytes = eth2hash(k.getBytes()) bytes.data[0] = BLS_WITHDRAWAL_PREFIX.uint8 diff --git a/beacon_chain/kvstore_lmdb.nim b/beacon_chain/kvstore_lmdb.nim index a4ba5c531..615254047 100644 --- a/beacon_chain/kvstore_lmdb.nim +++ b/beacon_chain/kvstore_lmdb.nim @@ -14,7 +14,7 @@ const MDB_NOTFOUND = -30798 when defined(cpu64): - const LMDB_MAP_SIZE = 1024'u * 1024'u * 1024'u * 10'u # 10TB enough? + const LMDB_MAP_SIZE = 1024'u * 1024'u * 1024'u * 10'u # 10 GiB enough? else: const LMDB_MAP_SIZE = 1024'u * 1024'u * 1024'u # 32bit limitation diff --git a/beacon_chain/spec/beaconstate.nim b/beacon_chain/spec/beaconstate.nim index 64a5f05bc..fe1827da1 100644 --- a/beacon_chain/spec/beaconstate.nim +++ b/beacon_chain/spec/beaconstate.nim @@ -12,7 +12,7 @@ import ./crypto, ./datatypes, ./digest, ./helpers, ./validator, ../../nbench/bench_lab -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_valid_merkle_branch +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_valid_merkle_branch func is_valid_merkle_branch*(leaf: Eth2Digest, branch: openarray[Eth2Digest], depth: uint64, index: uint64, root: Eth2Digest): bool {.nbench.}= ## Check if ``leaf`` at ``index`` verifies against the Merkle ``root`` and ## ``branch``. @@ -30,13 +30,13 @@ func is_valid_merkle_branch*(leaf: Eth2Digest, branch: openarray[Eth2Digest], de value = eth2hash(buf) value == root -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#increase_balance +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#increase_balance func increase_balance*( state: var BeaconState, index: ValidatorIndex, delta: Gwei) = # Increase the validator balance at index ``index`` by ``delta``. state.balances[index] += delta -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#decrease_balance +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#decrease_balance func decrease_balance*( state: var BeaconState, index: ValidatorIndex, delta: Gwei) = ## Decrease the validator balance at index ``index`` by ``delta``, with @@ -103,13 +103,13 @@ func process_deposit*( true -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#compute_activation_exit_epoch +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_activation_exit_epoch func compute_activation_exit_epoch(epoch: Epoch): Epoch = ## Return the epoch during which validator activations and exits initiated in ## ``epoch`` take effect. epoch + 1 + MAX_SEED_LOOKAHEAD -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_validator_churn_limit +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_validator_churn_limit func get_validator_churn_limit(state: BeaconState): uint64 = # Return the validator churn limit for the current epoch. let active_validator_indices = @@ -117,7 +117,7 @@ func get_validator_churn_limit(state: BeaconState): uint64 = max(MIN_PER_EPOCH_CHURN_LIMIT, len(active_validator_indices) div CHURN_LIMIT_QUOTIENT).uint64 -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#initiate_validator_exit +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#initiate_validator_exit func initiate_validator_exit*(state: var BeaconState, index: ValidatorIndex) = # Initiate the exit of the validator with index ``index``. @@ -146,7 +146,7 @@ func initiate_validator_exit*(state: var BeaconState, validator.withdrawable_epoch = validator.exit_epoch + MIN_VALIDATOR_WITHDRAWABILITY_DELAY -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#slash_validator +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#slash_validator proc slash_validator*(state: var BeaconState, slashed_index: ValidatorIndex, stateCache: var StateCache) = # Slash the validator with index ``index``. @@ -189,7 +189,7 @@ proc slash_validator*(state: var BeaconState, slashed_index: ValidatorIndex, increase_balance( state, whistleblower_index, whistleblowing_reward - proposer_reward) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#genesis +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#genesis func initialize_beacon_state_from_eth1*( eth1_block_hash: Eth2Digest, eth1_timestamp: uint64, @@ -274,7 +274,7 @@ func get_initial_beacon_block*(state: BeaconState): SignedBeaconBlock = # parent_root, randao_reveal, eth1_data, signature, and body automatically # initialized to default values. -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_block_root_at_slot +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_block_root_at_slot func get_block_root_at_slot*(state: BeaconState, slot: Slot): Eth2Digest = # Return the block root at a recent ``slot``. @@ -283,12 +283,12 @@ func get_block_root_at_slot*(state: BeaconState, doAssert slot < state.slot state.block_roots[slot mod SLOTS_PER_HISTORICAL_ROOT] -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_block_root +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_block_root func get_block_root*(state: BeaconState, epoch: Epoch): Eth2Digest = # Return the block root at the start of a recent ``epoch``. get_block_root_at_slot(state, compute_start_slot_at_epoch(epoch)) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_total_balance +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_total_balance func get_total_balance*(state: BeaconState, validators: auto): Gwei = ## Return the combined effective balance of the ``indices``. (1 Gwei minimum ## to avoid divisions by zero.) @@ -298,13 +298,13 @@ func get_total_balance*(state: BeaconState, validators: auto): Gwei = # XXX: Move to state_transition_epoch.nim? -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_eligible_for_activation_queue +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_eligible_for_activation_queue func is_eligible_for_activation_queue(validator: Validator): bool = # Check if ``validator`` is eligible to be placed into the activation queue. validator.activation_eligibility_epoch == FAR_FUTURE_EPOCH and validator.effective_balance == MAX_EFFECTIVE_BALANCE -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_eligible_for_activation +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_eligible_for_activation func is_eligible_for_activation(state: BeaconState, validator: Validator): bool = # Check if ``validator`` is eligible for activation. @@ -314,7 +314,7 @@ func is_eligible_for_activation(state: BeaconState, validator: Validator): # Has not yet been activated validator.activation_epoch == FAR_FUTURE_EPOCH -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#registry-updates +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#registry-updates proc process_registry_updates*(state: var BeaconState) {.nbench.}= ## Process activation eligibility and ejections ## Try to avoid caching here, since this could easily become undefined @@ -399,7 +399,7 @@ proc is_valid_indexed_attestation*( true -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_attesting_indices +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_attesting_indices func get_attesting_indices*(state: BeaconState, data: AttestationData, bits: CommitteeValidatorsBits, @@ -412,7 +412,7 @@ func get_attesting_indices*(state: BeaconState, if bits[i]: result.incl index -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_indexed_attestation +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_indexed_attestation func get_indexed_attestation(state: BeaconState, attestation: Attestation, stateCache: var StateCache): IndexedAttestation = # Return the indexed attestation corresponding to ``attestation``. diff --git a/beacon_chain/spec/crypto.nim b/beacon_chain/spec/crypto.nim index c090e85f8..7eda6e6b0 100644 --- a/beacon_chain/spec/crypto.nim +++ b/beacon_chain/spec/crypto.nim @@ -24,7 +24,7 @@ import stew/[endians2, objects, byteutils], hashes, nimcrypto/utils, blscurve, json_serialization, - ../version, digest, + digest, chronicles export @@ -250,31 +250,6 @@ else: proc newPrivKey*(): ValidatorPrivKey = SigKey.random() -when networkBackend == rlpx: - import eth/rlp - - when ValidatorPubKey is BlsValue: - proc append*(writer: var RlpWriter, value: ValidatorPubKey) = - writer.append if value.kind == Real: value.blsValue.getBytes() - else: value.blob - else: - proc append*(writer: var RlpWriter, value: ValidatorPubKey) = - writer.append value.getBytes() - - proc read*(rlp: var Rlp, T: type ValidatorPubKey): T {.inline.} = - result.initFromBytes rlp.toBytes.toOpenArray - - when ValidatorSig is BlsValue: - proc append*(writer: var RlpWriter, value: ValidatorSig) = - writer.append if value.kind == Real: value.blsValue.getBytes() - else: value.blob - else: - proc append*(writer: var RlpWriter, value: ValidatorSig) = - writer.append value.getBytes() - - proc read*(rlp: var Rlp, T: type ValidatorSig): T {.inline.} = - result.initFromBytes rlp.toBytes.toOpenArray - proc writeValue*(writer: var JsonWriter, value: VerKey) {.inline.} = writer.writeValue($value) diff --git a/beacon_chain/spec/datatypes.nim b/beacon_chain/spec/datatypes.nim index 8e0d23ebe..9ba3538d0 100644 --- a/beacon_chain/spec/datatypes.nim +++ b/beacon_chain/spec/datatypes.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -20,7 +20,7 @@ import macros, hashes, json, strutils, tables, stew/[byteutils, bitseqs], chronicles, - ../version, ../ssz/types, ./crypto, ./digest + ../ssz/types, ./crypto, ./digest # TODO Data types: # Presently, we're reusing the data types from the serialization (uint64) in the @@ -82,7 +82,7 @@ type # Domains # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#domain-types + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#domain-types DomainType* {.pure.} = enum DOMAIN_BEACON_PROPOSER = 0 DOMAIN_BEACON_ATTESTER = 1 @@ -90,10 +90,10 @@ type DOMAIN_DEPOSIT = 3 DOMAIN_VOLUNTARY_EXIT = 4 # Phase 1 - Custody game - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase1/custody-game.md#signature-domain-types + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase1/custody-game.md#signature-domain-types DOMAIN_CUSTODY_BIT_CHALLENGE = 6 # Phase 1 - Sharding - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase1/shard-data-chains.md#signature-domain-types + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase1/shard-data-chains.md#signature-domain-types DOMAIN_SHARD_PROPOSER = 128 DOMAIN_SHARD_ATTESTER = 129 @@ -109,18 +109,18 @@ type BitList*[maxLen: static int] = distinct BitSeq - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#proposerslashing + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#proposerslashing ProposerSlashing* = object proposer_index*: uint64 signed_header_1*: SignedBeaconBlockHeader signed_header_2*: SignedBeaconBlockHeader - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#attesterslashing + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#attesterslashing AttesterSlashing* = object attestation_1*: IndexedAttestation attestation_2*: IndexedAttestation - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#indexedattestation + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#indexedattestation IndexedAttestation* = object # TODO ValidatorIndex, but that doesn't serialize properly attesting_indices*: List[uint64, MAX_VALIDATORS_PER_COMMITTEE] @@ -129,18 +129,18 @@ type CommitteeValidatorsBits* = BitList[MAX_VALIDATORS_PER_COMMITTEE] - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#attestation + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#attestation Attestation* = object aggregation_bits*: CommitteeValidatorsBits data*: AttestationData signature*: ValidatorSig - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#checkpoint + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#checkpoint Checkpoint* = object epoch*: Epoch root*: Eth2Digest - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#AttestationData + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#AttestationData AttestationData* = object slot*: Slot index*: uint64 @@ -152,34 +152,34 @@ type source*: Checkpoint target*: Checkpoint - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#deposit + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#deposit Deposit* = object proof*: array[DEPOSIT_CONTRACT_TREE_DEPTH + 1, Eth2Digest] ##\ ## Merkle path to deposit root data*: DepositData - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#depositmessage + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#depositmessage DepositMessage* = object pubkey*: ValidatorPubKey withdrawal_credentials*: Eth2Digest amount*: Gwei - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#depositdata + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#depositdata DepositData* = object pubkey*: ValidatorPubKey withdrawal_credentials*: Eth2Digest amount*: uint64 signature*: ValidatorSig # Signing over DepositMessage - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#voluntaryexit + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#voluntaryexit VoluntaryExit* = object epoch*: Epoch ##\ ## Earliest epoch when voluntary exit can be processed validator_index*: uint64 - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#beaconblock + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beaconblock BeaconBlock* = object ## For each slot, a proposer is chosen from the validator pool to propose ## a new block. Once the block as been proposed, it is transmitted to @@ -197,14 +197,14 @@ type body*: BeaconBlockBody - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#beaconblockheader + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beaconblockheader BeaconBlockHeader* = object slot*: Slot parent_root*: Eth2Digest state_root*: Eth2Digest body_root*: Eth2Digest - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#beaconblockbody + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beaconblockbody BeaconBlockBody* = object randao_reveal*: ValidatorSig eth1_data*: Eth1Data @@ -217,7 +217,7 @@ type deposits*: List[Deposit, MAX_DEPOSITS] voluntary_exits*: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS] - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#beaconstate + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beaconstate BeaconState* = object # Versioning genesis_time*: uint64 @@ -269,7 +269,7 @@ type current_justified_checkpoint*: Checkpoint finalized_checkpoint*: Checkpoint - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#validator + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#validator Validator* = object pubkey*: ValidatorPubKey @@ -291,7 +291,7 @@ type withdrawable_epoch*: Epoch ##\ ## When validator can withdraw or transfer funds - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#pendingattestation + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#pendingattestation PendingAttestation* = object aggregation_bits*: CommitteeValidatorsBits data*: AttestationData @@ -301,12 +301,12 @@ type proposer_index*: uint64 - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#historicalbatch + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#historicalbatch HistoricalBatch* = object block_roots* : array[SLOTS_PER_HISTORICAL_ROOT, Eth2Digest] state_roots* : array[SLOTS_PER_HISTORICAL_ROOT, Eth2Digest] - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#fork + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#fork Fork* = object # TODO: Spec introduced an alias for Version = array[4, byte] # and a default parameter to compute_domain @@ -316,39 +316,39 @@ type epoch*: Epoch ##\ ## Epoch of latest fork - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#eth1data + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#eth1data Eth1Data* = object deposit_root*: Eth2Digest deposit_count*: uint64 block_hash*: Eth2Digest - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#signingroot + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#signingroot SigningRoot* = object object_root*: Eth2Digest domain*: uint64 - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#signedvoluntaryexit + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#signedvoluntaryexit SignedVoluntaryExit* = object message*: VoluntaryExit signature*: ValidatorSig - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#signedbeaconblock + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#signedbeaconblock SignedBeaconBlock* = object message*: BeaconBlock signature*: ValidatorSig - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#signedbeaconblockheader + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#signedbeaconblockheader SignedBeaconBlockHeader* = object message*: BeaconBlockHeader signature*: ValidatorSig - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/validator.md#aggregateandproof + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/validator.md#aggregateandproof AggregateAndProof* = object aggregator_index*: uint64 aggregate*: Attestation selection_proof*: ValidatorSig - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/validator.md#eth1block + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/validator.md#eth1block Eth1Block* = object timestamp*: uint64 # All other eth1 block fields @@ -365,16 +365,6 @@ type Table[Epoch, seq[ValidatorIndex]] committee_count_cache*: Table[Epoch, uint64] -when networkBackend == rlpx: - import eth/rlp/bitseqs as rlpBitseqs - export read, append - - proc read*(rlp: var Rlp, T: type BitList): T {.inline.} = - T rlp.read(BitSeq) - - proc append*(writer: var RlpWriter, value: BitList) = - writer.append BitSeq(value) - template foreachSpecType*(op: untyped) = ## These are all spec types that will appear in network messages ## and persistent consensus data. This helper template is useful @@ -486,13 +476,6 @@ template ethTimeUnit(typ: type) {.dirty.} = proc `%`*(x: typ): JsonNode {.borrow.} # Serialization - when networkBackend == rlpx: - proc read*(rlp: var Rlp, T: type typ): typ {.inline.} = - typ(rlp.read(uint64)) - - proc append*(writer: var RlpWriter, value: typ) = - writer.append uint64(value) - proc writeValue*(writer: var JsonWriter, value: typ) = writeValue(writer, uint64 value) @@ -599,6 +582,7 @@ func shortLog*(v: BeaconBlock): auto = func shortLog*(v: AttestationData): auto = ( slot: shortLog(v.slot), + index: v.index, beacon_block_root: shortLog(v.beacon_block_root), source_epoch: shortLog(v.source.epoch), source_root: shortLog(v.source.root), @@ -606,10 +590,18 @@ func shortLog*(v: AttestationData): auto = target_root: shortLog(v.target.root) ) +func shortLog*(v: Attestation): auto = + ( + aggregation_bits: v.aggregation_bits, + data: shortLog(v.data), + signature: shortLog(v.signature) + ) + chronicles.formatIt Slot: it.shortLog chronicles.formatIt Epoch: it.shortLog chronicles.formatIt BeaconBlock: it.shortLog chronicles.formatIt AttestationData: it.shortLog +chronicles.formatIt Attestation: it.shortLog import json_serialization export json_serialization diff --git a/beacon_chain/spec/digest.nim b/beacon_chain/spec/digest.nim index 4c3f6505c..fe27bebeb 100644 --- a/beacon_chain/spec/digest.nim +++ b/beacon_chain/spec/digest.nim @@ -7,7 +7,7 @@ # Serenity hash function / digest # -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#hash +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#hash # # In Phase 0 the beacon chain is deployed with SHA256 (SHA2-256). # Note that is is different from Keccak256 (often mistakenly called SHA3-256) diff --git a/beacon_chain/spec/helpers.nim b/beacon_chain/spec/helpers.nim index f4e612e6c..def556861 100644 --- a/beacon_chain/spec/helpers.nim +++ b/beacon_chain/spec/helpers.nim @@ -15,7 +15,7 @@ import # Internal ./datatypes, ./digest -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#integer_squareroot +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#integer_squareroot func integer_squareroot*(n: SomeInteger): SomeInteger = # Return the largest integer ``x`` such that ``x**2 <= n``. doAssert n >= 0'u64 @@ -28,7 +28,7 @@ func integer_squareroot*(n: SomeInteger): SomeInteger = y = (x + n div x) div 2 x -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#compute_epoch_at_slot +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_epoch_at_slot func compute_epoch_at_slot*(slot: Slot|uint64): Epoch = # Return the epoch number at ``slot``. (slot div SLOTS_PER_EPOCH).Epoch @@ -36,17 +36,17 @@ func compute_epoch_at_slot*(slot: Slot|uint64): Epoch = template epoch*(slot: Slot): Epoch = compute_epoch_at_slot(slot) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#compute_start_slot_at_epoch +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_start_slot_at_epoch func compute_start_slot_at_epoch*(epoch: Epoch): Slot = # Return the start slot of ``epoch``. (epoch * SLOTS_PER_EPOCH).Slot -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_active_validator +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_active_validator func is_active_validator*(validator: Validator, epoch: Epoch): bool = ### Check if ``validator`` is active validator.activation_epoch <= epoch and epoch < validator.exit_epoch -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_active_validator_indices +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_active_validator_indices func get_active_validator_indices*(state: BeaconState, epoch: Epoch): seq[ValidatorIndex] = # Return the sequence of active validator indices at ``epoch``. @@ -54,7 +54,7 @@ func get_active_validator_indices*(state: BeaconState, epoch: Epoch): if is_active_validator(val, epoch): result.add idx.ValidatorIndex -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_committee_count_at_slot +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_committee_count_at_slot func get_committee_count_at_slot*(state: BeaconState, slot: Slot): uint64 = # Return the number of committees at ``slot``. let epoch = compute_epoch_at_slot(slot) @@ -67,13 +67,13 @@ func get_committee_count_at_slot*(state: BeaconState, slot: Slot): uint64 = # Otherwise, get_beacon_committee(...) cannot access some committees. doAssert (SLOTS_PER_EPOCH * MAX_COMMITTEES_PER_SLOT).uint64 >= result -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_current_epoch +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_current_epoch func get_current_epoch*(state: BeaconState): Epoch = # Return the current epoch. doAssert state.slot >= GENESIS_SLOT, $state.slot compute_epoch_at_slot(state.slot) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_randao_mix +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_randao_mix func get_randao_mix*(state: BeaconState, epoch: Epoch): Eth2Digest = ## Returns the randao mix at a recent ``epoch``. @@ -114,7 +114,7 @@ func int_to_bytes4*(x: uint64): array[4, byte] = result[2] = ((x shr 16) and 0xff).byte result[3] = ((x shr 24) and 0xff).byte -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#compute_domain +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_domain func compute_domain*( domain_type: DomainType, fork_version: array[4, byte] = [0'u8, 0, 0, 0]): Domain = @@ -122,7 +122,7 @@ func compute_domain*( result[0..3] = int_to_bytes4(domain_type.uint64) result[4..7] = fork_version -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_domain +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_domain func get_domain*( fork: Fork, domain_type: DomainType, epoch: Epoch): Domain = ## Return the signature domain (fork version concatenated with domain type) @@ -144,7 +144,7 @@ func get_domain*( func get_domain*(state: BeaconState, domain_type: DomainType): Domain = get_domain(state, domain_type, get_current_epoch(state)) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_seed +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_seed func get_seed*(state: BeaconState, epoch: Epoch, domain_type: DomainType): Eth2Digest = # Return the seed at ``epoch``. diff --git a/beacon_chain/spec/presets/mainnet.nim b/beacon_chain/spec/presets/mainnet.nim index 139c5d478..1abef2776 100644 --- a/beacon_chain/spec/presets/mainnet.nim +++ b/beacon_chain/spec/presets/mainnet.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -20,7 +20,7 @@ type const # Misc # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/mainnet.yaml#L6 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L6 MAX_COMMITTEES_PER_SLOT* {.intdefine.} = 64 @@ -45,14 +45,14 @@ const MIN_GENESIS_ACTIVE_VALIDATOR_COUNT* {.intdefine.} = 16384 # Constants (TODO: not actually configurable) - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#constants + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#constants BASE_REWARDS_PER_EPOCH* = 4 DEPOSIT_CONTRACT_TREE_DEPTH* = 32 # Gwei values # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/mainnet.yaml#L50 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L52 MIN_DEPOSIT_AMOUNT* = 2'u64^0 * 10'u64^9 ##\ ## Minimum amounth of ETH that can be deposited in one call - deposits can @@ -69,14 +69,14 @@ const # Initial values # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/mainnet.yaml#L64 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L64 GENESIS_SLOT* = 0.Slot GENESIS_FORK_VERSION* = 0x00000000 BLS_WITHDRAWAL_PREFIX* = 0'u8 # Time parameters # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/mainnet.yaml#L69 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L71 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 @@ -128,7 +128,7 @@ const # State vector lengths # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/mainnet.yaml#L98 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L102 EPOCHS_PER_HISTORICAL_VECTOR* = 65536 EPOCHS_PER_SLASHINGS_VECTOR* = 8192 HISTORICAL_ROOTS_LIMIT* = 16777216 @@ -136,7 +136,7 @@ const # Reward and penalty quotients # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/mainnet.yaml#L110 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L114 BASE_REWARD_FACTOR* = 2'u64^6 WHISTLEBLOWER_REWARD_QUOTIENT* = 2'u64^9 PROPOSER_REWARD_QUOTIENT* = 2'u64^3 @@ -145,7 +145,7 @@ const # Max operations per block # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/mainnet.yaml#L128 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L128 MAX_PROPOSER_SLASHINGS* = 2^4 MAX_ATTESTER_SLASHINGS* = 2^0 MAX_ATTESTATIONS* = 2^7 @@ -154,12 +154,12 @@ const # Fork choice # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/mainnet.yaml#L26 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L26 SAFE_SLOTS_TO_UPDATE_JUSTIFIED* = 8 # 96 seconds # Validators # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/mainnet.yaml#L32 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/mainnet.yaml#L32 ETH1_FOLLOW_DISTANCE* = 1024 # blocks ~ 4 hours TARGET_AGGREGATORS_PER_COMMITTEE* = 16 # validators RANDOM_SUBNETS_PER_VALIDATOR* = 1 # subnet @@ -168,7 +168,7 @@ const # Phase 1 - Sharding # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase1/shard-data-chains.md#time-parameters + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase1/shard-data-chains.md#time-parameters # TODO those are included in minimal.yaml but not mainnet.yaml # Why? # SHARD_SLOTS_PER_BEACON_SLOT* = 2 # spec: SHARD_SLOTS_PER_EPOCH @@ -178,10 +178,9 @@ const # Phase 1 - Custody game # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase1/custody-game.md#constants + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase1/custody-game.md#constants # TODO those are included in minimal.yaml but not mainnet.yaml # Why? # EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS* = 4096 # epochs # EPOCHS_PER_CUSTODY_PERIOD* = 4 # CUSTODY_PERIOD_TO_RANDAO_PADDING* = 4 - diff --git a/beacon_chain/spec/presets/minimal.nim b/beacon_chain/spec/presets/minimal.nim index a083d128d..058ef7762 100644 --- a/beacon_chain/spec/presets/minimal.nim +++ b/beacon_chain/spec/presets/minimal.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -20,7 +20,7 @@ type const # Misc # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/minimal.yaml#L4 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L4 # Changed MAX_COMMITTEES_PER_SLOT* = 4 @@ -38,7 +38,7 @@ const # Constants # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#constants + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#constants # TODO "The following values are (non-configurable) constants" ... # Unchanged BASE_REWARDS_PER_EPOCH* = 4 @@ -47,7 +47,7 @@ const # Gwei values # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/minimal.yaml#L50 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L52 # Unchanged MIN_DEPOSIT_AMOUNT* = 2'u64^0 * 10'u64^9 @@ -57,7 +57,7 @@ const # Initial values # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/minimal.yaml#L62 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L64 # Unchanged GENESIS_SLOT* = 0.Slot @@ -66,7 +66,7 @@ const # Time parameters # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/minimal.yaml#L71 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L71 # Changed: Faster to spin up testnets, but does not give validator # reasonable warning time for genesis MIN_GENESIS_DELAY* = 300 @@ -98,7 +98,7 @@ const # State vector lengths # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/minimal.yaml#L101 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L105 # Changed EPOCHS_PER_HISTORICAL_VECTOR* = 64 @@ -108,7 +108,7 @@ const # Reward and penalty quotients # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/minimal.yaml#L117 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L117 BASE_REWARD_FACTOR* = 2'u64^6 WHISTLEBLOWER_REWARD_QUOTIENT* = 2'u64^9 @@ -118,7 +118,7 @@ const # Max operations per block # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/configs/minimal.yaml#L127 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L131 MAX_PROPOSER_SLASHINGS* = 2^4 MAX_ATTESTER_SLASHINGS* = 2^0 @@ -128,14 +128,14 @@ const # Fork choice # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/minimal.yaml#L26 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L26 # Changed SAFE_SLOTS_TO_UPDATE_JUSTIFIED* = 2 # Validators # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/validator/0_beacon-chain-validator.md#misc + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L32 # Changed ETH1_FOLLOW_DISTANCE* = 16 # blocks @@ -148,7 +148,7 @@ const # Phase 1 - Sharding # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/configs/minimal.yaml#L157 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/configs/minimal.yaml#L157 # TODO those are included in minimal.yaml but not mainnet.yaml # Why? SHARD_SLOTS_PER_BEACON_SLOT* = 2 # spec: SHARD_SLOTS_PER_EPOCH @@ -158,10 +158,9 @@ const # Phase 1 - Custody game # --------------------------------------------------------------- - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/1_custody-game.md#constants + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase1/custody-game.md#constants # TODO those are included in minimal.yaml but not mainnet.yaml # Why? EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS* = 4096 # epochs EPOCHS_PER_CUSTODY_PERIOD* = 4 CUSTODY_PERIOD_TO_RANDAO_PADDING* = 4 - diff --git a/beacon_chain/spec/state_transition_block.nim b/beacon_chain/spec/state_transition_block.nim index beb2825ac..3b33c2664 100644 --- a/beacon_chain/spec/state_transition_block.nim +++ b/beacon_chain/spec/state_transition_block.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -44,7 +44,7 @@ declareGauge beacon_previous_live_validators, "Number of active validators that declareGauge beacon_pending_deposits, "Number of pending deposits (state.eth1_data.deposit_count - state.eth1_deposit_index)" # On block declareGauge beacon_processed_deposits_total, "Number of total deposits included on chain" # On block -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#block-header +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#block-header proc process_block_header*( state: var BeaconState, blck: BeaconBlock, flags: UpdateFlags, stateCache: var StateCache): bool {.nbench.}= @@ -125,14 +125,14 @@ proc process_randao( true -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#eth1-data +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#eth1-data func process_eth1_data(state: var BeaconState, body: BeaconBlockBody) {.nbench.}= state.eth1_data_votes.add body.eth1_data if state.eth1_data_votes.count(body.eth1_data) * 2 > SLOTS_PER_ETH1_VOTING_PERIOD: state.eth1_data = body.eth1_data -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_slashable_validator +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_slashable_validator func is_slashable_validator(validator: Validator, epoch: Epoch): bool = # Check if ``validator`` is slashable. (not validator.slashed) and @@ -201,7 +201,7 @@ proc processProposerSlashings( true -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#is_slashable_attestation_data +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#is_slashable_attestation_data func is_slashable_attestation_data( data_1: AttestationData, data_2: AttestationData): bool = ## Check if ``data_1`` and ``data_2`` are slashable according to Casper FFG diff --git a/beacon_chain/spec/state_transition_epoch.nim b/beacon_chain/spec/state_transition_epoch.nim index 5b5c3b370..34f4624af 100644 --- a/beacon_chain/spec/state_transition_epoch.nim +++ b/beacon_chain/spec/state_transition_epoch.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -63,7 +63,7 @@ declareGauge epoch_transition_final_updates, "Epoch transition final updates tim # Spec # -------------------------------------------------------- -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_total_active_balance +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_total_active_balance func get_total_active_balance*(state: BeaconState): Gwei = # Return the combined effective balance of the active validators. # TODO it calls get_total_balance with set(g_a_v_i(...)) @@ -71,7 +71,7 @@ func get_total_active_balance*(state: BeaconState): Gwei = state, get_active_validator_indices(state, get_current_epoch(state))) -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#helper-functions-1 +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#helper-functions-1 func get_matching_source_attestations(state: BeaconState, epoch: Epoch): seq[PendingAttestation] = doAssert epoch in [get_current_epoch(state), get_previous_epoch(state)] @@ -140,11 +140,11 @@ proc process_justification_and_finalization*( ## matter -- in the next epoch, they'll be 2 epochs old, when BeaconState ## tracks current_epoch_attestations and previous_epoch_attestations only ## per - ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#attestations + ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#attestations ## and `get_matching_source_attestations(...)` via - ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#helper-functions-1 + ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#helper-functions-1 ## and - ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#final-updates + ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#final-updates ## after which the state.previous_epoch_attestations is replaced. trace "Non-attesting indices in previous epoch", missing_all_validators= @@ -167,7 +167,7 @@ proc process_justification_and_finalization*( root: get_block_root(state, previous_epoch)) state.justification_bits.setBit 1 - debug "Justified with previous epoch", + trace "Justified with previous epoch", current_epoch = current_epoch, checkpoint = shortLog(state.current_justified_checkpoint), cat = "justification" @@ -181,7 +181,7 @@ proc process_justification_and_finalization*( root: get_block_root(state, current_epoch)) state.justification_bits.setBit 0 - debug "Justified with current epoch", + trace "Justified with current epoch", current_epoch = current_epoch, checkpoint = shortLog(state.current_justified_checkpoint), cat = "justification" @@ -195,7 +195,7 @@ proc process_justification_and_finalization*( old_previous_justified_checkpoint.epoch + 3 == current_epoch: state.finalized_checkpoint = old_previous_justified_checkpoint - debug "Finalized with rule 234", + trace "Finalized with rule 234", current_epoch = current_epoch, checkpoint = shortLog(state.finalized_checkpoint), cat = "finalization" @@ -206,7 +206,7 @@ proc process_justification_and_finalization*( old_previous_justified_checkpoint.epoch + 2 == current_epoch: state.finalized_checkpoint = old_previous_justified_checkpoint - debug "Finalized with rule 23", + trace "Finalized with rule 23", current_epoch = current_epoch, checkpoint = shortLog(state.finalized_checkpoint), cat = "finalization" @@ -217,7 +217,7 @@ proc process_justification_and_finalization*( old_current_justified_checkpoint.epoch + 2 == current_epoch: state.finalized_checkpoint = old_current_justified_checkpoint - debug "Finalized with rule 123", + trace "Finalized with rule 123", current_epoch = current_epoch, checkpoint = shortLog(state.finalized_checkpoint), cat = "finalization" @@ -228,12 +228,12 @@ proc process_justification_and_finalization*( old_current_justified_checkpoint.epoch + 1 == current_epoch: state.finalized_checkpoint = old_current_justified_checkpoint - debug "Finalized with rule 12", + trace "Finalized with rule 12", current_epoch = current_epoch, checkpoint = shortLog(state.finalized_checkpoint), cat = "finalization" -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#rewards-and-penalties-1 +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#rewards-and-penalties-1 func get_base_reward(state: BeaconState, index: ValidatorIndex, total_balance: auto): Gwei = # Spec function recalculates total_balance every time, which creates an @@ -338,7 +338,7 @@ func get_attestation_deltas(state: BeaconState, stateCache: var StateCache): (rewards, penalties) -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#rewards-and-penalties-1 +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#rewards-and-penalties-1 func process_rewards_and_penalties( state: var BeaconState, cache: var StateCache) {.nbench.}= if get_current_epoch(state) == GENESIS_EPOCH: @@ -367,7 +367,7 @@ func process_slashings*(state: var BeaconState) {.nbench.}= let penalty = penalty_numerator div total_balance * increment decrease_balance(state, index.ValidatorIndex, penalty) -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#final-updates +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#final-updates func process_final_updates*(state: var BeaconState) {.nbench.}= let current_epoch = get_current_epoch(state) @@ -407,7 +407,7 @@ func process_final_updates*(state: var BeaconState) {.nbench.}= state.previous_epoch_attestations = state.current_epoch_attestations state.current_epoch_attestations = @[] -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#epoch-processing +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#epoch-processing proc process_epoch*(state: var BeaconState) {.nbench.}= # @proc are placeholders @@ -416,16 +416,16 @@ proc process_epoch*(state: var BeaconState) {.nbench.}= var per_epoch_cache = get_empty_per_epoch_cache() - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#justification-and-finalization + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#justification-and-finalization process_justification_and_finalization(state, per_epoch_cache) trace "ran process_justification_and_finalization", current_epoch = get_current_epoch(state) - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#rewards-and-penalties-1 + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#rewards-and-penalties-1 process_rewards_and_penalties(state, per_epoch_cache) - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#registry-updates + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#registry-updates # Don't rely on caching here. process_registry_updates(state) @@ -436,12 +436,12 @@ proc process_epoch*(state: var BeaconState) {.nbench.}= # @process_reveal_deadlines # @process_challenge_deadlines - # https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#slashings + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#slashings process_slashings(state) # @update_period_committee - # https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#final-updates + # https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#final-updates process_final_updates(state) # @after_process_final_updates diff --git a/beacon_chain/spec/state_transition_helpers.nim b/beacon_chain/spec/state_transition_helpers.nim index f8a339ed4..f6eb6c668 100644 --- a/beacon_chain/spec/state_transition_helpers.nim +++ b/beacon_chain/spec/state_transition_helpers.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -22,7 +22,7 @@ func shortLog*(x: Checkpoint): string = # Helpers used in epoch transition and trace-level block transition # -------------------------------------------------------- -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#helper-functions-1 +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#helper-functions-1 func get_attesting_indices*( state: BeaconState, attestations: openarray[PendingAttestation], stateCache: var StateCache): HashSet[ValidatorIndex] = @@ -32,7 +32,7 @@ func get_attesting_indices*( result = result.union(get_attesting_indices( state, a.data, a.aggregation_bits, stateCache)) -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#helper-functions-1 +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#helper-functions-1 func get_unslashed_attesting_indices*( state: BeaconState, attestations: openarray[PendingAttestation], stateCache: var StateCache): HashSet[ValidatorIndex] = diff --git a/beacon_chain/spec/validator.nim b/beacon_chain/spec/validator.nim index fcb48495b..03c33b789 100644 --- a/beacon_chain/spec/validator.nim +++ b/beacon_chain/spec/validator.nim @@ -1,4 +1,4 @@ -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -10,9 +10,8 @@ import options, nimcrypto, sequtils, math, tables, ./datatypes, ./digest, ./helpers -# TODO: Proceed to renaming and signature changes -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#compute_shuffled_index -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#compute_committee +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_shuffled_index +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_committee func get_shuffled_seq*(seed: Eth2Digest, list_size: uint64, ): seq[ValidatorIndex] = @@ -78,7 +77,7 @@ func get_shuffled_seq*(seed: Eth2Digest, result = shuffled_active_validator_indices -# https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/beacon-chain.md#get_previous_epoch +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_previous_epoch func get_previous_epoch*(state: BeaconState): Epoch = # Return the previous epoch (unless the current epoch is ``GENESIS_EPOCH``). let current_epoch = get_current_epoch(state) @@ -87,7 +86,7 @@ func get_previous_epoch*(state: BeaconState): Epoch = else: current_epoch - 1 -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.4/specs/core/0_beacon-chain.md#compute_committee +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_committee func compute_committee(indices: seq[ValidatorIndex], seed: Eth2Digest, index: uint64, count: uint64, stateCache: var StateCache): seq[ValidatorIndex] = ## Return the committee corresponding to ``indices``, ``seed``, ``index``, @@ -112,7 +111,7 @@ func compute_committee(indices: seq[ValidatorIndex], seed: Eth2Digest, start.int .. (endIdx.int-1), indices[stateCache.beacon_committee_cache[key][it]]) -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#get_beacon_committee +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_beacon_committee func get_beacon_committee*(state: BeaconState, slot: Slot, index: uint64, cache: var StateCache): seq[ValidatorIndex] = # Return the beacon committee at ``slot`` for ``index``. let @@ -146,7 +145,7 @@ func get_empty_per_epoch_cache*(): StateCache = initTable[Epoch, seq[ValidatorIndex]]() result.committee_count_cache = initTable[Epoch, uint64]() -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#compute_proposer_index +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#compute_proposer_index func compute_proposer_index(state: BeaconState, indices: seq[ValidatorIndex], seed: Eth2Digest, stateCache: var StateCache): Option[ValidatorIndex] = # Return from ``indices`` a random index sampled by effective balance. @@ -179,7 +178,7 @@ func compute_proposer_index(state: BeaconState, indices: seq[ValidatorIndex], return some(candidate_index) i += 1 -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#get_beacon_proposer_index +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#get_beacon_proposer_index func get_beacon_proposer_index*(state: BeaconState, stateCache: var StateCache): Option[ValidatorIndex] = # Return the beacon proposer index at the current slot. diff --git a/beacon_chain/ssz.nim b/beacon_chain/ssz.nim index 8daef8595..1834fbcc7 100644 --- a/beacon_chain/ssz.nim +++ b/beacon_chain/ssz.nim @@ -57,7 +57,7 @@ type FixedSizedWriterCtx = object - Bytes = seq[byte] + ByteList = seq[byte] serializationFormat SSZ, Reader = SszReader, @@ -102,7 +102,7 @@ template toSszType*(x: auto): auto = when x is Slot|Epoch|ValidatorIndex|enum: uint64(x) elif x is Eth2Digest: x.data elif x is BlsValue|BlsCurveType: getBytes(x) - elif x is BitSeq|BitList: Bytes(x) + elif x is BitSeq|BitList: ByteList(x) elif x is ref|ptr: toSszType x[] elif x is Option: toSszType x.get elif x is TypeWithMaxLen: toSszType valueOf(x) @@ -194,7 +194,7 @@ template writeField*(w: var SszWriter, let initPos = w.stream.pos trs "WRITING VAR SIZE VALUE OF TYPE ", name(FieldType) when FieldType is BitSeq: - trs "BIT SEQ ", Bytes(field) + trs "BIT SEQ ", ByteList(field) writeVarSizeType(w, toSszType(field)) ctx.offset += w.stream.pos - initPos @@ -458,8 +458,8 @@ func bitlistHashTreeRoot(merkelizer: SszChunksMerkelizer, x: BitSeq): Eth2Digest trs "CHUNKIFYING BIT SEQ WITH LIMIT ", merkelizer.limit var - totalBytes = Bytes(x).len - lastCorrectedByte = Bytes(x)[^1] + totalBytes = ByteList(x).len + lastCorrectedByte = ByteList(x)[^1] if lastCorrectedByte == byte(1): if totalBytes == 1: @@ -471,7 +471,7 @@ func bitlistHashTreeRoot(merkelizer: SszChunksMerkelizer, x: BitSeq): Eth2Digest getZeroHashWithoutSideEffect(0)) # this is the mixed length totalBytes -= 1 - lastCorrectedByte = Bytes(x)[^2] + lastCorrectedByte = ByteList(x)[^2] else: let markerPos = log2trunc(lastCorrectedByte) lastCorrectedByte.clearBit(markerPos) @@ -489,14 +489,14 @@ func bitlistHashTreeRoot(merkelizer: SszChunksMerkelizer, x: BitSeq): Eth2Digest chunkStartPos = i * bytesPerChunk chunkEndPos = chunkStartPos + bytesPerChunk - 1 - merkelizer.addChunk Bytes(x).toOpenArray(chunkEndPos, chunkEndPos) + merkelizer.addChunk ByteList(x).toOpenArray(chunkEndPos, chunkEndPos) var lastChunk: array[bytesPerChunk, byte] chunkStartPos = fullChunks * bytesPerChunk for i in 0 .. bytesInLastChunk - 2: - lastChunk[i] = Bytes(x)[chunkStartPos + i] + lastChunk[i] = ByteList(x)[chunkStartPos + i] lastChunk[bytesInLastChunk - 1] = lastCorrectedByte diff --git a/beacon_chain/state_transition.nim b/beacon_chain/state_transition.nim index fa1c97226..25f1b064e 100644 --- a/beacon_chain/state_transition.nim +++ b/beacon_chain/state_transition.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -44,7 +44,7 @@ declareGauge beacon_previous_validators, """Number of status="pending|active|exi # Canonical state transition functions # --------------------------------------------------------------- -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#beacon-chain-state-transition-function +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function func process_slot*(state: var BeaconState) {.nbench.}= # Cache state root let previous_state_root = hash_tree_root(state) @@ -81,7 +81,7 @@ func get_epoch_validator_count(state: BeaconState): int64 = validator.withdrawable_epoch > get_current_epoch(state): result += 1 -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#beacon-chain-state-transition-function +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function proc process_slots*(state: var BeaconState, slot: Slot) {.nbench.}= doAssert state.slot <= slot @@ -171,7 +171,7 @@ proc state_transition*( # Hashed-state transition functions # --------------------------------------------------------------- -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#beacon-chain-state-transition-function +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function func process_slot(state: var HashedBeaconState) = # Cache state root let previous_slot_state_root = state.root @@ -186,7 +186,7 @@ func process_slot(state: var HashedBeaconState) = state.data.block_roots[state.data.slot mod SLOTS_PER_HISTORICAL_ROOT] = hash_tree_root(state.data.latest_block_header) -# https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#beacon-chain-state-transition-function +# https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function proc process_slots*(state: var HashedBeaconState, slot: Slot) = # TODO: Eth specs strongly assert that state.data.slot <= slot # This prevents receiving attestation in any order diff --git a/beacon_chain/sync_protocol.nim b/beacon_chain/sync_protocol.nim index 1b9dbc704..bc58fa0e3 100644 --- a/beacon_chain/sync_protocol.nim +++ b/beacon_chain/sync_protocol.nim @@ -1,13 +1,10 @@ import options, tables, sets, macros, chronicles, chronos, metrics, stew/ranges/bitranges, - spec/[datatypes, crypto, digest, helpers], eth/rlp, + spec/[datatypes, crypto, digest, helpers], beacon_node_types, eth2_network, block_pool, ssz -when networkBackend == rlpx: - import eth/rlp/options as rlpOptions - template libp2pProtocol*(name: string, version: int) {.pragma.} -elif networkBackend == libp2p: +when networkBackend == libp2p: import libp2p/switch declarePublicGauge libp2p_peers, "Number of libp2p peers" diff --git a/beacon_chain/time.nim b/beacon_chain/time.nim index c77fa9225..105073740 100644 --- a/beacon_chain/time.nim +++ b/beacon_chain/time.nim @@ -14,7 +14,7 @@ type ## which blocks are valid - in particular, blocks are not valid if they ## come from the future as seen from the local clock. ## - ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.0/specs/phase0/fork-choice.md#fork-choice + ## https://github.com/ethereum/eth2.0-specs/blob/v0.10.1/specs/phase0/fork-choice.md#fork-choice ## # TODO replace time in chronos with a proper unit type, then this code can # follow: diff --git a/beacon_chain/version.nim b/beacon_chain/version.nim index 963408ead..17b0f1f4a 100644 --- a/beacon_chain/version.nim +++ b/beacon_chain/version.nim @@ -2,15 +2,13 @@ type NetworkBackendType* = enum libp2p libp2pDaemon - rlpx const NETWORK_TYPE {.strdefine.} = "libp2p_daemon" - networkBackend* = when NETWORK_TYPE == "rlpx": rlpx - elif NETWORK_TYPE == "libp2p": libp2p + networkBackend* = when NETWORK_TYPE == "libp2p": libp2p elif NETWORK_TYPE == "libp2p_daemon": libp2pDaemon - else: {.fatal: "The 'NETWORK_TYPE' should be either 'libp2p', 'libp2p_daemon' or 'rlpx'" .} + else: {.fatal: "The 'NETWORK_TYPE' should be either 'libp2p', 'libp2p_daemon'" .} const copyrights* = "Copyright (c) 2019 Status Research & Development GmbH" diff --git a/nbench/README.md b/nbench/README.md index 37814af74..080aedc31 100644 --- a/nbench/README.md +++ b/nbench/README.md @@ -24,7 +24,7 @@ Features ``` nim c -d:const_preset=mainnet -d:nbench -d:release -o:build/nbench nbench/nbench.nim -export SCENARIOS=tests/official/fixtures/tests-v0.9.4/mainnet/phase0 +export SCENARIOS=tests/official/fixtures/tests-v0.10.1/mainnet/phase0 # Full state transition build/nbench cmdFullStateTransition -d="${SCENARIOS}"/sanity/blocks/pyspec_tests/voluntary_exit/ -q=2 @@ -71,7 +71,7 @@ Furthermore benchmarks are run in parallel and might interfere which each other. ``` nim c -d:const_preset=mainnet -d:nbench -d:release -o:build/nbench nbench/nbench.nim nim c -o:build/nbench_tests nbench/nbench_official_fixtures.nim -build/nbench_tests --nbench=build/nbench --tests=tests/official/fixtures/tests-v0.9.4/mainnet/ +build/nbench_tests --nbench=build/nbench --tests=tests/official/fixtures/tests-v0.10.1/mainnet/ ``` ## TODO Reporting diff --git a/tests/official/fixtures b/tests/official/fixtures index 73e91fe1f..1359bab0a 160000 --- a/tests/official/fixtures +++ b/tests/official/fixtures @@ -1 +1 @@ -Subproject commit 73e91fe1f6abac428441105bd094c71dce182af4 +Subproject commit 1359bab0ae93cec24183e7ae8dd12be3b8275198 diff --git a/tests/official/fixtures_utils.nim b/tests/official/fixtures_utils.nim index d58e08dc6..8f58b3dcf 100644 --- a/tests/official/fixtures_utils.nim +++ b/tests/official/fixtures_utils.nim @@ -21,7 +21,7 @@ export # Workaround: serialization.readValue, Json, ssz -# Process current EF test format (up to 0.8.2+) +# Process current EF test format # --------------------------------------------- # ####################### @@ -36,7 +36,7 @@ proc readValue*(r: var JsonReader, a: var seq[byte]) {.inline.} = const FixturesDir* = currentSourcePath.rsplit(DirSep, 1)[0] / "fixtures" - SszTestsDir* = FixturesDir/"tests-v0.10.0" + SszTestsDir* = FixturesDir/"tests-v0.10.1" proc parseTest*(path: string, Format: typedesc[Json or SSZ], T: typedesc): T = try: diff --git a/tests/official/test_fixture_const_sanity_check.nim b/tests/official/test_fixture_const_sanity_check.nim index d6407cad3..c9d4b768b 100644 --- a/tests/official/test_fixture_const_sanity_check.nim +++ b/tests/official/test_fixture_const_sanity_check.nim @@ -20,7 +20,7 @@ const SpecDir = currentSourcePath.rsplit(DirSep, 1)[0] / ".."/".."/"beacon_chain"/"spec" FixturesDir = currentSourcePath.rsplit(DirSep, 1)[0] / "fixtures" - Config = FixturesDir/"tests-v0.10.0"/const_preset/"config.yaml" + Config = FixturesDir/"tests-v0.10.1"/const_preset/"config.yaml" type CheckedType = SomeInteger or Slot or Epoch @@ -122,5 +122,5 @@ proc checkConfig() = else: check: ConstsToCheck[constant] == value.getBiggestInt().uint64() -suite "Official - 0.10.0 - constants & config " & preset(): +suite "Official - 0.10.1 - constants & config " & preset(): checkConfig() diff --git a/tests/official/test_fixture_ssz_consensus_objects.nim b/tests/official/test_fixture_ssz_consensus_objects.nim index be2a60f16..9ae458910 100644 --- a/tests/official/test_fixture_ssz_consensus_objects.nim +++ b/tests/official/test_fixture_ssz_consensus_objects.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018-2019 Status Research & Development GmbH +# 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). @@ -26,7 +26,7 @@ import const FixturesDir = currentSourcePath.rsplit(DirSep, 1)[0] / "fixtures" - SSZDir = FixturesDir/"tests-v0.10.0"/const_preset/"phase0"/"ssz_static" + SSZDir = FixturesDir/"tests-v0.10.1"/const_preset/"phase0"/"ssz_static" type SSZHashTreeRoot = object @@ -104,5 +104,5 @@ proc runSSZtests() = else: raise newException(ValueError, "Unsupported test: " & sszType) -suite "Official - 0.10.0 - SSZ consensus objects " & preset(): +suite "Official - 0.10.1 - SSZ consensus objects " & preset(): runSSZtests() diff --git a/tests/official/test_fixture_ssz_generic_types.nim b/tests/official/test_fixture_ssz_generic_types.nim index a9b98b718..a6050cd39 100644 --- a/tests/official/test_fixture_ssz_generic_types.nim +++ b/tests/official/test_fixture_ssz_generic_types.nim @@ -1,5 +1,5 @@ # beacon_chain -# Copyright (c) 2018 Status Research & Development GmbH +# 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). @@ -23,7 +23,7 @@ import const FixturesDir = currentSourcePath.rsplit(DirSep, 1)[0] / "fixtures" - SSZDir = FixturesDir/"tests-v0.9.4"/"general"/"phase0"/"ssz_generic" + SSZDir = FixturesDir/"tests-v0.10.1"/"general"/"phase0"/"ssz_generic" type SSZHashTreeRoot = object @@ -278,5 +278,5 @@ proc runSSZtests() = # test "Testing " & name & " inputs (" & $T & ") - invalid": # const path = SSZDir/name/"invalid" -suite "Official - 0.9.4 - SSZ generic types": +suite "Official - SSZ generic types": runSSZtests() diff --git a/tests/simulation/run_node.sh b/tests/simulation/run_node.sh index c8a4d283b..4def0a452 100755 --- a/tests/simulation/run_node.sh +++ b/tests/simulation/run_node.sh @@ -47,7 +47,12 @@ fi rm -rf "$DATA_DIR/dump" mkdir -p "$DATA_DIR/dump" -$BEACON_NODE_BIN \ +NODE_BIN=$BEACON_NODE_BIN +if [[ $NODE_ID == $MASTER_NODE ]]; then + NODE_BIN=$BOOTSTRAP_NODE_BIN +fi + +$NODE_BIN \ --bootstrap-file=$BOOTSTRAP_ADDRESS_FILE \ --data-dir=$DATA_DIR \ --node-name=$NODE_ID \ diff --git a/tests/simulation/start.sh b/tests/simulation/start.sh index 7a59a3e74..7edcbbb7c 100755 --- a/tests/simulation/start.sh +++ b/tests/simulation/start.sh @@ -28,8 +28,22 @@ DEFS+="-d:SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-6} " # Spec default: 12 LAST_VALIDATOR_NUM=$(( NUM_VALIDATORS - 1 )) LAST_VALIDATOR="$VALIDATORS_DIR/v$(printf '%07d' $LAST_VALIDATOR_NUM).deposit.json" -echo "Building $BEACON_NODE_BIN ($DEFS)" -nim c -o:"$BEACON_NODE_BIN" $NIMFLAGS $DEFS beacon_chain/beacon_node +build_beacon_node () { + OUTPUT_BIN=$1; shift + PARAMS="$NIMFLAGS $DEFS $@" + echo "Building $OUTPUT_BIN ($PARAMS)" + nim c -o:$OUTPUT_BIN $PARAMS beacon_chain/beacon_node +} + +build_beacon_node $BEACON_NODE_BIN -d:"NETWORK_TYPE=$NETWORK_TYPE" + +if [[ "$BOOTSTRAP_NODE_NETWORK_TYPE" != "$NETWORK_TYPE" ]]; then + build_beacon_node $BOOTSTRAP_NODE_BIN \ + --nimcache:nimcache/bootstrap_node \ + -d:"NETWORK_TYPE=$BOOTSTRAP_NODE_NETWORK_TYPE" +else + cp $BEACON_NODE_BIN $BOOTSTRAP_NODE_BIN +fi if [ ! -f "${LAST_VALIDATOR}" ]; then echo Building $DEPLOY_DEPOSIT_CONTRACT_BIN @@ -65,10 +79,17 @@ if [ -f "${MASTER_NODE_ADDRESS_FILE}" ]; then rm "${MASTER_NODE_ADDRESS_FILE}" fi -# multitail support -MULTITAIL="${MULTITAIL:-multitail}" # to allow overriding the program name -USE_MULTITAIL="${USE_MULTITAIL:-no}" # make it an opt-in -type "$MULTITAIL" &>/dev/null || USE_MULTITAIL="no" +# to allow overriding the program names +MULTITAIL="${MULTITAIL:-multitail}" +TMUX="${TMUX:-tmux}" +TMUX_SESSION_NAME="${TMUX_SESSION_NAME:-nbc-network-sim}" + +# Using tmux or multitail is an opt-in +USE_MULTITAIL="${USE_MULTITAIL:-no}" +type "$MULTITAIL" &>/dev/null || { echo $MULTITAIL is missing; USE_MULTITAIL="no"; } + +USE_TMUX="${USE_TMUX:-no}" +type "$TMUX" &>/dev/null || { echo $TMUX is missing; USE_TMUX="no"; } # Prometheus config (continued inside the loop) mkdir -p "${METRICS_DIR}" @@ -103,6 +124,15 @@ fi COMMANDS=() +if [[ "$USE_TMUX" != "no" ]]; then + $TMUX new-session -s $TMUX_SESSION_NAME -d + + # maybe these should be moved to a user config file + $TMUX set-option -t $TMUX_SESSION_NAME history-limit 999999 + $TMUX set-option -t $TMUX_SESSION_NAME remain-on-exit on + $TMUX set -t $TMUX_SESSION_NAME mouse on +fi + for i in $(seq $MASTER_NODE -1 $TOTAL_USER_NODES); do if [[ "$i" != "$MASTER_NODE" && "$USE_MULTITAIL" == "no" ]]; then # Wait for the master node to write out its address file @@ -113,7 +143,10 @@ for i in $(seq $MASTER_NODE -1 $TOTAL_USER_NODES); do CMD="${SIM_ROOT}/run_node.sh $i" - if [[ "$USE_MULTITAIL" != "no" ]]; then + if [[ "$USE_TMUX" != "no" ]]; then + $TMUX split-window -t $TMUX_SESSION_NAME "$CMD" + $TMUX select-layout -t $TMUX_SESSION_NAME tiled + elif [[ "$USE_MULTITAIL" != "no" ]]; then if [[ "$i" == "$MASTER_NODE" ]]; then SLEEP="0" else @@ -133,7 +166,11 @@ for i in $(seq $MASTER_NODE -1 $TOTAL_USER_NODES); do EOF done -if [[ "$USE_MULTITAIL" != "no" ]]; then +if [[ "$USE_TMUX" != "no" ]]; then + $TMUX kill-pane -t $TMUX_SESSION_NAME:0.0 + $TMUX select-layout -t $TMUX_SESSION_NAME tiled + $TMUX attach-session -t $TMUX_SESSION_NAME -d +elif [[ "$USE_MULTITAIL" != "no" ]]; then eval $MULTITAIL -s 3 -M 0 -x \"Nimbus beacon chain\" "${COMMANDS[@]}" else wait # Stop when all nodes have gone down diff --git a/tests/simulation/vars.sh b/tests/simulation/vars.sh index 5fb061db7..cdaf2f9ee 100644 --- a/tests/simulation/vars.sh +++ b/tests/simulation/vars.sh @@ -25,12 +25,18 @@ TOTAL_USER_NODES=${USER_NODES:-0} TOTAL_SYSTEM_NODES=$(( TOTAL_NODES - TOTAL_USER_NODES )) MASTER_NODE=$(( TOTAL_NODES - 1 )) +# You can run a mixed simulation of daemon and native libp2p nodes +# by changing the variables below: +NETWORK_TYPE=libp2p +BOOTSTRAP_NODE_NETWORK_TYPE=libp2p + SIMULATION_DIR="${SIM_ROOT}/data" METRICS_DIR="${SIM_ROOT}/prometheus" VALIDATORS_DIR="${SIM_ROOT}/validators" SNAPSHOT_FILE="${SIMULATION_DIR}/state_snapshot.ssz" NETWORK_BOOTSTRAP_FILE="${SIMULATION_DIR}/bootstrap_nodes.txt" BEACON_NODE_BIN="${SIMULATION_DIR}/beacon_node" +BOOTSTRAP_NODE_BIN="${SIMULATION_DIR}/bootstrap_node" DEPLOY_DEPOSIT_CONTRACT_BIN="${SIMULATION_DIR}/deploy_deposit_contract" MASTER_NODE_ADDRESS_FILE="${SIMULATION_DIR}/node-${MASTER_NODE}/beacon_node.address" diff --git a/tests/test_block_pool.nim b/tests/test_block_pool.nim index be8dff840..3874431bf 100644 --- a/tests/test_block_pool.nim +++ b/tests/test_block_pool.nim @@ -221,3 +221,17 @@ when const_preset == "minimal": # Too much stack space used on mainnet pool.heads.len() == 1 pool.head.justified.slot.compute_epoch_at_slot() == 5 pool.tail.children.len == 1 + + let + pool2 = BlockPool.init(db) + + # check that the state reloaded from database resembles what we had before + check: + pool2.tail.root == pool.tail.root + pool2.head.blck.root == pool.head.blck.root + pool2.finalizedHead.blck.root == pool.finalizedHead.blck.root + pool2.finalizedHead.slot == pool.finalizedHead.slot + hash_tree_root(pool2.headState.data.data) == + hash_tree_root(pool.headState.data.data) + hash_tree_root(pool2.justifiedState.data.data) == + hash_tree_root(pool.justifiedState.data.data) diff --git a/tests/test_peer_connection.nim b/tests/test_peer_connection.nim index 90edf03b0..32ab23858 100644 --- a/tests/test_peer_connection.nim +++ b/tests/test_peer_connection.nim @@ -23,9 +23,8 @@ asyncTest "connect two nodes": echo "Node 1 persistent address: ", n1PersistentAddress - when networkBackend != rlpx: - var n1ActualAddress = await n1.daemon.identity() - echo "Node 1 actual address:", n1ActualAddress + var n1ActualAddress = await n1.daemon.identity() + echo "Node 1 actual address:", n1ActualAddress echo "Press any key to continue" discard stdin.readLine() diff --git a/vendor/nim-chronos b/vendor/nim-chronos index f02e748f1..74700fdca 160000 --- a/vendor/nim-chronos +++ b/vendor/nim-chronos @@ -1 +1 @@ -Subproject commit f02e748f18e0bc43ae6c68f92aa2c78323265bce +Subproject commit 74700fdcab9387843975650ed326937c4d59df9e diff --git a/vendor/nim-eth b/vendor/nim-eth index b7ebf8ed5..1756f7b41 160000 --- a/vendor/nim-eth +++ b/vendor/nim-eth @@ -1 +1 @@ -Subproject commit b7ebf8ed54c14884a63f185de1f38a25bc8fbcbc +Subproject commit 1756f7b41f738df1e5775ede635cd9a1e0fcd990 diff --git a/vendor/nim-nat-traversal b/vendor/nim-nat-traversal index bfc48eda5..2403c3392 160000 --- a/vendor/nim-nat-traversal +++ b/vendor/nim-nat-traversal @@ -1 +1 @@ -Subproject commit bfc48eda54a35b7c19cbb2994470655ad7a3bdd1 +Subproject commit 2403c33929c74f2d150f50dc8bc3a598af70661a diff --git a/vendor/nim-result b/vendor/nim-result deleted file mode 160000 index 5b15d5162..000000000 --- a/vendor/nim-result +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5b15d516265feac9470d78a88a0e1959ee22c21c diff --git a/vendor/nim-stew b/vendor/nim-stew index 1edeabb45..f5be0ab63 160000 --- a/vendor/nim-stew +++ b/vendor/nim-stew @@ -1 +1 @@ -Subproject commit 1edeabb453724aa452a940ab03ddc82f5aeeff6e +Subproject commit f5be0ab63a64c314e74223891a7651e2eaaa8fec