Skip to main content

tempo_xtask/
generate_genesis.rs

1use std::path::PathBuf;
2
3use eyre::WrapErr as _;
4
5use crate::genesis_args::GenesisArgs;
6
7#[derive(clap::Parser, Debug)]
8pub(crate) struct GenerateGenesis {
9    /// Output file path
10    #[arg(short, long)]
11    output: PathBuf,
12
13    #[clap(flatten)]
14    genesis_args: GenesisArgs,
15}
16
17impl GenerateGenesis {
18    pub(crate) async fn run(self) -> eyre::Result<()> {
19        let Self {
20            output,
21            genesis_args,
22        } = self;
23        let (genesis, consensus_config) = genesis_args
24            .generate_genesis()
25            .await
26            .wrap_err("failed generating genesis")?;
27
28        let json =
29            serde_json::to_string_pretty(&genesis).wrap_err("failed encoding genesis as JSON")?;
30
31        std::fs::create_dir_all(&output).wrap_err_with(|| {
32            format!(
33                "failed to create directory and parents for `{}`",
34                output.display()
35            )
36        })?;
37        let genesis_dst = output.join("genesis.json");
38        std::fs::write(&genesis_dst, json).wrap_err_with(|| {
39            format!("failed writing genesis to file `{}`", genesis_dst.display())
40        })?;
41
42        if let Some(consensus_config) = consensus_config {
43            println!(
44                "consensus config generated for `{}` validators; writing to disk...",
45                consensus_config.validators.len()
46            );
47            for validator in consensus_config.validators {
48                std::fs::create_dir_all(validator.dst_dir(&output)).wrap_err_with(|| {
49                    format!(
50                        "failed creating target directory to store validator specifici keys at `{}`",
51                        validator.dst_dir(&output).display()
52                    )
53                })?;
54                let signing_key_dst = validator.dst_signing_key(&output);
55                std::fs::File::create(&signing_key_dst)
56                    .map_err(eyre::Report::new)
57                    .and_then(|f| {
58                        validator
59                            .signing_key
60                            .to_writer(f)
61                            .map_err(eyre::Report::new)
62                    })
63                    .wrap_err_with(|| {
64                        format!(
65                            "failed writing ed25519 signing key to `{}`",
66                            signing_key_dst.display()
67                        )
68                    })?;
69                let signing_share_dst = validator.dst_signing_share(&output);
70                validator
71                    .signing_share
72                    .write_to_file(&signing_share_dst)
73                    .wrap_err_with(|| {
74                        format!(
75                            "failed writing bls12381 signing share to `{}`",
76                            signing_share_dst.display()
77                        )
78                    })?;
79                println!(
80                    "validator keys written to `{}`, `{}`",
81                    signing_key_dst.display(),
82                    signing_share_dst.display()
83                );
84            }
85        } else {
86            println!("no consensus config generated; likely didn't provide --validators flag");
87        }
88
89        Ok(())
90    }
91}