Skip to content

Commit

Permalink
chore: adds additional debug flags. adds default InMemoryNode. update…
Browse files Browse the repository at this point in the history
…s version in Cargo lock. (#20)

* chore: adds vm execution flags for storage logs and vm result

* chore: Adds default InMemoryNode. Add config_setShowStorageLogs and config_setShowVmDetails endpoints. Update display format of Storage Logs, Execution Results, and transaction summary banner. Fix suggested API call to for displaying call traces. Update Cargo lock with latest version.

* docs: Updates docs with new endpoints and latest console information

---------

Co-authored-by: mm-zk <mm@matterlabs.dev>
Co-authored-by: MexicanAce <nicolasvillanueva@msn.com>
  • Loading branch information
3 people authored Aug 21, 2023
1 parent 31fe14a commit 0cb16a6
Show file tree
Hide file tree
Showing 10 changed files with 317 additions and 25 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ tokio = { version = "1", features = ["time", "rt"] }
futures = { version = "0.3", features = ["compat"] }
once_cell = "1.7"


jsonrpc-http-server = { git = "https://github.com/matter-labs/jsonrpc.git", branch = "master" }
jsonrpc-core = { git = "https://github.com/matter-labs/jsonrpc.git", branch = "master" }
jsonrpc-core-client = { git = "https://github.com/matter-labs/jsonrpc.git", branch = "master" }
Expand Down
25 changes: 16 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,16 +99,23 @@ But with --show-calls flag, it can print more detailed call traces, and with --r
era_test_node --show-calls=user --resolve-hashes replay_tx testnet 0x7f039bcbb1490b855be37e74cf2400503ad57f51c84856362f99b0cbf1ef478a
Executing 0x7f039bcbb1490b855be37e74cf2400503ad57f51c84856362f99b0cbf1ef478a
┌─────────────────────────┐
│ TRANSACTION SUMMARY │
└─────────────────────────┘
Transaction: SUCCESS
Initiator: 0x55362182242a4de20ea8a0ec055b2134bb24e23d Payer: 0x55362182242a4de20ea8a0ec055b2134bb24e23d
Gas Limit: 797128 used: 399148 refunded: 397980
18 call traces. Use --show-calls flag to display more info.
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d 0x202bcce7 729918
Call(Normal) 0x0000000000000000000000000000000000000001 0xbb1e83e6 688275
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d 0xe2f318e3 693630
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d 0xdf9c1589 624834
Call(Mimic) 0x6eef3310e09df3aa819cc2aa364d4f3ad2e6ffe3 swapExactETHForTokens(uint256,address[],address,uint256) 562275
Call(Normal) 0x053f26a020de152a947b8ba7d8974c85c5fc5b81 getPair(address,address) 544068
Initiator: 0x55362182242a4de20ea8a0ec055b2134bb24e23d
Payer: 0x55362182242a4de20ea8a0ec055b2134bb24e23d
Gas - Limit: 797128 | Used: 351250 | Refunded: 445878
==== Console logs:
==== 18 call traces. Use --show-calls flag or call config_setShowCalls to display more info.
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d validateTransaction(bytes32, bytes32, tuple) 730485
Call(Normal) 0x0000000000000000000000000000000000000001 0xbb1e83e6 698040
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d payForTransaction(bytes32, bytes32, tuple) 703647
Call(Normal) 0x55362182242a4de20ea8a0ec055b2134bb24e23d executeTransaction(bytes32, bytes32, tuple) 647199
Call(Mimic) 0x6eef3310e09df3aa819cc2aa364d4f3ad2e6ffe3 swapExactETHForTokens(uint256,address[],address,uint256) 596358
Call(Normal) 0x053f26a020de152a947b8ba7d8974c85c5fc5b81 getPair(address,address) 577647
```

Expand Down
50 changes: 49 additions & 1 deletion SUPPORTED_APIS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ The `status` options are:
| Namespace | API | <div style="width:130px">Status</div> | Description |
| --- | --- | --- | --- |
| [`CONFIG`](#config-namespace) | [`config_getShowCalls`](#config_getshowcalls) | `SUPPORTED` | Gets the current value of `show_calls` that's originally set with `--show-calls` option |
| [`CONFIG`](#config-namespace) | [`config_setShowCalls`](#config_setshowcalls) | `SUPPORTED` | Updates `show_calls` to print more detailed call traces |
| [`CONFIG`](#config-namespace) | [`config_setResolveHashes`](#config_setresolvehashes) | `SUPPORTED` | Updates `resolve-hashes` to call OpenChain for human-readable ABI names in call traces |
| [`CONFIG`](#config-namespace) | [`config_setShowCalls`](#config_setshowcalls) | `SUPPORTED` | Updates `show_calls` to print more detailed call traces |
| [`CONFIG`](#config-namespace) | [`config_setShowStorageLogs`](#config_setshowstoragelogs) | `SUPPORTED` | Updates `show_storage_logs` to print storage log reads/writes |
| [`CONFIG`](#config-namespace) | [`config_setShowVmDetails`](#config_setshowvmdetails) | `SUPPORTED` | Updates `show_vm_details` to print more detailed results from vm execution |
| `DEBUG` | `debug_traceCall` | `NOT IMPLEMENTED`<br />[GitHub Issue #61](https://github.com/matter-labs/era-test-node/issues/61) | Performs a call and returns structured traces of the execution |
| `DEBUG` | `debug_traceBlockByHash` | `NOT IMPLEMENTED`<br />[GitHub Issue #63](https://github.com/matter-labs/era-test-node/issues/63) | Returns structured traces for operations within the block of the specified block hash |
| `DEBUG` | `debug_traceBlockByNumber` | `NOT IMPLEMENTED`<br />[GitHub Issue #64](https://github.com/matter-labs/era-test-node/issues/64) | Returns structured traces for operations within the block of the specified block number |
Expand Down Expand Up @@ -172,6 +174,52 @@ curl --request POST \
--data '{"jsonrpc": "2.0","id": "1","method": "config_setShowCalls","params": ["all"]}'
```

### `config_setShowStorageLogs`

[source](src/configuration_api.rs)

Updates `show_storage_logs` to print storage log reads/writes

#### Arguments

+ `value: String ('None', 'Read', 'Write', 'All')`

#### Status

`SUPPORTED`

#### Example

```bash
curl --request POST \
--url http://localhost:8011/ \
--header 'content-type: application/json' \
--data '{"jsonrpc": "2.0","id": "1","method": "config_setShowStorageLogs","params": ["all"]}'
```

### `config_setShowVmDetails`

[source](src/configuration_api.rs)

Updates `show_vm_details` to print more detailed results from vm execution

#### Arguments

+ `value: String ('None', 'All')`

#### Status

`SUPPORTED`

#### Example

```bash
curl --request POST \
--url http://localhost:8011/ \
--header 'content-type: application/json' \
--data '{"jsonrpc": "2.0","id": "1","method": "config_setShowVmDetails","params": ["all"]}'
```

### `config_setResolveHashes`

[source](src/configuration_api.rs)
Expand Down
50 changes: 49 additions & 1 deletion src/configuration_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use jsonrpc_derive::rpc;
// Workspace uses

// Local uses
use crate::{node::InMemoryNodeInner, ShowCalls};
use crate::{node::InMemoryNodeInner, ShowCalls, ShowStorageLogs, ShowVMDetails};

pub struct ConfigurationApiNamespace {
node: Arc<RwLock<InMemoryNodeInner>>,
Expand Down Expand Up @@ -39,6 +39,26 @@ pub trait ConfigurationApiNamespaceT {
#[rpc(name = "config_setShowCalls", returns = "String")]
fn config_set_show_calls(&self, value: String) -> Result<String>;

/// Set show_storage_logs for the InMemoryNodeInner
///
/// # Parameters
/// - `value`: A ShowStorageLogs enum to update show_storage_logs to
///
/// # Returns
/// The updated/current `show_storage_logs` value for the InMemoryNodeInner.
#[rpc(name = "config_setShowStorageLogs", returns = "String")]
fn config_set_show_storage_logs(&self, value: String) -> Result<String>;

/// Set show_vm_details for the InMemoryNodeInner
///
/// # Parameters
/// - `value`: A ShowVMDetails enum to update show_vm_details to
///
/// # Returns
/// The updated/current `show_vm_details` value for the InMemoryNodeInner.
#[rpc(name = "config_setShowVmDetails", returns = "String")]
fn config_set_show_vm_details(&self, value: String) -> Result<String>;

/// Set resolve_hashes for the InMemoryNodeInner
///
/// # Parameters
Expand Down Expand Up @@ -70,6 +90,34 @@ impl ConfigurationApiNamespaceT for ConfigurationApiNamespace {
Ok(inner.show_calls.to_string())
}

fn config_set_show_storage_logs(&self, value: String) -> Result<String> {
let show_storage_logs = match value.parse::<ShowStorageLogs>() {
Ok(value) => value,
Err(_) => {
let reader = self.node.read().unwrap();
return Ok(reader.show_storage_logs.to_string());
}
};

let mut inner = self.node.write().unwrap();
inner.show_storage_logs = show_storage_logs;
Ok(inner.show_storage_logs.to_string())
}

fn config_set_show_vm_details(&self, value: String) -> Result<String> {
let show_vm_details = match value.parse::<ShowVMDetails>() {
Ok(value) => value,
Err(_) => {
let reader = self.node.read().unwrap();
return Ok(reader.show_vm_details.to_string());
}
};

let mut inner = self.node.write().unwrap();
inner.show_vm_details = show_vm_details;
Ok(inner.show_vm_details.to_string())
}

fn config_set_resolve_hashes(&self, value: bool) -> Result<bool> {
let mut inner = self.node.write().unwrap();
inner.resolve_hashes = value;
Expand Down
47 changes: 46 additions & 1 deletion src/formatter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ use std::collections::HashMap;
use crate::fork::block_on;
use zksync_basic_types::H160;

use zksync_types::{vm_trace::Call, VmEvent};
use vm::vm::VmPartialExecutionResult;
use zksync_types::{vm_trace::Call, StorageLogQuery, StorageLogQueryType, VmEvent};

use lazy_static::lazy_static;

Expand Down Expand Up @@ -158,3 +159,47 @@ pub fn print_call(call: &Call, padding: usize, show_calls: &ShowCalls, resolve_h
print_call(subcall, padding + 2, show_calls, resolve_hashes);
}
}

pub fn print_logs(log_query: &StorageLogQuery) {
let separator = "─".repeat(82);
println!("{:<15} {:?}", "Type:", log_query.log_type);
println!(
"{:<15} {}",
"Address:",
address_to_human_readable(log_query.log_query.address)
.unwrap_or(format!("{}", log_query.log_query.address))
);
println!("{:<15} {:#066x}", "Key:", log_query.log_query.key);

println!(
"{:<15} {:#066x}",
"Read Value:", log_query.log_query.read_value
);

if log_query.log_type != StorageLogQueryType::Read {
println!(
"{:<15} {:#066x}",
"Written Value:", log_query.log_query.written_value
);
}
println!("{}", separator);
}

pub fn print_vm_details(result: &VmPartialExecutionResult) {
println!("\n┌──────────────────────────┐");
println!("│ VM EXECUTION RESULTS │");
println!("└──────────────────────────┘");

println!("Cycles Used: {}", result.cycles_used);
println!("Computation Gas Used: {}", result.computational_gas_used);
println!("Contracts Used: {}", result.contracts_used);

if let Some(revert_reason) = &result.revert_reason {
println!(
"{}",
format!("\n[!] Revert Reason: {}", revert_reason).on_red()
);
}

println!("════════════════════════════");
}
60 changes: 60 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@ struct Cli {
#[arg(long, default_value = "none")]
/// Show call debug information
show_calls: ShowCalls,
#[arg(long, default_value = "none")]
/// Show storage log information
show_storage_logs: ShowStorageLogs,
#[arg(long, default_value = "none")]
/// Show VM details information
show_vm_details: ShowVMDetails,

#[arg(long)]
/// If true, the tool will try to contact openchain to resolve the ABI & topic names.
Expand Down Expand Up @@ -216,6 +222,58 @@ impl Display for ShowCalls {
}
}

#[derive(Debug, Parser, Clone, clap::ValueEnum, PartialEq, Eq)]
pub enum ShowStorageLogs {
None,
Read,
Write,
All,
}

impl FromStr for ShowStorageLogs {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_ref() {
"none" => Ok(ShowStorageLogs::None),
"read" => Ok(ShowStorageLogs::Read),
"write" => Ok(ShowStorageLogs::Write),
"all" => Ok(ShowStorageLogs::All),
_ => Err(()),
}
}
}

impl Display for ShowStorageLogs {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
write!(f, "{:?}", self)
}
}

#[derive(Debug, Parser, Clone, clap::ValueEnum, PartialEq, Eq)]
pub enum ShowVMDetails {
None,
All,
}

impl FromStr for ShowVMDetails {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_ref() {
"none" => Ok(ShowVMDetails::None),
"all" => Ok(ShowVMDetails::All),
_ => Err(()),
}
}
}

impl Display for ShowVMDetails {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
write!(f, "{:?}", self)
}
}

#[derive(Debug, Subcommand)]
enum Command {
/// Starts a new empty local network.
Expand Down Expand Up @@ -298,6 +356,8 @@ async fn main() -> anyhow::Result<()> {
let node = InMemoryNode::new(
fork_details,
opt.show_calls,
opt.show_storage_logs,
opt.show_vm_details,
opt.resolve_hashes,
opt.dev_use_local_contracts,
);
Expand Down
Loading

0 comments on commit 0cb16a6

Please sign in to comment.