diff --git a/Cargo.lock b/Cargo.lock index 50bc5fd..afde9cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,15 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "ark-bn254" version = "0.4.0" @@ -255,6 +264,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.5" @@ -347,7 +362,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", "syn_derive", ] @@ -374,7 +389,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -448,9 +463,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation" @@ -497,9 +512,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -508,22 +523,21 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" dependencies = [ "cfg-if", ] @@ -534,7 +548,9 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core", + "serdect", "subtle", ] @@ -573,7 +589,61 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", +] + +[[package]] +name = "cust" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6cc71911e179f12483b9734120b45bd00bf64fab085cc4818428523eedd469" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "cust_core", + "cust_derive", + "cust_raw", + "find_cuda_helper", +] + +[[package]] +name = "cust_core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039f79662cb8f890cbf335e818cd522d6e3a53fe63f61d1aaaf859cd3d975f06" +dependencies = [ + "cust_derive", + "glam", + "mint", + "vek", +] + +[[package]] +name = "cust_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3bc95fe629aed92b2423de6ccff9e40174b21d19cb6ee6281a4d04ac72f66" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cust_raw" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf40d6ade12cb9828bbc844b9875c7b93d25e67a3c9bf61c7aa3ae09e402bf8" +dependencies = [ + "find_cuda_helper", +] + +[[package]] +name = "datalove-bloomclock" +version = "0.0.1" +dependencies = [ + "crypto-bigint", + "digest", ] [[package]] @@ -589,14 +659,18 @@ dependencies = [ name = "datalove-persona-core" version = "0.0.1" dependencies = [ + "anyhow", "borsh", + "datalove-persona-core", "datalove-persona-risc0", "digest", "ed25519-dalek", + "rand", "risc0-zkvm", "sha2", "signature", "thiserror", + "tracing-subscriber", ] [[package]] @@ -604,6 +678,7 @@ name = "datalove-persona-risc0" version = "0.0.1" dependencies = [ "risc0-build", + "risc0-zkvm", ] [[package]] @@ -704,6 +779,7 @@ checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek", "ed25519", + "rand_core", "serde", "sha2", "signature", @@ -740,9 +816,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.3.31" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +checksum = "4adbf0983fe06bd3a5c19c8477a637c2389feb0994eca7a59e3b961054aa7c0a" dependencies = [ "serde", ] @@ -804,6 +880,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +[[package]] +name = "find_cuda_helper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f9e65c593dd01ac77daad909ea4ad17f0d6d1776193fc8ea766356177abdad" +dependencies = [ + "glob", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -826,21 +911,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -912,7 +982,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -976,6 +1046,15 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "glam" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" +dependencies = [ + "num-traits", +] + [[package]] name = "glob" version = "0.3.1" @@ -1056,9 +1135,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1102,16 +1181,17 @@ dependencies = [ ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "hyper-rustls" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "bytes", + "futures-util", + "http", "hyper", - "native-tls", + "rustls", "tokio", - "tokio-native-tls", + "tokio-rustls", ] [[package]] @@ -1166,9 +1246,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" @@ -1208,7 +1288,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -1219,9 +1299,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "libm" @@ -1252,6 +1332,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matrixmultiply" version = "0.3.8" @@ -1301,6 +1390,12 @@ dependencies = [ "adler", ] +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + [[package]] name = "mio" version = "0.8.10" @@ -1318,24 +1413,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndarray" version = "0.15.6" @@ -1389,7 +1466,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -1409,6 +1486,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1438,50 +1516,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "openssl" -version = "0.10.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -1557,7 +1591,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -1629,7 +1663,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.39", + "syn 2.0.41", "tempfile", "which", ] @@ -1644,7 +1678,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -1764,8 +1798,17 @@ checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1776,9 +1819,15 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.2", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -1800,26 +1849,28 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-tls", + "hyper-rustls", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "system-configuration", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg", ] @@ -1881,6 +1932,7 @@ version = "0.20.0-alpha.1" dependencies = [ "anyhow", "bytemuck", + "cust", "downloader", "rand", "rayon", @@ -1906,6 +1958,7 @@ name = "risc0-circuit-rv32im" version = "0.20.0-alpha.1" dependencies = [ "anyhow", + "cust", "rand", "rayon", "risc0-circuit-rv32im-sys", @@ -1937,7 +1990,9 @@ name = "risc0-sys" version = "0.20.0-alpha.1" dependencies = [ "cc", + "cust", "risc0-build-kernel", + "sppark", ] [[package]] @@ -1947,6 +2002,7 @@ dependencies = [ "anyhow", "blake2", "bytemuck", + "cust", "digest", "ff", "hex", @@ -2042,9 +2098,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.26" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ "bitflags 2.4.1", "errno", @@ -2055,9 +2111,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", @@ -2065,6 +2121,15 @@ dependencies = [ "sct", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -2088,24 +2153,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "sct" @@ -2117,29 +2167,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.20" @@ -2166,7 +2193,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2192,6 +2219,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2264,6 +2301,15 @@ dependencies = [ "der", ] +[[package]] +name = "sppark" +version = "0.1.5" +source = "git+https://github.com/supranational/sppark.git?rev=17119848e21491244125d266b2d74f26be2514f0#17119848e21491244125d266b2d74f26be2514f0" +dependencies = [ + "cc", + "which", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2295,9 +2341,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" dependencies = [ "proc-macro2", "quote", @@ -2313,7 +2359,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2382,7 +2428,7 @@ checksum = "e4c60d69f36615a077cc7663b9cb8e42275722d23e58a7fa3d2c7f2915d09d04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2393,7 +2439,17 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", ] [[package]] @@ -2413,9 +2469,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" dependencies = [ "backtrace", "bytes", @@ -2428,12 +2484,12 @@ dependencies = [ ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "tokio-rustls" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "native-tls", + "rustls", "tokio", ] @@ -2494,7 +2550,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2506,6 +2562,20 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "once_cell", + "regex", + "thread_local", + "tracing", + "tracing-core", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -2530,9 +2600,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "typetag" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80960fd143d4c96275c0e60b08f14b81fbb468e79bc0ef8fbda69fb0afafae43" +checksum = "196976efd4a62737b3a2b662cda76efb448d099b1049613d7a5d72743c611ce0" dependencies = [ "erased-serde", "inventory", @@ -2543,13 +2613,13 @@ dependencies = [ [[package]] name = "typetag-impl" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc13d450dc4a695200da3074dacf43d449b968baee95e341920e47f61a3b40f" +checksum = "2eea6765137e2414c44c7b1e07c73965a118a72c46148e1e168b3fc9d3ccf3aa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2606,10 +2676,16 @@ dependencies = [ ] [[package]] -name = "vcpkg" -version = "0.2.15" +name = "vek" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "8085882662f9bc47fc8b0cdafa5e19df8f592f650c02b9083da8d45ac9eebd17" +dependencies = [ + "approx", + "num-integer", + "num-traits", + "rustc_version", +] [[package]] name = "version_check" @@ -2653,7 +2729,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", "wasm-bindgen-shared", ] @@ -2687,7 +2763,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2882,9 +2958,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.26" +version = "0.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" +checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" dependencies = [ "memchr", ] @@ -2910,22 +2986,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.29" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d075cf85bbb114e933343e087b92f2146bac0d55b534cbb8188becf0039948e" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.29" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86cd5ca076997b97ef09d3ad65efe811fa68c9e874cb636ccb211223a813b0c2" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -2945,7 +3021,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0faa881..204a0e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ edition = "2021" rust-version = "1.70" [workspace.dependencies] +anyhow = { version = "1.0", default-features = false } coerce = { version = "0.8", default-features = false} futures = { version = "0.3", default-features = false } # futures-channel = { version = "0.3", default-features = false } @@ -35,7 +36,7 @@ thiserror = { version = "1.0", default-features = false } tokio = { version = "1.28", default-features = false } tracing = { version = "0.1", default-features = false } tracing-futures = { version = "0.2", default-features = false } -tracing-subscriber = { version = "0.2", default-features = false } +tracing-subscriber = { version = "0.3", default-features = false } # # wasm wasmtime = { version = "13.0", default-features = false } @@ -53,11 +54,13 @@ wit-bindgen-rust = { version = "0.12", default-features = false } # crypto, zk borsh = { version = "1.2", default-features = false } cid = { version = "0.10", default-features = false } +crypto-bigint = { version = "0.5", default-features = false, features = [] } digest = { version = "0.10", default-features = false } ed25519-dalek = { version = "2.1", default-features = false } # k256 = { git = "https://github.com/risc0/rustcrypto-elliptic-curves", branch = "risc0" } # pqc_kyber = {version = "0.7.1", default-features = false } merkle-log = { version = "0.0.9", default-features = false } +rand = { version = "0.8", default-features = false } sha2 = { version = "0.10", default-features = false } signature = { version = "2.2", default-features = false } # veilid-core = { version = "0.2.3", default-features = false, features = [ diff --git a/components/persona/Cargo.toml b/components/persona/Cargo.toml index 0b77f24..b5cdbb1 100644 --- a/components/persona/Cargo.toml +++ b/components/persona/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "datalove-persona" -authors.workspace = true -version.workspace = true -edition.workspace = true +authors = { workspace = true } +version = { workspace = true } +edition = { workspace = true } [dependencies] datalove-persona-core = { path = "./core", default-features = false, features = [ diff --git a/components/persona/core/Cargo.toml b/components/persona/core/Cargo.toml index 6f1fe46..a30afdf 100644 --- a/components/persona/core/Cargo.toml +++ b/components/persona/core/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "datalove-persona-core" -authors.workspace = true -version.workspace = true -edition.workspace = true +authors = { workspace = true } +version = { workspace = true } +edition = { workspace = true } [dependencies] # general @@ -18,12 +18,14 @@ digest = { workspace = true, default-features = false, features = [ ] } ed25519-dalek = { workspace = true, default-features = false, features = [ "digest", + # "fast", ] } # merkle-log = { workspace = true, default-features = false, features = [ # "borsh", # "digest", # ] } risc0-zkvm = { workspace = true, default-features = false, features = [ + "verify", ] } sha2 = { workspace = true, default-features = false, features = [ ] } @@ -32,7 +34,21 @@ signature = { workspace = true, default-features = false, features = [ ] } [dev-dependencies] +anyhow = { workspace = true, default-features = false, features = ["std"] } +datalove-persona-core = { path = ".", features = ["std", "test"] } datalove-persona-risc0 = { path = "../methods" } +ed25519-dalek = { workspace = true, default-features = false, features = [ + "rand_core", + "std", +] } +rand = { workspace = true, default-features = false, features = ["std"] } +risc0-zkvm = { workspace = true, default-features = false, features = [ + "cuda", # remove + "prove", + "verify", + "std", +] } +tracing-subscriber = { workspace = true, features = ["env-filter"] } [features] default = [] @@ -47,6 +63,7 @@ std = [ "sha2/std", "signature/std", ] +test = [] # enables test utilities # serde = [ # "dep:serde", # "ed25519-dalek/serde", diff --git a/components/persona/core/src/device.rs b/components/persona/core/src/device.rs index fe8883b..fa6f22c 100644 --- a/components/persona/core/src/device.rs +++ b/components/persona/core/src/device.rs @@ -1,16 +1,33 @@ -use std::process::Output; - use crate::{util, Error}; use borsh::{BorshDeserialize, BorshSerialize}; use digest::{typenum::U64, Digest}; -use ed25519_dalek::{Signature as Ed25519Signature, VerifyingKey as Ed25519VerifyingKey}; +use ed25519_dalek::{ + Signature as Ed25519Signature, SigningKey as Ed25519SigningKey, + VerifyingKey as Ed25519VerifyingKey, +}; use sha2::Sha512; use signature::{DigestSigner, DigestVerifier, Error as SignatureError, Verifier}; /// #[derive(Copy, Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] +pub struct Device { + inner: DeviceInner, + // log: MerkleLog, +} + +impl Device { + pub fn id(&self) -> [u8; 32] { + match self.inner { + DeviceInner::Ed25519(pk) => pk.to_bytes(), + } + } +} + +/// +#[derive(Copy, Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] +#[borsh(use_discriminant = true)] #[non_exhaustive] -pub enum Device { +enum DeviceInner { Ed25519( #[borsh( deserialize_with = "util::ed25519::deserialize_key", @@ -21,6 +38,8 @@ pub enum Device { } #[derive(Copy, Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] +#[borsh(use_discriminant = true)] +#[non_exhaustive] pub enum DeviceSignature { Ed25519( #[borsh( @@ -79,7 +98,7 @@ impl Device { // self.pk.as_bytes() == &NULL_PEER_KEY // } - pub fn sign(&self, message: &[u8], signer: &Si) -> Result + pub fn sign_message(&self, message: &[u8], signer: &Si) -> Result where D: Digest + Clone, Si: DigestSigner, @@ -91,16 +110,12 @@ impl Device { } /// assumes we're verifying a protocol message digest - pub(crate) fn verify_digest( - &self, - msg_digest: D, - signature: &DeviceSignature, - ) -> Result<(), Error> + fn verify_digest(&self, msg_digest: D, signature: &DeviceSignature) -> Result<(), Error> where D: Digest, { - match (self, signature) { - (Self::Ed25519(pk), DeviceSignature::Ed25519(sig)) => { + match (self.inner, signature) { + (DeviceInner::Ed25519(pk), DeviceSignature::Ed25519(sig)) => { Ok(pk.verify_digest(msg_digest, sig)?) } } @@ -132,19 +147,16 @@ impl Verifier for Device { } } -// pub(crate) const NULL_PEER_KEY: [u8; 32] = [ -// 59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, -// 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, -// ]; - -// /// A default [`Device`] with a secret key of all zeros. -// impl Default for Device { -// fn default() -> Self { -// let sk = ed25519_dalek::SigningKey::from_bytes(&[0u8; 32]); -// let pk = sk.verifying_key(); -// Self::new(pk, &sk).expect("failed to create default peer") -// } -// } +/// A default [`Device`] with a secret key of all zeros. +impl Default for Device { + fn default() -> Self { + let sk = Ed25519SigningKey::from_bytes(&[0u8; 32]); + let pk = sk.verifying_key(); + Self { + inner: DeviceInner::Ed25519(pk), + } + } +} #[cfg(test)] mod tests { diff --git a/components/persona/core/src/error.rs b/components/persona/core/src/error.rs index d359622..80e209d 100644 --- a/components/persona/core/src/error.rs +++ b/components/persona/core/src/error.rs @@ -10,6 +10,9 @@ pub enum Error { #[cfg_attr(feature = "std", error("Signature error: {0}"))] SignatureError(#[cfg_attr(feature = "std", from)] signature::Error), + #[cfg_attr(feature = "std", error("Invalid signature error: {0}"))] + InvalidSignatureError(&'static str), + // #[cfg_attr(feature = "std", error("MerkleLog error: {0}"))] // MerkleLogError(#[cfg_attr(feature = "std", from)] merkle_log::Error), #[cfg_attr(feature = "std", error("invalid operation: {0}"))] diff --git a/components/persona/core/src/lib.rs b/components/persona/core/src/lib.rs index 3eaf89a..6d8bd56 100644 --- a/components/persona/core/src/lib.rs +++ b/components/persona/core/src/lib.rs @@ -23,12 +23,14 @@ mod device; mod error; mod persona; -pub(crate) mod proof; -pub(crate) mod util; +#[doc(hidden)] +pub mod util; +pub mod zksm; + pub(crate) mod maybestd { pub use borsh::__private::maybestd::*; pub use borsh::io; - pub use core::{borrow, cell, cmp, marker, ops}; + pub use core::{borrow, cell, cmp, fmt, marker, ops}; } pub use borsh; diff --git a/components/persona/core/src/persona/group.rs b/components/persona/core/src/persona/group.rs index e4ddd02..767b581 100644 --- a/components/persona/core/src/persona/group.rs +++ b/components/persona/core/src/persona/group.rs @@ -1,10 +1,15 @@ use super::{Did, Weight}; use crate::{ device::{Device, DeviceSignature}, - maybestd::{cmp, io, vec::Vec}, - proof::{ProverState, VerifierState}, + maybestd::{ + cmp, + collections::BTreeMap, + io, + vec::{IntoIter, Vec}, + }, util::risc0::{Sha256Digest, TypedJournal}, - Error, + zksm::{ProverState, VerifierState}, + Error, Threshold, }; use borsh::{BorshDeserialize, BorshSerialize}; use signature::Verifier; @@ -19,10 +24,15 @@ pub struct Persona { pub(super) metadata: Sha256Digest, /// Digest of the proof-specific message (e.g. signature payload). + /// usually a persona operation, but could be a message to just sign pub(super) msg: Sha256Digest, + // /// Digest of the group managing this persona. + // pub(super) group: Sha256Digest, /// The sequence number (ie. age by number of proofs generated). pub(super) seqno: u32, + // /// + // pub(super) clock: BloomClock<4, 96, Sha256>, } impl Persona { @@ -47,6 +57,30 @@ impl PartialOrd for Persona { /// pub type PersonaSignature = TypedJournal<(Sha256Digest, Persona)>; +impl PersonaSignature { + // (Self::Persona(member), MemberSignature::Persona(sig)) => { + // // Persona proofs double as signatures, and are verified upon deserialization, + // // so this just asserts that the proof belongs to this member and signs the same message. + + // let persona_sig = &sig.payload.as_inner().1; + + // if persona_sig.did != member.payload.did { + // Err(Error::InvalidSignatureError( + // "signature DID does not match member DID", + // ))?; + // } + + // if &persona_sig.msg != &member_op_digest { + // Err(Error::InvalidSignatureError( + // "signature message does not apply to operation", + // ))?; + // } + // } + // _ => Err(Error::InvalidSignatureError( + // "signature / member type mismatch", + // ))?, +} + // pub struct PersonaState(TypedJournal<(Sha256Digest, Persona)>); // @@ -67,6 +101,10 @@ impl Group { members: Vec::new(), }; + // pub const HIGH_THRESHOLD: Threshold = u16::MAX >> 2; // 16383 + // pub const MID_THRESHOLD: Threshold = u16::MAX >> 4; // 4095 + // pub const LOW_THRESHOLD: Threshold = u16::MAX >> 8; // 255 + pub fn is_empty(&self) -> bool { self.members.is_empty() } @@ -75,42 +113,110 @@ impl Group { self.members.len() } - pub fn weight(&self) -> Weight { - self.members.iter().map(|m| m.weight()).sum() + /// Returns the weight of the group. + /// TODO: refactor this mechanism + // pub fn group_weight(&self) -> Threshold { + // self.weights().fold(0u16, |a, b| a + b as Threshold) + // } + + // pub fn weights(&self) -> impl Iterator + '_ { + // self.members.iter().map(|m| m.weight()) + // } + + // pub fn devices(&self) -> impl Iterator + '_ { + // self.members.iter().filter_map(|m| match m { + // Member::Device(d) => Some(m), + // _ => None, + // }) + // } + + /// + /// TODO: verify sig against group + pub fn add_signature( + &self, + idx: u8, + member_sig: MemberSignature, + group_sig: GroupSignature, + ) -> Result { + // prune duplicate signer indices + let mut signers = self + .signer_iter(group_sig) + .map(|res| res.map(|signer| (signer.0, signer))) + .collect::, _>>()?; + + // TODO: verify each current member_sig against stored member + let member = self + .members + .get(idx as usize) + .ok_or_else(|| Error::InvalidSignatureError("signature member index out of bounds"))?; + + // add signer to group_sig at it appropriate index, erroring it already exists + signers + .insert(idx, (idx, member, member_sig)) + .map(|_| { + Err(Error::InvalidSignatureError( + "signature member index already signed", + )) + }) + .transpose()?; + + // aggregate indices and signatures + let indices = signers.values().fold(0u32, |i, (idx, _, _)| i | (1 << idx)); + let signatures = signers.into_values().map(|(_, _, sig)| sig).collect(); + Ok(GroupSignature { + indices, + signatures, + }) } /// Verifies a group signature against the group's state. - pub fn verify(&self, msg: &[u8], sig: &GroupSignature) -> Result<(), Error> { + pub fn verify_signature( + &self, + op_digest: &Sha256Digest, + sig: &GroupSignature, + ) -> Result { // assert participant count let num_participants = sig.len(); if !(num_participants > 0 && num_participants <= self.len()) { - return Err(signature::Error::new().into()); + Err(Error::InvalidSignatureError( + "signature must have non-zero number of participants", + ))?; } - let mut weight = 0; + let mut sig_weight: Threshold = 0; // verify each member sig // TODO: group and batch device sig verifies - for (member_idx, member_sig) in sig.idx_iter() { - let member = &self.members[member_idx]; - member.verify(msg, &member_sig)?; - - weight += member.weight(); + while let Some((_, member, sig)) = self.signer_ref_iter(sig).next().transpose()? { + member.verify_signature(op_digest, &sig)?; + sig_weight += member.weight() as Threshold; } - // assert weight - self.verify_weight(weight)?; - - Ok(()) + Ok(sig_weight) } - /// TODO: - fn verify_weight(&self, weight: Weight) -> Result<(), Error> { - if weight < self.weight() / 2 { - return Err(signature::Error::new().into()); - } + fn signer_iter( + &self, + sig: GroupSignature, + ) -> impl Iterator> + '_ { + sig.into_iter().map(move |(idx, sig)| { + let member = self.members.get(idx as usize).ok_or_else(|| { + Error::InvalidSignatureError("signature member index out of bounds") + })?; + Ok((idx, member, sig)) + }) + } - Ok(()) + fn signer_ref_iter<'a: 'b, 'b>( + &'a self, + sig: &'b GroupSignature, + ) -> impl Iterator> + 'b { + sig.iter().map(move |(idx, sig)| { + let member = self.members.get(idx as usize).ok_or_else(|| { + Error::InvalidSignatureError("signature member index out of bounds") + })?; + Ok((idx, member, sig)) + }) } } @@ -126,11 +232,20 @@ impl GroupSignature { self.signatures.len() } + fn indices_iter(&self) -> impl Iterator { + let indices = self.indices; + (0..32u8) + .into_iter() + .filter_map(move |idx| ((indices & (1 << idx)) != 0).then(|| idx)) + } + /// Returns an iterator over the member's group index and its signature. - pub fn idx_iter(&self) -> impl Iterator { - (0..32u32) - .filter_map(|idx| (self.indices & (1 << idx) != 0).then(|| idx as usize)) - .zip(self.signatures.iter()) + fn iter(&self) -> impl Iterator { + self.indices_iter().zip(self.signatures.iter()) + } + + fn into_iter(self) -> impl Iterator { + self.indices_iter().zip(self.signatures.into_iter()) } } @@ -141,7 +256,7 @@ impl BorshDeserialize for GroupSignature { if indices.count_ones() as usize != signatures.len() { return Err(io::Error::new( io::ErrorKind::InvalidData, - "invalid signature count", + "mismatch between num indices and signatures", )); } @@ -152,25 +267,6 @@ impl BorshDeserialize for GroupSignature { } } -// impl VerifierState<(usize, MemberSignature)> for Group { -// fn verify( -// &self, -// msg: &[u8], -// (idx, signature): &(usize, MemberSignature), -// ) -> Result<(), signature::Error> { -// match signature { -// MemberSignature::Device(sig) => todo!(), -// MemberSignature::Persona(persona) => todo!(), -// } -// } -// } - -// impl VerifierState for Group { -// fn verify(&self, msg: &[u8], signature: &GroupSignature) -> Result<(), signature::Error> { -// todo!() -// } -// } - // // Member // @@ -179,17 +275,25 @@ impl BorshDeserialize for GroupSignature { #[derive(Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] #[borsh(use_discriminant = true)] #[non_exhaustive] -#[repr(align(4))] +// #[repr(align(4))] pub enum Member { Device(MemberInner), - Persona(MemberInner), + // Persona(MemberInner), } impl Member { + pub fn id(&self) -> [u8; 32] { + match self { + Self::Device(member) => member.payload.id(), + // Self::Persona(member) => member.payload.id(), + } + } + + /// Returns the weight of the member. pub const fn weight(&self) -> Weight { match self { Self::Device(member) => member.weight, - Self::Persona(member) => member.weight, + // Self::Persona(member) => member.weight, } } } @@ -197,53 +301,70 @@ impl Member { #[derive(Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] pub struct MemberInner { weight: Weight, - inner: T, + payload: T, } -impl Member { - pub fn verify(&self, msg: &[u8], signature: &MemberSignature) -> Result<(), Error> { - match (self, signature) { - (Self::Device(member), MemberSignature::Device(sig)) => { - member.inner.verify(msg, sig)? - } - (Self::Persona(member), MemberSignature::Persona(sig)) => { - Self::verify_persona_signature(&member.inner, msg, sig)? - } - _ => Err(signature::Error::new())?, - }; +#[derive(Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] +#[borsh(use_discriminant = true)] +#[non_exhaustive] +pub enum MemberSignature { + Device(MemberInner), + // Persona(MemberInner), +} - Ok(()) +impl MemberSignature { + /// Returns the weight of the member's signature. + pub const fn weight(&self) -> Weight { + match self { + Self::Device(member) => member.weight, + // Self::Persona(member) => member.weight, + } } +} - /// Verifies a [`PersonaSignature`]. - /// - /// Persona proofs double as signatures, and are verified upon deserialization, - /// so this just asserts that the proof belongs to this member and signs the same message. - fn verify_persona_signature( - member: &Persona, - msg: &[u8], - signature: &PersonaSignature, +impl Member { + pub fn verify_signature( + &self, + op_digest: &Sha256Digest, + signature: &MemberSignature, ) -> Result<(), Error> { - let sig = &signature.as_inner().1; - - if sig.did != member.did { - return Err(signature::Error::new())?; + // assert signer's weight is lte member weight + if !(signature.weight() <= self.weight()) { + Err(Error::InvalidSignatureError( + "signature weight exceeds member weight", + ))?; } - if AsRef::<[u8]>::as_ref(&sig.msg) != msg { - return Err(signature::Error::new())?; - } + // create modified op digest, reflecting signer's weight for this operation + let member_op_digest = { *op_digest ^ signature.weight() as u32 }; + + match (self, signature) { + (Self::Device(member), MemberSignature::Device(sig)) => member + .payload + .verify(member_op_digest.as_ref(), &sig.payload)?, + // (Self::Persona(member), MemberSignature::Persona(sig)) => { + // // Persona proofs double as signatures, and are verified upon deserialization, + // // so this just asserts that the proof belongs to this member and signs the same message. + + // let persona_sig = &sig.payload.as_inner().1; + + // if persona_sig.did != member.payload.did { + // Err(Error::InvalidSignatureError( + // "signature DID does not match member DID", + // ))?; + // } + + // if &persona_sig.msg != &member_op_digest { + // Err(Error::InvalidSignatureError( + // "signature message does not apply to operation", + // ))?; + // } + // } + // _ => Err(Error::InvalidSignatureError( + // "signature / member type mismatch", + // ))?, + }; Ok(()) } } - -/// A signature produced by a member of a [`Persona`]. -#[derive(Clone, Debug, Eq, PartialEq, BorshDeserialize, BorshSerialize)] -#[borsh(use_discriminant = true)] -#[non_exhaustive] -#[repr(align(4))] -pub enum MemberSignature { - Device(DeviceSignature), - Persona(TypedJournal<(Sha256Digest, Persona)>), -} diff --git a/components/persona/core/src/persona/mod.rs b/components/persona/core/src/persona/mod.rs index ef72e10..9675e8b 100644 --- a/components/persona/core/src/persona/mod.rs +++ b/components/persona/core/src/persona/mod.rs @@ -2,21 +2,35 @@ mod group; mod ops; pub use group::{Group, GroupSignature, Member, MemberSignature, Persona}; -pub use ops::Operation; +pub use ops::SignedOperation; -use crate::{maybestd::io, proof::StateMachine, util::Sha256Digest, Error}; +use crate::util::Sha256Digest; /// pub type Weight = u8; +/// +pub type Threshold = u16; + /// pub type Did = Sha256Digest; /// -pub fn exec( - mut stdin: impl io::Read, - mut stdout: impl io::Write, - mut journal: impl io::Write, -) -> Result<(), Error> { - StateMachine::::exec::(&mut stdin, &mut stdout, &mut journal) +#[cfg(target_os = "zkvm")] +pub mod guest { + use super::*; + use crate::{maybestd::io, zksm::StateMachine, Error}; + + pub fn exec( + mut stdin: impl io::Read, + mut stdout: impl io::Write, + mut journal: impl io::Write, + // mut pause: impl FnMut() -> bool, + ) -> Result<(), Error> { + StateMachine::::run_io::( + &mut stdin, + &mut stdout, + &mut journal, + ) + } } diff --git a/components/persona/core/src/persona/ops.rs b/components/persona/core/src/persona/ops.rs index 2bfbeef..5405a8c 100644 --- a/components/persona/core/src/persona/ops.rs +++ b/components/persona/core/src/persona/ops.rs @@ -1,26 +1,75 @@ -use super::{Group, Member, Persona}; -use crate::{proof::Operation as IOperation, util::Sha256Digest, Error, GroupSignature}; +use super::{Group, Member, Persona, Threshold, Weight}; +use crate::{ + util::{risc0::Sha256, Sha256Digest}, + zksm::Operation as IOperation, + Error, GroupSignature, +}; use borsh::{BorshDeserialize, BorshSerialize}; +use digest::Digest; /// #[derive(Clone, Debug, BorshDeserialize, BorshSerialize)] pub struct SignedOperation { /// The operation payload. - payload: Operation, + op: Operation, /// The signature of the operation. signature: GroupSignature, + // #[borsh(skip)] + // weight: Option, +} + +impl SignedOperation { + // /// Verifies a group signature against the group's state. + // pub fn verify_signature( + // &self, + // op_digest: &Sha256Digest, + // sig: &GroupSignature, + // ) -> Result { + // // assert participant count + // let num_participants = sig.len(); + // if !(num_participants > 0 && num_participants <= self.len()) { + // return Err(signature::Error::new().into()); + // } + + // let mut sig_weight = 0u16; + + // // verify each member sig + // // TODO: group and batch device sig verifies + // for (member_idx, member_sig) in sig.idx_iter() { + // let member = &self.members[member_idx]; + // member.verify_signature(op_digest, &member_sig)?; + + // sig_weight += member.weight() as Threshold; + // } + + // Ok(sig_weight) + // } } impl IOperation for SignedOperation { #[inline] fn validate( &self, - self_digest: &Sha256Digest, + op_digest: &Sha256Digest, persona: &Persona, group: &Group, ) -> Result<(), Error> { - group.verify(self_digest.as_ref(), &self.signature)?; + let sig_group = if group.len() == 0 { + self.op + .try_as_init() + .ok_or_else(|| { + Error::InvalidOperation("only Init can be applied to an empty group") + })? + .as_ref() + } else { + group + }; + + let sig_weight = sig_group.verify_signature(op_digest, &self.signature)?; + // self.operation.verify_weight(sig_weight, sig_group)?; + self.op.validate(op_digest, persona, group)?; + Ok(()) } @@ -40,11 +89,26 @@ impl IOperation for SignedOperation { #[borsh(use_discriminant = true)] #[non_exhaustive] pub enum Operation { + /// The initialization operation, that creates a new [`Persona`] from the provided [`MemberState`]. Init(init::Init), - Swap(swap::Swap), + // Bump(bump::Bump), + // Swap(swap::Swap), // Sign(sign::Sign), + // Freeze, + // Thaw, } +impl Operation { + fn try_as_init(&self) -> Option<&init::Init> { + match self { + Self::Init(op) => Some(op), + _ => None, + } + } +} + +impl Operation {} + impl IOperation for Operation { #[inline] fn validate( @@ -54,9 +118,26 @@ impl IOperation for Operation { group: &Group, ) -> Result<(), Error> { match self { + // group weight must be greater than or equal to the signature weight Self::Init(op) => op.validate(self_digest, persona, group), - Self::Swap(op) => op.validate(self_digest, persona, group), - // Self::Sign(op) => op.validate(prev_persona), + // use case(s): + // - bump: only updates seqno + group member clocks (no threshold change) + // - can be self-signed (i.e. by only members being updated) + // Self::Bump(op) + + // use case(s): + // - addition: + // - removal: + // - (device) key rotation: 1:1 swap && old signs new(head), no threshold change + // - self-solo-signed iff 1:1 swap && old signs new(head), no threshold change + // - ??? + // CANNOT be ONLY self-signed personas + // Self::Swap(op) => op.validate(self_digest, persona, group), + + // use case(s): + // - sign: ... ? something that requires consensus? + // CANNOT be ONLY self-signed personas + // Self::Sign(op) => op.validate(self_digest, persona, group), } } @@ -69,8 +150,8 @@ impl IOperation for Operation { ) -> Result<(), Error> { match self { Self::Init(op) => op.apply(self_digest, persona, group), - Self::Swap(op) => op.apply(self_digest, persona, group), - // Self::Sign(op) => op.validate(prev_persona), + // Self::Swap(op) => op.apply(self_digest, persona, group), + // Self::Sign(op) => op.apply(self_digest, persona, group), } } } @@ -86,6 +167,27 @@ pub struct GenericOperation { payload: T, } +impl AsRef for GenericOperation +where + T: AsRef, +{ + fn as_ref(&self) -> &U { + self.payload.as_ref() + } +} + +impl From<(Sha256Digest, U)> for GenericOperation +where + T: From, +{ + fn from((new_metadata, payload): (Sha256Digest, U)) -> Self { + Self { + new_metadata, + payload: payload.into(), + } + } +} + mod init { use super::*; @@ -94,9 +196,31 @@ mod init { #[derive(Clone, Debug, BorshDeserialize, BorshSerialize)] pub struct InitInner { - members: Vec, + // msg: Sha256Digest, + group: Group, + } + + impl Init { + pub fn new(metadata: Sha256Digest, group: Group) -> Self { + Self { + new_metadata: metadata, + payload: InitInner { group }, + } + } + } + + impl AsRef for InitInner { + fn as_ref(&self) -> &Group { + &self.group + } } + // impl From for InitInner { + // fn from(group: Group) -> Self { + // Self { group } + // } + // } + impl IOperation for Init { fn validate( &self, @@ -118,19 +242,33 @@ mod init { persona: &mut Persona, group: &mut Group, ) -> Result<(), Error> { - let Self { payload, .. } = self; + // let Self { payload, .. } = self; - // *group = payload; + *group = self.payload.group; persona.seqno = 1; persona.metadata = self.new_metadata; - persona.msg = Sha256Digest::ZERO; - // persona.did = + // persona.msg = self.payload.msg; + persona.did = Sha256::default() + .chain_update(&self_digest) + .chain_update(&persona.metadata) + // .chain_update(&persona.msg) + .finalize() + .into(); Ok(()) } } } +mod bump { + use super::*; + + /// The bump operation, which increments the [`Persona`]'s sequence number. + pub type Bump = GenericOperation; + + pub struct BumpInner {} +} + mod swap { use super::*; @@ -202,5 +340,10 @@ mod sign { #[cfg(test)] mod tests { - // #[test] + use super::*; + + // fn random_device_member() -> Member {} + + #[test] + fn can_init() {} } diff --git a/components/persona/core/src/proof.rs b/components/persona/core/src/proof.rs deleted file mode 100644 index fc8a76c..0000000 --- a/components/persona/core/src/proof.rs +++ /dev/null @@ -1,167 +0,0 @@ -use crate::{ - maybestd::{cell::Ref, io, ops::Deref}, - util::{ - risc0::{BlockData, TypedJournal}, - Sha256Digest, - }, - Error, -}; -use borsh::{BorshDeserialize, BorshSerialize}; - -// pub type PublicState = TypedJournal<(Sha256Digest, V)>; - -/// -pub trait ProverState: Default + BorshSerialize + BorshDeserialize { - // type Signature: BorshDeserialize; - // fn verify(&self, msg: &[u8], signature: &Self::Signature) -> Result<(), Error>; -} -// impl ProverState for P {} - -/// -pub trait VerifierState: Default + BorshSerialize + BorshDeserialize {} -// impl VerifierState for V {} - -/// -pub trait Operation: BorshSerialize + BorshDeserialize { - fn validate( - &self, - self_digest: &Sha256Digest, - verifier_state: &V, - prover_state: &P, - ) -> Result<(), Error>; - - fn apply( - self, - self_digest: Sha256Digest, - verifier_state: &mut V, - prover_state: &mut P, - ) -> Result<(), Error>; -} - -/// -#[derive(Clone, Debug, Default, BorshDeserialize, BorshSerialize)] -pub struct StateMachine { - /// Public verifier state - /// Commits to prover state, assuring consistency. - verifier: TypedJournal<(Sha256Digest, V)>, - /// Prover state; verifies authorization of operations. - prover: BlockData

, -} - -impl StateMachine {} - -impl StateMachine { - pub fn exec( - mut stdin: impl io::Read, - mut stdout: impl io::Write, - mut journal: impl io::Write, - ) -> Result<(), Error> - where - Op: Operation, - { - let transition = Transition::deserialize_reader(&mut stdin)?; - let mut sm = >::try_from_reader(&mut stdin)?.unwrap_or_default(); - - sm.validate::(&transition)?; - sm.apply::(transition)?; - - sm.prover.serialize(&mut stdout)?; - sm.verifier.as_inner_mut().0 = sm.prover.digest().clone(); - sm.verifier.serialize(&mut journal)?; - Ok(()) - } - - fn validate(&self, transition: &Transition) -> Result<(), Error> - where - Op: Operation, - { - // assert operation expects verifier state - if transition.op_commitment() != self.verifier.digest().deref() { - Err(Error::InvalidOperation( - "operation expected different prover state", - ))?; - } - - // assert verifier expects prover state - if self.verifier_commitment() != self.prover.digest().deref() { - Err(Error::InvalidOperation( - "verifier expected different prover state", - ))?; - } - - // verify operation is valid against current state - let (prover, verifier) = self.as_ref(); - let (op_digest, op) = transition.as_ref(); - op.validate(op_digest, verifier, prover)?; - - Ok(()) - } - - fn apply(&mut self, transition: Transition) -> Result<(), Error> - where - Op: Operation, - { - let (prover, verifier) = self.as_mut(); - let (op_digest, op) = transition.into_inner(); - op.apply(op_digest, verifier, prover)?; - - Ok(()) - } - - fn verifier_commitment(&self) -> &Sha256Digest { - &self.verifier.as_inner().0 - } - - fn as_ref(&self) -> (&P, &V) { - (&self.prover.as_inner(), &self.verifier.as_inner().1) - } - - fn as_mut(&mut self) -> (&mut P, &mut V) { - ( - self.prover.as_inner_mut(), - &mut self.verifier.as_inner_mut().1, - ) - } -} - -/// A state transition, as provided to the guest. -#[derive(Clone, Debug, BorshDeserialize, BorshSerialize)] -pub struct Transition { - /// Commitment to verifier state; plus the operation which will be applied. - /// Prevents replay attacks. - op: BlockData<(Sha256Digest, Op)>, - // /// Signature of the entire operation. - // signature: S, -} - -impl Transition { - fn as_ref(&self) -> &(Sha256Digest, Op) { - self.op.as_inner() - } - - fn into_inner(self) -> (Sha256Digest, Op) { - self.op.into_inner() - } - - fn op_commitment(&self) -> &Sha256Digest { - &self.op.as_inner().0 - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[derive(Clone, Debug, Default, BorshDeserialize, BorshSerialize)] - struct ProverState(u32); - - #[derive(Clone, Debug, Default, BorshDeserialize, BorshSerialize)] - struct VerifierState(u32); - - enum Op {} - - #[test] - fn test_exec() { - // TODO - } -} diff --git a/components/persona/core/src/util.rs b/components/persona/core/src/util.rs index 17978e1..599e451 100644 --- a/components/persona/core/src/util.rs +++ b/components/persona/core/src/util.rs @@ -4,27 +4,26 @@ pub use risc0::{Sha256Digest, Sha256Pipe}; use crate::maybestd::{ cell::{Ref, RefCell}, io, - ops::Deref, + ops::{BitXor, BitXorAssign}, vec::Vec, }; use borsh::{BorshDeserialize, BorshSerialize}; -// pub mod cid { -// use super::*; -// use ::cid::Cid; - -// pub fn serialize_cid(cid: &Cid, writer: &mut W) -> io::Result<()> { -// let mut bytes = Vec::with_capacity(cid.encoded_len()); -// cid.write_bytes(bytes.as_mut_slice()) -// .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e)))?; -// bytes.serialize(writer) -// } - -// pub fn deserialize_cid(reader: &mut R) -> io::Result { -// let mut bytes = Vec::with_capacity(); -// Cid::read_bytes(reader).map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e))) -// } -// } +#[derive(Debug)] +pub struct Empty; +impl io::Read for Empty { + fn read(&mut self, _buf: &mut [u8]) -> io::Result { + Ok(0) + } +} +impl io::Write for Empty { + fn write(&mut self, buf: &[u8]) -> io::Result { + Ok(buf.len()) + } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} pub mod digest { use super::*; @@ -155,7 +154,7 @@ pub mod risc0 { impl From<&Sha256> for Sha256Digest { #[inline] fn from(sha256: &Sha256) -> Self { - Self::from(sha256.clone()) + sha256.clone().into() } } @@ -174,9 +173,26 @@ pub mod risc0 { } } + impl BitXor for Sha256Digest { + type Output = Self; + + #[inline] + fn bitxor(mut self, rhs: u32) -> Self::Output { + self ^= rhs; + self + } + } + + impl BitXorAssign for Sha256Digest { + #[inline] + fn bitxor_assign(&mut self, rhs: u32) { + self.0.as_mut_words()[0] ^= rhs; + } + } + #[inline] fn serialize_digest(digest: &sha::Digest, writer: &mut W) -> io::Result<()> { - digest.as_words().serialize(writer) + AsRef::<[u32; DIGEST_WORDS]>::as_ref(digest).serialize(writer) } #[inline] @@ -201,14 +217,13 @@ pub mod risc0 { // } pub type Sha256Pipe = DigestPipe; - // pub type EmptySha256Pipe = Sha256Pipe; /// A digest-ible borsh-encoded type. #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct BlockData { /// Digest of the borsh-encoded journal. pub(crate) digest: RefCell, - pub(crate) inner: T, + pub(crate) decoded: T, } impl BlockData { @@ -217,15 +232,37 @@ pub mod risc0 { } pub fn as_inner(&self) -> &T { - &self.inner + &self.decoded } pub fn as_inner_mut(&mut self) -> &mut T { - &mut self.inner + &mut self.decoded } pub fn into_inner(self) -> T { - self.inner + self.decoded + } + } + + impl BlockData { + pub fn new(inner: T) -> Self { + Self::new_with_bytes(inner, &mut Empty) + .expect("should never fail to serialize and compute digest") + } + + fn new_with_bytes(decoded: T, writer: &mut W) -> io::Result { + let this = Self { + digest: RefCell::new(Sha256Digest::ZERO), + decoded, + }; + this.serialize(writer)?; + Ok(this) + } + } + + impl From for BlockData { + fn from(other: T) -> Self { + Self::new(other) } } @@ -238,16 +275,16 @@ pub mod risc0 { impl BorshSerialize for BlockData { fn serialize(&self, writer: &mut W) -> io::Result<()> { self.digest - .replace(Sha256Pipe::encode_to_writer(&self.inner, writer)?.into()); + .replace(Sha256Pipe::encode_to_writer(&self.decoded, writer)?.into()); Ok(()) } } impl BorshDeserialize for BlockData { fn deserialize_reader(reader: &mut R) -> io::Result { - let (digest, inner) = super::Sha256Pipe::decode_from_reader(reader)?; + let (digest, decoded) = super::Sha256Pipe::decode_from_reader(reader)?; let digest = RefCell::new(digest.into()); - Ok(Self { digest, inner }) + Ok(Self { digest, decoded }) } } diff --git a/components/persona/methods/Cargo.toml b/components/persona/methods/Cargo.toml index eb18ed3..99a30d2 100644 --- a/components/persona/methods/Cargo.toml +++ b/components/persona/methods/Cargo.toml @@ -1,11 +1,32 @@ [package] name = "datalove-persona-risc0" -authors.workspace = true -version.workspace = true -edition.workspace = true +authors = { workspace = true } +version = { workspace = true } +edition = { workspace = true } + +[lib] +name = "datalove_persona_risc0" +path = "lib.rs" [build-dependencies] risc0-build = { workspace = true } +[dependencies] +risc0-zkvm = { workspace = true } +# risc0-zkvm-platform = { workspace = true } + +# [dev-dependencies] +# anyhow = { workspace = true } +# datalove-persona-core = { path = "../core", features = ["std", "dev"] } +# ed25519-dalek = { workspace = true, default-features = false, features = [ +# "rand_core", +# "std", +# ] } +# rand = { workspace = true, default-features = false, features = ["std"] } +# risc0-zkvm = { workspace = true, default-features = false, features = [ +# "prove", +# "std", +# ] } + [package.metadata.risc0] -methods = ["v1"] +methods = ["zksm", "v1"] diff --git a/components/persona/methods/build.rs b/components/persona/methods/build.rs index 08a8a4e..91a7715 100644 --- a/components/persona/methods/build.rs +++ b/components/persona/methods/build.rs @@ -1,3 +1,15 @@ +use std::env; + fn main() { + // tracing_subscriber::fmt() + // .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) + // .init(); + // (); + + if env::var("CARGO_CFG_TARGET_OS").unwrap().contains("zkvm") { + // Guest shouldn't recursively depend on itself. + return; + } + risc0_build::embed_methods(); } diff --git a/components/persona/methods/src/lib.rs b/components/persona/methods/src/lib.rs deleted file mode 100644 index 1bdb308..0000000 --- a/components/persona/methods/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -include!(concat!(env!("OUT_DIR"), "/methods.rs")); diff --git a/components/persona/methods/v1/Cargo.lock b/components/persona/methods/v1/Cargo.lock index 1a6c5ee..2d2a592 100755 --- a/components/persona/methods/v1/Cargo.lock +++ b/components/persona/methods/v1/Cargo.lock @@ -2,12 +2,203 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "anyhow" version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "sha2", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "base64ct" version = "1.6.0" @@ -52,7 +243,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.39", "syn_derive", ] @@ -73,7 +264,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -148,7 +339,7 @@ source = "git+https://github.com/risc0/curve25519-dalek?branch=risczero#42c4faf7 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -182,6 +373,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -225,6 +427,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "elf" version = "0.7.4" @@ -264,6 +472,15 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -283,7 +500,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", ] [[package]] @@ -310,6 +536,47 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -344,6 +611,12 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro-crate" version = "2.0.0" @@ -394,6 +667,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -415,6 +708,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "risc0-circuit-recursion" +version = "0.20.0-alpha.1" +dependencies = [ + "anyhow", + "bytemuck", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "0.20.0-alpha.1" +dependencies = [ + "anyhow", + "risc0-core", + "risc0-zkp", + "risc0-zkvm-platform", + "tracing", +] + [[package]] name = "risc0-core" version = "0.20.0-alpha.1" @@ -446,17 +761,25 @@ name = "risc0-zkvm" version = "0.20.0-alpha.1" dependencies = [ "anyhow", + "ark-bn254", + "ark-groth16", + "ark-serialize", "bytemuck", "cfg-if", "getrandom", "hex", + "num-bigint", + "num-derive", "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", "risc0-core", "risc0-zkp", "risc0-zkvm-platform", "rrs-lib", "semver", "serde", + "tracing", ] [[package]] @@ -510,7 +833,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -549,6 +872,17 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.39" @@ -569,7 +903,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -589,7 +923,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -629,7 +963,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -674,11 +1008,45 @@ dependencies = [ "memchr", ] +[[package]] +name = "zerocopy" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] [[patch.unused]] name = "risc0-build" diff --git a/components/persona/methods/v1/Cargo.toml b/components/persona/methods/v1/Cargo.toml index 4160dcb..360c07c 100644 --- a/components/persona/methods/v1/Cargo.toml +++ b/components/persona/methods/v1/Cargo.toml @@ -1,9 +1,13 @@ +[workspace] + [package] name = "datalove-persona-risc0-guest-v1" version = "0.0.1" edition = "2021" -[workspace] +[[bin]] +name = "datalove-persona-risc0-guest-v1" +path = "main.rs" [dependencies] datalove-persona-core = { path = "../../core", default-features = false } @@ -23,4 +27,4 @@ sha2 = { git = "https://github.com/risc0/rustcrypto-hashes", branch = "risczero" [profile.release] # TODO: play with this -lto = "thin" +# lto = "thin" diff --git a/components/persona/methods/v1/src/main.rs b/components/persona/methods/v1/src/main.rs deleted file mode 100644 index 8e4a7b2..0000000 --- a/components/persona/methods/v1/src/main.rs +++ /dev/null @@ -1,10 +0,0 @@ -#![no_main] -#![no_std] - -risc0_zkvm::guest::entry!(main); - -pub fn main() { - use risc0_zkvm::guest::env; - - datalove_persona_core::exec(env::stdin(), env::stdout(), env::journal()).unwrap(); -}