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:
parent
9718c5db07
commit
ad4e5adabc
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -5409,6 +5409,7 @@ dependencies = [
|
||||
"deposit_contract",
|
||||
"eth2_keystore",
|
||||
"eth2_wallet",
|
||||
"hex 0.4.2",
|
||||
"rand 0.7.3",
|
||||
"rayon",
|
||||
"tempfile",
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
1
common/eth2_testnet_config/.gitignore
vendored
1
common/eth2_testnet_config/.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
testnet*
|
||||
schlesi-*
|
||||
witti-*
|
||||
|
@ -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
|
||||
);
|
||||
|
||||
|
@ -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.
|
||||
///
|
||||
|
@ -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"
|
||||
|
@ -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)?
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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))?;
|
||||
|
Loading…
Reference in New Issue
Block a user