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                validator
56                    .signing_key
57                    .write_to_file(&signing_key_dst)
58                    .wrap_err_with(|| {
59                        format!(
60                            "failed writing ed25519 signing key to `{}`",
61                            signing_key_dst.display()
62                        )
63                    })?;
64                let signing_share_dst = validator.dst_signing_share(&output);
65                validator
66                    .signing_share
67                    .write_to_file(&signing_share_dst)
68                    .wrap_err_with(|| {
69                        format!(
70                            "failed writing bls12381 signing share to `{}`",
71                            signing_share_dst.display()
72                        )
73                    })?;
74                println!(
75                    "validator keys written to `{}`, `{}`",
76                    signing_key_dst.display(),
77                    signing_share_dst.display()
78                );
79            }
80        } else {
81            println!("no consensus config generated; likely didn't provide --validators flag");
82        }
83
84        Ok(())
85    }
86}