packages feed

bulletproofs-0.4.0: bench/Main.hs

{-# LANGUAGE NoImplicitPrelude #-}

-- To run this, run "stack bench"

module Main where

import Protolude

import Criterion.Main
import qualified Crypto.PubKey.ECC.Types as Crypto
import qualified Bulletproofs.RangeProof as RP
import qualified Bulletproofs.Utils as Utils
import qualified Bulletproofs.Fq as Fq

upperBound :: Integer
upperBound = 2 ^ (2 ^ 6)

benchInput :: (Integer, Integer)
benchInput = (7238283, 827361)

proof :: (Integer, Integer) -> IO (RP.RangeProof Fq.Fq)
proof input = do
  Right proof <- runExceptT $ RP.generateProof upperBound input
  pure proof

prepareProof :: IO (Crypto.Point, RP.RangeProof Fq.Fq)
prepareProof = do
  proofObj <- proof benchInput
  let cm = Utils.commit (fst benchInput) (snd benchInput)
  pure (cm, proofObj)

verify :: Crypto.Point -> RP.RangeProof Fq.Fq -> Bool
verify = RP.verifyProof upperBound

rangeproofBenchmarks :: [Benchmark]
rangeproofBenchmarks
  = [ bench "Proving" $ nfAppIO proof benchInput
    , env prepareProof $ \ ~(cm, proofObj) -> bench "Verifying" $ nf (uncurry verify) (cm, proofObj)
    ]

main :: IO ()
main = defaultMain
  [ bgroup "Rangeproof" rangeproofBenchmarks ]