ckb-vm-syscall-tracer 1.1.1

A utility that runs a CKB transaction, and then gathers syscall input/outputs for each individual VM instances to seperate files
Documentation
use ckb_vm::Error;
use ckb_vm_syscall_tracer::{
    Collector, CollectorKind, SyscallBasedCollector, TxPartsBasedCollector, VmCreateCollector,
};
use clap::Parser;

#[derive(Debug, Parser)]
#[command(version, about, long_about = None)]
struct Cli {
    /// Collector to use
    #[arg(long, value_enum, default_value_t = CollectorKind::Syscall)]
    collector: CollectorKind,

    files: Vec<String>,
}

fn main() -> Result<(), Error> {
    let cli = Cli::parse();

    match cli.collector {
        CollectorKind::Syscall => run::<SyscallBasedCollector>(&cli),
        CollectorKind::TxParts => run::<TxPartsBasedCollector>(&cli),
        CollectorKind::VmCreate => run::<VmCreateCollector>(&cli),
    }
}

fn run<C>(cli: &Cli) -> Result<(), Error>
where
    C: Collector<Trace: for<'a> TryFrom<&'a [u8], Error = Error> + std::fmt::Debug>,
{
    for file in &cli.files {
        let data = std::fs::read(file).map_err(|e| Error::IO { kind: e.kind(), data: format!("{}", e) })?;
        let trace = C::Trace::try_from(&data)?;

        println!("Content for {}:", file);
        println!("{:?}", trace);
        println!();
    }
    Ok(())
}