mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-06 02:01:40 +00:00
Anchor currently depends on `lighthouse_network` for a few types and utilities that live within. As we use our own libp2p behaviours, we actually do not use the core logic in that crate. This makes us transitively depend on a bunch of unneeded crates (even a whole separate libp2p if the versions mismatch!) Move things we require into it's own lightweight crate. Co-Authored-By: Daniel Knopik <daniel@dknopik.de>
125 lines
4.1 KiB
Rust
125 lines
4.1 KiB
Rust
use crate::build_utils;
|
|
use crate::execution_engine::GenericExecutionEngine;
|
|
use crate::genesis_json::geth_genesis_json;
|
|
use network_utils::unused_port::unused_tcp4_port;
|
|
use std::path::{Path, PathBuf};
|
|
use std::process::{Child, Command, Output};
|
|
use std::{env, fs};
|
|
use tempfile::TempDir;
|
|
|
|
const GETH_BRANCH: &str = "master";
|
|
const GETH_REPO_URL: &str = "https://github.com/ethereum/go-ethereum";
|
|
|
|
pub fn build_result(repo_dir: &Path) -> Output {
|
|
Command::new("make")
|
|
.arg("geth")
|
|
.current_dir(repo_dir)
|
|
// Geth now uses the commit hash from a GitHub runner environment variable if it detects a CI environment.
|
|
// We need to override this to successfully build Geth in Lighthouse workflows.
|
|
// See: https://github.com/ethereum/go-ethereum/blob/668c3a7278af399c0e776e92f1c721b5158388f2/internal/build/env.go#L95-L121
|
|
.env("CI", "false")
|
|
.output()
|
|
.expect("failed to make geth")
|
|
}
|
|
|
|
pub fn build(execution_clients_dir: &Path) {
|
|
let repo_dir = execution_clients_dir.join("go-ethereum");
|
|
|
|
if !repo_dir.exists() {
|
|
// Clone the repo
|
|
build_utils::clone_repo(execution_clients_dir, GETH_REPO_URL).unwrap();
|
|
}
|
|
|
|
// Get the latest tag on the branch
|
|
let last_release = build_utils::get_latest_release(&repo_dir, GETH_BRANCH).unwrap();
|
|
build_utils::checkout(&repo_dir, dbg!(&last_release)).unwrap();
|
|
|
|
// Build geth
|
|
build_utils::check_command_output(build_result(&repo_dir), || {
|
|
format!("geth make failed using release {last_release}")
|
|
});
|
|
}
|
|
|
|
pub fn clean(execution_clients_dir: &Path) {
|
|
let repo_dir = execution_clients_dir.join("go-ethereum");
|
|
if let Err(e) = fs::remove_dir_all(repo_dir) {
|
|
eprintln!("Error while deleting folder: {}", e);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Geth-specific Implementation for GenericExecutionEngine
|
|
*/
|
|
|
|
#[derive(Clone)]
|
|
pub struct GethEngine;
|
|
|
|
impl GethEngine {
|
|
fn binary_path() -> PathBuf {
|
|
let manifest_dir: PathBuf = env::var("CARGO_MANIFEST_DIR").unwrap().into();
|
|
manifest_dir
|
|
.join("execution_clients")
|
|
.join("go-ethereum")
|
|
.join("build")
|
|
.join("bin")
|
|
.join("geth")
|
|
}
|
|
}
|
|
|
|
impl GenericExecutionEngine for GethEngine {
|
|
fn init_datadir() -> TempDir {
|
|
let datadir = TempDir::new().unwrap();
|
|
|
|
let genesis_json_path = datadir.path().join("genesis.json");
|
|
let mut file = fs::File::create(&genesis_json_path).unwrap();
|
|
let json = geth_genesis_json();
|
|
serde_json::to_writer(&mut file, &json).unwrap();
|
|
|
|
let output = Command::new(Self::binary_path())
|
|
.arg("--datadir")
|
|
.arg(datadir.path().to_str().unwrap())
|
|
.arg("init")
|
|
.arg(genesis_json_path.to_str().unwrap())
|
|
.output()
|
|
.expect("failed to init geth");
|
|
|
|
build_utils::check_command_output(output, || "geth init failed".into());
|
|
|
|
datadir
|
|
}
|
|
|
|
fn start_client(
|
|
datadir: &TempDir,
|
|
http_port: u16,
|
|
http_auth_port: u16,
|
|
jwt_secret_path: PathBuf,
|
|
) -> Child {
|
|
let network_port = unused_tcp4_port().unwrap();
|
|
|
|
Command::new(Self::binary_path())
|
|
.arg("--datadir")
|
|
.arg(datadir.path().to_str().unwrap())
|
|
.arg("--http")
|
|
.arg("--http.api")
|
|
.arg("engine,eth")
|
|
.arg("--http.port")
|
|
.arg(http_port.to_string())
|
|
.arg("--authrpc.port")
|
|
.arg(http_auth_port.to_string())
|
|
.arg("--port")
|
|
.arg(network_port.to_string())
|
|
.arg("--allow-insecure-unlock")
|
|
.arg("--authrpc.jwtsecret")
|
|
.arg(jwt_secret_path.as_path().to_str().unwrap())
|
|
// This flag is required to help Geth perform reliably when feeding it blocks
|
|
// one-by-one. For more information, see:
|
|
//
|
|
// https://github.com/sigp/lighthouse/pull/3382#issuecomment-1197680345
|
|
.arg("--syncmode=full")
|
|
.stdout(build_utils::build_stdio())
|
|
.stderr(build_utils::build_stdio())
|
|
.spawn()
|
|
.expect("failed to start geth")
|
|
}
|
|
}
|