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