From 4b5ce32ecaf2dde74b199c6e0f230d8592825f36 Mon Sep 17 00:00:00 2001 From: Evgeny Fomin Date: Wed, 22 May 2024 11:48:08 +0200 Subject: [PATCH] json schema faker feature --- Cargo.lock | 829 +++++++++++++++++- packages/rs-dapi-grpc-macros/src/lib.rs | 5 +- packages/rs-dpp/Cargo.toml | 4 + .../document_type/random_document.rs | 92 +- .../document_type/v0/random_document.rs | 136 ++- 5 files changed, 1045 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dada11a73f..3780315c9a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,6 +57,12 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -126,6 +132,12 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + [[package]] name = "arc-swap" version = "1.7.1" @@ -337,6 +349,15 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bincode" version = "2.0.0-rc.3" @@ -614,6 +635,71 @@ dependencies = [ "serde", ] +[[package]] +name = "cap-fs-ext" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e341d15ac1029aadce600be764a1a1edafe40e03cde23285bc1d261b3a4866" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", +] + +[[package]] +name = "cap-primitives" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe16767ed8eee6d3f1f00d6a7576b81c226ab917eb54b96e5f77a5216ef67abb" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes 2.0.3", + "ipnet", + "maybe-owned", + "rustix 0.38.34", + "windows-sys 0.52.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20e5695565f0cd7106bc3c7170323597540e772bb73e0be2cd2c662a0f8fa4ca" +dependencies = [ + "ambient-authority", + "rand", +] + +[[package]] +name = "cap-std" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "593db20e4c51f62d3284bae7ee718849c3214f93a3b94ea1899ad85ba119d330" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes 2.0.3", + "rustix 0.38.34", +] + +[[package]] +name = "cap-time-ext" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03261630f291f425430a36f38c847828265bc928f517cdd2004c56f4b02f002b" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix 0.38.34", + "winx", +] + [[package]] name = "cargo-platform" version = "0.1.8" @@ -887,6 +973,115 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c22542c0b95bd3302f7ed6839869c561f2324bac2fd5e7e99f5cfa65fdc8b92" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3db903ef2e9c8a4de2ea6db5db052c7857282952f9df604aa55d169e6000d8" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.14.3", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6590feb5a1d6438f974bf6a5ac4dddf69fca14e1f07f3265d880f69e61a94463" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7239038c56fafe77fddc8788fc8533dd6c474dc5bdc5637216404f41ba807330" + +[[package]] +name = "cranelift-control" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7dc9c595341404d381d27a3d950160856b35b402275f0c3990cd1ad683c8053" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44e3ee532fc4776c69bcedf7e62f9632cbb3f35776fa9a525cdade3195baa3f7" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a612c94d09e653662ec37681dc2d6fd2b9856e6df7147be0afc9aabb0abf19df" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85db9830abeb1170b7d29b536ffd55af1d4d26ac8a77570b5d1aca003bf225cc" + +[[package]] +name = "cranelift-native" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301ef0edafeaeda5771a5d2db64ac53e1818ae3111220a185677025fe91db4a1" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380f0abe8264e4570ac615fc31cef32a3b90a77f7eb97b08331f9dd357b1f500" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools 0.10.5", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + [[package]] name = "crc32fast" version = "1.4.0" @@ -932,6 +1127,19 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + [[package]] name = "crossbeam-channel" version = "0.5.12" @@ -960,6 +1168,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" @@ -1092,7 +1309,7 @@ version = "1.0.0-dev.14" dependencies = [ "async-trait", "base64 0.22.0", - "bincode", + "bincode 2.0.0-rc.3", "bip37-bloom-filter", "ciborium", "clap 4.5.4", @@ -1163,7 +1380,7 @@ name = "dashcore-rpc-json" version = "0.15.1" source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.2#9e596142f589d32a7347872b8f5c2b3b2ed54257" dependencies = [ - "bincode", + "bincode 2.0.0-rc.3", "dashcore", "hex", "serde", @@ -1274,6 +1491,37 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dircpy" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29259db751c34980bfc44100875890c507f585323453b91936960ab1104272ca" +dependencies = [ + "jwalk", + "log", + "walkdir", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -1304,7 +1552,7 @@ dependencies = [ "assert_matches", "async-trait", "base64 0.22.0", - "bincode", + "bincode 2.0.0-rc.3", "bls-signatures", "bs58 0.4.0", "byteorder", @@ -1322,6 +1570,7 @@ dependencies = [ "integer-encoding", "itertools 0.12.1", "json-schema-compatibility-validator", + "json-schema-faker", "jsonschema", "lazy_static", "log", @@ -1392,7 +1641,7 @@ dependencies = [ "async-trait", "atty", "base64 0.20.0", - "bincode", + "bincode 2.0.0-rc.3", "chrono", "ciborium", "clap 4.5.4", @@ -1614,6 +1863,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fancy-regex" version = "0.13.0" @@ -1640,6 +1895,17 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +[[package]] +name = "fd-lock" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +dependencies = [ + "cfg-if", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + [[package]] name = "feature-flags-contract" version = "1.0.0-dev.14" @@ -1746,6 +2012,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" +[[package]] +name = "fs-set-times" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +dependencies = [ + "io-lifetimes 2.0.3", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + [[package]] name = "fs_extra" version = "1.3.0" @@ -1890,6 +2167,11 @@ name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "fallible-iterator", + "indexmap 2.2.6", + "stable_deref_trait", +] [[package]] name = "glob" @@ -1902,7 +2184,7 @@ name = "grovedb" version = "1.0.0-rc.2" source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ - "bincode", + "bincode 2.0.0-rc.3", "grovedb-costs", "grovedb-merk", "grovedb-path", @@ -2037,6 +2319,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -2363,6 +2654,16 @@ dependencies = [ "serde", ] +[[package]] +name = "io-extras" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f046b9af244f13b3bd939f55d16830ac3a201e8a9ba9661bfcb03e2be72b9b" +dependencies = [ + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -2374,6 +2675,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + [[package]] name = "ipnet" version = "2.9.0" @@ -2474,6 +2781,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "json-schema-faker" +version = "0.1.0" +source = "git+https://github.com/fominok/json-schema-faker-rs?rev=2dd1cf7#2dd1cf7ea17b9246aa2aabd7026a3a320e3fa903" +dependencies = [ + "dircpy", + "serde_json", + "thiserror", + "wasi-common", + "wasmtime", + "wasmtime-wasi", +] + [[package]] name = "jsonrpc" version = "0.14.1" @@ -2511,6 +2831,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "jwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2735847566356cd2179a2a38264839308f7079fa96e6bd5a42d740460e003c56" +dependencies = [ + "crossbeam", + "rayon", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2523,6 +2853,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "lhash" version = "1.1.0" @@ -2545,6 +2881,16 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + [[package]] name = "librocksdb-sys" version = "0.16.0+8.10.0" @@ -2619,6 +2965,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "mach2" version = "0.4.2" @@ -2653,12 +3008,36 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "memchr" version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix 0.38.34", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.22.3" @@ -2992,6 +3371,9 @@ version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ + "crc32fast", + "hashbrown 0.14.3", + "indexmap 2.2.6", "memchr", ] @@ -3166,7 +3548,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" name = "platform-serialization" version = "1.0.0-dev.14" dependencies = [ - "bincode", + "bincode 2.0.0-rc.3", "platform-version", ] @@ -3185,7 +3567,7 @@ name = "platform-value" version = "1.0.0-dev.14" dependencies = [ "base64 0.22.0", - "bincode", + "bincode 2.0.0-rc.3", "bs58 0.5.1", "ciborium", "hex", @@ -3512,6 +3894,15 @@ dependencies = [ "prost 0.12.4", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3666,6 +4057,30 @@ dependencies = [ "bitflags 2.5.0", ] +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", +] + [[package]] name = "regex" version = "1.10.4" @@ -3866,7 +4281,7 @@ checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", - "io-lifetimes", + "io-lifetimes 1.0.11", "libc", "linux-raw-sys 0.3.8", "windows-sys 0.48.0", @@ -3880,8 +4295,10 @@ checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", + "itoa", "libc", "linux-raw-sys 0.4.13", + "once_cell", "windows-sys 0.52.0", ] @@ -4210,6 +4627,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" @@ -4244,7 +4670,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" name = "simple-signer" version = "1.0.0-dev.14" dependencies = [ - "bincode", + "bincode 2.0.0-rc.3", "dashcore-rpc", "dpp", ] @@ -4279,6 +4705,12 @@ dependencies = [ "autocfg", ] +[[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.2" @@ -4321,6 +4753,12 @@ dependencies = [ "der", ] +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "sqlparser" version = "0.38.0" @@ -4330,11 +4768,17 @@ dependencies = [ "log", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strategy-tests" version = "1.0.0-dev.14" dependencies = [ - "bincode", + "bincode 2.0.0-rc.3", "dpp", "drive", "futures", @@ -4470,6 +4914,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-interface" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0682e006dd35771e392a6623ac180999a9a854b1d4a6c12fb2e804941c2b1f58" +dependencies = [ + "bitflags 2.5.0", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes 2.0.3", + "rustix 0.38.34", + "windows-sys 0.52.0", + "winx", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -4482,6 +4942,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "tempfile" version = "3.10.1" @@ -5214,6 +5680,49 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi-cap-std-sync" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "154528979a211aa28d969846e883df75705809ed9bcc70aba61460683ea7355b" +dependencies = [ + "anyhow", + "async-trait", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes 2.0.3", + "once_cell", + "rustix 0.38.34", + "system-interface", + "tracing", + "wasi-common", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasi-common" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d888b611fee7d273dd057dc009d2dd3132736f36710ffd65657ac83628d1e3b" +dependencies = [ + "anyhow", + "bitflags 2.5.0", + "cap-rand", + "cap-std", + "io-extras", + "log", + "rustix 0.38.34", + "thiserror", + "tracing", + "wasmtime", + "wiggle", + "windows-sys 0.48.0", +] + [[package]] name = "wasm-bindgen" version = "0.2.86" @@ -5303,6 +5812,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-encoder" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +dependencies = [ + "leb128", +] + [[package]] name = "wasm-logger" version = "0.2.0" @@ -5314,6 +5832,233 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.118.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f1154f1ab868e2a01d9834a805faca7bf8b50d041b4ca714d005d0dab1c50c" +dependencies = [ + "indexmap 2.2.6", + "semver", +] + +[[package]] +name = "wasmtime" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e539fded2495422ea3c4dfa7beeddba45904eece182cf315294009e1a323bf" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "bumpalo", + "cfg-if", + "indexmap 2.2.6", + "libc", + "log", + "object", + "once_cell", + "paste", + "serde", + "serde_derive", + "serde_json", + "target-lexicon", + "wasmparser", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "660ba9143e15a2acd921820df221b73aee256bd3ca2d208d73d8adc9587ccbb9" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cranelift" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d648c8b4064a7911093b02237cd5569f71ca171d3a0a486bf80600b19e1cba2" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290a89027688782da8ff60b12bb95695494b1874e0d0ba2ba387d23dace6d70c" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-control", + "cranelift-native", + "gimli", + "object", + "target-lexicon", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61eb64fb3e0da883e2df4a13a81d6282e072336e6cb6295021d0f7ab2e352754" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli", + "indexmap 2.2.6", + "log", + "object", + "serde", + "serde_derive", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f485336add49267d8859e8f8084d2d4b9a4b1564496b6f30ba5b168d50c10ceb" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "cfg-if", + "gimli", + "log", + "object", + "rustix 0.38.34", + "serde", + "serde_derive", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b6d197fcc34ad32ed440e1f9552fd57d1f377d9699d31dee1b5b457322c1f8a" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794b2bb19b99ef8322ff0dd9fe1ba7e19c41036dfb260b3f99ecce128c42ff92" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap 2.2.6", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "psm", + "rustix 0.38.34", + "sptr", + "wasm-encoder", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-versioned-export-macros", + "wasmtime-wmemcheck", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-types" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d995db8bb56f2cd8d2dc0ed5ffab94ffb435283b0fe6747f80f7aab40b2d06a1" +dependencies = [ + "cranelift-entity", + "serde", + "serde_derive", + "thiserror", + "wasmparser", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c5565959287c21dd0f4277ae3518dd2ae62679f655ee2dbc4396e19d210db" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "wasmtime-wasi" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd8370078149d49a3a47e93741553fd79b700421464b6a27ca32718192ab130" +dependencies = [ + "anyhow", + "bytes", + "io-extras", + "libc", + "log", + "once_cell", + "url", + "wasi-cap-std-sync", + "wasi-common", + "wasmtime", + "wiggle", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-wmemcheck" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67761d8f8c0b3c13a5d34356274b10a40baba67fe9cfabbfc379a8b414e45de2" + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + [[package]] name = "web-sys" version = "0.3.63" @@ -5345,6 +6090,48 @@ dependencies = [ "rustix 0.38.34", ] +[[package]] +name = "wiggle" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0afb26cd3269289bb314a361ff0a6685e5ce793b62181a9fe3f81ace15051697" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.5.0", + "thiserror", + "tracing", + "wasmtime", + "wiggle-macro", +] + +[[package]] +name = "wiggle-generate" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef2868fed7584d2b552fa317104858ded80021d23b073b2d682d3c932a027bd" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.60", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ae1ec11a17ea481539ee9a5719a278c9790d974060fbf71db4b2c05378780b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5542,6 +6329,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winx" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +dependencies = [ + "bitflags 2.5.0", + "windows-sys 0.52.0", +] + [[package]] name = "withdrawals-contract" version = "1.0.0-dev.14" @@ -5555,6 +6352,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror", + "wast", +] + [[package]] name = "wyz" version = "0.5.1" diff --git a/packages/rs-dapi-grpc-macros/src/lib.rs b/packages/rs-dapi-grpc-macros/src/lib.rs index 740e09010bc..8d5851e35f4 100644 --- a/packages/rs-dapi-grpc-macros/src/lib.rs +++ b/packages/rs-dapi-grpc-macros/src/lib.rs @@ -115,6 +115,7 @@ pub fn versioned_grpc_response_derive(input: TokenStream) -> TokenStream { quote! { #mod_ident::Version::#version_ident(inner) => match &inner.result { Some(#mod_ident::#version_mod_ident::Result::Proof(proof)) => Ok(proof), + // TODO: this substitutes any error that could be received instead of a proof, not just version-related _ => return Err(::platform_version::error::PlatformVersionError::UnknownVersionError("unknown proof version not known".to_string())), }, } @@ -130,6 +131,7 @@ pub fn versioned_grpc_response_derive(input: TokenStream) -> TokenStream { quote! { #mod_ident::Version::#version_ident(inner) => match inner.result { Some(#mod_ident::#version_mod_ident::Result::Proof(proof)) => Ok(proof), + // TODO: this substitutes any error that could be received instead of a proof, not just version-related _ => return Err(::platform_version::error::PlatformVersionError::UnknownVersionError("unknown proof version not known".to_string())), }, } @@ -138,8 +140,7 @@ pub fn versioned_grpc_response_derive(input: TokenStream) -> TokenStream { let metadata_arms = (0..=versions).map(|version| { let version_ident = format_ident!("V{}", version); quote! { - #mod_ident::Version::#version_ident(inner) => inner.metadata.as_ref().ok_or(platform_version::error::PlatformVersionError:: - UnknownVersionError("result did not have metadata".to_string())), + #mod_ident::Version::#version_ident(inner) => inner.metadata.as_ref().ok_or(platform_version::error::PlatformVersionError:: UnknownVersionError("result did not have metadata".to_string())), } }); diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 20cacf510c3..64b9ee8eb38 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -38,6 +38,7 @@ itertools = { version = "0.12.1" } jsonschema = { git = "https://github.com/fominok/jsonschema-rs", branch = "feat-unevaluated-properties", default-features = false, features = [ "draft202012", ], optional = true } +json-schema-faker = { git = "https://github.com/fominok/json-schema-faker-rs", rev = "2dd1cf7", optional = true } lazy_static = { version = "1.4" } log = { version = "0.4.6" } num_enum = "0.5.7" @@ -265,3 +266,6 @@ extended-document = [ factories = [] client = ["factories", "state-transitions"] + +# Faker feature requires `npm` and `javy` to be installed at build time +documents-faker = ["dep:json-schema-faker", "document-serde-conversion"] diff --git a/packages/rs-dpp/src/data_contract/document_type/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/random_document.rs index e64256540ee..258b58d79bb 100644 --- a/packages/rs-dpp/src/data_contract/document_type/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/random_document.rs @@ -1,12 +1,18 @@ +#[cfg(feature = "documents-faker")] +use std::collections::BTreeMap; + +use bincode::{Decode, Encode}; +#[cfg(feature = "documents-faker")] +use platform_value::Value; +use platform_value::{Bytes32, Identifier}; +use rand::prelude::StdRng; + use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::document::Document; use crate::identity::Identity; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::version::PlatformVersion; use crate::ProtocolError; -use bincode::{Decode, Encode}; -use platform_value::{Bytes32, Identifier}; -use rand::prelude::StdRng; #[derive(Clone, Copy, Debug, Eq, PartialEq, Encode, Decode)] pub enum DocumentFieldFillType { @@ -29,6 +35,17 @@ pub enum DocumentFieldFillSize { // TODO The factory is used in benchmark and tests. Probably it should be available under the test feature /// Functions for creating various types of random documents. pub trait CreateRandomDocument { + #[cfg(feature = "documents-faker")] + /// Create random documents using json-schema-faker-rs + fn random_documents_faker( + &self, + owner_id: Identifier, + entropy: &Bytes32, + count: u32, + platform_version: &PlatformVersion, + substitutions: &BTreeMap<&str, Value>, + ) -> Result, ProtocolError>; + /// Generates a single random document, employing default behavior for document field /// filling where fields that are not required will not be filled (`DoNotFillIfNotRequired`) and /// any fill size that is contractually allowed may be used (`AnyDocumentFillSize`). @@ -195,6 +212,22 @@ pub trait CreateRandomDocument { } impl CreateRandomDocument for DocumentType { + #[cfg(feature = "documents-faker")] + fn random_documents_faker( + &self, + owner_id: Identifier, + entropy: &Bytes32, + count: u32, + platform_version: &PlatformVersion, + substitutions: &BTreeMap<&str, Value>, + ) -> Result, ProtocolError> { + match self { + DocumentType::V0(v0) => { + v0.random_documents_faker(owner_id, entropy, count, platform_version, substitutions) + } + } + } + fn random_document( &self, seed: Option, @@ -313,6 +346,22 @@ impl CreateRandomDocument for DocumentType { } impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { + #[cfg(feature = "documents-faker")] + fn random_documents_faker( + &self, + owner_id: Identifier, + entropy: &Bytes32, + count: u32, + platform_version: &PlatformVersion, + substitutions: &BTreeMap<&str, Value>, + ) -> Result, ProtocolError> { + match self { + DocumentTypeRef::V0(v0) => { + v0.random_documents_faker(owner_id, entropy, count, platform_version, substitutions) + } + } + } + fn random_document( &self, seed: Option, @@ -430,3 +479,40 @@ impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { } } } + +#[cfg(all(test, feature = "documents-faker"))] +mod faker_tests { + use data_contracts::SystemDataContract; + use platform_version::TryIntoPlatformVersioned; + use rand::SeedableRng; + + use crate::{ + data_contract::accessors::v0::DataContractV0Getters, + system_data_contracts::load_system_data_contract, + }; + + use super::*; + + #[test] + fn test_random_document_faker() { + let data_contract = + load_system_data_contract(SystemDataContract::DPNS, &PlatformVersion::latest()) + .unwrap(); + let mut rng = StdRng::from_entropy(); + let entropy = Bytes32::random_with_rng(&mut rng); + + let _random_documents = data_contract + .document_types() + .iter() + .next() + .unwrap() + .1 + .random_documents_faker( + Identifier::random(), + &entropy, + 2, + &PlatformVersion::latest(), + &Default::default(), + ); + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 2496f032be2..b72f30bc980 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -4,13 +4,21 @@ //! create various types of random documents. //! +#[cfg(feature = "documents-faker")] +use std::collections::BTreeMap; +use std::time::{SystemTime, UNIX_EPOCH}; + +#[cfg(feature = "documents-faker")] +use platform_value::Value; +use platform_value::{Bytes32, Identifier}; +use rand::rngs::StdRng; +use rand::{Rng, SeedableRng}; + +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; use crate::data_contract::document_type::v0::DocumentTypeV0; -use std::time::{SystemTime, UNIX_EPOCH}; - -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::document::property_names::{ CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, @@ -21,11 +29,127 @@ use crate::identity::Identity; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::version::PlatformVersion; use crate::ProtocolError; -use platform_value::{Bytes32, Identifier}; -use rand::rngs::StdRng; -use rand::{Rng, SeedableRng}; impl CreateRandomDocument for DocumentTypeV0 { + /// Create random documents using json-schema-faker-rs + #[cfg(feature = "documents-faker")] + fn random_documents_faker( + &self, + owner_id: Identifier, + entropy: &Bytes32, + count: u32, + platform_version: &PlatformVersion, + substitutions: &BTreeMap<&str, Value>, + ) -> Result, ProtocolError> { + use anyhow::Context; + + use crate::document::{ + extended_document_property_names::FEATURE_VERSION, + property_names::{ID, OWNER_ID, REVISION}, + serialization_traits::DocumentPlatformValueMethodsV0, + }; + + let json_schema = &self + .schema + .clone() + .try_into() + .expect("jsonschema must be a valid JSON"); + let json_documents = json_schema_faker::generate(&json_schema, count as u16) + .context("cannot generate a random document with json-schema-faker-rs")?; + + let fix_document = |mut document: platform_value::Value| { + let id = Document::generate_document_id_v0( + &self.data_contract_id, + &owner_id, + self.name.as_str(), + entropy.as_slice(), + ); + let now = SystemTime::now(); + let duration_since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); + let time_ms = duration_since_epoch.as_millis() as u64; + + if self.documents_mutable { + document.as_map_mut().into_iter().for_each(|d| { + d.push((REVISION.into(), 1.into())); + }); + } + document.as_map_mut().into_iter().for_each(|d| { + d.push((ID.into(), id.into())); + }); + document.as_map_mut().into_iter().for_each(|d| { + d.push((OWNER_ID.into(), owner_id.into())); + }); + if self.required_fields.contains(FEATURE_VERSION) { + document.as_map_mut().into_iter().for_each(|d| { + d.push((FEATURE_VERSION.into(), "0".into())); + }); + } + if self.required_fields.contains(CREATED_AT) { + document.as_map_mut().into_iter().for_each(|d| { + d.push((CREATED_AT.into(), time_ms.into())); + }); + } + if self.required_fields.contains(UPDATED_AT) { + document.as_map_mut().into_iter().for_each(|d| { + d.push((UPDATED_AT.into(), time_ms.into())); + }); + } + + document + }; + + json_documents + .into_iter() + .map(|d| { + let p_value: Value = d.into(); + let fixed_value = fix_document(p_value); + + // TODO: tl;dr use PlatformDeserialize instead of Deserialize for Documents + // + // `properties` is a `BTreeMap` with `platform_value::Value` as values, since + // `Document::from_platform_value` does deserialization through Serde's data model + // it losts some information like distinction between `Value::Bytes` and `Value::Bytes32`; + // The solution here is to let deserialize a `Document`, but put `properties` unprocessed + // since they were `platform_value::Value` and will be the same type again and no deserialization + // is needed, especially that lossy kind. + let mut properties = fixed_value + .to_map_ref() + .ok() + .and_then(|m| Value::map_into_btree_string_map(m.clone()).ok()) + .unwrap_or_default(); + let mut document = Document::from_platform_value(fixed_value, platform_version); + match document.as_mut() { + Ok(Document::V0(d)) => { + // This moves stored properties back to the document so it could skip unnecessary + // and wrong deserialization part + d.properties.iter_mut().for_each(|(k, v)| { + substitutions + .get(k.as_str()) + .cloned() + .or(properties.remove(k)) + .into_iter() + .for_each(|prop| { + // TODO: schema and internal DocumentType representations are incompatible + // Properties are tweaked though, because the only integer type supported by + // DPP is i64, while `platform_value::Value` distincts them, and json schema is + // even more permissive; however, we want our proofs to work and proofs use the + // DPP model. + *v = match prop { + Value::U64(x) => Value::I64(x as i64), + Value::U32(x) => Value::I64(x as i64), + Value::I32(x) => Value::I64(x as i64), + x => x, + }; + }) + }); + } + _ => {} + } + document + }) + .collect() + } + /// Creates a random Document using a seed if given, otherwise entropy. fn random_document( &self,