Simple validator onboarding

On your very first connection to each testnet, you'll be asked to
become a validator. Please consult our private repo for a Goerli
Eth1 private key that you can use for deposits.

Other changes:

* Added a simple wrapper ./connect-to-testnet script calling the
  nims file in the correct environment. No extension was used to
  make the command the same on Unix and Windows.

* Bumped a number of modules with fixes from this week

* `make testnet0` and `make testnet1` will no longer delete your
  existing database. This is considered a more appropriate behavior
  for testing forward sync.
This commit is contained in:
Zahary Karadjov 2019-12-03 01:27:59 +02:00 committed by zah
parent 94f9658e7b
commit ee2448b221
11 changed files with 65 additions and 17 deletions

View File

@ -70,10 +70,10 @@ clean_eth2_network_simulation_files:
eth2_network_simulation: | build deps p2pd clean_eth2_network_simulation_files process_dashboard
GIT_ROOT="$$PWD" tests/simulation/start.sh
testnet0: | build deps clean-testnet0
testnet0: | build deps
+ $(MAKE) testnet0-no-clean
testnet1: | build deps clean-testnet1
testnet1: | build deps
+ $(MAKE) testnet1-no-clean
clean-testnet0:

View File

@ -97,10 +97,9 @@ Once the [prerequisites](#prerequisites) are installed you can connect to testne
```bash
git clone https://github.com/status-im/nim-beacon-chain
cd nim-beacon-chain
make # This invocation will just download all Nimbus dependencies
make # The second invocation will compile the Nim compiler and Nimbus
source env.sh
nim scripts/connect_to_testnet.nims nimbus/testnet0
make # This invocation will bootstrap the build system with additional Makefiles
make update deps # This will build Nim and all other dependencies
./connect-to-testnet testnet0
```
The testnets are restarted once per week, usually on Monday evenings (UTC)) and integrate the changes for the past week.

View File

@ -288,7 +288,12 @@ proc addLocalValidators(node: BeaconNode, state: BeaconState) =
for kind, file in walkDir(node.config.localValidatorsDir):
if kind in {pcFile, pcLinkToFile}:
node.addLocalValidator state, ValidatorPrivKey.init(readFile(file).string)
if cmpIgnoreCase(".privkey", splitFile(file).ext) == 0:
try:
let keyText = ValidatorPrivKey.init(readFile(file).string)
node.addLocalValidator state, keyText
except CatchableError:
warn "Failed to load a validator private key", file
info "Local validators attached ", count = node.attachedValidators.count
@ -1138,6 +1143,10 @@ when isMainModule:
firstIdx = config.totalQuickstartDeposits)
if config.depositWeb3Url.len > 0 and config.depositContractAddress.len > 0:
info "Sending deposits",
web3 = config.depositWeb3Url,
depositContract = config.depositContractAddress
waitFor sendDeposits(
quickstartDeposits & randomDeposits,
config.depositWeb3Url,

View File

@ -52,16 +52,19 @@ proc generateDeposits*(totalValidators: int,
proc sendDeposits*(
deposits: seq[Deposit],
depositWeb3Url, depositContractAddress, privateKey: string) {.async.} =
let
web3 = await newWeb3(depositWeb3Url)
contractAddress = Address.fromHex(depositContractAddress)
eth1Addresses = await web3.provider.eth_accounts()
var web3 = await newWeb3(depositWeb3Url)
if privateKey.len != 0:
web3.privateKey = initPrivateKey(privateKey)
let eth1Addresses = await web3.provider.eth_accounts()
if eth1Addresses.len == 0:
error "Eth1 account rejected"
return
let contractAddress = Address.fromHex(depositContractAddress)
for i, dp in deposits:
web3.defaultAccount = eth1Addresses[i]
web3.defaultAccount = eth1Addresses[0]
let depositContract = web3.contractSender(DepositContract, contractAddress)
discard await depositContract.deposit(
Bytes48(dp.data.pubKey.getBytes()),

5
connect-to-testnet Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
cd $(dirname "$0")
./env.sh nim scripts/connect_to_testnet.nims $1

6
connect-to-testnet.cmd Normal file
View File

@ -0,0 +1,6 @@
@echo off
cd /D "%~dp0"
vendor/nimbus-build-system/vendor/Nim/bin/nim scripts/connect_to_testnet.nims %1

View File

@ -55,6 +55,7 @@ cli do (testnetName {.argument.}: string):
let
dataDirName = testnetName.replace("/", "_")
dataDir = buildDir / "data" / dataDirName
validatorsDir = dataDir / "validators"
beaconNodeBinary = buildDir / "beacon_node_" & dataDirName
nimFlags = "-d:chronicles_log_level=DEBUG " & getEnv("NIM_PARAMS")
@ -73,6 +74,31 @@ cli do (testnetName {.argument.}: string):
cd rootDir
exec &"""nim c {nimFlags} -d:"const_preset={preset}" -o:"{beaconNodeBinary}" beacon_chain/beacon_node.nim"""
if depositContractOpt.len > 0 and not system.dirExists(validatorsDir):
mode = Silent
echo "Would you like to become a validator (you'll need access to 32 GoETH)? [Yn]"
while true:
let answer = readLineFromStdin()
if answer in ["y", "Y", "yes", ""]:
echo "Please enter your Eth1 private key in hex form (e.g. 0x1a2...f3c). Hit Enter to cancel."
let privKey = readLineFromStdin()
if privKey.len > 0:
mkDir validatorsDir
exec replace(&"""{beaconNodeBinary} makeDeposits
--random-deposits=1
--deposits-dir="{validatorsDir}"
--deposit-private-key={privKey}
--web3-url=wss://goerli.infura.io/ws/v3/809a18497dd74102b5f37d25aae3c85a
{depositContractOpt}
""", "\n", " ")
break
elif answer in ["n", "N", "no"]:
break
else:
echo "Please answer 'yes' or 'no'"
mode = Verbose
exec replace(&"""{beaconNodeBinary}
--data-dir="{dataDir}"
--bootstrap-file="{testnetDir/bootstrapFile}"

2
vendor/nim-chronos vendored

@ -1 +1 @@
Subproject commit 2518a4161f723405004c3e2a743fa08ec67404dc
Subproject commit c39c0696806a0ef09bc90e477ea6b177d2824699

@ -1 +1 @@
Subproject commit 7a607bfd3d83be86f153517636370b76f3d7cf25
Subproject commit 0bdfb3786cad3a1c045934a1d003dedd3498074d

2
vendor/nim-eth vendored

@ -1 +1 @@
Subproject commit a54fdc8073be75e1e7f3273fc7382b580d6a8339
Subproject commit 4976bd9fb95c36df3688867a4e2fe7bbfed8f966

2
vendor/nim-libp2p vendored

@ -1 +1 @@
Subproject commit f3fc763895986e96d53349e0696c897303104765
Subproject commit f9eed172d4a61f142e596f891f371ecf7c21b415