Skip to content

Commit 2341493

Browse files
committed
CLI: generate .pub file when generate encrypted file
1 parent dcb6c3a commit 2341493

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,8 @@ run-block-producer: build-release ## Run a block producer node on $(NETWORK) net
332332

333333
.PHONY: generate-block-producer-key
334334
generate-block-producer-key: build-release ## Generate a new block producer key pair (fails if keys exist, use PRODUCER_KEY_FILENAME to customize, MINA_PRIVKEY_PASS for password)
335-
@if [ -f "$(PRODUCER_KEY_FILENAME)" ]; then \
336-
echo "Error: Producer key already exists at $(PRODUCER_KEY_FILENAME)"; \
335+
@if [ -f "$(PRODUCER_KEY_FILENAME)" ] || [ -f "$(PRODUCER_KEY_FILENAME).pub" ]; then \
336+
echo "Error: Producer key already exists at $(PRODUCER_KEY_FILENAME) or public key exists at $(PRODUCER_KEY_FILENAME).pub"; \
337337
echo ""; \
338338
echo "To generate a key with a different filename, set PRODUCER_KEY_FILENAME:"; \
339339
echo " make generate-block-producer-key PRODUCER_KEY_FILENAME=./path/to/new-key"; \
@@ -349,7 +349,7 @@ generate-block-producer-key: build-release ## Generate a new block producer key
349349
echo ""; \
350350
echo "✓ Generated new encrypted producer key:"; \
351351
echo " Encrypted key saved to: $(PRODUCER_KEY_FILENAME)"; \
352-
echo " Public key: $$PUBLIC_KEY"; \
352+
echo " Public key: $$PUBLIC_KEY, saved to $(PRODUCER_KEY_FILENAME).pub"; \
353353
echo ""; \
354354
echo "⚠️ IMPORTANT: Keep your encrypted key file and password secure and backed up!"
355355

cli/src/commands/misc.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use libp2p_identity::PeerId;
22
use node::{account::AccountSecretKey, p2p::identity::SecretKey};
3+
use std::{fs::File, io::Write};
34

45
#[derive(Debug, clap::Args)]
56
pub struct Misc {
@@ -111,6 +112,8 @@ impl MinaEncryptedKey {
111112
/// Generates a new Mina key pair (or uses provided secret key) and saves it
112113
/// as an encrypted JSON file that can be used for block production.
113114
///
115+
/// It will also save the public key to the filename suffixed with `.pub`.
116+
///
114117
/// # Returns
115118
///
116119
/// * `Ok(())` - On successful key generation and file creation
@@ -122,12 +125,30 @@ impl MinaEncryptedKey {
122125
/// JSON file at the specified path.
123126
pub fn run(self) -> anyhow::Result<()> {
124127
let secret_key = self.secret_key.unwrap_or_else(AccountSecretKey::rand);
128+
let public_key = secret_key.public_key();
129+
130+
// Save the public key to a separate file
131+
let public_key_file = format!("{}.pub", self.file);
132+
133+
if File::open(&public_key_file).is_ok() {
134+
return Err(anyhow::anyhow!(
135+
"Public key file '{}' already exists. Please choose a different file name.",
136+
public_key_file
137+
));
138+
}
139+
125140
secret_key
126141
.to_encrypted_file(&self.file, &self.password)
127142
.map_err(|e| {
128143
anyhow::anyhow!("Failed to encrypt key: {} into path '{}'", e, self.file,)
129144
})?;
130-
let public_key = secret_key.public_key();
145+
// Write the public key to the file
146+
let mut public_key_file = File::create(public_key_file)
147+
.map_err(|e| anyhow::anyhow!("Failed to create public key file: {}", e))?;
148+
public_key_file
149+
.write_all(public_key.to_string().as_bytes())
150+
.map_err(|e| anyhow::anyhow!("Failed to write public key: {}", e))?;
151+
131152
println!("secret key: {secret_key}");
132153
println!("public key: {public_key}");
133154
Ok(())

0 commit comments

Comments
 (0)