Adds starter integration tests for u32

This commit is contained in:
howardwu 2020-05-01 22:10:40 -07:00
parent b9afcff602
commit 219f90cb17
20 changed files with 491 additions and 159 deletions

386
Cargo.lock generated
View File

@ -18,6 +18,33 @@ dependencies = [
"winapi",
]
[[package]]
name = "arrayvec"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
[[package]]
name = "async-stream"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22068c0c19514942eefcfd4daf8976ef1aad84e61539f95cd200c35202f80af5"
dependencies = [
"async-stream-impl",
"futures-core",
]
[[package]]
name = "async-stream-impl"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25f9db3b38af870bf7e5cc649167533b493928e50744e2c30ae350230b414670"
dependencies = [
"proc-macro2 1.0.9",
"quote 1.0.3",
"syn 1.0.16",
]
[[package]]
name = "atty"
version = "0.2.14"
@ -71,11 +98,14 @@ checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83"
[[package]]
name = "base58-monero"
version = "0.1.1"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87c25c7705c81e36f14c293e67846819b1fa3ca7c5e9888ebf149c2bd59d06aa"
checksum = "06753f02479480272d4ffc2c850174e2c2e84c887ffa357bc0d8f61ff38791fc"
dependencies = [
"keccak-hash",
"async-stream",
"futures-util",
"tiny-keccak",
"tokio",
]
[[package]]
@ -124,6 +154,16 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "bitvec"
version = "0.17.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c"
dependencies = [
"either",
"radium",
]
[[package]]
name = "blake2"
version = "0.7.1"
@ -156,6 +196,12 @@ dependencies = [
"byte-tools 0.3.1",
]
[[package]]
name = "byte-slice-cast"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3"
[[package]]
name = "byte-tools"
version = "0.2.0"
@ -174,6 +220,12 @@ version = "1.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
[[package]]
name = "bytes"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1"
[[package]]
name = "cc"
version = "1.0.41"
@ -200,9 +252,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "clang-sys"
version = "0.29.2"
version = "0.29.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f92986241798376849e1a007827041fed9bb36195822c2049d18e174420e0534"
checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a"
dependencies = [
"glob",
"libc",
@ -297,12 +349,6 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "crunchy"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda"
[[package]]
name = "crunchy"
version = "0.2.2"
@ -379,40 +425,31 @@ dependencies = [
[[package]]
name = "ethbloom"
version = "0.5.3"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6294da962646baa738414e8e718d1a1f0360a51d92de89ccbf91870418f5360"
checksum = "befe713756981dbbda28e23f5c65c85de512915db695284342cc2ee36b7a184f"
dependencies = [
"crunchy 0.1.6",
"ethereum-types-serialize",
"crunchy",
"fixed-hash",
"serde",
"impl-rlp",
"impl-serde",
"tiny-keccak",
]
[[package]]
name = "ethereum-types"
version = "0.4.2"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e742184dc63a01c8ea0637369f8faa27c40f537949908a237f95c05e68d2c96"
checksum = "8616dc6a7bc7d81ab8a6425635299ee3582975d4ddeb9312b8b0b8ea54dfecf8"
dependencies = [
"crunchy 0.1.6",
"ethbloom",
"ethereum-types-serialize",
"fixed-hash",
"serde",
"impl-rlp",
"impl-serde",
"primitive-types",
"uint",
]
[[package]]
name = "ethereum-types-serialize"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1873d77b32bc1891a79dad925f2acbc318ee942b38b9110f9dbc5fbeffcea350"
dependencies = [
"serde",
]
[[package]]
name = "failure"
version = "0.1.7"
@ -442,14 +479,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
[[package]]
name = "fixed-hash"
version = "0.2.5"
name = "ff"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7afe6ce860afb14422711595a7b26ada9ed7de2f43c0b2ab79d09ee196287273"
checksum = "c4b967a3ee6ae993f0094174257d404a5818f58be79d67a1aea1ec8996d28906"
dependencies = [
"heapsize",
"rand 0.4.6",
"byteorder",
"rand_core 0.5.1",
]
[[package]]
name = "fixed-hash"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c"
dependencies = [
"byteorder",
"rand 0.7.3",
"rustc-hex",
"static_assertions",
]
[[package]]
@ -474,6 +522,45 @@ version = "0.1.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef"
[[package]]
name = "futures-core"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a"
[[package]]
name = "futures-macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7"
dependencies = [
"proc-macro-hack",
"proc-macro2 1.0.9",
"quote 1.0.3",
"syn 1.0.16",
]
[[package]]
name = "futures-task"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27"
[[package]]
name = "futures-util"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5"
dependencies = [
"futures-core",
"futures-macro",
"futures-task",
"pin-utils",
"proc-macro-hack",
"proc-macro-nested",
"slab",
]
[[package]]
name = "generic-array"
version = "0.9.0"
@ -509,15 +596,6 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "heapsize"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461"
dependencies = [
"winapi",
]
[[package]]
name = "heck"
version = "0.3.1"
@ -536,12 +614,6 @@ dependencies = [
"libc",
]
[[package]]
name = "hex"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
[[package]]
name = "hex"
version = "0.4.2"
@ -557,6 +629,33 @@ dependencies = [
"quick-error",
]
[[package]]
name = "impl-codec"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53"
dependencies = [
"parity-scale-codec",
]
[[package]]
name = "impl-rlp"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5"
dependencies = [
"rlp",
]
[[package]]
name = "impl-serde"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8"
dependencies = [
"serde",
]
[[package]]
name = "itertools"
version = "0.7.11"
@ -574,9 +673,9 @@ checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
[[package]]
name = "jsonrpc-core"
version = "14.0.5"
version = "14.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970"
checksum = "25525f6002338fb4debb5167a89a0b47f727a5a48418417545ad3429758b7fec"
dependencies = [
"futures",
"log",
@ -585,16 +684,6 @@ dependencies = [
"serde_json",
]
[[package]]
name = "keccak-hash"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "253bbe643c32c816bf58fa5a88248fafedeebb139705ad17a62add3517854a86"
dependencies = [
"ethereum-types",
"tiny-keccak",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -649,6 +738,7 @@ dependencies = [
name = "leo-compiler"
version = "0.1.0"
dependencies = [
"failure",
"from-pest",
"lazy_static",
"log",
@ -681,9 +771,9 @@ dependencies = [
[[package]]
name = "librocksdb-sys"
version = "6.6.4"
version = "6.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e3b727e2dd20ec2fb7ed93f23d9fd5328a0871185485ebdaff007b47d3e27e4"
checksum = "883213ae3d09bfc3d104aefe94b25ebb183b6f4d3a515b23b14817e1f4854005"
dependencies = [
"bindgen",
"cc",
@ -720,11 +810,11 @@ checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
[[package]]
name = "memoffset"
version = "0.5.3"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8"
dependencies = [
"rustc_version",
"autocfg 1.0.0",
]
[[package]]
@ -739,9 +829,9 @@ dependencies = [
[[package]]
name = "num_cpus"
version = "1.12.0"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
dependencies = [
"hermit-abi",
"libc",
@ -753,6 +843,18 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]]
name = "parity-scale-codec"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "329c8f7f4244ddb5c37c103641027a76c530e65e8e4b8240b29f81ea40508b17"
dependencies = [
"arrayvec",
"bitvec",
"byte-slice-cast",
"serde",
]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
@ -815,12 +917,37 @@ dependencies = [
"sha-1",
]
[[package]]
name = "pin-project-lite"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae"
[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "ppv-lite86"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
[[package]]
name = "primitive-types"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dedac218327b6b55fff5ef05f63ce5127024e1a36342836da7e92cbfac4531"
dependencies = [
"fixed-hash",
"impl-codec",
"impl-rlp",
"impl-serde",
"uint",
]
[[package]]
name = "proc-macro-error"
version = "1.0.2"
@ -847,6 +974,18 @@ dependencies = [
"version_check",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63"
[[package]]
name = "proc-macro-nested"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
[[package]]
name = "proc-macro2"
version = "0.4.30"
@ -890,17 +1029,10 @@ dependencies = [
]
[[package]]
name = "rand"
version = "0.4.6"
name = "radium"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
dependencies = [
"fuchsia-cprng",
"libc",
"rand_core 0.3.1",
"rdrand",
"winapi",
]
checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac"
[[package]]
name = "rand"
@ -1120,6 +1252,15 @@ dependencies = [
"opaque-debug",
]
[[package]]
name = "rlp"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a7d3f9bed94764eac15b8f14af59fac420c236adaff743b7bcc88e265cb4345"
dependencies = [
"rustc-hex",
]
[[package]]
name = "rocksdb"
version = "0.13.0"
@ -1148,15 +1289,6 @@ version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6"
[[package]]
name = "rustc_version"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
dependencies = [
"semver",
]
[[package]]
name = "ryu"
version = "1.0.2"
@ -1180,19 +1312,22 @@ dependencies = [
]
[[package]]
name = "semver"
version = "0.9.0"
name = "secp256k1"
version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
checksum = "2932dc07acd2066ff2e3921a4419606b220ba6cd03a9935123856cc534877056"
dependencies = [
"semver-parser",
"secp256k1-sys",
]
[[package]]
name = "semver-parser"
version = "0.7.0"
name = "secp256k1-sys"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
checksum = "7ab2c26f0d3552a0f12e639ae8a64afc2e3db9c52fe32f5fc6c289d38519f220"
dependencies = [
"cc",
]
[[package]]
name = "serde"
@ -1265,10 +1400,16 @@ dependencies = [
]
[[package]]
name = "smallvec"
version = "1.2.0"
name = "slab"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc"
checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
[[package]]
name = "smallvec"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
[[package]]
name = "snarkos-algorithms"
@ -1305,10 +1446,10 @@ dependencies = [
"base58",
"bincode",
"failure",
"hex 0.4.2",
"hex",
"jsonrpc-core",
"rocksdb",
"secp256k1",
"secp256k1 0.15.5",
"wagyu-model",
]
@ -1349,6 +1490,12 @@ dependencies = [
"rand 0.7.3",
]
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
version = "0.8.0"
@ -1459,11 +1606,23 @@ dependencies = [
[[package]]
name = "tiny-keccak"
version = "1.5.0"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2"
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
dependencies = [
"crunchy 0.2.2",
"crunchy",
]
[[package]]
name = "tokio"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05c1d570eb1a36f0345a5ce9c6c6e665b70b73d11236912c0b477616aeec47b1"
dependencies = [
"bytes",
"futures-core",
"memchr",
"pin-project-lite",
]
[[package]]
@ -1489,14 +1648,14 @@ checksum = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2"
[[package]]
name = "uint"
version = "0.4.1"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "754ba11732b9161b94c41798e5197e5e75388d012f760c42adb5000353e98646"
checksum = "173cd16430c206dc1a430af8a89a0e9c076cf15cb42b4aedb10e8cc8fee73681"
dependencies = [
"byteorder",
"crunchy 0.1.6",
"heapsize",
"crunchy",
"rustc-hex",
"static_assertions",
]
[[package]]
@ -1543,22 +1702,27 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
[[package]]
name = "wagyu-model"
version = "0.6.1"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d64afd740a18fd8404dcebc8b15b2f7b63b0886f2c5552b28c8bf7f32ab462a"
checksum = "98dcfd8275fadf569c386e111968827cb3ca49937dbe816e2f2d43723272635f"
dependencies = [
"base58",
"base58-monero",
"bech32",
"byteorder",
"crypto-mac 0.7.0",
"ethereum-types",
"failure",
"hex 0.3.2",
"ff",
"hex",
"rand 0.7.3",
"rand_core 0.5.1",
"ripemd160",
"secp256k1",
"rlp",
"secp256k1 0.17.2",
"serde_json",
"sha2",
"uint",
]
[[package]]

View File

@ -11,6 +11,7 @@ snarkos-errors = { path = "../../snarkOS/errors", version = "0.8.0" }
snarkos-gadgets = { path = "../../snarkOS/gadgets", version = "0.8.0" }
snarkos-models = { path = "../../snarkOS/models", version = "0.8.0" }
failure = { version = "0.1.5" }
from-pest = { version = "0.3.1" }
lazy_static = { version = "1.3.0" }
log = { version = "0.4" }

View File

@ -1,4 +1,5 @@
use crate::{ast, Program, ResolvedProgram};
use crate::{ast, Program, ResolvedProgram, ResolvedValue};
use crate::errors::CompilerError;
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
@ -11,17 +12,40 @@ use std::{fs, marker::PhantomData, path::PathBuf};
#[derive(Clone)]
pub struct Compiler<F: Field + PrimeField> {
package_name: String,
main_file_path: PathBuf,
output: Option<ResolvedValue<F>>,
_engine: PhantomData<F>,
}
impl<F: Field + PrimeField> Compiler<F> {
pub fn init(main_file_path: PathBuf) -> Self {
pub fn init(package_name: String, main_file_path: PathBuf) -> Self {
Self {
package_name,
main_file_path,
output: None,
_engine: PhantomData,
}
}
pub fn evaluate_program<CS: ConstraintSystem<F>>(self, cs: &mut CS) -> Result<ResolvedValue<F>, CompilerError> {
// Read in the main file as string
let unparsed_file = fs::read_to_string(&self.main_file_path).map_err(|_| CompilerError::FileReadError(self.main_file_path.clone()))?;
// Parse the file using leo.pest
let mut file = ast::parse(&unparsed_file).map_err(|_| CompilerError::FileParsingError)?;
// Build the abstract syntax tree
let syntax_tree = ast::File::from_pest(&mut file).map_err(|_| CompilerError::SyntaxTreeError)?;
log::debug!("{:#?}", syntax_tree);
// Build program from abstract syntax tree
let package_name = self.package_name.clone();
let program = Program::<'_, F>::from(syntax_tree).name(package_name);
log::info!("Compiled -\n{:#?}", program);
Ok(ResolvedProgram::generate_constraints(cs, program))
}
}
impl<F: Field + PrimeField> ConstraintSynthesizer<F> for Compiler<F> {
@ -29,22 +53,7 @@ impl<F: Field + PrimeField> ConstraintSynthesizer<F> for Compiler<F> {
self,
cs: &mut CS,
) -> Result<(), SynthesisError> {
// Read in the main file as string
let unparsed_file = fs::read_to_string(&self.main_file_path).expect("cannot read file");
// Parse the file using leo.pest
let mut file = ast::parse(&unparsed_file).expect("unsuccessful parse");
// Build the abstract syntax tree
let syntax_tree = ast::File::from_pest(&mut file).expect("infallible");
log::debug!("{:#?}", syntax_tree);
let program = Program::<'_, F>::from(syntax_tree);
log::info!(" compiled: {:#?}", program);
let program = program.name("simple".into());
ResolvedProgram::generate_constraints(cs, program);
self.evaluate_program(cs);
Ok(())
}
}

View File

@ -294,7 +294,7 @@ impl<F: Field + PrimeField, CS: ConstraintSystem<F>> ResolvedProgram<F, CS> {
});
}
pub fn generate_constraints(cs: &mut CS, program: Program<F>) {
pub fn generate_constraints(cs: &mut CS, program: Program<F>) -> ResolvedValue<F> {
let mut resolved_program = ResolvedProgram::new();
let program_name = program.get_name();
let main_function_name = new_scope(program_name.clone(), "main".into());
@ -305,12 +305,13 @@ impl<F: Field + PrimeField, CS: ConstraintSystem<F>> ResolvedProgram<F, CS> {
.get(&main_function_name)
.expect("main function not defined");
let result = match main.clone() {
match main.clone() {
ResolvedValue::Function(function) => {
resolved_program.enforce_main_function(cs, program_name, function)
let result = resolved_program.enforce_main_function(cs, program_name, function);
log::info!("{}", result);
result
}
_ => unimplemented!("main must be a function"),
};
println!("\n {}", result);
}
}
}

View File

@ -7,7 +7,7 @@ use snarkos_models::curves::{Field, PrimeField};
use snarkos_models::gadgets::utilities::eq::EqGadget;
use snarkos_models::gadgets::{
r1cs::ConstraintSystem,
utilities::{boolean::Boolean, eq::ConditionalEqGadget, uint32::UInt32},
utilities::{alloc::AllocGadget, boolean::Boolean, eq::ConditionalEqGadget, uint32::UInt32},
};
impl<F: Field + PrimeField, CS: ConstraintSystem<F>> ResolvedProgram<F, CS> {
@ -34,9 +34,9 @@ impl<F: Field + PrimeField, CS: ConstraintSystem<F>> ResolvedProgram<F, CS> {
// Check visibility of parameter
let name = parameter.variable.name.clone();
let number = if parameter.private {
UInt32::alloc(cs.ns(|| name), Some(argument)).unwrap()
UInt32::alloc(cs.ns(|| name), || Ok(argument)).unwrap()
} else {
UInt32::alloc_input(cs.ns(|| name), Some(argument)).unwrap()
UInt32::alloc_input(cs.ns(|| name), || Ok(argument)).unwrap()
};
let parameter_variable = new_variable_from_variable(scope, &parameter.variable);

View File

@ -6,7 +6,10 @@ use snarkos_models::curves::{Field, PrimeField};
use snarkos_models::gadgets::{utilities::boolean::Boolean, utilities::uint32::UInt32};
use std::fmt;
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct ResolvedStructMember<F: Field + PrimeField>(pub Variable<F>, pub ResolvedValue<F>);
#[derive(Clone, PartialEq, Eq)]
pub enum ResolvedValue<F: Field + PrimeField> {
U32(UInt32),
FieldElement(F),
@ -18,9 +21,6 @@ pub enum ResolvedValue<F: Field + PrimeField> {
Return(Vec<ResolvedValue<F>>), // add Null for function returns
}
#[derive(Clone)]
pub struct ResolvedStructMember<F: Field + PrimeField>(pub Variable<F>, pub ResolvedValue<F>);
impl<F: Field + PrimeField> ResolvedValue<F> {
pub(crate) fn match_type(&self, ty: &Type<F>) -> bool {
match (self, ty) {
@ -97,3 +97,9 @@ impl<F: Field + PrimeField> fmt::Display for ResolvedValue<F> {
}
}
}
impl<F: Field + PrimeField> fmt::Debug for ResolvedValue<F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self)
}
}

View File

@ -0,0 +1,29 @@
use std::io;
use std::path::PathBuf;
#[derive(Debug, Fail)]
pub enum CompilerError {
#[fail(display = "{}: {}", _0, _1)]
Crate(&'static str, String),
#[fail(display = "creating: {}", _0)]
Creating(io::Error),
#[fail(display = "Cannot read from the provided file path - {:?}", _0)]
FileReadError(PathBuf),
#[fail(display = "Cannot parse the file")]
FileParsingError,
#[fail(display = "Unable to construct abstract syntax tree")]
SyntaxTreeError,
#[fail(display = "writing: {}", _0)]
Writing(io::Error),
}
impl From<std::io::Error> for CompilerError {
fn from(error: std::io::Error) -> Self {
CompilerError::Crate("std::io", format!("{}", error))
}
}

View File

@ -0,0 +1,2 @@
pub mod compiler;
pub use self::compiler::*;

View File

@ -1,10 +1,15 @@
//! Module containing structs and types that make up an Leo program.
extern crate from_pest;
#[macro_use]
extern crate failure;
#[macro_use]
extern crate lazy_static;
extern crate from_pest;
extern crate pest;
extern crate pest_ast;
#[macro_use]
extern crate pest_derive;
@ -15,6 +20,8 @@ pub mod compiler;
pub mod constraints;
pub use self::constraints::*;
pub mod errors;
pub mod imports;
pub use self::imports::*;

View File

@ -15,7 +15,7 @@ pub struct Variable<F: Field + PrimeField> {
}
/// An integer type enum wrapping the integer value
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Integer {
// U8(u8),
U32(u32),
@ -33,21 +33,21 @@ impl Integer {
}
/// Range or expression enum
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RangeOrExpression<F: Field + PrimeField> {
Range(Option<Integer>, Option<Integer>),
Expression(Expression<F>),
}
/// Spread or expression
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SpreadOrExpression<F: Field + PrimeField> {
Spread(Expression<F>),
Expression(Expression<F>),
}
/// Expression that evaluates to a value
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Expression<F: Field + PrimeField> {
// Variable
Variable(Variable<F>),
@ -90,7 +90,7 @@ pub enum Expression<F: Field + PrimeField> {
}
/// Definition assignee: v, arr[0..2], Point p.x
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Assignee<F: Field + PrimeField> {
Variable(Variable<F>),
Array(Box<Assignee<F>>, RangeOrExpression<F>),
@ -98,7 +98,7 @@ pub enum Assignee<F: Field + PrimeField> {
}
/// Explicit type used for defining a variable or expression type
#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Type<F: Field + PrimeField> {
U32,
FieldElement,
@ -107,13 +107,13 @@ pub enum Type<F: Field + PrimeField> {
Struct(Variable<F>),
}
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub enum ConditionalNestedOrEnd<F: Field + PrimeField> {
Nested(Box<ConditionalStatement<F>>),
End(Vec<Statement<F>>),
}
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct ConditionalStatement<F: Field + PrimeField> {
pub condition: Expression<F>,
pub statements: Vec<Statement<F>>,
@ -121,7 +121,7 @@ pub struct ConditionalStatement<F: Field + PrimeField> {
}
/// Program statement that defines some action (or expression) to be carried out.
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub enum Statement<F: Field + PrimeField> {
// Declaration(Variable),
Return(Vec<Expression<F>>),
@ -133,19 +133,19 @@ pub enum Statement<F: Field + PrimeField> {
AssertEq(Expression<F>, Expression<F>),
}
#[derive(Clone, Debug)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StructMember<F: Field + PrimeField> {
pub variable: Variable<F>,
pub expression: Expression<F>,
}
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct StructField<F: Field + PrimeField> {
pub variable: Variable<F>,
pub ty: Type<F>,
}
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct Struct<F: Field + PrimeField> {
pub variable: Variable<F>,
pub fields: Vec<StructField<F>>,
@ -153,7 +153,7 @@ pub struct Struct<F: Field + PrimeField> {
/// Function parameters
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct Parameter<F: Field + PrimeField> {
pub private: bool,
pub ty: Type<F>,
@ -164,7 +164,7 @@ pub struct Parameter<F: Field + PrimeField> {
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct FunctionName(pub String);
#[derive(Clone)]
#[derive(Clone, PartialEq, Eq)]
pub struct Function<F: Field + PrimeField> {
pub function_name: FunctionName,
pub parameters: Vec<Parameter<F>>,

1
compiler/tests/mod.rs Normal file
View File

@ -0,0 +1 @@
pub mod u32;

View File

@ -0,0 +1,3 @@
function main() -> (u32) {
return 1 + 1
}

View File

@ -0,0 +1,3 @@
function main() -> (u32) {
return 1 - 1
}

View File

@ -0,0 +1,4 @@
// This program should panic at compilation.
function main() -> (u32) {
return 1 - 2
}

89
compiler/tests/u32/mod.rs Normal file
View File

@ -0,0 +1,89 @@
use leo_compiler::{compiler::Compiler, ResolvedValue};
use snarkos_curves::bls12_377::Fr;
use std::env::current_dir;
use snarkos_models::gadgets::r1cs::{ConstraintSynthesizer, TestConstraintSystem};
use snarkos_models::gadgets::utilities::uint32::UInt32;
const DIRECTORY_NAME: &str = "tests/u32/";
fn compile_program(directory_name: &str, file_name: &str) -> Compiler<Fr> {
let path = current_dir().unwrap();
// Sanitize the package path to the test directory
let mut package_path = path.clone();
if package_path.is_file() {
package_path.pop();
}
// Construct the path to the test file in the test directory
let mut main_file_path = package_path.clone();
main_file_path.push(directory_name);
main_file_path.push(file_name);
println!("Compiling file - {:?}", main_file_path);
// Compile from the main file path
let program = Compiler::<Fr>::init(file_name.to_string(), main_file_path);
program
}
#[test]
fn test_zero() {
let mut cs = TestConstraintSystem::<Fr>::new();
let program = compile_program(DIRECTORY_NAME, "zero.leo");
let output = program.evaluate_program(&mut cs);
assert!(cs.is_satisfied());
let output = output.unwrap();
assert_eq!(ResolvedValue::<Fr>::Return(vec![ResolvedValue::<Fr>::U32(UInt32::constant(0))]), output);
println!("{}", output);
}
#[test]
fn test_one() {
let mut cs = TestConstraintSystem::<Fr>::new();
let program = compile_program(DIRECTORY_NAME, "one.leo");
let output = program.evaluate_program(&mut cs);
assert!(cs.is_satisfied());
let output = output.unwrap();
assert_eq!(ResolvedValue::<Fr>::Return(vec![ResolvedValue::<Fr>::U32(UInt32::constant(1))]), output);
println!("{}", output);
}
#[test]
fn test_1_plus_1() {
let mut cs = TestConstraintSystem::<Fr>::new();
let program = compile_program(DIRECTORY_NAME, "1+1.leo");
let output = program.evaluate_program(&mut cs);
assert!(cs.is_satisfied());
let output = output.unwrap();
assert_eq!(ResolvedValue::<Fr>::Return(vec![ResolvedValue::<Fr>::U32(UInt32::constant(2))]), output);
println!("{}", output);
}
#[test]
fn test_1_minus_1() {
let mut cs = TestConstraintSystem::<Fr>::new();
let program = compile_program(DIRECTORY_NAME, "1-1.leo");
let output = program.evaluate_program(&mut cs);
assert!(cs.is_satisfied());
let output = output.unwrap();
assert_eq!(ResolvedValue::<Fr>::Return(vec![ResolvedValue::<Fr>::U32(UInt32::constant(0))]), output);
println!("{}", output);
}
#[test]
fn test_1_minus_2_should_fail() {
// TODO (howardwu): Catch panic from subtraction overflow
let mut cs = TestConstraintSystem::<Fr>::new();
let program = compile_program(DIRECTORY_NAME, "1-2.leo");
let output = program.evaluate_program(&mut cs);
assert!(output.is_err());
}

View File

@ -0,0 +1,3 @@
function main() -> (u32) {
return 1
}

View File

@ -0,0 +1,3 @@
function main() -> (u32) {
return 0
}

View File

@ -33,7 +33,10 @@ impl CLI for BuildCommand {
#[cfg_attr(tarpaulin, skip)]
fn output(_options: Self::Options) -> Result<Self::Output, CLIError> {
let path = current_dir()?;
let _manifest = Manifest::try_from(&path)?;
// Get the package name
let manifest = Manifest::try_from(&path)?;
let package_name = manifest.get_package_name();
// Sanitize the package path to the root directory
let mut package_path = path.clone();
@ -59,7 +62,7 @@ impl CLI for BuildCommand {
log::info!("Compiling program located in {:?}", main_file_path);
// Compile from the main file path
let circuit = Compiler::<Fr>::init(main_file_path);
let circuit = Compiler::<Fr>::init(package_name, main_file_path);
Ok(circuit)
}

View File

@ -50,7 +50,7 @@ impl MainFile {
format!(
r#"// The '{}' main function.
function main() -> (u32) {{
a = 1 + 1
a = 1 + 1;
return a
}}
"#,

View File

@ -38,6 +38,10 @@ impl Manifest {
path.exists()
}
pub fn get_package_name(&self) -> String {
self.package.name.clone()
}
pub fn write_to(self, path: &PathBuf) -> Result<(), ManifestError> {
let mut path = path.to_owned();
if path.is_dir() {