diff --git a/go.mod b/go.mod index 133700f6a..9b3f0722d 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ad7a24b92..04639096c 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/api/bindings.h b/internal/api/bindings.h index 2d2835f5f..696a45d02 100644 --- a/internal/api/bindings.h +++ b/internal/api/bindings.h @@ -426,6 +426,8 @@ struct AnalysisReport analyze_code(struct cache_t *cache, struct Metrics get_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg); +struct UnmanagedVector get_pinned_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg); + /** * frees a cache reference * diff --git a/internal/api/lib.go b/internal/api/lib.go index 71b5a19ae..37338d437 100644 --- a/internal/api/lib.go +++ b/internal/api/lib.go @@ -14,6 +14,7 @@ import ( "golang.org/x/sys/unix" "github.com/CosmWasm/wasmvm/v2/types" + "github.com/vmihailenco/msgpack/v5" ) // Value types @@ -188,6 +189,21 @@ func GetMetrics(cache Cache) (*types.Metrics, error) { }, nil } +func GetPinnedMetrics(cache Cache) (*types.PinnedMetrics, error) { + errmsg := uninitializedUnmanagedVector() + metrics, err := C.get_pinned_metrics(cache.ptr, &errmsg) + if err != nil { + return nil, errorWithMessage(err, errmsg) + } + + var pinnedMetrics types.PinnedMetrics + if err := msgpack.Unmarshal(copyAndDestroyUnmanagedVector(metrics), &pinnedMetrics); err != nil { + return nil, err + } + + return &pinnedMetrics, nil +} + func Instantiate( cache Cache, checksum []byte, diff --git a/libwasmvm/Cargo.lock b/libwasmvm/Cargo.lock index 02425bf98..58be8ec95 100644 --- a/libwasmvm/Cargo.lock +++ b/libwasmvm/Cargo.lock @@ -19,21 +19,15 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", "version_check", ] -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - [[package]] name = "atty" version = "0.2.14" @@ -264,11 +258,13 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" version = "2.0.0" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v2.0.0#336afd2e62f83ea632bb4b2f94488b228ca2e28a" +source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018#f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -276,7 +272,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" version = "2.0.0" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v2.0.0#336afd2e62f83ea632bb4b2f94488b228ca2e28a" +source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018#f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018" dependencies = [ "syn 1.0.109", ] @@ -284,7 +280,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" version = "2.0.0" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v2.0.0#336afd2e62f83ea632bb4b2f94488b228ca2e28a" +source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018#f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018" dependencies = [ "base64", "bech32", @@ -305,11 +301,9 @@ dependencies = [ [[package]] name = "cosmwasm-vm" version = "2.0.0" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v2.0.0#336afd2e62f83ea632bb4b2f94488b228ca2e28a" +source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018#f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018" dependencies = [ "bech32", - "bitflags 1.3.2", - "bytecheck", "bytes", "clru", "cosmwasm-crypto", @@ -323,6 +317,7 @@ dependencies = [ "sha2 0.10.8", "strum", "thiserror", + "tracing", "wasmer", "wasmer-middlewares", ] @@ -336,89 +331,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cranelift-bforest" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" -dependencies = [ - "arrayvec", - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-egraph", - "cranelift-entity", - "cranelift-isle", - "gimli 0.26.2", - "log", - "regalloc2", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" -dependencies = [ - "cranelift-codegen-shared", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" - -[[package]] -name = "cranelift-egraph" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" -dependencies = [ - "cranelift-entity", - "fxhash", - "hashbrown 0.12.3", - "indexmap 1.9.3", - "log", - "smallvec", -] - -[[package]] -name = "cranelift-entity" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" - -[[package]] -name = "cranelift-frontend" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" - [[package]] name = "crc32fast" version = "1.3.2" @@ -551,6 +463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -674,6 +587,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -778,15 +692,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1034,6 +939,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.32.2" @@ -1061,6 +975,18 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", +] + [[package]] name = "parking_lot_core" version = "0.9.9" @@ -1074,6 +1000,21 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1096,6 +1037,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1208,18 +1158,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "regalloc2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" -dependencies = [ - "fxhash", - "log", - "slice-group-by", - "smallvec", -] - [[package]] name = "region" version = "3.0.0" @@ -1281,6 +1219,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1486,12 +1446,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" -[[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - [[package]] name = "smallvec" version = "1.13.1" @@ -1825,7 +1779,6 @@ dependencies = [ "tracing", "wasm-bindgen", "wasmer-compiler", - "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-types", @@ -1860,25 +1813,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "wasmer-compiler-cranelift" -version = "4.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102e2c5bacac69495c4025767e2fa26797ffb27f242dccb7cf57d9cefd944386" -dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "gimli 0.26.2", - "more-asserts", - "rayon", - "smallvec", - "target-lexicon", - "tracing", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler-singlepass" version = "4.2.6" @@ -1985,6 +1919,7 @@ dependencies = [ "cosmwasm-vm", "errno", "hex", + "rmp-serde", "serde", "serde_json", "tempfile", diff --git a/libwasmvm/Cargo.toml b/libwasmvm/Cargo.toml index 0abfcd89e..1d843f405 100644 --- a/libwasmvm/Cargo.toml +++ b/libwasmvm/Cargo.toml @@ -26,9 +26,13 @@ default = [] backtraces = [] [dependencies] -cosmwasm-std = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.0.0", features = ["staking", "stargate", "iterator"] } -cosmwasm-vm = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.0.0", features = ["staking", "stargate", "iterator"] } +#cosmwasm-std = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.0.0", features = ["staking", "stargate", "iterator"] } +#cosmwasm-vm = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.0.0", features = ["staking", "stargate", "iterator"] } +cosmwasm-std = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018", features = ["staking", "stargate", "iterator"] } +cosmwasm-vm = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "f1fa4bb35a1fc8ad5f48d079c1d29e5b2a1d4018", features = ["staking", "stargate", "iterator"] } errno = "0.3.8" +rmp-serde = "1.1.2" +serde = { version = "1.0.103", features = ["derive"] } serde_json = "1.0.91" thiserror = "1.0.38" hex = "0.4.3" diff --git a/libwasmvm/bindings.h b/libwasmvm/bindings.h index 2d2835f5f..696a45d02 100644 --- a/libwasmvm/bindings.h +++ b/libwasmvm/bindings.h @@ -426,6 +426,8 @@ struct AnalysisReport analyze_code(struct cache_t *cache, struct Metrics get_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg); +struct UnmanagedVector get_pinned_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg); + /** * frees a cache reference * diff --git a/libwasmvm/src/cache.rs b/libwasmvm/src/cache.rs index 9b21dbd9b..e5e7f9542 100644 --- a/libwasmvm/src/cache.rs +++ b/libwasmvm/src/cache.rs @@ -5,6 +5,7 @@ use std::str::from_utf8; use cosmwasm_std::Checksum; use cosmwasm_vm::{capabilities_from_csv, Cache, CacheOptions, Size}; +use serde::Serialize; use crate::api::GoApi; use crate::args::{AVAILABLE_CAPABILITIES_ARG, CACHE_ARG, CHECKSUM_ARG, DATA_DIR_ARG, WASM_ARG}; @@ -384,6 +385,64 @@ fn do_get_metrics(cache: &mut Cache) -> Result for PerModuleMetrics { + fn from(value: cosmwasm_vm::PerModuleMetrics) -> Self { + Self { + hits: value.hits, + size: value.size, + } + } +} + +#[derive(Serialize)] +struct PinnedMetrics { + per_module: Vec<(Checksum, PerModuleMetrics)>, +} + +impl From for PinnedMetrics { + fn from(value: cosmwasm_vm::PinnedMetrics) -> Self { + Self { + per_module: value + .per_module + .iter() + .cloned() + .map(|(checksum, metrics)| (checksum, metrics.into())) + .collect(), + } + } +} + +#[no_mangle] +pub extern "C" fn get_pinned_metrics( + cache: *mut cache_t, + error_msg: Option<&mut UnmanagedVector>, +) -> UnmanagedVector { + let r = match to_cache(cache) { + Some(c) => { + catch_unwind(AssertUnwindSafe(move || do_get_pinned_metrics(c))).unwrap_or_else(|err| { + eprintln!("Panic in do_get_pinned_metrics: {err:?}"); + Err(Error::panic()) + }) + } + None => Err(Error::unset_arg(CACHE_ARG)), + }; + handle_c_error_default(r, error_msg) +} + +fn do_get_pinned_metrics( + cache: &mut Cache, +) -> Result { + let pinned_metrics = PinnedMetrics::from(cache.pinned_metrics()); + let edgerunner = rmp_serde::to_vec_named(&pinned_metrics)?; + Ok(UnmanagedVector::new(Some(edgerunner))) +} + /// frees a cache reference /// /// # Safety diff --git a/libwasmvm/src/error/rust.rs b/libwasmvm/src/error/rust.rs index cb0656dcc..a6682d667 100644 --- a/libwasmvm/src/error/rust.rs +++ b/libwasmvm/src/error/rust.rs @@ -22,6 +22,12 @@ pub enum RustError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, + #[error("Cannot serialize to MessagePack: {msg}")] + MessagePack { + msg: String, + #[cfg(feature = "backtraces")] + backtrace: Backtrace, + }, #[error("Ran out of gas")] OutOfGas { #[cfg(feature = "backtraces")] @@ -68,6 +74,14 @@ impl RustError { } } + pub fn message_pack(msg: S) -> Self { + RustError::MessagePack { + msg: msg.to_string(), + #[cfg(feature = "backtraces")] + backtrace: Backtrace::capture(), + } + } + pub fn panic() -> Self { RustError::Panic { #[cfg(feature = "backtraces")] @@ -121,6 +135,12 @@ impl From for RustError { } } +impl From for RustError { + fn from(source: rmp_serde::encode::Error) -> Self { + RustError::message_pack(source) + } +} + impl From for RustError { fn from(source: std::str::Utf8Error) -> Self { RustError::invalid_utf8(source) diff --git a/types/types.go b/types/types.go index a8cca6dd6..5eea2fe83 100644 --- a/types/types.go +++ b/types/types.go @@ -184,6 +184,15 @@ type Metrics struct { SizeMemoryCache uint64 } +type PerModuleMetrics struct { + Hits uint32 + Size uint64 +} + +type PinnedMetrics struct { + PerModule PerModuleMetrics `json:"per_module"` +} + // Array is a wrapper around a slice that ensures that we get "[]" JSON for nil values. // When unmarshaling, we get an empty slice for "[]" and "null". //