Integrate Witti testnet (#1193)

* Update for latest master

* Shift delay inside loop

* Clean up genesis service

* Tidy

* Tidy logs

* Address Michael's comments

* Add pre-genesis logging

* Remove est time till genesis

* Fix time formatting

* Tidy

* Update docs for Witti

* Update JS for Witti

* Ensure deposit data is 0x-prefixed hex

* Hard code witti testnet dir

* Add --auto-register warning

* Integrate local sigp testnet source

* Reword warning
This commit is contained in:
Paul Hauner 2020-05-26 15:31:41 +10:00 committed by GitHub
parent 9718c5db07
commit ad4e5adabc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 50 additions and 28 deletions

1
Cargo.lock generated
View File

@ -5409,6 +5409,7 @@ dependencies = [
"deposit_contract",
"eth2_keystore",
"eth2_wallet",
"hex 0.4.2",
"rand 0.7.3",
"rayon",
"tempfile",

View File

@ -1,20 +1,10 @@
# Become an Ethereum 2.0 Testnet Validator
# Become an Ethereum 2.0 Testnet Validator on Witti
---
Running a Lighthouse validator on the [Witti](https://github.com/goerli/witti)
multi-client testnet is easy if you're familiar with the terminal.
**The Schlesi testnet is currently down.**
Please do not submit any deposits. For updates, see:
- The Lighthouse ["announcements"](https://discord.gg/cE3GEy) Discord channel.
- The Eth R&D ["Schlesi"](https://discord.gg/GQwzr7) Discord channel.
- [goerli/witti](https://github.com/goerli/witti) for technical information.
---
Running a Lighthouse validator is easy if you're familiar with the terminal.
Lighthouse runs on Linux, MacOS and Windows and has a Docker work-flow to make things as simple as possible.
Lighthouse runs on Linux, MacOS and Windows and has a Docker work-flow to make
things as simple as possible.
## 0. Acquire Goerli ETH

View File

@ -1,6 +1,6 @@
const NETWORK = "5";
const NETWORK_NAME = "Goerli Test Network";
const DEPOSIT_CONTRACT = "0xA15554BF93a052669B511ae29EA21f3581677ac5";
const DEPOSIT_CONTRACT = "0x42cc0FcEB02015F145105Cf6f19F90e9BEa76558";
const DEPOSIT_AMOUNT_ETH = "32";
const GAS_LIMIT = "4000000";
const DEPOSIT_DATA_BYTES = 420;

View File

@ -1,2 +1,3 @@
testnet*
schlesi-*
witti-*

View File

@ -6,7 +6,7 @@ use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
const TESTNET_ID: &str = "schlesi-v0-11";
const TESTNET_ID: &str = "witti-v0-11-3";
fn main() {
if !base_dir().exists() {
@ -38,7 +38,7 @@ pub fn get_all_files() -> Result<(), String> {
pub fn get_file(filename: &str) -> Result<(), String> {
let url = format!(
"https://raw.githubusercontent.com/goerli/schlesi/839866fe29a1b4df3a87bfe2ff1257c8a58671c9/light/{}",
"https://raw.githubusercontent.com/sigp/witti/6d079b0f10f6bed75cd003e5f0ea5ecbe2044455/lighthouse/{}",
filename
);

View File

@ -20,14 +20,14 @@ pub const BOOT_ENR_FILE: &str = "boot_enr.yaml";
pub const GENESIS_STATE_FILE: &str = "genesis.ssz";
pub const YAML_CONFIG_FILE: &str = "config.yaml";
pub const HARDCODED_TESTNET: &str = "schlesi-v0-11";
pub const HARDCODED_TESTNET: &str = "witti-v0-11-3";
pub const HARDCODED_YAML_CONFIG: &[u8] = include_bytes!("../schlesi-v0-11/config.yaml");
pub const HARDCODED_DEPLOY_BLOCK: &[u8] = include_bytes!("../schlesi-v0-11/deploy_block.txt");
pub const HARDCODED_YAML_CONFIG: &[u8] = include_bytes!("../witti-v0-11-3/config.yaml");
pub const HARDCODED_DEPLOY_BLOCK: &[u8] = include_bytes!("../witti-v0-11-3/deploy_block.txt");
pub const HARDCODED_DEPOSIT_CONTRACT: &[u8] =
include_bytes!("../schlesi-v0-11/deposit_contract.txt");
pub const HARDCODED_GENESIS_STATE: &[u8] = include_bytes!("../schlesi-v0-11/genesis.ssz");
pub const HARDCODED_BOOT_ENR: &[u8] = include_bytes!("../schlesi-v0-11/boot_enr.yaml");
include_bytes!("../witti-v0-11-3/deposit_contract.txt");
pub const HARDCODED_GENESIS_STATE: &[u8] = include_bytes!("../witti-v0-11-3/genesis.ssz");
pub const HARDCODED_BOOT_ENR: &[u8] = include_bytes!("../witti-v0-11-3/boot_enr.yaml");
/// Specifies an Eth2 testnet.
///

View File

@ -19,6 +19,7 @@ rand = "0.7.2"
deposit_contract = { path = "../deposit_contract" }
rayon = "1.3.0"
tree_hash = { path = "../../consensus/tree_hash" }
hex = "0.4.2"
[dev-dependencies]
tempfile = "3.1.0"

View File

@ -175,13 +175,14 @@ impl<'a> Builder<'a> {
if path.exists() {
return Err(Error::DepositDataAlreadyExists(path));
} else {
let hex = format!("0x{}", hex::encode(&deposit_data));
OpenOptions::new()
.write(true)
.read(true)
.create(true)
.open(path.clone())
.map_err(Error::UnableToSaveDepositData)?
.write_all(&deposit_data)
.write_all(hex.as_bytes())
.map_err(Error::UnableToSaveDepositData)?
}

View File

@ -27,6 +27,9 @@ pub enum Error {
UnableToReadPassword(PathBuf),
UnableToDecryptKeypair(KeystoreError),
UnableToReadDepositData(io::Error),
DepositDataMissing0xPrefix,
DepositDataNotUtf8,
DepositDataInvalidHex(hex::FromHexError),
DepositAmountDoesNotExist(PathBuf),
UnableToReadDepositAmount(io::Error),
UnableToParseDepositAmount(std::num::ParseIntError),
@ -160,7 +163,16 @@ impl ValidatorDir {
if !path.exists() {
return Ok(None);
}
let deposit_data_rlp = read(path).map_err(Error::UnableToReadDepositData)?;
let deposit_data_rlp = read(path)
.map_err(Error::UnableToReadDepositData)
.and_then(|hex_bytes| {
let hex = std::str::from_utf8(&hex_bytes).map_err(|_| Error::DepositDataNotUtf8)?;
if hex.starts_with("0x") {
hex::decode(&hex[2..]).map_err(Error::DepositDataInvalidHex)
} else {
Err(Error::DepositDataMissing0xPrefix)
}
})?;
// Read and parse `ETH1_DEPOSIT_AMOUNT_FILE`.
let path = self.dir.join(ETH1_DEPOSIT_AMOUNT_FILE);

View File

@ -6,7 +6,7 @@ use std::path::Path;
use tempfile::{tempdir, TempDir};
use types::{test_utils::generate_deterministic_keypair, EthSpec, Keypair, MainnetEthSpec};
use validator_dir::{
Builder, ValidatorDir, ETH1_DEPOSIT_TX_HASH_FILE, VOTING_KEYSTORE_FILE,
Builder, ValidatorDir, ETH1_DEPOSIT_DATA_FILE, ETH1_DEPOSIT_TX_HASH_FILE, VOTING_KEYSTORE_FILE,
WITHDRAWAL_KEYSTORE_FILE,
};
@ -145,6 +145,13 @@ impl Harness {
// Ensure the amount is consistent.
assert_eq!(data.deposit_data.amount, amount);
// Check that the eth1 deposit data file is a valid format.
let hex =
String::from_utf8(fs::read(validator.dir().join(ETH1_DEPOSIT_DATA_FILE)).unwrap())
.unwrap();
assert!(hex.starts_with("0x"), "deposit data should have 0x prefix");
hex::decode(&hex[2..]).unwrap();
} else {
// If there was no deposit then we should return `Ok(None)`.
assert!(validator.eth1_deposit_data().unwrap().is_none());

View File

@ -14,13 +14,14 @@ pub use config::Config;
use attestation_service::{AttestationService, AttestationServiceBuilder};
use block_service::{BlockService, BlockServiceBuilder};
use clap::ArgMatches;
use config::SLASHING_PROTECTION_FILENAME;
use duties_service::{DutiesService, DutiesServiceBuilder};
use environment::RuntimeContext;
use exit_future::Signal;
use fork_service::{ForkService, ForkServiceBuilder};
use notifier::spawn_notifier;
use remote_beacon_node::RemoteBeaconNode;
use slog::{error, info, Logger};
use slog::{error, info, warn, Logger};
use slot_clock::SlotClock;
use slot_clock::SystemTimeSlotClock;
use std::time::{SystemTime, UNIX_EPOCH};
@ -71,6 +72,14 @@ impl<T: EthSpec> ProductionValidatorClient<T> {
"datadir" => format!("{:?}", config.data_dir),
);
if !config.data_dir.join(SLASHING_PROTECTION_FILENAME).exists() && !config.auto_register {
warn!(
log_1,
"Will not register any validators";
"msg" => "strongly consider using --auto-register on the first use",
);
}
let beacon_node =
RemoteBeaconNode::new_with_timeout(config.http_server.clone(), HTTP_TIMEOUT)
.map_err(|e| format!("Unable to init beacon node http client: {}", e))?;