Merge branch 'feature/char-type' into feature/string-parsing

This commit is contained in:
damirka 2021-05-20 00:24:22 +03:00
commit f96c4ad37e
57 changed files with 828 additions and 858 deletions

355
Cargo.lock generated
View File

@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96e669320c520d87931e752d603dd442b4709c73b1b8b1fcba838f9c5acc1791" checksum = "96e669320c520d87931e752d603dd442b4709c73b1b8b1fcba838f9c5acc1791"
dependencies = [ dependencies = [
"abnf-core", "abnf-core",
"nom 6.1.2", "nom",
] ]
[[package]] [[package]]
@ -18,7 +18,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b514944cb7199c4201f54406bc58676a3e4f37d40bf8e3dbe30652ca82e3ddb4" checksum = "b514944cb7199c4201f54406bc58676a3e4f37d40bf8e3dbe30652ca82e3ddb4"
dependencies = [ dependencies = [
"nom 6.1.2", "nom",
] ]
[[package]] [[package]]
@ -83,9 +83,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]] [[package]]
name = "assert_cmd" name = "assert_cmd"
version = "1.0.3" version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2475b58cd94eb4f70159f4fd8844ba3b807532fe3131b3373fae060bbe30396" checksum = "8f57fec1ac7e4de72dcc69811795f1a7172ed06012f80a5d1ee651b62484f588"
dependencies = [ dependencies = [
"bstr", "bstr",
"doc-comment", "doc-comment",
@ -140,9 +140,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]] [[package]]
name = "bech32" name = "bech32"
version = "0.6.0" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58946044516aa9dc922182e0d6e9d124a31aafe6b421614654eb27cf90cec09c" checksum = "6c7f7096bc256f5e5cb960f60dfc4f4ef979ca65abe7fb9d5a4f77150d3783d4"
[[package]] [[package]]
name = "bincode" name = "bincode"
@ -153,30 +153,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "bindgen"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36"
dependencies = [
"bitflags",
"cexpr",
"cfg-if 0.1.10",
"clang-sys",
"clap",
"env_logger",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"proc-macro2 1.0.24",
"quote 1.0.9",
"regex",
"rustc-hash",
"shlex",
"which",
]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.2.1" version = "1.2.1"
@ -307,18 +283,6 @@ name = "cc"
version = "1.0.67" version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
dependencies = [
"jobserver",
]
[[package]]
name = "cexpr"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27"
dependencies = [
"nom 5.1.2",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
@ -355,17 +319,6 @@ dependencies = [
"envmnt", "envmnt",
] ]
[[package]]
name = "clang-sys"
version = "0.29.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]] [[package]]
name = "clap" name = "clap"
version = "2.33.3" version = "2.33.3"
@ -425,9 +378,12 @@ checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.1.0" version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cd5a7748210e7ec1a9696610b1015e6e31fbf58f77a160801f124bd1c36592a" checksum = "dec1028182c380cc45a2e2c5ec841134f2dfd0f8f5f0a5bcd68004f81b5efdf4"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
@ -551,36 +507,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "curl"
version = "0.4.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a872858e9cb9e3b96c80dd78774ad9e32e44d3b05dc31e142b858d14aebc82c"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
"socket2",
"winapi 0.3.9",
]
[[package]]
name = "curl-sys"
version = "0.4.41+curl-7.75.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ec466abd277c7cab2905948f3e94d10bc4963f1f5d47921c1cc4ffd2028fe65"
dependencies = [
"cc",
"libc",
"libz-sys",
"openssl-sys",
"pkg-config",
"vcpkg",
"winapi 0.3.9",
]
[[package]] [[package]]
name = "derivative" name = "derivative"
version = "2.2.0" version = "2.2.0"
@ -669,19 +595,6 @@ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
] ]
[[package]]
name = "env_logger"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]] [[package]]
name = "envmnt" name = "envmnt"
version = "0.8.4" version = "0.8.4"
@ -955,12 +868,6 @@ version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
[[package]]
name = "glob"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.3.0" version = "0.3.0"
@ -1050,15 +957,6 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
[[package]]
name = "humantime"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
dependencies = [
"quick-error",
]
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.14.4" version = "0.14.4"
@ -1150,15 +1048,6 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "instant"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
dependencies = [
"cfg-if 1.0.0",
]
[[package]] [[package]]
name = "iovec" name = "iovec"
version = "0.1.4" version = "0.1.4"
@ -1207,15 +1096,6 @@ version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
[[package]]
name = "jobserver"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.47" version = "0.3.47"
@ -1444,7 +1324,6 @@ dependencies = [
"snarkvm-algorithms", "snarkvm-algorithms",
"snarkvm-curves", "snarkvm-curves",
"snarkvm-dpc", "snarkvm-dpc",
"snarkvm-storage",
"snarkvm-utilities", "snarkvm-utilities",
"thiserror", "thiserror",
] ]
@ -1492,55 +1371,12 @@ version = "0.2.89"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "538c092e5586f4cdd7dd8078c4a79220e3e168880218124dcbce860f0ea938c6" checksum = "538c092e5586f4cdd7dd8078c4a79220e3e168880218124dcbce860f0ea938c6"
[[package]]
name = "libloading"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
dependencies = [
"cc",
"winapi 0.3.9",
]
[[package]]
name = "librocksdb-sys"
version = "6.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb5b56f651c204634b936be2f92dbb42c36867e00ff7fe2405591f3b9fa66f09"
dependencies = [
"bindgen",
"cc",
"glob",
"libc",
]
[[package]]
name = "libz-sys"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
version = "0.5.4" version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "lock_api"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
dependencies = [
"scopeguard",
]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.14" version = "0.4.14"
@ -1734,16 +1570,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0" checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0"
[[package]]
name = "nom"
version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
dependencies = [
"memchr",
"version_check",
]
[[package]] [[package]]
name = "nom" name = "nom"
version = "6.1.2" version = "6.1.2"
@ -1759,9 +1585,9 @@ dependencies = [
[[package]] [[package]]
name = "notify" name = "notify"
version = "4.0.16" version = "4.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2599080e87c9bd051ddb11b10074f4da7b1223298df65d4c2ec5bcf309af1533" checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"filetime", "filetime",
@ -1893,37 +1719,6 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "parking_lot"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
dependencies = [
"instant",
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
dependencies = [
"cfg-if 1.0.0",
"instant",
"libc",
"redox_syscall",
"smallvec",
"winapi 0.3.9",
]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.1.0" version = "2.1.0"
@ -2135,12 +1930,6 @@ dependencies = [
"unicode-xid 0.2.1", "unicode-xid 0.2.1",
] ]
[[package]]
name = "quick-error"
version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.20.0" version = "0.20.0"
@ -2380,28 +2169,12 @@ dependencies = [
"winreg", "winreg",
] ]
[[package]]
name = "rocksdb"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23d83c02c429044d58474eaf5ae31e062d0de894e21125b47437ec0edc1397e6"
dependencies = [
"libc",
"librocksdb-sys",
]
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.18" version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.2.3" version = "0.2.3"
@ -2539,9 +2312,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.125" version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -2558,9 +2331,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.125" version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
dependencies = [ dependencies = [
"proc-macro2 1.0.24", "proc-macro2 1.0.24",
"quote 1.0.9", "quote 1.0.9",
@ -2616,9 +2389,9 @@ dependencies = [
[[package]] [[package]]
name = "sha2" name = "sha2"
version = "0.9.4" version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8f6b75b17576b792bef0db1bcc4b8b8bcdf9506744cf34b974195487af6cff2" checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12"
dependencies = [ dependencies = [
"block-buffer 0.9.0", "block-buffer 0.9.0",
"cfg-if 1.0.0", "cfg-if 1.0.0",
@ -2636,12 +2409,6 @@ dependencies = [
"lazy_static", "lazy_static",
] ]
[[package]]
name = "shlex"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
[[package]] [[package]]
name = "single" name = "single"
version = "1.0.0" version = "1.0.0"
@ -2665,9 +2432,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
[[package]] [[package]]
name = "snarkvm-algorithms" name = "snarkvm-algorithms"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf8ca73d429824090b96f751846e37e539f24c527f1f1ce0254984ade6d17b2" checksum = "99f8349fad4f4e9a05ab4fde6baa99aad8542fcaf10320128114fdc26798a0ad"
dependencies = [ dependencies = [
"blake2", "blake2",
"derivative", "derivative",
@ -2688,9 +2455,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-curves" name = "snarkvm-curves"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64610b135b8b1152439d5dfa4f745515933366082f08651961344aa0bb5abfca" checksum = "3a8f71e6243e588507a7935512bcd79e28906ad89553671151eaf721e42b1513"
dependencies = [ dependencies = [
"derivative", "derivative",
"rand 0.8.3", "rand 0.8.3",
@ -2704,9 +2471,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-derives" name = "snarkvm-derives"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c9829b6e2023b4c7c4d6c55e88fe755dd997171a6c9c063b75c28161d04326" checksum = "d1b3ad83bcd981531a29e8e70bac4cf34126b1031f42bc529975a46e49100383"
dependencies = [ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro-error", "proc-macro-error",
@ -2717,9 +2484,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-dpc" name = "snarkvm-dpc"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "491ae936e24e17c358d112ff8638b260500b5a982ecefc804861e28b5279f552" checksum = "54268e972e18e7a1508418f29fe3f64201f86acf2131ed28b1bc9f8891fc1bbb"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base58", "base58",
@ -2743,9 +2510,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-fields" name = "snarkvm-fields"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c49c69d02df11be58e07f626c9d6f5804c6dd4ccf42e425f2be8d79fe6e5bb7" checksum = "04b885226e300d6a237905038fba681eaa2a851e5cb45a22b685c0bc87c574b6"
dependencies = [ dependencies = [
"bincode", "bincode",
"derivative", "derivative",
@ -2758,9 +2525,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-gadgets" name = "snarkvm-gadgets"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd6f9ac2a166d926e1755a06fdae21ce40ce6164c75c89120401b8d78f3b7ba4" checksum = "0322e4fd5fe0b0b7499a6b1dbd47d20cf65e0904a23094ba087662253ed60ff0"
dependencies = [ dependencies = [
"derivative", "derivative",
"digest 0.9.0", "digest 0.9.0",
@ -2775,9 +2542,9 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-objects" name = "snarkvm-objects"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bd9779ec6ab9211f34a6ba25566feb575a396f4c41cc0e002ec2d48d7560a2a" checksum = "345b2dd86a3d036d09608e7493c7a14bf17a59648e567cd08414d2520a627d07"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -2796,11 +2563,10 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-parameters" name = "snarkvm-parameters"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98378f612206fc7dd44a26f4e345bd1f3ba51bd325acad1e5cc3785d14750ec5" checksum = "7932c7d7fd7b9572a1acaad3c9622f6849c414e5ac8bdb599a504ef4330bb857"
dependencies = [ dependencies = [
"curl",
"hex", "hex",
"snarkvm-algorithms", "snarkvm-algorithms",
"snarkvm-utilities", "snarkvm-utilities",
@ -2809,15 +2575,15 @@ dependencies = [
[[package]] [[package]]
name = "snarkvm-profiler" name = "snarkvm-profiler"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2460ac01c25f79f5ea306e4de82a1d4105e811f868206b4fd31c0c9b62a3d7b" checksum = "877f7ee215903aa4da2343f6d82fd5ec7426210a33f4773770ab35dbdddd3bd9"
[[package]] [[package]]
name = "snarkvm-r1cs" name = "snarkvm-r1cs"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3a0d54b15802976aff7522765dd29d5733f338612449629cc57c5a4a4d51f05" checksum = "f5695a57009b1b79f32df22d88f5d5dabf7a84f6a953280896ae4edb8b9db76d"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"fxhash", "fxhash",
@ -2828,32 +2594,11 @@ dependencies = [
"snarkvm-utilities", "snarkvm-utilities",
] ]
[[package]]
name = "snarkvm-storage"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d76881939f008d7bba4c8cc4118d29567b5c71908ad66bef9880f8aa7c52881"
dependencies = [
"anyhow",
"bincode",
"hex",
"parking_lot",
"rand 0.8.3",
"rocksdb",
"serde",
"snarkvm-algorithms",
"snarkvm-dpc",
"snarkvm-objects",
"snarkvm-parameters",
"snarkvm-utilities",
"thiserror",
]
[[package]] [[package]]
name = "snarkvm-utilities" name = "snarkvm-utilities"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c763843fa67a3aa4ce68173c8cd96b4f04aaa135a5792bc051c36eec0fe1cd73" checksum = "996ba23293c9288d983003c224450db8a6acd875f9fe7f6d839ab91897023b5b"
dependencies = [ dependencies = [
"bincode", "bincode",
"rand 0.8.3", "rand 0.8.3",
@ -2979,15 +2724,6 @@ dependencies = [
"utf-8", "utf-8",
] ]
[[package]]
name = "termcolor"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
dependencies = [
"winapi-util",
]
[[package]] [[package]]
name = "terminal_size" name = "terminal_size"
version = "0.1.16" version = "0.1.16"
@ -3462,15 +3198,6 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "which"
version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.2.8" version = "0.2.8"

View File

@ -70,22 +70,22 @@ path = "./synthesizer"
version = "1.4.0" version = "1.4.0"
[dependencies.snarkvm-algorithms] [dependencies.snarkvm-algorithms]
version = "0.2.2" version = "0.3.1"
[dependencies.snarkvm-curves] [dependencies.snarkvm-curves]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-gadgets] [dependencies.snarkvm-gadgets]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-r1cs] [dependencies.snarkvm-r1cs]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-utilities] [dependencies.snarkvm-utilities]
version = "0.2.2" version = "0.3.1"
[dependencies.anyhow] [dependencies.anyhow]
version = "1.0" version = "1.0"
@ -112,7 +112,7 @@ version = "0.3.1"
version = "1.4.0" version = "1.4.0"
[dependencies.notify] [dependencies.notify]
version = "4.0.16" version = "4.0.17"
[dependencies.rand] [dependencies.rand]
version = "0.8" version = "0.8"
@ -158,7 +158,7 @@ version = "0.12.1"
version = "0.11.2" version = "0.11.2"
[dev-dependencies.assert_cmd] [dev-dependencies.assert_cmd]
version = "1.0.3" version = "1.0.4"
[dev-dependencies.test_dir] [dev-dependencies.test_dir]
version = "0.1.0" version = "0.1.0"

View File

@ -57,27 +57,27 @@ version = "1.4.0"
version = "0.4" version = "0.4"
[dependencies.snarkvm-curves] [dependencies.snarkvm-curves]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-fields] [dependencies.snarkvm-fields]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-dpc] [dependencies.snarkvm-dpc]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-gadgets] [dependencies.snarkvm-gadgets]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-r1cs] [dependencies.snarkvm-r1cs]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-utilities] [dependencies.snarkvm-utilities]
version = "0.2.2" version = "0.3.1"
[dependencies.bincode] [dependencies.bincode]
version = "1.3" version = "1.3"
@ -118,7 +118,7 @@ version = "0.3"
default-features = false default-features = false
[dev-dependencies.snarkvm-algorithms] [dev-dependencies.snarkvm-algorithms]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dev-dependencies.tempfile] [dev-dependencies.tempfile]

View File

@ -44,9 +44,9 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
ConstValue::Address(value) => ConstrainedValue::Address(Address::constant(value.to_string(), span)?), ConstValue::Address(value) => ConstrainedValue::Address(Address::constant(value.to_string(), span)?),
ConstValue::Boolean(value) => ConstrainedValue::Boolean(Boolean::Constant(*value)), ConstValue::Boolean(value) => ConstrainedValue::Boolean(Boolean::Constant(*value)),
ConstValue::Char(value) => { ConstValue::Char(value) => {
ConstrainedValue::Char(Char::constant(*value, format!("{}", *value as u32), span)?) ConstrainedValue::Char(Char::constant(cs, *value, format!("{}", *value as u32), span)?)
} }
ConstValue::Field(value) => ConstrainedValue::Field(FieldType::constant(value.to_string(), span)?), ConstValue::Field(value) => ConstrainedValue::Field(FieldType::constant(cs, value.to_string(), span)?),
ConstValue::Group(value) => ConstrainedValue::Group(G::constant(value, span)?), ConstValue::Group(value) => ConstrainedValue::Group(G::constant(value, span)?),
ConstValue::Int(value) => ConstrainedValue::Integer(Integer::new(value)), ConstValue::Int(value) => ConstrainedValue::Integer(Integer::new(value)),
ConstValue::Tuple(values) => ConstrainedValue::Tuple( ConstValue::Tuple(values) => ConstrainedValue::Tuple(

View File

@ -39,6 +39,10 @@ pub fn evaluate_eq<'a, F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
let unique_namespace = cs.ns(|| namespace_string); let unique_namespace = cs.ns(|| namespace_string);
bool_1.evaluate_equal(unique_namespace, &bool_2) bool_1.evaluate_equal(unique_namespace, &bool_2)
} }
(ConstrainedValue::Char(char_1), ConstrainedValue::Char(char_2)) => {
let unique_namespace = cs.ns(|| namespace_string);
char_1.evaluate_equal(unique_namespace, &char_2)
}
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => { (ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
let unique_namespace = cs.ns(|| namespace_string); let unique_namespace = cs.ns(|| namespace_string);
num_1.evaluate_equal(unique_namespace, &num_2) num_1.evaluate_equal(unique_namespace, &num_2)

View File

@ -72,7 +72,7 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> { impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
pub fn constant_main_function_input<CS: ConstraintSystem<F>>( pub fn constant_main_function_input<CS: ConstraintSystem<F>>(
&mut self, &mut self,
_cs: &mut CS, cs: &mut CS,
type_: &Type, type_: &Type,
name: &str, name: &str,
input_option: Option<InputValue>, input_option: Option<InputValue>,
@ -84,11 +84,14 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
(Type::Address, InputValue::Address(addr)) => Ok(ConstrainedValue::Address(Address::constant(addr, span)?)), (Type::Address, InputValue::Address(addr)) => Ok(ConstrainedValue::Address(Address::constant(addr, span)?)),
(Type::Boolean, InputValue::Boolean(value)) => Ok(ConstrainedValue::Boolean(Boolean::constant(value))), (Type::Boolean, InputValue::Boolean(value)) => Ok(ConstrainedValue::Boolean(Boolean::constant(value))),
(Type::Char, InputValue::Char(character)) => Ok(ConstrainedValue::Char(Char::constant( (Type::Char, InputValue::Char(character)) => Ok(ConstrainedValue::Char(Char::constant(
cs,
character, character,
format!("{}", character as u32), format!("{}", character as u32),
span, span,
)?)), )?)),
(Type::Field, InputValue::Field(value)) => Ok(ConstrainedValue::Field(FieldType::constant(value, span)?)), (Type::Field, InputValue::Field(value)) => {
Ok(ConstrainedValue::Field(FieldType::constant(cs, value, span)?))
}
(Type::Group, InputValue::Group(value)) => Ok(ConstrainedValue::Group(G::constant(&value.into(), span)?)), (Type::Group, InputValue::Group(value)) => Ok(ConstrainedValue::Group(G::constant(&value.into(), span)?)),
(Type::Integer(integer_type), InputValue::Integer(_, value)) => Ok(ConstrainedValue::Integer( (Type::Integer(integer_type), InputValue::Integer(_, value)) => Ok(ConstrainedValue::Integer(
Integer::new(&ConstInt::parse(integer_type, &value, span)?), Integer::new(&ConstInt::parse(integer_type, &value, span)?),
@ -105,7 +108,7 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
Ok(ConstrainedValue::Array( Ok(ConstrainedValue::Array(
values values
.iter() .iter()
.map(|x| self.constant_main_function_input(_cs, type_, name, Some(x.clone()), span)) .map(|x| self.constant_main_function_input(cs, type_, name, Some(x.clone()), span))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
)) ))
} }
@ -119,7 +122,7 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConstrainedProgram<'a, F, G> {
.iter() .iter()
.enumerate() .enumerate()
.map(|(i, x)| { .map(|(i, x)| {
self.constant_main_function_input(_cs, types.get(i).unwrap(), name, Some(x.clone()), span) self.constant_main_function_input(cs, types.get(i).unwrap(), name, Some(x.clone()), span)
}) })
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
)) ))

View File

@ -23,24 +23,117 @@ use crate::{
use leo_ast::{InputValue, Span}; use leo_ast::{InputValue, Span};
use snarkvm_fields::PrimeField; use snarkvm_fields::PrimeField;
use snarkvm_r1cs::ConstraintSystem; use snarkvm_gadgets::utilities::{
bits::comparator::{ComparatorGadget, EvaluateLtGadget},
boolean::Boolean,
eq::{ConditionalEqGadget, EqGadget, EvaluateEqGadget, NEqGadget},
select::CondSelectGadget,
};
use snarkvm_r1cs::{ConstraintSystem, SynthesisError};
/// A char /// A char
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug)]
pub struct Char<F: PrimeField> { pub struct Char<F: PrimeField> {
pub character: char, pub character: char,
pub field: FieldType<F>, pub field: FieldType<F>,
} }
impl<F: PrimeField> Char<F> { impl<F: PrimeField> Char<F> {
pub fn constant(character: char, field: String, span: &Span) -> Result<Self, CharError> { pub fn constant<CS: ConstraintSystem<F>>(
cs: CS,
character: char,
field: String,
span: &Span,
) -> Result<Self, CharError> {
Ok(Self { Ok(Self {
character, character,
field: FieldType::constant(field, span)?, field: FieldType::constant(cs, field, span)?,
}) })
} }
} }
impl<F: PrimeField> PartialEq for Char<F> {
fn eq(&self, other: &Self) -> bool {
self.field.eq(&other.field)
}
}
impl<F: PrimeField> Eq for Char<F> {}
impl<F: PrimeField> PartialOrd for Char<F> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.field.partial_cmp(&other.field)
}
}
impl<F: PrimeField> EvaluateLtGadget<F> for Char<F> {
fn less_than<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
self.field.less_than(cs, &other.field)
}
}
impl<F: PrimeField> ComparatorGadget<F> for Char<F> {}
impl<F: PrimeField> EvaluateEqGadget<F> for Char<F> {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
self.field.evaluate_equal(cs, &other.field)
}
}
impl<F: PrimeField> EqGadget<F> for Char<F> {}
impl<F: PrimeField> ConditionalEqGadget<F> for Char<F> {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self,
cs: CS,
other: &Self,
condition: &Boolean,
) -> Result<(), SynthesisError> {
self.field.conditional_enforce_equal(cs, &other.field, condition)
}
fn cost() -> usize {
<FieldType<F> as ConditionalEqGadget<F>>::cost()
}
}
impl<F: PrimeField> NEqGadget<F> for Char<F> {
fn enforce_not_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<(), SynthesisError> {
self.field.enforce_not_equal(cs, &other.field)
}
fn cost() -> usize {
<FieldType<F> as NEqGadget<F>>::cost()
}
}
impl<F: PrimeField> CondSelectGadget<F> for Char<F> {
fn conditionally_select<CS: ConstraintSystem<F>>(
cs: CS,
cond: &Boolean,
first: &Self,
second: &Self,
) -> Result<Self, SynthesisError> {
let field = FieldType::<F>::conditionally_select(cs, cond, &first.field, &second.field)?;
if field == first.field {
return Ok(Char {
character: first.character,
field,
});
}
Ok(Char {
character: second.character,
field,
})
}
fn cost() -> usize {
<FieldType<F> as CondSelectGadget<F>>::cost()
}
}
pub(crate) fn char_from_input<'a, F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn char_from_input<'a, F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,

View File

@ -21,13 +21,14 @@ use leo_ast::Span;
use snarkvm_fields::PrimeField; use snarkvm_fields::PrimeField;
use snarkvm_gadgets::{ use snarkvm_gadgets::{
fields::{AllocatedFp, FpGadget}, fields::FpGadget,
traits::{ traits::{
fields::FieldGadget, fields::FieldGadget,
utilities::{ utilities::{
alloc::AllocGadget, alloc::AllocGadget,
bits::comparator::{ComparatorGadget, EvaluateLtGadget},
boolean::Boolean, boolean::Boolean,
eq::{ConditionalEqGadget, EqGadget, EvaluateEqGadget}, eq::{ConditionalEqGadget, EqGadget, EvaluateEqGadget, NEqGadget},
select::CondSelectGadget, select::CondSelectGadget,
uint::UInt8, uint::UInt8,
ToBitsBEGadget, ToBitsBEGadget,
@ -36,131 +37,83 @@ use snarkvm_gadgets::{
}, },
}; };
use snarkvm_r1cs::{ConstraintSystem, SynthesisError}; use snarkvm_r1cs::{ConstraintSystem, SynthesisError};
use std::{borrow::Borrow, cmp::Ordering}; use std::{borrow::Borrow, cmp::Ordering};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum FieldType<F: PrimeField> { pub struct FieldType<F: PrimeField>(FpGadget<F>);
Constant(F),
Allocated(FpGadget<F>),
}
impl<F: PrimeField> FieldType<F> { impl<F: PrimeField> FieldType<F> {
/// Returns the value of the field.
pub fn get_value(&self) -> Option<F> { pub fn get_value(&self) -> Option<F> {
match self { self.0.get_value()
FieldType::Constant(field) => Some(*field),
FieldType::Allocated(gadget) => gadget.get_value(),
}
} }
pub fn constant(string: String, span: &Span) -> Result<Self, FieldError> { /// Returns a new `FieldType` from the given `String` or returns a `FieldError`.
pub fn constant<CS: ConstraintSystem<F>>(cs: CS, string: String, span: &Span) -> Result<Self, FieldError> {
let number_info = number_string_typing(&string); let number_info = number_string_typing(&string);
let value = match number_info { let value = match number_info {
(number, neg) if neg => -F::from_str(&number).map_err(|_| FieldError::invalid_field(string, span))?, (number, neg) if neg => {
(number, _) => F::from_str(&number).map_err(|_| FieldError::invalid_field(string, span))?, -F::from_str(&number).map_err(|_| FieldError::invalid_field(string.clone(), span))?
}
(number, _) => F::from_str(&number).map_err(|_| FieldError::invalid_field(string.clone(), span))?,
}; };
Ok(FieldType::Constant(value)) let value = FpGadget::alloc_constant(cs, || Ok(value)).map_err(|_| FieldError::invalid_field(string, span))?;
Ok(FieldType(value))
} }
/// Returns a new `FieldType` by calling the `FpGadget` `negate` function.
pub fn negate<CS: ConstraintSystem<F>>(&self, cs: CS, span: &Span) -> Result<Self, FieldError> { pub fn negate<CS: ConstraintSystem<F>>(&self, cs: CS, span: &Span) -> Result<Self, FieldError> {
match self { let result = self.0.negate(cs).map_err(|e| FieldError::negate_operation(e, span))?;
FieldType::Constant(field) => Ok(FieldType::Constant(field.neg())),
FieldType::Allocated(field) => {
let result = field.negate(cs).map_err(|e| FieldError::negate_operation(e, span))?;
Ok(FieldType::Allocated(result)) Ok(FieldType(result))
}
}
} }
/// Returns a new `FieldType` by calling the `FpGadget` `add` function.
pub fn add<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> { pub fn add<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> {
match (self, other) { let value = self
(FieldType::Constant(self_value), FieldType::Constant(other_value)) => { .0
Ok(FieldType::Constant(self_value.add(other_value))) .add(cs, &other.0)
}
(FieldType::Allocated(self_value), FieldType::Allocated(other_value)) => {
let result = self_value
.add(cs, other_value)
.map_err(|e| FieldError::binary_operation("+".to_string(), e, span))?; .map_err(|e| FieldError::binary_operation("+".to_string(), e, span))?;
Ok(FieldType::Allocated(result)) Ok(FieldType(value))
}
(FieldType::Constant(constant_value), FieldType::Allocated(allocated_value))
| (FieldType::Allocated(allocated_value), FieldType::Constant(constant_value)) => Ok(FieldType::Allocated(
allocated_value
.add_constant(cs, constant_value)
.map_err(|e| FieldError::binary_operation("+".to_string(), e, span))?,
)),
}
} }
/// Returns a new `FieldType` by calling the `FpGadget` `sub` function.
pub fn sub<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> { pub fn sub<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> {
match (self, other) { let value = self
(FieldType::Constant(self_value), FieldType::Constant(other_value)) => { .0
Ok(FieldType::Constant(self_value.sub(other_value))) .sub(cs, &other.0)
}
(FieldType::Allocated(self_value), FieldType::Allocated(other_value)) => {
let result = self_value
.sub(cs, other_value)
.map_err(|e| FieldError::binary_operation("-".to_string(), e, span))?; .map_err(|e| FieldError::binary_operation("-".to_string(), e, span))?;
Ok(FieldType::Allocated(result)) Ok(FieldType(value))
}
(FieldType::Constant(constant_value), FieldType::Allocated(allocated_value))
| (FieldType::Allocated(allocated_value), FieldType::Constant(constant_value)) => Ok(FieldType::Allocated(
allocated_value
.sub_constant(cs, constant_value)
.map_err(|e| FieldError::binary_operation("+".to_string(), e, span))?,
)),
}
} }
/// Returns a new `FieldType` by calling the `FpGadget` `mul` function.
pub fn mul<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> { pub fn mul<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> {
match (self, other) { let value = self
(FieldType::Constant(self_value), FieldType::Constant(other_value)) => { .0
Ok(FieldType::Constant(self_value.mul(other_value))) .mul(cs, &other.0)
}
(FieldType::Allocated(self_value), FieldType::Allocated(other_value)) => {
let result = self_value
.mul(cs, other_value)
.map_err(|e| FieldError::binary_operation("*".to_string(), e, span))?; .map_err(|e| FieldError::binary_operation("*".to_string(), e, span))?;
Ok(FieldType::Allocated(result)) Ok(FieldType(value))
} }
(FieldType::Constant(constant_value), FieldType::Allocated(allocated_value)) /// Returns a new `FieldType` by calling the `FpGadget` `inverse` function.
| (FieldType::Allocated(allocated_value), FieldType::Constant(constant_value)) => Ok(FieldType::Allocated( pub fn inverse<CS: ConstraintSystem<F>>(&self, cs: CS, span: &Span) -> Result<Self, FieldError> {
allocated_value let value = self
.mul_by_constant(cs, constant_value) .0
.map_err(|e| FieldError::binary_operation("*".to_string(), e, span))?, .inverse(cs)
)), .map_err(|e| FieldError::binary_operation("inv".to_string(), e, span))?;
}
Ok(FieldType(value))
} }
/// Returns a new `FieldType` by calling the `FpGadget` `div` function.
pub fn div<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> { pub fn div<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self, span: &Span) -> Result<Self, FieldError> {
let inverse = match other { let inverse = other.inverse(cs.ns(|| "division inverse"), span)?;
FieldType::Constant(constant) => {
let constant_inverse = constant
.inverse()
.ok_or_else(|| FieldError::no_inverse(constant.to_string(), span))?;
FieldType::Constant(constant_inverse)
}
FieldType::Allocated(allocated) => {
let allocated_inverse = allocated
.inverse(&mut cs)
.map_err(|e| FieldError::binary_operation("+".to_string(), e, span))?;
FieldType::Allocated(allocated_inverse)
}
};
self.mul(cs, &inverse, span) self.mul(cs, &inverse, span)
} }
@ -178,15 +131,6 @@ impl<F: PrimeField> FieldType<F> {
F::from_str(&field_string).map_err(|_| SynthesisError::AssignmentMissing) F::from_str(&field_string).map_err(|_| SynthesisError::AssignmentMissing)
} }
pub fn allocated<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<FpGadget<F>, SynthesisError> {
match self {
FieldType::Constant(constant) => FpGadget::alloc(&mut cs.ns(|| format!("{:?}", constant)), || Ok(constant)),
FieldType::Allocated(allocated) => FpGadget::alloc(&mut cs.ns(|| format!("{:?}", allocated)), || {
allocated.get_value().ok_or(SynthesisError::AssignmentMissing)
}),
}
}
} }
impl<F: PrimeField> AllocGadget<String, F> for FieldType<F> { impl<F: PrimeField> AllocGadget<String, F> for FieldType<F> {
@ -196,7 +140,7 @@ impl<F: PrimeField> AllocGadget<String, F> for FieldType<F> {
) -> Result<Self, SynthesisError> { ) -> Result<Self, SynthesisError> {
let value = FpGadget::alloc(cs, || Self::alloc_helper(value_gen))?; let value = FpGadget::alloc(cs, || Self::alloc_helper(value_gen))?;
Ok(FieldType::Allocated(value)) Ok(FieldType(value))
} }
fn alloc_input<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>( fn alloc_input<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>(
@ -205,16 +149,13 @@ impl<F: PrimeField> AllocGadget<String, F> for FieldType<F> {
) -> Result<Self, SynthesisError> { ) -> Result<Self, SynthesisError> {
let value = FpGadget::alloc_input(cs, || Self::alloc_helper(value_gen))?; let value = FpGadget::alloc_input(cs, || Self::alloc_helper(value_gen))?;
Ok(FieldType::Allocated(value)) Ok(FieldType(value))
} }
} }
impl<F: PrimeField> PartialEq for FieldType<F> { impl<F: PrimeField> PartialEq for FieldType<F> {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
let self_value = self.get_value(); self.0.eq(&other.0)
let other_value = other.get_value();
self_value.is_some() && other_value.is_some() && self_value.eq(&other_value)
} }
} }
@ -229,19 +170,17 @@ impl<F: PrimeField> PartialOrd for FieldType<F> {
} }
} }
impl<F: PrimeField> EvaluateEqGadget<F> for FieldType<F> { impl<F: PrimeField> EvaluateLtGadget<F> for FieldType<F> {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, mut _cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn less_than<CS: ConstraintSystem<F>>(&self, _cs: CS, _other: &Self) -> Result<Boolean, SynthesisError> {
match (self, other) { unimplemented!()
(FieldType::Constant(first), FieldType::Constant(second)) => Ok(Boolean::constant(first.eq(second))),
_ => unimplemented!(),
// (FieldType::Allocated(first), FieldType::Allocated(second)) => first.evaluate_equal(cs, second),
// (FieldType::Constant(constant_value), FieldType::Allocated(allocated_value))
// | (FieldType::Allocated(allocated_value), FieldType::Constant(constant_value)) => {
// let allocated_constant_value =
// FpGadget::alloc(&mut cs.ns(|| format!("alloc constant for eq")), || Ok(constant_value))?;
// allocated_value.evaluate_equal(cs, &allocated_constant_value)
// }
} }
}
impl<F: PrimeField> ComparatorGadget<F> for FieldType<F> {}
impl<F: PrimeField> EvaluateEqGadget<F> for FieldType<F> {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
self.0.is_eq(cs, &other.0)
} }
} }
@ -250,30 +189,11 @@ impl<F: PrimeField> EqGadget<F> for FieldType<F> {}
impl<F: PrimeField> ConditionalEqGadget<F> for FieldType<F> { impl<F: PrimeField> ConditionalEqGadget<F> for FieldType<F> {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>( fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self, &self,
mut cs: CS, cs: CS,
other: &Self, other: &Self,
condition: &Boolean, condition: &Boolean,
) -> Result<(), SynthesisError> { ) -> Result<(), SynthesisError> {
match (self, other) { self.0.conditional_enforce_equal(cs, &other.0, condition)
// c - c
(FieldType::Constant(self_value), FieldType::Constant(other_value)) => {
if self_value == other_value {
return Ok(());
}
Err(SynthesisError::AssignmentMissing)
}
// a - a
(FieldType::Allocated(self_value), FieldType::Allocated(other_value)) => {
self_value.conditional_enforce_equal(cs, other_value, condition)
}
// c - a = a - c
(FieldType::Constant(constant_value), FieldType::Allocated(allocated_value))
| (FieldType::Allocated(allocated_value), FieldType::Constant(constant_value)) => {
let constant_gadget = FpGadget::from(AllocatedFp::from(&mut cs, constant_value));
constant_gadget.conditional_enforce_equal(cs, allocated_value, condition)
}
}
} }
fn cost() -> usize { fn cost() -> usize {
@ -281,22 +201,26 @@ impl<F: PrimeField> ConditionalEqGadget<F> for FieldType<F> {
} }
} }
impl<F: PrimeField> NEqGadget<F> for FieldType<F> {
fn enforce_not_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<(), SynthesisError> {
self.0.enforce_not_equal(cs, &other.0)
}
fn cost() -> usize {
<FpGadget<F> as NEqGadget<F>>::cost()
}
}
impl<F: PrimeField> CondSelectGadget<F> for FieldType<F> { impl<F: PrimeField> CondSelectGadget<F> for FieldType<F> {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
mut cs: CS, cs: CS,
cond: &Boolean, cond: &Boolean,
first: &Self, first: &Self,
second: &Self, second: &Self,
) -> Result<Self, SynthesisError> { ) -> Result<Self, SynthesisError> {
if let Boolean::Constant(cond) = *cond { let value = FpGadget::conditionally_select(cs, cond, &first.0, &second.0)?;
if cond { Ok(first.clone()) } else { Ok(second.clone()) }
} else {
let first_gadget = first.allocated(&mut cs)?;
let second_gadget = second.allocated(&mut cs)?;
let result = FpGadget::conditionally_select(cs, cond, &first_gadget, &second_gadget)?;
Ok(FieldType::Allocated(result)) Ok(FieldType(value))
}
} }
fn cost() -> usize { fn cost() -> usize {
@ -305,26 +229,22 @@ impl<F: PrimeField> CondSelectGadget<F> for FieldType<F> {
} }
impl<F: PrimeField> ToBitsBEGadget<F> for FieldType<F> { impl<F: PrimeField> ToBitsBEGadget<F> for FieldType<F> {
fn to_bits_be<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<Boolean>, SynthesisError> { fn to_bits_be<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<Vec<Boolean>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; self.0.to_bits_be(cs)
self_gadget.to_bits_be(cs)
} }
fn to_bits_be_strict<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<Boolean>, SynthesisError> { fn to_bits_be_strict<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<Vec<Boolean>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; self.0.to_bits_be(cs)
self_gadget.to_bits_be_strict(cs)
} }
} }
impl<F: PrimeField> ToBytesGadget<F> for FieldType<F> { impl<F: PrimeField> ToBytesGadget<F> for FieldType<F> {
fn to_bytes<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<UInt8>, SynthesisError> { fn to_bytes<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<Vec<UInt8>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; self.0.to_bytes(cs)
self_gadget.to_bytes(cs)
} }
fn to_bytes_strict<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<UInt8>, SynthesisError> { fn to_bytes_strict<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<Vec<UInt8>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; self.0.to_bytes_strict(cs)
self_gadget.to_bytes_strict(cs)
} }
} }

