tempo_xtask/
generate_genesis.rs1use 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 #[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}