From 087585b3ad41e084f3a8261326c62e953e5b4b27 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Tue, 10 Sep 2024 10:29:21 +0200 Subject: [PATCH 1/4] EVM/Kernel: log levels have an associated integer level and an order --- etherlink/kernel_evm/Cargo.lock | 2 ++ etherlink/kernel_evm/logging/Cargo.toml | 4 +++- etherlink/kernel_evm/logging/src/lib.rs | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/etherlink/kernel_evm/Cargo.lock b/etherlink/kernel_evm/Cargo.lock index 9631ee1fbdac..746cc77b88b8 100644 --- a/etherlink/kernel_evm/Cargo.lock +++ b/etherlink/kernel_evm/Cargo.lock @@ -2220,6 +2220,8 @@ dependencies = [ name = "tezos-evm-logging" version = "0.1.0" dependencies = [ + "num-derive", + "num-traits", "tezos-smart-rollup-debug", ] diff --git a/etherlink/kernel_evm/logging/Cargo.toml b/etherlink/kernel_evm/logging/Cargo.toml index 46a29094511e..c0851ce37376 100644 --- a/etherlink/kernel_evm/logging/Cargo.toml +++ b/etherlink/kernel_evm/logging/Cargo.toml @@ -9,10 +9,12 @@ edition = "2021" license = "MIT" [dependencies] +num-traits.workspace = true +num-derive.workspace = true tezos-smart-rollup-debug.workspace = true [features] default = ["alloc"] alloc = [] debug = [] -benchmark = [] \ No newline at end of file +benchmark = [] diff --git a/etherlink/kernel_evm/logging/src/lib.rs b/etherlink/kernel_evm/logging/src/lib.rs index a9176040cdaf..3009ffc72de5 100644 --- a/etherlink/kernel_evm/logging/src/lib.rs +++ b/etherlink/kernel_evm/logging/src/lib.rs @@ -5,15 +5,26 @@ #[doc(hidden)] pub use tezos_smart_rollup_debug::debug_str; -#[derive(PartialEq)] +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; + +#[repr(u8)] +#[derive(PartialEq, Clone, Copy, PartialOrd, FromPrimitive)] pub enum Level { - Info, + Fatal = 0, Error, - Fatal, + Info, Debug, Benchmarking, } +impl TryFrom for Level { + type Error = (); + fn try_from(value: u8) -> Result { + FromPrimitive::from_u8(value).ok_or(()) + } +} + impl std::fmt::Display for Level { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match &self { -- GitLab From 9c8f9d1af95ea08bea5f1c3ed9b2ef0fdc65a451 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Tue, 10 Sep 2024 10:31:02 +0200 Subject: [PATCH 2/4] EVM/Kernel: default level is set by the build flag --- etherlink/kernel_evm/logging/src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/etherlink/kernel_evm/logging/src/lib.rs b/etherlink/kernel_evm/logging/src/lib.rs index 3009ffc72de5..1bec1942f20e 100644 --- a/etherlink/kernel_evm/logging/src/lib.rs +++ b/etherlink/kernel_evm/logging/src/lib.rs @@ -25,6 +25,18 @@ impl TryFrom for Level { } } +impl Default for Level { + fn default() -> Self { + if cfg!(feature = "debug") { + Self::Debug + } else if cfg!(feature = "benchmark") { + Self::Benchmarking + } else { + Self::Info + } + } +} + impl std::fmt::Display for Level { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match &self { -- GitLab From b5353dac6afd73ee65fe186a4047537d3f7a2d52 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Tue, 10 Sep 2024 10:35:39 +0200 Subject: [PATCH 3/4] EVM/Kernel: add a Verbosity trait that the runtime should implement --- etherlink/kernel_evm/Cargo.lock | 1 + .../kernel_evm/evm_evaluation/src/evalhost.rs | 7 +++++++ .../kernel/src/evm_node_entrypoint.rs | 2 ++ etherlink/kernel_evm/kernel/src/lib.rs | 1 + etherlink/kernel_evm/logging/src/lib.rs | 4 ++++ etherlink/kernel_evm/runtime/Cargo.toml | 1 + etherlink/kernel_evm/runtime/src/runtime.rs | 17 +++++++++++++++-- .../kernel_evm/runtime/src/safe_storage.rs | 7 +++++++ 8 files changed, 38 insertions(+), 2 deletions(-) diff --git a/etherlink/kernel_evm/Cargo.lock b/etherlink/kernel_evm/Cargo.lock index 746cc77b88b8..5e31350eff01 100644 --- a/etherlink/kernel_evm/Cargo.lock +++ b/etherlink/kernel_evm/Cargo.lock @@ -2230,6 +2230,7 @@ name = "tezos-evm-runtime" version = "0.1.0" dependencies = [ "sha3", + "tezos-evm-logging", "tezos-smart-rollup-core", "tezos-smart-rollup-debug", "tezos-smart-rollup-encoding", diff --git a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs index 0ae2f6876fbc..d05bc1f4f02c 100644 --- a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs +++ b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs @@ -4,6 +4,7 @@ use std::{cell::RefCell, io::Write}; +use tezos_evm_logging::Verbosity; use tezos_evm_runtime::{ internal_runtime::{ExtendedRuntime, InternalRuntime}, runtime::MockKernelHost, @@ -217,3 +218,9 @@ impl ExtendedRuntime for EvalHost { self.host.store_get_hash(path) } } + +impl Verbosity for EvalHost { + fn verbosity(&self) -> tezos_evm_logging::Level { + self.host.verbosity() + } +} diff --git a/etherlink/kernel_evm/kernel/src/evm_node_entrypoint.rs b/etherlink/kernel_evm/kernel/src/evm_node_entrypoint.rs index ece244b1f1a3..9dc4045d4cf0 100644 --- a/etherlink/kernel_evm/kernel/src/evm_node_entrypoint.rs +++ b/etherlink/kernel_evm/kernel/src/evm_node_entrypoint.rs @@ -12,6 +12,7 @@ use std::marker::PhantomData; use crate::{delayed_inbox::DelayedInbox, inbox::Transaction}; use tezos_ethereum::rlp_helpers::FromRlpBytes; +use tezos_evm_logging::Level; use tezos_evm_runtime::{internal_runtime::InternalHost, runtime::KernelHost}; use tezos_smart_rollup_core::rollup_host::RollupHost; use tezos_smart_rollup_host::{path::RefPath, runtime::Runtime}; @@ -27,6 +28,7 @@ pub extern "C" fn populate_delayed_inbox() { host: sdk_host, internal, _pd: PhantomData, + logs_verbosity: Level::default(), }; let payload = host.store_read_all(&DELAYED_INPUT_PATH).unwrap(); let transaction = Transaction::from_rlp_bytes(&payload).unwrap(); diff --git a/etherlink/kernel_evm/kernel/src/lib.rs b/etherlink/kernel_evm/kernel/src/lib.rs index 3bff17485ace..f1ce8172071a 100644 --- a/etherlink/kernel_evm/kernel/src/lib.rs +++ b/etherlink/kernel_evm/kernel/src/lib.rs @@ -320,6 +320,7 @@ pub fn kernel_loop(host: &mut H let mut host = KernelHost { host, internal: internal_storage, + logs_verbosity: Level::default(), _pd: PhantomData::, }; diff --git a/etherlink/kernel_evm/logging/src/lib.rs b/etherlink/kernel_evm/logging/src/lib.rs index 1bec1942f20e..b1d49647fb42 100644 --- a/etherlink/kernel_evm/logging/src/lib.rs +++ b/etherlink/kernel_evm/logging/src/lib.rs @@ -49,6 +49,10 @@ impl std::fmt::Display for Level { } } +pub trait Verbosity { + fn verbosity(&self) -> Level; +} + #[cfg(feature = "alloc")] #[macro_export] macro_rules! log { diff --git a/etherlink/kernel_evm/runtime/Cargo.toml b/etherlink/kernel_evm/runtime/Cargo.toml index a2b28231d6e0..7a89c30ec8c1 100644 --- a/etherlink/kernel_evm/runtime/Cargo.toml +++ b/etherlink/kernel_evm/runtime/Cargo.toml @@ -13,6 +13,7 @@ tezos-smart-rollup-core.workspace = true tezos-smart-rollup-host.workspace = true tezos-smart-rollup-mock.workspace = true tezos-smart-rollup-encoding.workspace = true +tezos-evm-logging.workspace = true sha3.workspace = true [dev-dependencies] diff --git a/etherlink/kernel_evm/runtime/src/runtime.rs b/etherlink/kernel_evm/runtime/src/runtime.rs index ebb683d969a7..0372970b5a6a 100644 --- a/etherlink/kernel_evm/runtime/src/runtime.rs +++ b/etherlink/kernel_evm/runtime/src/runtime.rs @@ -17,6 +17,7 @@ use crate::{ internal_runtime::{ExtendedRuntime, InternalRuntime}, mock_internal::MockInternal, }; +use tezos_evm_logging::{Level, Verbosity}; use tezos_smart_rollup_core::PREIMAGE_HASH_SIZE; use tezos_smart_rollup_encoding::smart_rollup::SmartRollupAddress; use tezos_smart_rollup_host::{ @@ -28,11 +29,11 @@ use tezos_smart_rollup_host::{ }; use tezos_smart_rollup_mock::MockHost; -pub trait Runtime: SdkRuntime + InternalRuntime + ExtendedRuntime {} +pub trait Runtime: SdkRuntime + InternalRuntime + ExtendedRuntime + Verbosity {} // If a type implements the Runtime, InternalRuntime and ExtendedRuntime traits, // it also implements the kernel Runtime. -impl Runtime for T {} +impl Runtime for T {} // This type has two interesting parts: // 1. Host: BorrowMut + Borrow @@ -53,6 +54,7 @@ impl Runtime for T {} pub struct KernelHost + Borrow, Internal> { pub host: Host, pub internal: Internal, + pub logs_verbosity: Level, pub _pd: PhantomData, } @@ -259,11 +261,20 @@ where KernelHost { host: &mut self.host, internal: &mut self.internal, + logs_verbosity: self.logs_verbosity, _pd: PhantomData, } } } +impl + Borrow, Internal: InternalRuntime> Verbosity + for KernelHost +{ + fn verbosity(&self) -> Level { + self.logs_verbosity + } +} + pub type MockKernelHost = KernelHost; impl Default for MockKernelHost { @@ -271,6 +282,7 @@ impl Default for MockKernelHost { Self { host: MockHost::default(), internal: MockInternal(), + logs_verbosity: Level::default(), _pd: PhantomData, } } @@ -283,6 +295,7 @@ impl MockKernelHost { KernelHost { host, internal, + logs_verbosity: Level::default(), _pd: PhantomData, } } diff --git a/etherlink/kernel_evm/runtime/src/safe_storage.rs b/etherlink/kernel_evm/runtime/src/safe_storage.rs index bce9d0ac6af8..2d0573aeae35 100644 --- a/etherlink/kernel_evm/runtime/src/safe_storage.rs +++ b/etherlink/kernel_evm/runtime/src/safe_storage.rs @@ -7,6 +7,7 @@ use crate::internal_runtime::{ExtendedRuntime, InternalRuntime}; use crate::runtime::Runtime; +use tezos_evm_logging::Verbosity; use tezos_smart_rollup_core::PREIMAGE_HASH_SIZE; use tezos_smart_rollup_host::dal_parameters::RollupDalParameters; use tezos_smart_rollup_host::{ @@ -226,6 +227,12 @@ impl SdkRuntime for SafeStorage<&mut Host> { } } +impl Verbosity for SafeStorage<&mut Host> { + fn verbosity(&self) -> tezos_evm_logging::Level { + self.host.verbosity() + } +} + impl SafeStorage<&mut Host> { pub fn start(&mut self) -> Result<(), RuntimeError> { self.host -- GitLab From ad8e020ad5099d906bce7dc77e8366f32032545f Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Tue, 10 Sep 2024 10:58:13 +0200 Subject: [PATCH 4/4] EVM/Kernel: log macro uses `Verbosity` trait Logs are ordered as: Fatal < Error < Info < Debug < Benchmarking. If the verbosity is `N`, all the logs with level below `N` and `N` are displayed. --- etherlink/kernel_evm/kernel/src/block.rs | 2 +- etherlink/kernel_evm/kernel/src/lib.rs | 6 +++++- etherlink/kernel_evm/logging/src/lib.rs | 26 +++--------------------- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/etherlink/kernel_evm/kernel/src/block.rs b/etherlink/kernel_evm/kernel/src/block.rs index db76e69ed848..1d3e53687255 100644 --- a/etherlink/kernel_evm/kernel/src/block.rs +++ b/etherlink/kernel_evm/kernel/src/block.rs @@ -29,7 +29,7 @@ use evm_execution::trace::TracerInput; use primitive_types::{H160, H256, U256}; use tezos_ethereum::block::BlockFees; use tezos_ethereum::transaction::TransactionHash; -use tezos_evm_logging::{log, Level::*}; +use tezos_evm_logging::{log, Level::*, Verbosity}; use tezos_evm_runtime::runtime::Runtime; use tezos_evm_runtime::safe_storage::SafeStorage; use tezos_smart_rollup::outbox::OutboxQueue; diff --git a/etherlink/kernel_evm/kernel/src/lib.rs b/etherlink/kernel_evm/kernel/src/lib.rs index f1ce8172071a..3c4ffe776858 100644 --- a/etherlink/kernel_evm/kernel/src/lib.rs +++ b/etherlink/kernel_evm/kernel/src/lib.rs @@ -30,7 +30,11 @@ use storage::{ }; use tezos_crypto_rs::hash::ContractKt1Hash; use tezos_ethereum::block::BlockFees; -use tezos_evm_logging::{log, Level::*}; +use tezos_evm_logging::{ + log, + Level::{self, *}, + Verbosity, +}; use tezos_evm_runtime::runtime::{KernelHost, Runtime}; use tezos_evm_runtime::safe_storage::WORLD_STATE_PATH; use tezos_smart_rollup::entrypoint; diff --git a/etherlink/kernel_evm/logging/src/lib.rs b/etherlink/kernel_evm/logging/src/lib.rs index b1d49647fb42..e15255dab31b 100644 --- a/etherlink/kernel_evm/logging/src/lib.rs +++ b/etherlink/kernel_evm/logging/src/lib.rs @@ -57,29 +57,9 @@ pub trait Verbosity { #[macro_export] macro_rules! log { ($host: expr, $level: expr, $fmt: expr $(, $arg:expr)*) => { - match $level { - $crate::Level::Debug => { - #[cfg(not(feature = "debug"))] - {} - #[cfg(feature = "debug")] - { - let msg = format!("[{}] {}\n", $level, format_args!($fmt $(, $arg)*)); - $crate::debug_str!($host, &msg); - } - } - $crate::Level::Benchmarking => { - #[cfg(not(feature = "benchmark"))] - {} - #[cfg(feature = "benchmark")] - { - let msg = format!("[{}] {}\n", $level, format_args!($fmt $(, $arg)*)); - $crate::debug_str!($host, &msg); - } - } - $crate::Level::Info | $crate::Level::Error | $crate::Level::Fatal => { - let msg = format!("[{}] {}\n", $level, format_args!($fmt $(, $arg)*)); - $crate::debug_str!($host, &msg); - } + if $host.verbosity() >= $level { + let msg = format!("[{}] {}\n", $level, format_args!($fmt $(, $arg)*)); + $crate::debug_str!($host, &msg); } }; } -- GitLab