View File

@ -148,7 +148,7 @@ impl<'a, F: PrimeField, G: GroupType<F>> ConditionalEqGadget<F> for ConstrainedV
bool_1.conditional_enforce_equal(cs, bool_2, condition) bool_1.conditional_enforce_equal(cs, bool_2, condition)
} }
(ConstrainedValue::Char(char_1), ConstrainedValue::Char(char_2)) => { (ConstrainedValue::Char(char_1), ConstrainedValue::Char(char_2)) => {
char_1.field.conditional_enforce_equal(cs, &char_2.field, condition) char_1.conditional_enforce_equal(cs, char_2, condition)
} }
(ConstrainedValue::Field(field_1), ConstrainedValue::Field(field_2)) => { (ConstrainedValue::Field(field_1), ConstrainedValue::Field(field_2)) => {
field_1.conditional_enforce_equal(cs, field_2, condition) field_1.conditional_enforce_equal(cs, field_2, condition)
@ -195,7 +195,7 @@ impl<'a, F: PrimeField, G: GroupType<F>> CondSelectGadget<F> for ConstrainedValu
ConstrainedValue::Boolean(Boolean::conditionally_select(cs, cond, bool_1, bool_2)?) ConstrainedValue::Boolean(Boolean::conditionally_select(cs, cond, bool_1, bool_2)?)
} }
(ConstrainedValue::Char(char_1), ConstrainedValue::Char(char_2)) => { (ConstrainedValue::Char(char_1), ConstrainedValue::Char(char_2)) => {
ConstrainedValue::Field(FieldType::conditionally_select(cs, cond, &char_1.field, &char_2.field)?) ConstrainedValue::Char(Char::conditionally_select(cs, cond, char_1, char_2)?)
} }
(ConstrainedValue::Field(field_1), ConstrainedValue::Field(field_2)) => { (ConstrainedValue::Field(field_1), ConstrainedValue::Field(field_2)) => {
ConstrainedValue::Field(FieldType::conditionally_select(cs, cond, field_1, field_2)?) ConstrainedValue::Field(FieldType::conditionally_select(cs, cond, field_1, field_2)?)

View File

@ -104,7 +104,7 @@ description = "The {name} package"
license = "MIT" license = "MIT"
[remote] [remote]
author = "{author}" # Add your Aleo Package Manager username, team's name, or organization's name. author = "{author}" # Add your Aleo Package Manager username or team name.
"#, "#,
name = self.project.name, name = self.project.name,
author = author author = author

View File

@ -173,6 +173,9 @@ impl Token {
/// Returns a new `StrTendril` string if an character can be eaten, otherwise returns [`None`]. /// Returns a new `StrTendril` string if an character can be eaten, otherwise returns [`None`].
/// ///
fn eat_char(input_tendril: &StrTendril) -> (usize, Option<Token>) { fn eat_char(input_tendril: &StrTendril) -> (usize, Option<Token>) {
// Probably better to move this logic to a parse_char.
// Would give better errors, and isolates logic from lexer.
// Lexer can just return content between single quotes.
if input_tendril.is_empty() { if input_tendril.is_empty() {
return (0, None); return (0, None);
} }
@ -247,6 +250,19 @@ impl Token {
} }
return match characters.len() { return match characters.len() {
1 | 2 | 3 | 4 | 5 if unicode => {
if let Ok(string) = std::str::from_utf8(&characters[..]) {
if let Ok(hex) = u32::from_str_radix(&string, 16) {
if hex <= 0x10FFFF {
if let Some(unicode_char) = std::char::from_u32(hex) {
return (i, Some(Token::CharLit(unicode_char)));
}
}
}
}
(0, None)
}
1 => { 1 => {
if hex { if hex {
return (0, None); return (0, None);
@ -254,8 +270,7 @@ impl Token {
(i, Some(Token::CharLit(characters[0] as char))) (i, Some(Token::CharLit(characters[0] as char)))
} }
2 => { 2 if hex => {
if hex {
if let Ok(string) = std::str::from_utf8(&characters[..]) { if let Ok(string) = std::str::from_utf8(&characters[..]) {
if let Ok(number) = u8::from_str_radix(&string, 16) { if let Ok(number) = u8::from_str_radix(&string, 16) {
if number <= 127 { if number <= 127 {
@ -263,19 +278,11 @@ impl Token {
} }
} }
} }
}
if unicode {
if let Ok(string) = std::str::from_utf8(&characters[..]) {
if let Some(character) = string.chars().next() {
return (i, Some(Token::CharLit(character)));
}
}
}
(0, None) (0, None)
} }
3 => { 3 | 4 => {
// direct unicode symbol
if let Ok(string) = std::str::from_utf8(&characters[..]) { if let Ok(string) = std::str::from_utf8(&characters[..]) {
if let Some(character) = string.chars().next() { if let Some(character) = string.chars().next() {
return (i, Some(Token::CharLit(character))); return (i, Some(Token::CharLit(character)));
@ -284,17 +291,6 @@ impl Token {
(0, None) (0, None)
} }
4 | 5 | 6 => {
if let Ok(unicode_string) = std::str::from_utf8(&characters[..]) {
if let Ok(hex) = u32::from_str_radix(&unicode_string, 16) {
if let Some(unicode_char) = std::char::from_u32(hex) {
return (i, Some(Token::CharLit(unicode_char)));
}
}
}
(0, None)
}
_ => (0, None), _ => (0, None),
}; };
} }

View File

@ -26,18 +26,18 @@ path = "../ast"
version = "1.4.0" version = "1.4.0"
[dependencies.snarkvm-algorithms] [dependencies.snarkvm-algorithms]
version = "0.2.2" version = "0.3.1"
[dependencies.snarkvm-curves] [dependencies.snarkvm-curves]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-dpc] [dependencies.snarkvm-dpc]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-utilities] [dependencies.snarkvm-utilities]
version = "0.2.2" version = "0.3.1"
[dependencies.indexmap] [dependencies.indexmap]
version = "1.6.2" version = "1.6.2"
@ -52,8 +52,8 @@ version = "0.3"
[dependencies.thiserror] [dependencies.thiserror]
version = "1.0" version = "1.0"
[dev-dependencies.snarkvm-storage] #[dev-dependencies.snarkos-storage]
version = "0.2.2" #version = "1.3.3"
[dev-dependencies.rand_core] [dev-dependencies.rand_core]
version = "0.6.2" version = "0.6.2"

View File

@ -14,6 +14,6 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>. // along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
mod test_verify_local_data_commitment; // mod test_verify_local_data_commitment;
mod test_verify_record_commitment; // mod test_verify_record_commitment;

View File

@ -14,206 +14,206 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>. // along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
use leo_ast::Input; // use leo_ast::Input;
use leo_input::LeoInputParser; // use leo_input::LeoInputParser;
use leo_state::verify_local_data_commitment; // use leo_state::verify_local_data_commitment;
//
use snarkvm_algorithms::traits::{CommitmentScheme, CRH}; // use snarkos_storage::{mem::MemDb, Ledger};
use snarkvm_dpc::{ // use snarkvm_algorithms::traits::{CommitmentScheme, CRH};
base_dpc::{instantiated::*, record_payload::RecordPayload, DPC}, // use snarkvm_dpc::{
Account, // base_dpc::{instantiated::*, record_payload::RecordPayload, DPC},
AccountScheme, // traits::DPCScheme,
Record, // Account,
}; // AccountScheme,
use snarkvm_utilities::{bytes::ToBytes, to_bytes}; // Record,
// };
use rand::Rng; // use snarkvm_utilities::{bytes::ToBytes, to_bytes};
use rand_core::SeedableRng; //
use rand_xorshift::XorShiftRng; // use rand::Rng;
use snarkvm_dpc::DPCScheme; // use rand_core::SeedableRng;
use snarkvm_storage::Ledger; // use rand_xorshift::XorShiftRng;
//
// TODO (Collin): Update input to reflect new parameter ordering. // // TODO (Collin): Update input to reflect new parameter ordering.
#[test] // #[test]
#[ignore] // #[ignore]
fn test_verify_local_data_commitment_from_file() { // fn test_verify_local_data_commitment_from_file() {
let mut rng = XorShiftRng::seed_from_u64(1231275789u64); // let mut rng = XorShiftRng::seed_from_u64(1231275789u64);
//
// Generate parameters for the record commitment scheme // // Generate parameters for the record commitment scheme
let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap(); // let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap();
//
// Load test record state file from `inputs/test.state` // // Load test record state file from `inputs/test.state`
let file_bytes = include_bytes!("inputs/test_state.state"); // let file_bytes = include_bytes!("inputs/test_state.state");
let file_string = String::from_utf8_lossy(file_bytes); // let file_string = String::from_utf8_lossy(file_bytes);
let file = LeoInputParser::parse_file(&file_string).unwrap(); // let file = LeoInputParser::parse_file(&file_string).unwrap();
//
let mut program_input = Input::new(); // let mut program_input = Input::new();
program_input.parse_state(file).unwrap(); // program_input.parse_state(file).unwrap();
//
// check record state is correct by verifying commitment // // check record state is correct by verifying commitment
let result = verify_local_data_commitment(&system_parameters, &program_input).unwrap(); // let result = verify_local_data_commitment(&system_parameters, &program_input).unwrap();
//
assert!(result); // assert!(result);
} // }
//
#[test] // #[test]
#[ignore] // #[ignore]
fn test_generate_values_from_dpc() { // fn test_generate_values_from_dpc() {
type L = Ledger<Tx, CommitmentMerkleParameters>; // type L = Ledger<Tx, CommitmentMerkleParameters, MemDb>;
//
let mut rng = XorShiftRng::seed_from_u64(1231275789u64); // let mut rng = XorShiftRng::seed_from_u64(1231275789u64);
//
// Specify network_id // // Specify network_id
let network_id: u8 = 0; // let network_id: u8 = 0;
//
// Generate parameters for the ledger, commitment schemes, CRH, and the // // Generate parameters for the ledger, commitment schemes, CRH, and the
// "always-accept" program. // // "always-accept" program.
let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap(); // let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap();
let noop_program_snark_pp = // let noop_program_snark_pp =
InstantiatedDPC::generate_noop_program_snark_parameters(&system_parameters, &mut rng).unwrap(); // InstantiatedDPC::generate_noop_program_snark_parameters(&system_parameters, &mut rng).unwrap();
//
let noop_program_id = to_bytes![ // let noop_program_id = to_bytes![
ProgramVerificationKeyCRH::hash( // ProgramVerificationKeyCRH::hash(
&system_parameters.program_verification_key_crh, // &system_parameters.program_verification_key_crh,
&to_bytes![noop_program_snark_pp.verification_key].unwrap() // &to_bytes![noop_program_snark_pp.verification_key].unwrap()
) // )
.unwrap() // .unwrap()
] // ]
.unwrap(); // .unwrap();
//
let signature_parameters = &system_parameters.account_signature; // let signature_parameters = &system_parameters.account_signature;
let commitment_parameters = &system_parameters.account_commitment; // let commitment_parameters = &system_parameters.account_commitment;
let encryption_parameters = &system_parameters.account_encryption; // let encryption_parameters = &system_parameters.account_encryption;
//
// Generate metadata and an account for a dummy initial record. // // Generate metadata and an account for a dummy initial record.
let dummy_account = Account::new( // let dummy_account = Account::new(
signature_parameters, // signature_parameters,
commitment_parameters, // commitment_parameters,
encryption_parameters, // encryption_parameters,
&mut rng, // &mut rng,
) // )
.unwrap(); // .unwrap();
//
let sn_nonce = SerialNumberNonce::hash(&system_parameters.serial_number_nonce, &[0u8; 1]).unwrap(); // let sn_nonce = SerialNumberNonce::hash(&system_parameters.serial_number_nonce, &[0u8; 1]).unwrap();
let value = rng.gen(); // let value = rng.gen();
let payload: [u8; 32] = rng.gen(); // let payload: [u8; 32] = rng.gen();
//
let old_record = DPC::generate_record( // let old_record = DPC::generate_record(
&system_parameters, // &system_parameters,
sn_nonce, // sn_nonce,
dummy_account.address, // dummy_account.address,
false, // false,
value, // value,
RecordPayload::from_bytes(&payload), // RecordPayload::from_bytes(&payload),
noop_program_id.clone(), // noop_program_id.clone(),
noop_program_id.clone(), // noop_program_id.clone(),
&mut rng, // &mut rng,
) // )
.unwrap(); // .unwrap();
//
// Set the input records for our transaction to be the initial dummy records. // // Set the input records for our transaction to be the initial dummy records.
let old_records = vec![old_record; NUM_INPUT_RECORDS]; // let old_records = vec![old_record; NUM_INPUT_RECORDS];
let old_account_private_keys = vec![dummy_account.private_key; NUM_INPUT_RECORDS]; // let old_account_private_keys = vec![dummy_account.private_key; NUM_INPUT_RECORDS];
//
// Construct new records. // // Construct new records.
//
// Create an account for an actual new record. // // Create an account for an actual new record.
//
let new_account = Account::new( // let new_account = Account::new(
signature_parameters, // signature_parameters,
commitment_parameters, // commitment_parameters,
encryption_parameters, // encryption_parameters,
&mut rng, // &mut rng,
) // )
.unwrap(); // .unwrap();
//
// Set the new record's program to be the "always-accept" program. // // Set the new record's program to be the "always-accept" program.
//
let new_record_owners = vec![new_account.address; NUM_OUTPUT_RECORDS]; // let new_record_owners = vec![new_account.address; NUM_OUTPUT_RECORDS];
let new_is_dummy_flags = vec![false; NUM_OUTPUT_RECORDS]; // let new_is_dummy_flags = vec![false; NUM_OUTPUT_RECORDS];
let new_values = vec![10; NUM_OUTPUT_RECORDS]; // let new_values = vec![10; NUM_OUTPUT_RECORDS];
let new_payloads = vec![RecordPayload::default(); NUM_OUTPUT_RECORDS]; // let new_payloads = vec![RecordPayload::default(); NUM_OUTPUT_RECORDS];
let new_birth_program_ids = vec![noop_program_id.clone(); NUM_OUTPUT_RECORDS]; // let new_birth_program_ids = vec![noop_program_id.clone(); NUM_OUTPUT_RECORDS];
let new_death_program_ids = vec![noop_program_id; NUM_OUTPUT_RECORDS]; // let new_death_program_ids = vec![noop_program_id; NUM_OUTPUT_RECORDS];
let memo = [0u8; 32]; // let memo = [0u8; 32];
//
let context = <InstantiatedDPC as DPCScheme<L>>::execute_offline( // let context = <InstantiatedDPC as DPCScheme<L>>::execute_offline(
system_parameters.clone(), // system_parameters.clone(),
old_records, // old_records,
old_account_private_keys, // old_account_private_keys,
new_record_owners, // new_record_owners,
&new_is_dummy_flags, // &new_is_dummy_flags,
&new_values, // &new_values,
new_payloads, // new_payloads,
new_birth_program_ids, // new_birth_program_ids,
new_death_program_ids, // new_death_program_ids,
memo, // memo,
network_id, // network_id,
&mut rng, // &mut rng,
) // )
.unwrap(); // .unwrap();
//
let local_data = context.into_local_data(); // let local_data = context.into_local_data();
let leaf_index = 0; // let leaf_index = 0;
let record = &local_data.old_records[leaf_index]; // let record = &local_data.old_records[leaf_index];
//
let root = local_data.local_data_merkle_tree.root(); // let root = local_data.local_data_merkle_tree.root();
//
let serial_number = local_data.old_serial_numbers[0]; // let serial_number = local_data.old_serial_numbers[0];
let serial_number_bytes = to_bytes![serial_number].unwrap(); // let serial_number_bytes = to_bytes![serial_number].unwrap();
//
let memorandum = local_data.memorandum; // let memorandum = local_data.memorandum;
let network_id = local_data.network_id; // let network_id = local_data.network_id;
let input_bytes = to_bytes![serial_number, record.commitment(), memorandum, network_id].unwrap(); // let input_bytes = to_bytes![serial_number, record.commitment(), memorandum, network_id].unwrap();
let leaf_randomness = local_data.local_data_commitment_randomizers[0]; // let leaf_randomness = local_data.local_data_commitment_randomizers[0];
//
let old_record_leaf = <LocalDataCommitment as CommitmentScheme>::commit( // let old_record_leaf = <LocalDataCommitment as CommitmentScheme>::commit(
&system_parameters.local_data_commitment, // &system_parameters.local_data_commitment,
&input_bytes, // &input_bytes,
&leaf_randomness, // &leaf_randomness,
) // )
.unwrap(); // .unwrap();
//
// generate the path // // generate the path
//
let path = local_data // let path = local_data
.local_data_merkle_tree // .local_data_merkle_tree
.generate_proof(&old_record_leaf) // .generate_proof(&old_record_leaf)
.unwrap(); // .unwrap();
//
println!("////////////////////////////////////////////////////"); // println!("////////////////////////////////////////////////////");
println!(); // println!();
println!("[state]"); // println!("[state]");
println!("leaf index {}", leaf_index); // println!("leaf index {}", leaf_index);
println!("root {:?}", to_bytes![root].unwrap()); // println!("root {:?}", to_bytes![root].unwrap());
println!(); // println!();
println!("[record]"); // println!("[record]");
println!( // println!(
"serial number {:?} len {}", // "serial number {:?} len {}",
serial_number_bytes, // serial_number_bytes,
serial_number_bytes.len() // serial_number_bytes.len()
); // );
println!("commitment {:?}", to_bytes![record.commitment()].unwrap()); // println!("commitment {:?}", to_bytes![record.commitment()].unwrap());
println!("owner {}", record.owner()); // println!("owner {}", record.owner());
println!("is_dummy {:?}", record.is_dummy()); // println!("is_dummy {:?}", record.is_dummy());
println!("value {:?}", record.value()); // println!("value {:?}", record.value());
println!("payload {:?}", record.payload()); // println!("payload {:?}", record.payload());
println!("birth_program_id {:?}", record.birth_program_id()); // println!("birth_program_id {:?}", record.birth_program_id());
println!("death_program_id {:?}", record.death_program_id()); // println!("death_program_id {:?}", record.death_program_id());
println!( // println!(
"serial number nonce {:?}", // "serial number nonce {:?}",
to_bytes![record.serial_number_nonce()].unwrap() // to_bytes![record.serial_number_nonce()].unwrap()
); // );
println!( // println!(
"commitment randomness {:?}", // "commitment randomness {:?}",
to_bytes![record.commitment_randomness()].unwrap() // to_bytes![record.commitment_randomness()].unwrap()
); // );
println!(); // println!();
println!("[state_leaf]"); // println!("[state_leaf]");
println!("path {:?}", to_bytes![path].unwrap()); // println!("path {:?}", to_bytes![path].unwrap());
println!("memo {:?}", memorandum); // println!("memo {:?}", memorandum);
println!("network id {:?}", network_id); // println!("network id {:?}", network_id);
println!("leaf randomness {:?}", to_bytes![leaf_randomness].unwrap()); // println!("leaf randomness {:?}", to_bytes![leaf_randomness].unwrap());
println!(); // println!();
println!("////////////////////////////////////////////////////"); // println!("////////////////////////////////////////////////////");
} // }

View File

@ -14,34 +14,34 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>. // along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
use leo_ast::Input; // use leo_ast::Input;
use leo_input::LeoInputParser; // use leo_input::LeoInputParser;
use leo_state::verify_record_commitment; // use leo_state::verify_record_commitment;
//
use snarkvm_dpc::base_dpc::instantiated::*; // use snarkvm_dpc::base_dpc::instantiated::*;
//
use rand_core::SeedableRng; // use rand_core::SeedableRng;
use rand_xorshift::XorShiftRng; // use rand_xorshift::XorShiftRng;
//
// TODO (Collin): Update input to reflect new parameter ordering. // // TODO (Collin): Update input to reflect new parameter ordering.
#[test] // #[test]
#[ignore] // #[ignore]
fn test_verify_record_from_file() { // fn test_verify_record_from_file() {
let mut rng = XorShiftRng::seed_from_u64(1231275789u64); // let mut rng = XorShiftRng::seed_from_u64(1231275789u64);
//
// Generate parameters for the record commitment scheme // // Generate parameters for the record commitment scheme
let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap(); // let system_parameters = InstantiatedDPC::generate_system_parameters(&mut rng).unwrap();
//
// Load test record state file from `inputs/test.state` // // Load test record state file from `inputs/test.state`
let file_bytes = include_bytes!("inputs/test_record.state"); // let file_bytes = include_bytes!("inputs/test_record.state");
let file_string = String::from_utf8_lossy(file_bytes); // let file_string = String::from_utf8_lossy(file_bytes);
let file = LeoInputParser::parse_file(&file_string).unwrap(); // let file = LeoInputParser::parse_file(&file_string).unwrap();
//
let mut program_input = Input::new(); // let mut program_input = Input::new();
program_input.parse_state(file).unwrap(); // program_input.parse_state(file).unwrap();
//
let typed_record = program_input.get_record(); // let typed_record = program_input.get_record();
//
// check record state is correct by verifying commitment // // check record state is correct by verifying commitment
let _values = verify_record_commitment(&system_parameters, typed_record).unwrap(); // let _values = verify_record_commitment(&system_parameters, typed_record).unwrap();
} // }

View File

@ -18,18 +18,18 @@ license = "GPL-3.0"
edition = "2018" edition = "2018"
[dependencies.snarkvm-curves] [dependencies.snarkvm-curves]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-fields] [dependencies.snarkvm-fields]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.snarkvm-gadgets] [dependencies.snarkvm-gadgets]
version = "0.2.2" version = "0.3.1"
[dependencies.snarkvm-r1cs] [dependencies.snarkvm-r1cs]
version = "0.2.2" version = "0.3.1"
default-features = false default-features = false
[dependencies.num-bigint] [dependencies.num-bigint]

View File

@ -1,3 +0,0 @@
function main(a: field, b: field, c: field) {
console.assert(a + b == c);
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field) {
console.assert(a == b);
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field, c: field) {
console.assert(a / b == c);
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field, c: bool) {
console.assert(a == b == c);
}

View File

@ -1,4 +0,0 @@
function main() {
const negOneField: field = -1field;
const oneField = 1field;
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field, c: field) {
console.assert(a * b == c);
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field) {
console.assert(-a == b);
}

View File

@ -1,3 +0,0 @@
function main() {
const f = 1 field;
}

View File

@ -1,3 +0,0 @@
function main(registers) -> field {
return registers.r;
}

View File

@ -1,3 +0,0 @@
function main(a: field, b: field, c: field) {
console.assert(a - b == c);
}

View File

@ -1,5 +0,0 @@
function main(s: bool, a: field, b: field, c: field) {
const r = s ? a : b;
console.assert(r == c);
}

View File

@ -1,6 +1,6 @@
/* /*
namespace: Compile namespace: Compile
expectation: Fail expectation: Pass
input_file: input_file:
- inputs/ascii.in - inputs/ascii.in
- inputs/escaped_unicode.in - inputs/escaped_unicode.in
@ -15,5 +15,7 @@ circuit Foo {
function main(character: char) -> char { function main(character: char) -> char {
let f = Foo { character }; let f = Foo { character };
return f.character;
let character = f.character == 'a' ? 'a' : f.character;
return character;
} }

View File

@ -0,0 +1,14 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/ascii.in
- inputs/escaped_unicode.in
- inputs/escaped.in
- inputs/hex.in
- inputs/unicode.in
*/
function main(character: char) -> char {
return character != 'a' ? 'a' : 'Z';
}

View File

@ -1,2 +1,2 @@
[registers] [registers]
r: char = a; r: char = 'a';

View File

@ -1,9 +1,7 @@
/* // namespace: Compile
namespace: Compile // expectation: Fail
expectation: Fail // input_files:
input_files: // - input/dummy.in
- input/dummy.in
*/
import core.unstable.blake2s.BadCircuit; // `BadCircuit` is not included in the blake2s package import core.unstable.blake2s.BadCircuit; // `BadCircuit` is not included in the blake2s package

View File

@ -1,14 +1,12 @@
/* // namespace: Compile
namespace: Compile // expectation: Pass
expectation: Pass // inputs:
inputs: // - blake.in: |
- blake.in: | // [main]
[main] // message: [u8; 32] = [0; 32];
message: [u8; 32] = [0; 32];
[registers] // [registers]
r0: [u8; 32] = [0; 32]; // r0: [u8; 32] = [0; 32];
*/
import core.unstable.blake2s.Blake2s; import core.unstable.blake2s.Blake2s;

View File

@ -0,0 +1,10 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field, b: field, c: field) -> bool {
return a + b == c;
}

View File

@ -0,0 +1,10 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field, b: field, c: field) -> bool {
return a / b != c;
}

View File

@ -0,0 +1,10 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field, b: field) -> bool {
return a == b;
}

View File

@ -0,0 +1,11 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field) -> bool {
const negOneField: field = -1field;
return negOneField + a == 0field;
}

View File

@ -0,0 +1,7 @@
[main]
a: field = 1field;
b: field = 1field;
c: field = 2field;
[registers]
r: bool = false;

View File

@ -0,0 +1,10 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field, b: field, c: field) -> bool {
return a * b == c;
}

View File

@ -0,0 +1,10 @@
/*
namespace: Compile
expectation: Pass
input_file:
- inputs/fields.in
*/
function main(a: field, b: field) -> bool {
return -a == -b;
}

View File

@ -0,0 +1,8 @@
/*
namespace: Compile
expectation: Fail
*/
function main() {
const f = 1 field;
}

View File

@ -0,0 +1,3 @@
function main(a: field, b: field, c: field) -> bool {
return a - b == c;
}

View File

@ -0,0 +1,3 @@
function main(a: field, b: field, c: field) -> bool {
return b == 1field ? a == 1field : c == 2field;
}

View File

@ -1,5 +1,42 @@
--- ---
namespace: Compile namespace: Compile
expectation: Fail expectation: Pass
outputs: outputs:
- "- Circuit has no constraints, use inputs and registers in program to produce them" - circuit:
num_public_variables: 0
num_private_variables: 6
num_constraints: 4
at: 2859fe6f24016b5634df2791da7de932e68ec32c73b5b573e0c39e968c7a4e12
bt: 8143508f19c8eee208a7fbbcfb833aeeace6ba0a761e41d028599d2237cc60fa
ct: d0c6feeed1e6b8d5c0e03dc9e25641b7fdc34ad912e2b1488296d4a99ed6cbf5
output:
- input_file: inputs/ascii.in
output:
registers:
r:
type: char
value: a
- input_file: inputs/escaped_unicode.in
output:
registers:
r:
type: char
value: ❤
- input_file: inputs/escaped.in
output:
registers:
r:
type: char
value: "'"
- input_file: inputs/hex.in
output:
registers:
r:
type: char
value: "\n"
- input_file: inputs/unicode.in
output:
registers:
r:
type: char
value: ❤

View File

@ -0,0 +1,42 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 6
num_constraints: 3
at: cc1286e0b6fa2e90fb6f0880431a7c1e2cc37a329fae3aff1c13f51036c66f12
bt: 02c492cb6df07172e56cffd0cfd902a8443921e1256a2d907bbabd30bf6b8f6d
ct: a1f8e2b168c0f2f28f0ca3f16ce9b25ba7f7c410cfd68b0912bf19c90b53f2a2
output:
- input_file: inputs/ascii.in
output:
registers:
r:
type: char
value: Z
- input_file: inputs/escaped_unicode.in
output:
registers:
r:
type: char
value: a
- input_file: inputs/escaped.in
output:
registers:
r:
type: char
value: a
- input_file: inputs/hex.in
output:
registers:
r:
type: char
value: a
- input_file: inputs/unicode.in
output:
registers:
r:
type: char
value: a

View File

@ -1,5 +0,0 @@
---
namespace: Compile
expectation: Fail
outputs:
- " --> compiler-test:3:30\n |\n 3 | import core.unstable.blake2s.BadCircuit; // `BadCircuit` is not included in the blake2s package\n | ^^^^^^^^^^\n |\n = failed to resolve import: 'core.unstable.blake2s.BadCircuit'"

View File

@ -1,18 +0,0 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 20168
num_constraints: 20472
at: 43b5f7bd5efbf13ae0684e3c506e5e28866ce7a29f5d6b1442925913bb07a73b
bt: 4d435c1eac471fb7b40b0d83503e2aa13f49db68fc71d64be84ddc9cb053a15d
ct: 081e529f5d26cb4cea2d8288ad454a8d0b381f2fb81e0bd21b47d4186777504f
output:
- input_file: blake.in
output:
registers:
r0:
type: "[u8; 32]"
value: "[213, 24, 235, 180, 216, 116, 28, 65, 88, 162, 204, 6, 23, 8, 66, 112, 214, 239, 242, 134, 165, 39, 172, 247, 65, 130, 155, 2, 97, 147, 14, 57]"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 5
num_constraints: 3
at: 58e404664f2d64d2fd5fee64bf6e997f542a822b8b17e394fcdd7bed05386db8
bt: f91b8601243dbd0d25e7df8f34ff304ca78a295fdfafbe0102ec6ce4fcb3c0f0
ct: fe68b86a12c0b8c1585a656d7c4b8c47fbe19677b5da7ce0aae1d80dffb2a2ca
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "true"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 7
num_constraints: 5
at: 545f3730dcbdb3a3dff41db4263dd41f9be9cf279fdc3cde9518973db0c88685
bt: 0a5ae5a6be6351f852bbcc193e57320be38fff279cf6fd65a3239c3a64239b27
ct: f25b05da849d0d7fcaab89d41d9624efacb48b7ba983f73a0d5f383b16f7009b
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "true"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 4
num_constraints: 3
at: ca775a363045cd405dd1d60cd10edb6cc6e4c0b164934951dab0977509b8225c
bt: 02c492cb6df07172e56cffd0cfd902a8443921e1256a2d907bbabd30bf6b8f6d
ct: a1f8e2b168c0f2f28f0ca3f16ce9b25ba7f7c410cfd68b0912bf19c90b53f2a2
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "true"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 4
num_constraints: 3
at: cfcc3adf871aef0910034c4c3478746733a9746d44fd678971ee2e1e5e69dffd
bt: 02c492cb6df07172e56cffd0cfd902a8443921e1256a2d907bbabd30bf6b8f6d
ct: a1f8e2b168c0f2f28f0ca3f16ce9b25ba7f7c410cfd68b0912bf19c90b53f2a2
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "true"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 6
num_constraints: 4
at: 7dcea624bdc7a6e6fb5f5e93395e84a96db66898779eb3f5595c4e30e3684f17
bt: c21a8e9f463d2fad68fd3a88904dd88f2a3dc7dcb01835357fa4ee457ef1673b
ct: 4b4ef106804964b8a1ee7c1dad3d4682d20a0d07f576130bfec9989b353bf596
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "false"

View File

@ -0,0 +1,18 @@
---
namespace: Compile
expectation: Pass
outputs:
- circuit:
num_public_variables: 0
num_private_variables: 4
num_constraints: 3
at: cc1286e0b6fa2e90fb6f0880431a7c1e2cc37a329fae3aff1c13f51036c66f12
bt: 02c492cb6df07172e56cffd0cfd902a8443921e1256a2d907bbabd30bf6b8f6d
ct: a1f8e2b168c0f2f28f0ca3f16ce9b25ba7f7c410cfd68b0912bf19c90b53f2a2
output:
- input_file: inputs/fields.in
output:
registers:
r:
type: bool
value: "true"

View File

@ -0,0 +1,5 @@
---
namespace: Compile
expectation: Fail
outputs:
- " --> compiler-test:4:13\n |\n 4 | const f = 1 field;\n | ^\n |\n = Unexpected white space between terms 1 and field"