diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore b/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore new file mode 100644 index 000000000..0e24e33d5 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore @@ -0,0 +1,13 @@ +# Build results +/target +*.wasm + +# Text file backups +**/*.rs.bk + +# macOS +.DS_Store + +# IDEs +*.iml +.idea diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock new file mode 100644 index 000000000..85691eba5 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock @@ -0,0 +1,646 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "base64ct" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851" + +[[package]] +name = "bench-contract" +version = "1.0.0" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.5", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "cosmwasm-crypto" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "digest 0.9.0", + "ed25519-zebra", + "k256", + "rand_core 0.6.3", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-std" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "forward_ref", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", +] + +[[package]] +name = "dyn-clone" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d07a982d1fb29db01e5a59b1918e03da4df7297eaeee7686ac45542fd4e59c8" + +[[package]] +name = "ecdsa" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.6.3", + "serde", + "sha2 0.9.9", + "thiserror", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array", + "group", + "rand_core 0.6.3", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "group" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +dependencies = [ + "ff", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "k256" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sec1", + "sha2 0.9.9", +] + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "proc-macro2" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "schemars" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "signature" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +dependencies = [ + "digest 0.9.0", + "rand_core 0.6.3", +] + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "uint" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml new file mode 100644 index 000000000..26835d8bc --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "bench-contract" +version = "1.0.0" +authors = ["Enigma "] +edition = "2018" +description = "A Test contract intended to use in system tests for the Secret Netowrk" +license = "MIT" +exclude = [ + # Those files are cosmwasm-opt artifacts. You might want to commit them for convenience but they should not be part of the source code publication. + "bench-contract.wasm", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = 'abort' +incremental = false +overflow-checks = true + +[dependencies] +cosmwasm-std = { git = "https://github.com/scrtlabs/cosmwasm", branch = "secret" } +cosmwasm-storage = { git = "https://github.com/scrtlabs/cosmwasm", branch = "secret" } +schemars = "0.8.1" +serde = { version = "1.0.114", default-features = false, features = [ + "derive", + "alloc" +] } +serde-json-wasm = "0.4.1" +sha2 = "0.10.2" diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile new file mode 100644 index 000000000..95e0c87f7 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile @@ -0,0 +1,8 @@ +all: src/contract.rs src src src Cargo.toml Cargo.lock + rustup target add wasm32-unknown-unknown + RUSTFLAGS='-C link-arg=-s' cargo build --release --target wasm32-unknown-unknown + cp ./target/wasm32-unknown-unknown/release/v1_sanity_contract.wasm ./v1-contract.wasm + +clean: + cargo clean + -rm -f ./v1-contract.wasm diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain b/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain new file mode 100644 index 000000000..a7efc46ca --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain @@ -0,0 +1 @@ +1.61 \ No newline at end of file diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs new file mode 100644 index 000000000..c05f363f6 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs @@ -0,0 +1,21 @@ +use cosmwasm_std::{StdError, StdResult}; + +pub fn do_allocate_large_memory() -> StdResult<()> { + // We create memory pages explicitely since Rust's default allocator seems to be clever enough + // to not grow memory for unused capacity like `Vec::::with_capacity(100 * 1024 * 1024)`. + // Even with std::alloc::alloc the memory did now grow beyond 1.5 MiB. + + #[cfg(target_arch = "wasm32")] + { + use core::arch::wasm32; + let pages = 1_600; // 100 MiB + let ptr = wasm32::memory_grow(0, pages); + if ptr == usize::max_value() { + return Err(StdError::generic_err("Error in memory.grow instruction")); + } + Ok(()) + } + + #[cfg(not(target_arch = "wasm32"))] + Err(StdError::generic_err("Unsupported architecture")) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs new file mode 100644 index 000000000..cc000004e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs @@ -0,0 +1,19 @@ +use sha2::{Digest, Sha256}; + +// use crate::msg::BenchResponse; +use cosmwasm_std::StdError; + +const BENCH_NAME: &str = "bench_cpu_sha256"; + +pub fn do_cpu_loop(num_of_runs: usize) -> Result<(), StdError> { + let mut hashed: Vec = BENCH_NAME.into(); + for _i in 1..num_of_runs { + hashed = Sha256::digest(&hashed).to_vec() + } + + Ok(()) + // Ok(BenchResponse { + // name: BENCH_NAME.to_string(), + // time: 0, + // }) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs new file mode 100644 index 000000000..7b9f1eb72 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod allocate; +pub(crate) mod cpu; +pub(crate) mod read_storage; +pub(crate) mod write_storage; diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs new file mode 100644 index 000000000..aabfa72fe --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs @@ -0,0 +1,21 @@ +use cosmwasm_std::{Deps, DepsMut, StdResult}; + +pub fn bench_read_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { + deps.storage.set(b"test.key", b"test.value"); + + for _ in 1..keys { + deps.storage.get(b"test.key"); + } + + Ok(()) +} + +#[allow(dead_code)] +/// call this test only after the bench of write storage, so the keys are populated +pub fn bench_read_storage_different_key(deps: Deps, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.get(&i.to_be_bytes()).unwrap(); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs new file mode 100644 index 000000000..2f60b21cb --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs @@ -0,0 +1,18 @@ +use cosmwasm_std::{DepsMut, StdResult}; + +#[allow(dead_code)] +pub fn bench_write_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.set(b"test.key", i.to_string().as_bytes()); + } + + Ok(()) +} + +pub fn bench_write_storage_different_key(deps: DepsMut, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.set(&i.to_be_bytes(), i.to_string().as_bytes()); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs new file mode 100644 index 000000000..6b023066e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs @@ -0,0 +1,51 @@ +use benches::cpu::do_cpu_loop; + +use crate::benches; +use crate::benches::allocate::do_allocate_large_memory; +use crate::benches::read_storage::bench_read_storage_same_key; +use crate::benches::write_storage::bench_write_storage_different_key; +use cosmwasm_std::{ + entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdResult, +}; + +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[entry_point] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + Ok(Response::default()) +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + let _ = match msg { + ExecuteMsg::Noop {} => Ok(()), + ExecuteMsg::BenchCPU {} => do_cpu_loop(5000), + ExecuteMsg::BenchReadStorage {} => bench_read_storage_same_key(deps, 100), + ExecuteMsg::BenchWriteStorage {} => bench_write_storage_different_key(deps, 100), + ExecuteMsg::BenchAllocate {} => do_allocate_large_memory(), + ExecuteMsg::BenchReadLargeItemFromStorage { .. } => Ok(()), + ExecuteMsg::BenchWriteLargeItemToStorage { .. } => Ok(()), + }; + + Ok(Response::default()) +} + +#[entry_point] +pub fn query(_deps: Deps, _env: Env, _msg: QueryMsg) -> StdResult { + Ok(Binary::default()) +} + +#[entry_point] +pub fn reply(_deps: DepsMut, _env: Env, _reply: Reply) -> StdResult { + Ok(Response::default()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs new file mode 100644 index 000000000..635c14b17 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs @@ -0,0 +1,3 @@ +pub mod benches; +pub mod contract; +pub mod msg; diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs new file mode 100644 index 000000000..db4128c9e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs @@ -0,0 +1,33 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum InstantiateMsg { + Init {}, +} + +// #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +// #[serde(rename_all = "snake_case")] +// pub struct BenchResponse { +// /// benchmark name +// name: String, +// /// time in nanos to run the test +// time: u64, +// } + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + Noop {}, + BenchCPU {}, + BenchReadStorage {}, + BenchWriteStorage {}, + BenchAllocate {}, + BenchReadLargeItemFromStorage {}, + BenchWriteLargeItemToStorage {}, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg {} diff --git a/deployment/dockerfiles/dev-image.Dockerfile b/deployment/dockerfiles/dev-image.Dockerfile index 1995a2b84..b9f8d4a71 100644 --- a/deployment/dockerfiles/dev-image.Dockerfile +++ b/deployment/dockerfiles/dev-image.Dockerfile @@ -3,6 +3,9 @@ ARG SCRT_BASE_IMAGE=build-release FROM $SCRT_BASE_IMAGE as build-localsecret COPY deployment/docker/devimage/bootstrap_init_no_stop.sh bootstrap_init.sh + +RUN chmod +x bootstrap_init.sh + COPY deployment/docker/devimage/faucet/faucet_server.js . HEALTHCHECK --interval=5s --timeout=1s --retries=120 CMD bash -c 'curl -sfm1 http://localhost:26657/status && curl -s http://localhost:26657/status | jq -e "(.result.sync_info.latest_block_height | tonumber) > 0"' diff --git a/go.mod b/go.mod index 1bda63a76..947b12c63 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/cosmos/ibc-go/v3 v3.3.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 + github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b github.com/google/gofuzz v1.2.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -33,6 +34,12 @@ require github.com/cosmos/gorocksdb v1.2.0 // indirect require ( github.com/creachadair/taskgroup v0.3.2 // indirect github.com/dgraph-io/badger/v2 v2.2007.3 // indirect + github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect + github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect + github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 // indirect + github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 // indirect + github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect + github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/pelletier/go-toml/v2 v2.0.2 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect diff --git a/go.sum b/go.sum index 5f1ea7897..f0111ef72 100644 --- a/go.sum +++ b/go.sum @@ -316,6 +316,20 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 h1:GUSkTcIe1SlregbHNUKbYDhBsS8lNgYfIp4S4cToUyU= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b h1:fbskpz/cPqWH8VqkQ7LJghFkl2KPAiIFUHrTJ2O3RGk= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= diff --git a/x/compute/client/utils/utils.go b/x/compute/client/utils/utils.go index 91f5635d9..412db39e7 100644 --- a/x/compute/client/utils/utils.go +++ b/x/compute/client/utils/utils.go @@ -156,6 +156,7 @@ func (ctx WASMContext) getConsensusIoPubKey() ([]byte, error) { ioPubkey, err := ra.UNSAFE_VerifyRaCert(masterIoKey.Key) if err != nil { + println(masterIoKey.Key) return nil, err } diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go new file mode 100644 index 000000000..143b5f795 --- /dev/null +++ b/x/compute/internal/keeper/bench_test.go @@ -0,0 +1,212 @@ +package keeper + +import ( + "fmt" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/gonum/stat" + "github.com/stretchr/testify/require" + "math" + "os" + "testing" + "time" +) + +type Bench string + +// Available benches +const ( + Noop Bench = "noop" + BenchCPU = "bench_c_p_u" + BenchReadStorage = "bench_read_storage" + BenchWriteStorage = "bench_write_storage" + BenchAllocate = "bench_allocate" + BenchReadLargeItemFromStorage = "bench_read_large_item_from_storage" + BenchWriteLargeItemToStorage Bench = "bench_write_large_item_from_storage" +) + +func buildBenchMessage(bench Bench) []byte { + x := fmt.Sprintf("{\"%s\": {}}", bench) + return []byte(x) +} + +type BenchTime struct { + Name string + Case Bench + Mean float64 + iterations uint64 + Min time.Duration + Max time.Duration + datapoints []float64 + StdEv float64 + AvgGas uint64 +} + +func NewBenchTimer(name string, bench Bench) BenchTime { + return BenchTime{ + Name: name, + Case: bench, + Mean: 0, + Min: math.MaxInt64, + Max: 0, + datapoints: []float64{}, + StdEv: 0, + AvgGas: 0, + } +} + +func (b *BenchTime) appendGas(gasUsed uint64) { + currentAvgGas := b.AvgGas * b.iterations + newAvgSum := currentAvgGas + gasUsed + + b.AvgGas = newAvgSum / (b.iterations + 1) +} + +func (b *BenchTime) AppendResult(singleRunTime time.Duration, gasUsed uint64) { + + b.appendGas(gasUsed) + b.iterations += 1 + + b.datapoints = append(b.datapoints, float64(singleRunTime)) + + if singleRunTime > b.Max { + b.Max = singleRunTime + } + if singleRunTime < b.Min { + b.Min = singleRunTime + } + + //currentAvgSum := uint64(b.Mean) * b.iterations + //newAvgSum := currentAvgSum + uint64(singleRunTime) + + //b.Mean = time.Duration(newAvgSum / b.iterations) + // + b.Mean, b.StdEv = stat.MeanStdDev(b.datapoints, nil) + +} + +func (b *BenchTime) PrintReport() { + + stdevTime := time.Duration(math.Floor(b.StdEv)) + stdevMean := time.Duration(math.Floor(b.Mean)) + + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Value: %f [Kgas/ms]", + b.Name, + b.Case, + b.iterations, + stdevMean, + b.Min, + b.Max, + stdevTime, + b.AvgGas, + float64(b.AvgGas)/b.Mean*1000, + ) + + // todo: log this properly + println(s) +} + +func initBenchContract(t *testing.T) (contract sdk.AccAddress, creator sdk.AccAddress, creatorPriv crypto.PrivKey, ctx sdk.Context, keeper Keeper) { + + encodingConfig := MakeEncodingConfig() + + encoders := DefaultEncoders(nil, encodingConfig.Marshaler) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, &encoders, nil) + accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper + + deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) + creator, creatorPriv = CreateFakeFundedAccount(ctx, accKeeper, keeper.bankKeeper, deposit.Add(deposit...)) + + // store the code + wasmCode, err := os.ReadFile(TestContractPaths[benchContract]) + require.NoError(t, err) + codeID, err := keeper.Create(ctx, creator, wasmCode, "", "") + require.NoError(t, err) + + _, _, contractAddr, _, initErr := initHelper(t, keeper, ctx, codeID, creator, creatorPriv, `{"init": {}}`, true, true, defaultGasForTests) + require.Empty(t, initErr) + + return contractAddr, creator, creatorPriv, ctx, keeper +} + +func TestRunBenchmarks(t *testing.T) { + + cases := map[string]struct { + gasLimit uint64 + bench Bench + loops uint64 + callbackfn func() uint64 + }{ + "warmup": { + gasLimit: 1_000_000, + bench: Noop, + loops: 10, + }, + "Empty execution (contract startup time)": { + gasLimit: 1_000_000, + bench: Noop, + loops: 10, + }, + "CPU 5000 rounds of sha2": { + gasLimit: 1_000_000, + bench: BenchCPU, + loops: 10, + }, + "Storage Write 100 different keys": { + gasLimit: 1_000_000, + bench: BenchWriteStorage, + loops: 10, + }, + "Storage Read 100 times same key": { + gasLimit: 1_000_000, + bench: BenchReadStorage, + loops: 10, + }, + } + + contractAddr, creator, creatorPriv, ctx, keeper := initBenchContract(t) + + timers := make(map[string]BenchTime) + + for name, tc := range cases { + + t.Run(name, func(t *testing.T) { + timer := NewBenchTimer(name, tc.bench) + // make sure we set a limit before calling + ctx = ctx.WithGasMeter(sdk.NewGasMeter(tc.gasLimit)) + require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) + + msg := buildBenchMessage(tc.bench) + + for i := uint64(1); i < tc.loops+1; i++ { + start := time.Now() + // call bench + _, _, qErr, _, gasUsed, _ := execHelper( + t, + keeper, + ctx, + contractAddr, + creator, + creatorPriv, + string(msg), + false, + true, + tc.gasLimit, + 0, + false, + ) + elapsed := time.Since(start) + require.Empty(t, qErr) + println("Gas used by execute: %d", gasUsed) + timer.AppendResult(elapsed, gasUsed) + } + timers[name] = timer + }) + + } + + for name := range cases { + timer, _ := timers[name] + timer.PrintReport() + } +} diff --git a/x/compute/internal/keeper/test_common.go b/x/compute/internal/keeper/test_common.go index b5078e849..508b729cd 100644 --- a/x/compute/internal/keeper/test_common.go +++ b/x/compute/internal/keeper/test_common.go @@ -109,6 +109,8 @@ const ( staticTooHighMemoryContract = "static-too-high-initial-memory.wasm" ) +const benchContract = "bench_contract.wasm" + const contractPath = "testdata" var TestContractPaths = map[string]string{ @@ -120,6 +122,7 @@ var TestContractPaths = map[string]string{ v010WithFloats: filepath.Join(".", contractPath, v010WithFloats), tooHighMemoryContract: filepath.Join(".", contractPath, tooHighMemoryContract), staticTooHighMemoryContract: filepath.Join(".", contractPath, staticTooHighMemoryContract), + benchContract: filepath.Join(".", contractPath, benchContract), } var ( diff --git a/x/compute/internal/keeper/testdata/bench_contract.wasm b/x/compute/internal/keeper/testdata/bench_contract.wasm new file mode 100644 index 000000000..31d0d5c29 Binary files /dev/null and b/x/compute/internal/keeper/testdata/bench_contract.wasm differ