From 2aa5835215ed734c76492044152de3ff4467987b Mon Sep 17 00:00:00 2001 From: Olivier Desenfans Date: Thu, 22 Feb 2024 16:06:31 +0100 Subject: [PATCH] Feature: info logs Problem: the CLI does not display enough information about what it is doing. Solution: add logs. The CLI now uses the `log` and `env_logger` crate to print messages. This will simplify the addition of a verbosity flag down the line. --- Cargo.lock | 31 +++++++++++++++++++++++++++++++ Cargo.toml | 4 +++- scripts/install-stone-cli.sh | 2 +- src/commands/prove.rs | 6 ++++++ src/commands/verify.rs | 7 ++++++- src/main.rs | 30 ++++++++++++++++++++++++++---- 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 12a8c57..c0bd670 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1012,6 +1012,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1736,6 +1759,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.28" @@ -3413,6 +3442,8 @@ version = "0.1.0" dependencies = [ "cairo-vm", "clap 4.5.0", + "env_logger", + "log", "rstest", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 94f2ccc..3face72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,9 +8,11 @@ edition = "2021" [dependencies] cairo-vm = { git = "https://github.com/Moonsong-Labs/cairo-vm", rev = "b2f69d230416129a84ad8237ccc13d088992f74b", features = ["extensive_hints"] } clap = { version = "4.5.0", features = ["derive"] } +env_logger = { version = "0.11.2", features = ["color"] } +log = "0.4.20" serde = { version = "1.0.196", features = ["derive"] } serde_json = { version = "1.0.113" } -stone-prover-sdk = { git = "https://github.com/Moonsong-Labs/stone-prover-sdk", tag="v0.3.0" } +stone-prover-sdk = { git = "https://github.com/Moonsong-Labs/stone-prover-sdk", tag = "v0.3.0" } thiserror = { version = "1.0.57" } [dev-dependencies] diff --git a/scripts/install-stone-cli.sh b/scripts/install-stone-cli.sh index fb53abc..3dbde12 100644 --- a/scripts/install-stone-cli.sh +++ b/scripts/install-stone-cli.sh @@ -2,7 +2,7 @@ set -eo pipefail -VERSION="v0.1.0" +VERSION="v0.1.1" INSTALL_DIR="${HOME}/.stone/${VERSION}" TARBALL="stone-cli-linux-x86-64.tar.gz" diff --git a/src/commands/prove.rs b/src/commands/prove.rs index 8ed8dd1..24d9435 100644 --- a/src/commands/prove.rs +++ b/src/commands/prove.rs @@ -6,6 +6,7 @@ use cairo_vm::types::errors::cairo_pie_error::CairoPieError; use cairo_vm::types::errors::program_errors::ProgramError; use cairo_vm::types::program::Program; use cairo_vm::vm::runners::cairo_pie::CairoPie; +use log::{debug, info}; use serde::Serialize; use stone_prover_sdk::cairo_vm::{ extract_execution_artifacts, run_bootloader_in_proof_mode, run_in_proof_mode, @@ -106,6 +107,8 @@ pub fn run_with_bootloader(args: ProveWithBootloaderArgs) -> Result Result<(), RunError> { + debug!("preparing config files..."); + // Cloning here is the easiest solution to avoid borrow checks. let config_args = command.config().clone(); @@ -122,6 +125,7 @@ pub fn prove(command: ProveCommand) -> Result<(), RunError> { .map(|path| read_json_from_file(path).map_err(|e| RunError::Deserialize(path.clone(), e))) .transpose()?; + info!("execution in progress..."); let execution_artifacts = match command { ProveCommand::Bare(args) => run_program(args)?, ProveCommand::WithBootloader(args) => run_with_bootloader(args)?, @@ -133,6 +137,7 @@ pub fn prove(command: ProveCommand) -> Result<(), RunError> { last_layer_degree_bound, )); + info!("proving in progress..."); let proof = run_prover( &execution_artifacts.public_input, &execution_artifacts.private_input, @@ -141,6 +146,7 @@ pub fn prove(command: ProveCommand) -> Result<(), RunError> { &prover_config, &prover_parameters, )?; + info!("proving completed!"); let output_file = config_args.output_file(); write_json_to_file(proof, output_file.as_ref()) diff --git a/src/commands/verify.rs b/src/commands/verify.rs index 9020a0a..b335ce9 100644 --- a/src/commands/verify.rs +++ b/src/commands/verify.rs @@ -1,8 +1,13 @@ +use log::info; use stone_prover_sdk::error::VerifierError; use stone_prover_sdk::verifier::run_verifier; use crate::cli::VerifyArgs; pub fn verify(args: VerifyArgs) -> Result<(), VerifierError> { - run_verifier(args.proof_file.as_path()) + info!("verification in progress..."); + run_verifier(args.proof_file.as_path())?; + info!("verification completed!"); + + Ok(()) } diff --git a/src/main.rs b/src/main.rs index f6c87f6..197986a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,14 @@ +use crate::cli::Cli; +use crate::commands::prove::RunError; use cairo_vm::vm::errors::cairo_run_errors::CairoRunError; use clap::Parser; +use env_logger::fmt::Formatter; +use log::{error, LevelFilter, Record}; +use std::io; +use std::io::Write; use stone_prover_sdk::cairo_vm::ExecutionError; use stone_prover_sdk::error::VerifierError; -use crate::cli::Cli; -use crate::commands::prove::RunError; - mod cli; mod commands; mod toolkit; @@ -18,6 +21,23 @@ enum CliError { Verify(#[from] VerifierError), } +fn format_log(buf: &mut Formatter, record: &Record) -> io::Result<()> { + let level_style = buf.default_level_style(record.level()); + writeln!( + buf, + "{level_style}{:<5}{level_style:#} {}", + record.level().to_string().to_lowercase(), + record.args() + ) +} + +fn setup_logging() { + env_logger::Builder::new() + .filter_level(LevelFilter::Info) + .format(format_log) + .init(); +} + fn display_error(error: CliError) { let error_message = match error { CliError::Prove(run_error) => match run_error { @@ -70,7 +90,7 @@ fn display_error(error: CliError) { } }, }; - println!("Error: {}", error_message); + error!("{}", error_message); } fn process_cli_command(command: Cli) -> Result<(), CliError> { @@ -83,6 +103,8 @@ fn process_cli_command(command: Cli) -> Result<(), CliError> { } fn main() -> Result<(), Box> { + setup_logging(); + let command = Cli::parse(); if let Err(e) = process_cli_command(command) { display_error(e);