Address some TODO items; Handle start-up before genesis more properly
This commit is contained in:
parent
c773e10c1a
commit
cf6a869e9e
|
@ -31,6 +31,7 @@ import
|
|||
|
||||
const
|
||||
genesisFile* = "genesis.ssz"
|
||||
timeToInitNetworkingBeforeGenesis = chronos.seconds(10)
|
||||
hasPrompt = not defined(withoutPrompt)
|
||||
|
||||
type
|
||||
|
@ -145,7 +146,7 @@ proc init*(T: type BeaconNode, conf: BeaconNodeConf): Future[BeaconNode] {.async
|
|||
if genesisState.isNil:
|
||||
# Didn't work, try creating a genesis state using main chain monitor
|
||||
# TODO Could move this to a separate "GenesisMonitor" process or task
|
||||
# that would do only this - see
|
||||
# that would do only this - see Paul's proposal for this.
|
||||
if conf.web3Url.len > 0 and conf.depositContractAddress.len > 0:
|
||||
mainchainMonitor = MainchainMonitor.init(
|
||||
web3Provider(conf.web3Url),
|
||||
|
@ -226,8 +227,10 @@ proc init*(T: type BeaconNode, conf: BeaconNodeConf): Future[BeaconNode] {.async
|
|||
topicAggregateAndProofs: topicAggregateAndProofs,
|
||||
)
|
||||
|
||||
# TODO sync is called when a remote peer is connected - is that the right
|
||||
# time to do so?
|
||||
traceAsyncErrors res.addLocalValidators()
|
||||
|
||||
# This merely configures the BeaconSync
|
||||
# The traffic will be started when we join the network.
|
||||
network.initBeaconSync(blockPool, enrForkId.forkDigest,
|
||||
proc(signedBlock: SignedBeaconBlock) =
|
||||
if signedBlock.message.slot.isEpoch:
|
||||
|
@ -251,9 +254,6 @@ proc init*(T: type BeaconNode, conf: BeaconNodeConf): Future[BeaconNode] {.async
|
|||
|
||||
return res
|
||||
|
||||
proc connectToNetwork(node: BeaconNode) {.async.} =
|
||||
await node.network.connectToNetwork()
|
||||
|
||||
proc onAttestation(node: BeaconNode, attestation: Attestation) =
|
||||
# We received an attestation from the network but don't know much about it
|
||||
# yet - in particular, we haven't verified that it belongs to particular chain
|
||||
|
@ -807,15 +807,25 @@ proc createPidFile(filename: string) =
|
|||
gPidFile = filename
|
||||
addQuitProc proc {.noconv.} = removeFile gPidFile
|
||||
|
||||
proc initializeNetworking(node: BeaconNode) {.async.} =
|
||||
node.network.startListening()
|
||||
|
||||
let addressFile = node.config.dataDir / "beacon_node.address"
|
||||
writeFile(addressFile, node.network.announcedENR.toURI)
|
||||
|
||||
await node.network.startLookingForPeers()
|
||||
|
||||
proc start(node: BeaconNode) =
|
||||
# TODO: while it's nice to cheat by waiting for connections here, we
|
||||
# actually need to make this part of normal application flow -
|
||||
# losing all connections might happen at any time and we should be
|
||||
# prepared to handle it.
|
||||
let
|
||||
head = node.blockPool.head
|
||||
finalizedHead = node.blockPool.finalizedHead
|
||||
|
||||
let genesisTime = node.beaconClock.fromNow(toBeaconTime(Slot 0))
|
||||
|
||||
if genesisTime.inFuture and genesisTime.offset > timeToInitNetworkingBeforeGenesis:
|
||||
info "Waiting for the genesis event", genesisIn = genesisTime.offset
|
||||
waitFor sleepAsync(genesisTime.offset - timeToInitNetworkingBeforeGenesis)
|
||||
|
||||
info "Starting beacon node",
|
||||
version = fullVersionStr,
|
||||
timeSinceFinalization =
|
||||
|
@ -832,21 +842,7 @@ proc start(node: BeaconNode) =
|
|||
cat = "init",
|
||||
pcs = "start_beacon_node"
|
||||
|
||||
node.network.startListening()
|
||||
let addressFile = node.config.dataDir / "beacon_node.address"
|
||||
writeFile(addressFile, node.network.announcedENR.toURI)
|
||||
|
||||
let bs = BlockSlot(blck: head.blck, slot: head.blck.slot)
|
||||
|
||||
node.blockPool.withState(node.blockPool.tmpState, bs):
|
||||
for validatorKey in node.config.validatorKeys:
|
||||
node.addLocalValidator state, validatorKey
|
||||
# Allow some network events to be processed:
|
||||
waitFor sleepAsync(1)
|
||||
|
||||
info "Local validators attached ", count = node.attachedValidators.count
|
||||
|
||||
waitFor node.network.connectToNetwork()
|
||||
waitFor node.initializeNetworking()
|
||||
node.run()
|
||||
|
||||
func formatGwei(amount: uint64): string =
|
||||
|
|
|
@ -1115,7 +1115,7 @@ proc announcedENR*(node: Eth2Node): enr.Record =
|
|||
proc shortForm*(id: KeyPair): string =
|
||||
$PeerID.init(id.pubkey)
|
||||
|
||||
proc connectToNetwork*(node: Eth2Node) {.async.} =
|
||||
proc startLookingForPeers*(node: Eth2Node) {.async.} =
|
||||
await node.start()
|
||||
|
||||
proc checkIfConnectedToBootstrapNode {.async.} =
|
||||
|
@ -1125,9 +1125,7 @@ proc connectToNetwork*(node: Eth2Node) {.async.} =
|
|||
bootstrapEnrs = node.discovery.bootstrapRecords
|
||||
quit 1
|
||||
|
||||
# TODO: The initial sync forces this to time out.
|
||||
# Revisit when the new Sync manager is integrated.
|
||||
# traceAsyncErrors checkIfConnectedToBootstrapNode()
|
||||
traceAsyncErrors checkIfConnectedToBootstrapNode()
|
||||
|
||||
func peersCount*(node: Eth2Node): int =
|
||||
len(node.peerPool)
|
||||
|
|
|
@ -41,8 +41,8 @@ proc saveValidatorKey*(keyName, key: string, conf: BeaconNodeConf) =
|
|||
info "Imported validator key", file = outputFile
|
||||
|
||||
proc addLocalValidator*(node: BeaconNode,
|
||||
state: BeaconState,
|
||||
privKey: ValidatorPrivKey) =
|
||||
state: BeaconState,
|
||||
privKey: ValidatorPrivKey) =
|
||||
let pubKey = privKey.toPubKey()
|
||||
|
||||
let idx = state.validators.asSeq.findIt(it.pubKey == pubKey)
|
||||
|
@ -53,9 +53,22 @@ proc addLocalValidator*(node: BeaconNode,
|
|||
|
||||
node.attachedValidators.addLocalValidator(pubKey, privKey)
|
||||
|
||||
proc addLocalValidators*(node: BeaconNode) {.async.} =
|
||||
let
|
||||
head = node.blockPool.head
|
||||
bs = BlockSlot(blck: head.blck, slot: head.blck.slot)
|
||||
|
||||
node.blockPool.withState(node.blockPool.tmpState, bs):
|
||||
for validatorKey in node.config.validatorKeys:
|
||||
node.addLocalValidator state, validatorKey
|
||||
# Allow some network events to be processed:
|
||||
await sleepAsync(0.seconds)
|
||||
|
||||
info "Local validators attached ", count = node.attachedValidators.count
|
||||
|
||||
func getAttachedValidator*(node: BeaconNode,
|
||||
state: BeaconState,
|
||||
idx: ValidatorIndex): AttachedValidator =
|
||||
state: BeaconState,
|
||||
idx: ValidatorIndex): AttachedValidator =
|
||||
let validatorKey = state.validators[idx].pubkey
|
||||
node.attachedValidators.getValidator(validatorKey)
|
||||
|
||||
|
|
|
@ -36,5 +36,5 @@ asyncTest "connect two nodes":
|
|||
c2.nat = "none"
|
||||
var n2 = await createEth2Node(c2, ENRForkID())
|
||||
|
||||
await n2.connectToNetwork(@[n1PersistentAddress])
|
||||
await n2.startLookingForPeers(@[n1PersistentAddress])
|
||||
|
||||
|
|
Loading…
Reference in New Issue