From 43f660441955d63f5f5382da72ddb9dad39ca048 Mon Sep 17 00:00:00 2001 From: Lef Ioannidis Date: Tue, 3 Nov 2020 14:52:43 -0500 Subject: [PATCH] Add an additional r1cs output option --- app/Main.hs | 30 ++++++++++++++++++------------ package.yaml | 1 + src/IR/R1cs.hs | 11 +++++++---- src/Util/Cfg.hs | 3 +++ stack.yaml | 2 ++ stack.yaml.lock | 15 ++++----------- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/app/Main.hs b/app/Main.hs index b51f5c0f..abab9e28 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -59,6 +59,7 @@ import qualified Util.Cfg as Cfg ( setFromEnv , evalCfg , defaultCfgState + , R1CSOutput(..) ) openFile :: FilePath -> IOMode -> IO Handle @@ -173,15 +174,15 @@ type Order -- type Order = 17 -- type OrderCtx = Ctx Order -cmdEmitR1cs :: Bool -> FilePath -> FilePath -> Cfg () -cmdEmitR1cs asJson circomPath r1csPath = do +cmdEmitR1cs :: Cfg.R1CSOutput -> FilePath -> FilePath -> Cfg () +cmdEmitR1cs r1csOutputType circomPath r1csPath = do liftIO $ print "Loading circuit" m <- liftIO $ loadMain circomPath r1cs <- evalLog $ (Link.linkMain @Order m >>= Opt.opt) liftIO $ do putStrLn $ R1cs.r1csStats r1cs --putStrLn $ R1cs.r1csShow r1cs - R1cs.writeToR1csFile asJson r1cs r1csPath + R1cs.writeToR1csFile r1csOutputType r1cs r1csPath cmdCountTerms :: FilePath -> Cfg () cmdCountTerms circomPath = do @@ -195,7 +196,7 @@ cmdCountTerms circomPath = do cmdSetup :: FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> Cfg () cmdSetup libsnark circomPath r1csPath pkPath vkPath = do - cmdEmitR1cs False circomPath r1csPath + cmdEmitR1cs Cfg.Legacy circomPath r1csPath liftIO $ runSetup libsnark r1csPath pkPath vkPath cmdProve @@ -253,11 +254,11 @@ cmdCEval name path = do r <- evalLog $ evalFn False tu name forM_ (Map.toList r) $ \(k, v) -> liftIO $ putStrLn $ unwords [k, ":", show v] -cmdCEmitR1cs :: Bool -> Bool -> String -> FilePath -> FilePath -> Cfg () -cmdCEmitR1cs findBugs asJson fnName cPath r1csPath = do +cmdCEmitR1cs :: Bool -> Cfg.R1CSOutput -> String -> FilePath -> FilePath -> Cfg () +cmdCEmitR1cs findBugs r1csOutputType fnName cPath r1csPath = do tu <- liftIO $ parseC cPath r1cs <- evalLog $ fnToR1cs @Order findBugs Nothing tu fnName - liftIO $ R1cs.writeToR1csFile asJson r1cs r1csPath + liftIO $ R1cs.writeToR1csFile r1csOutputType r1cs r1csPath cmdCSetup :: Bool @@ -269,7 +270,7 @@ cmdCSetup -> FilePath -> Cfg () cmdCSetup findBugs libsnark fnName cPath r1csPath pkPath vkPath = do - cmdCEmitR1cs findBugs False fnName cPath r1csPath + cmdCEmitR1cs findBugs Cfg.Legacy fnName cPath r1csPath liftIO $ runSetup libsnark r1csPath pkPath vkPath cmdCProve @@ -336,9 +337,9 @@ main = do cmd :: Cfg () = case True of _ | args `isPresent` command "emit-r1cs" -> do circomPath <- args `getExistingFilePath` longOption "circom" - let asJson = args `isPresent` longOption "json" + let r1csOutputType = parseR1CSOutputFromArgs args r1csPath <- args `getArgOrExit` shortOption 'C' - cmdEmitR1cs asJson circomPath r1csPath + cmdEmitR1cs r1csOutputType circomPath r1csPath _ | args `isPresent` command "count-terms" -> do circomPath <- args `getExistingFilePath` longOption "circom" cmdCountTerms circomPath @@ -374,11 +375,11 @@ main = do path <- args `getExistingFilePath` argument "path" cmdCEval fnName path _ | args `isPresent` command "c-emit-r1cs" -> do - let asJson = args `isPresent` longOption "json" + let r1csOutputType = parseR1CSOutputFromArgs args fnName <- args `getArgOrExit` argument "fn-name" path <- args `getExistingFilePath` argument "path" r1csPath <- args `getArgOrExit` shortOption 'C' - cmdCEmitR1cs False asJson fnName path r1csPath + cmdCEmitR1cs False r1csOutputType fnName path r1csPath _ | args `isPresent` command "c-setup" -> do libsnark <- args `getExistingFilePath` longOption "libsnark" fnName <- args `getArgOrExit` argument "fn-name" @@ -428,3 +429,8 @@ main = do _ -> liftIO $ exitWithUsageMessage patterns "Missing command!" cfg <- Cfg.setFromEnv Cfg.defaultCfgState Cfg.evalCfg cmd cfg + where + parseR1CSOutputFromArgs m | m `isPresent` longOption "json" = Cfg.Json + | m `isPresent` longOption "flatbuffer" = Cfg.FlatBuffer + | otherwise = Cfg.Legacy + diff --git a/package.yaml b/package.yaml index 3b66facc..113e2d12 100644 --- a/package.yaml +++ b/package.yaml @@ -39,6 +39,7 @@ library: - language-c >= 0.8.3 && < 0.9 - array >= 0.5 - filepath >= 1.4 + - flatbuffers >= 0.2.0 - ghc >= 8.3 - bv >= 0.5 - ghc-typelits-knownnat >= 0.7 diff --git a/src/IR/R1cs.hs b/src/IR/R1cs.hs index d1821527..bf3cb954 100644 --- a/src/IR/R1cs.hs +++ b/src/IR/R1cs.hs @@ -83,6 +83,7 @@ import System.IO ( hPutStr , IOMode(WriteMode) , hClose ) +import Util.Cfg ( R1CSOutput(..) ) -- Faster IO? -- import qualified Data.Text.IO as TextIO -- import System.IO ( openFile @@ -362,10 +363,12 @@ r1csAsLines r1cs = in [nPubIns, nWit, nConstraints] : constraintLines -- Todo: implement this using a better IO system. -writeToR1csFile :: (Show s, KnownNat n) => Bool -> R1CS s n -> FilePath -> IO () -writeToR1csFile asJson r1cs path = if asJson - then ByteString.writeFile path $ encode r1cs - else writeFile path $ unlines $ map (unwords . map show) $ r1csAsLines r1cs +writeToR1csFile + :: (Show s, KnownNat n) => R1CSOutput -> R1CS s n -> FilePath -> IO () +writeToR1csFile Json r1cs path = ByteString.writeFile path $ encode r1cs +writeToR1csFile FlatBuffer r1cs path = undefined -- TODO when we get the schema from SGA +writeToR1csFile Legacy r1cs path = + writeFile path $ unlines $ map (unwords . map show) $ r1csAsLines r1cs -- else do -- h <- openFile path WriteMode -- forM_ (r1csAsLines r1cs) $ \line -> do diff --git a/src/Util/Cfg.hs b/src/Util/Cfg.hs index 1cc073c1..70fc00f6 100644 --- a/src/Util/Cfg.hs +++ b/src/Util/Cfg.hs @@ -16,6 +16,7 @@ module Util.Cfg , defaultCfgState , evalCfg , evalCfgDefault + , R1CSOutput(..) ) where @@ -42,6 +43,8 @@ data SmtOptCfg = SmtOptCfg { _allowSubBlowup :: Bool , _benesThresh :: Int } deriving (Show) +data R1CSOutput = Json | Legacy | FlatBuffer deriving (Show, Eq) + defaultSmtOptCfg :: SmtOptCfg defaultSmtOptCfg = SmtOptCfg { _allowSubBlowup = False diff --git a/stack.yaml b/stack.yaml index f1bea668..cd8cb659 100644 --- a/stack.yaml +++ b/stack.yaml @@ -55,6 +55,8 @@ extra-deps: - mod-0.1.2.0@sha256:4c331986c46808d89da590d791841f046509041c849c4254b0872c72284f73ad,2202 - poly-0.4.0.0@sha256:75c243113712745dab5d2f4a52643705e146473770af212f9e0ce3d87a83f2ed,2123 - semirings-0.5.4@sha256:5bd49c52a22c876c93d030cafa96b1233e9e7c42dacbe9f49686574368578c9c,2998 + - flatbuffers-0.2.0.0@sha256:2aad954811ae8050beecd5100f1695ba5dc67eb71d2be56023144afa61465257,4543 + # Override default flag values for local packages and extra-deps # flags: {} diff --git a/stack.yaml.lock b/stack.yaml.lock index 070e46c3..fcff8f76 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -78,13 +78,6 @@ packages: sha256: e98a21bc2bdaba7dfba0aeb33d7b2ed5472cd496aea38098b40bac665171cefb original: hackage: mod-0.1.2.0@sha256:4c331986c46808d89da590d791841f046509041c849c4254b0872c72284f73ad,2202 -- completed: - hackage: natural-numbers-0.1.2.0@sha256:0fcbe1220979b83fa612fca73a1adb1a99ff43c84f9652b3ff32b2323309b43c,1407 - pantry-tree: - size: 220 - sha256: bd4beb677280f4586265c5657ab4e4a599c16f9e624df43d8edda6bf1e46dcdf - original: - hackage: natural-numbers-0.1.2.0@sha256:0fcbe1220979b83fa612fca73a1adb1a99ff43c84f9652b3ff32b2323309b43c,1407 - completed: hackage: poly-0.4.0.0@sha256:75c243113712745dab5d2f4a52643705e146473770af212f9e0ce3d87a83f2ed,2123 pantry-tree: @@ -100,12 +93,12 @@ packages: original: hackage: semirings-0.5.4@sha256:5bd49c52a22c876c93d030cafa96b1233e9e7c42dacbe9f49686574368578c9c,2998 - completed: - hackage: string-interpolate-0.3.0.2@sha256:0102ed1eac13b7f85c6d2d3da764ad178d98a23d74912f5d2898eb54af624651,4022 + hackage: flatbuffers-0.2.0.0@sha256:2aad954811ae8050beecd5100f1695ba5dc67eb71d2be56023144afa61465257,4543 pantry-tree: - size: 1002 - sha256: 073892b62ecdbee3138c572ede59b223433ac56795af96d2b18885de23b82f96 + size: 2876 + sha256: 71fb1dc36729e49044f85c068bb9953e877c99a839cf9867df813ee540bea1d3 original: - hackage: string-interpolate-0.3.0.2@sha256:0102ed1eac13b7f85c6d2d3da764ad178d98a23d74912f5d2898eb54af624651,4022 + hackage: flatbuffers-0.2.0.0@sha256:2aad954811ae8050beecd5100f1695ba5dc67eb71d2be56023144afa61465257,4543 snapshots: - completed: size: 524996