From 0ce368d68544a54c12a7d7af059bc2841cb97fa6 Mon Sep 17 00:00:00 2001 From: Lars Kuhtz Date: Fri, 18 Jan 2019 17:58:09 -0800 Subject: [PATCH] Initial version --- CHANGELOG.md | 5 + LICENSE | 30 ++ README.md | 78 ++++ bench/Main.hs | 330 +++++++++++++++ bench/results/create-inclusion-proof.png | Bin 0 -> 53605 bytes bench/results/create-tree.png | Bin 0 -> 47004 bytes bench/results/verify-inclusion-proof.png | Bin 0 -> 55788 bytes merkle-log.cabal | 80 ++++ src/Data/MerkleLog.hs | 516 +++++++++++++++++++++++ test/Main.hs | 131 ++++++ 10 files changed, 1170 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 bench/Main.hs create mode 100644 bench/results/create-inclusion-proof.png create mode 100644 bench/results/create-tree.png create mode 100644 bench/results/verify-inclusion-proof.png create mode 100644 merkle-log.cabal create mode 100644 src/Data/MerkleLog.hs create mode 100644 test/Main.hs diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b58d994 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for merkle-log + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5019370 --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2019, Kadena LLC + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Lars Kuhtz nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d05673e --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# Haskell Implementation of Merkle Tree Logs + +This packages implements Merkle Tree Logs as described in RFC 6962 in Haskell. + +## Format + +The implementation stores Merkle trees in a packed format in memory. This allows +for efficient construction, serialization, and querying. Trees are opaque +objects that are allocated and deallocated as well as serialized and +deserialized as a whole, which matches many use cases. Also, trees can be easily +nested, by building larger Merkle trees that have smaller trees as inputs to +their leafs. + +The overhead per indexed item is 64 bytes when 256 bit hashes are used. Thus, +about 16,000 items can be index in 1MB of memory. + +We plan to make the trees extensible and support loading and storing trees in +chunks that represent immutable full subtrees. Please file an issue on GitHub if +you need this feature. + +## Proofs + +Proofs are self contained and don't rely on a particular implementation of +Merkle tree. In particular, proofs don't depend on how the tree is balanced. + +A proof contains the proof subject (the input for which inclusion is proven) as +a plain `ByteString`. The result of validating a proof is a Merkle tree root +that must match the root of the Merkle tree that includes the subject. A proof +doesn't include the root hash of the Merkle tree, because the root must be +obtained from a trusted / authenticated source. Including it in the proof would +thus be redundant and may even be misleading. + +At the moment only inclusion / audit proofs are supported. We plan to also +implement consistency proofs. Please file an issue on GitHub if you need +consistency proofs. + +## Build and Installation + +The package can be build with cabal via + +```sh +cabal new-update +cabal new-build merkle-log +``` + +The test suite can be run with + +```sh +cabal new-test merkle-log +``` + +Benchmarks are available via + + +```sh +cabal new-bench merkle-log +``` + +## Benchmarks + +The following benchmark results compare the performance of this package with +the Merkle tree implementations in the packages +[merkle-tree](http://hackage.haskell.org/package/merkle-tree) and +[hash-tree](http://hackage.haskell.org/package/hash-tree) for different hash +functions on a 64bit Intel CPU. + +Create tree: + +![Create Tree Results](bench/results/create-tree.png) + +Create inclusion proof: + +![Create Inclusion Proof Results](bench/results/create-inclusion-proof.png) + +Verify inclusion proof: + +![Verify Inclusion Proof Results](bench/results/verify-inclusion-proof.png) + diff --git a/bench/Main.hs b/bench/Main.hs new file mode 100644 index 0000000..3cb15f5 --- /dev/null +++ b/bench/Main.hs @@ -0,0 +1,330 @@ +{-# LANGUAGE AllowAmbiguousTypes #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +{-# OPTIONS_GHC -fno-warn-orphans #-} + +-- | +-- Module: Main +-- Copyright: Copyright © 2019 Kadena LLC. +-- License: MIT +-- Maintainer: Lars Kuhtz +-- Stability: experimental +-- +-- TODO +-- +module Main +( main +) where + +import Control.DeepSeq + +import Criterion +import Criterion.Main + +import Crypto.Hash +import qualified Crypto.Hash.MerkleTree as MT + +import qualified Data.ByteArray as BA +import qualified Data.ByteString as B +import Data.ByteString.Random.MWC +import qualified Data.HashTree as HT +import Data.Maybe +import Data.Serialize (encode) + +import GHC.Generics + +import Numeric.Natural + +import System.Random +import qualified System.Random.MWC as MWC + +-- internal modules + +import qualified Data.MerkleLog as ML + +-- -------------------------------------------------------------------------- -- +-- Main + +main :: IO () +main = defaultMain + [ env globalEnv $ \ ~e -> bgroup "main" + [ bgroup "create tree" + [ bgroup "SHA512t_256" + [ createBench @(ML SHA512t_256) e + , createBench @(HT SHA512t_256) e + ] + , bgroup "SHA256" + [ createBench @(ML SHA256) e + , createBench @(HT SHA256) e + ] + , bgroup "SHA3_256" + [ createBench @(ML SHA3_256) e + , createBench @(HT SHA3_256) e + , createBench @MT e + ] + ] + , bgroup "create inclusion proof" + [ bgroup "SHA512t_256" + [ proofBench @(ML SHA512t_256) e + , proofBench @(HT SHA512t_256) e + ] + , bgroup "SHA256" + [ proofBench @(ML SHA256) e + , proofBench @(HT SHA256) e + ] + , bgroup "SHA3_256" + [ proofBench @(ML SHA3_256) e + , proofBench @(HT SHA3_256) e + , proofBench @MT e + ] + ] + , bgroup "verify inclusion proof" + [ bgroup "SHA512t_256" + [ verifyBench @(ML SHA512t_256) e + , verifyBench @(HT SHA512t_256) e + ] + , bgroup "SHA256" + [ verifyBench @(ML SHA256) e + , verifyBench @(HT SHA256) e + ] + , bgroup "SHA3_256" + [ verifyBench @(ML SHA3_256) e + , verifyBench @(HT SHA3_256) e + , verifyBench @MT e + ] + ] + ] + ] + +-- -------------------------------------------------------------------------- -- +-- Merkle Tree Implementations +-- -------------------------------------------------------------------------- -- + +-- -------------------------------------------------------------------------- -- +-- Global Environment + +leafCount :: Int +leafCount = 10000 + +leafMaxSize :: Int +leafMaxSize = 1000 + +type GlobalEnv = [B.ByteString] + +globalEnv :: IO GlobalEnv +globalEnv = do + gen <- MWC.create + traverse (randomGen gen) (randomNats leafCount) + where + +randomNats :: Int -> [Natural] +randomNats i = fmap fromIntegral $ take i $ randomRs @Int (0,leafMaxSize) $ mkStdGen 1 + +-- -------------------------------------------------------------------------- -- +-- Create Benchmark + +createBench :: forall a . Impl a => GlobalEnv -> Benchmark +createBench = bench (label @a) . nf (tree @a) + +-- -------------------------------------------------------------------------- -- +-- Proof Benchmark + +type ProofEnv a = (Tree a, B.ByteString, Int) + +proofEnv :: forall a . Impl a => GlobalEnv -> IO (ProofEnv a) +proofEnv e = return (tree @a e, e !! 277, 277) + +-- | Note that this also includes verification of the proof, because that's the +-- only way we can ensure that the resulting proofs are in normal form. +-- +proofBench + :: forall a + . Impl a + => GlobalEnv + -> Benchmark +proofBench e = env (proofEnv @a e) + $ bench (label @a) . nf (\(t, ix, i) -> proof @a t ix i) + +-- -------------------------------------------------------------------------- -- +-- Verify Benchmark + +type VerifyEnv a = Proof a + +verifyEnv :: forall a . Impl a => GlobalEnv -> IO (VerifyEnv a) +verifyEnv e = return $ proof @a (tree @a e) (e !! 277) 277 + +verifyBench + :: forall a + . Impl a + => GlobalEnv + -> Benchmark +verifyBench e = env (verifyEnv @a e) $ bench (label @a) . nf verifyThrow + where + verifyThrow p + | verify @a p = () + | otherwise = error "benchmark failure" + +-- -------------------------------------------------------------------------- -- +-- Merkle Tree Implementations +-- -------------------------------------------------------------------------- -- + +-- -------------------------------------------------------------------------- -- +-- Merkle Tree Implementation Class + +class (NFData (Tree a), NFData (Root a), NFData (Proof a)) => Impl a where + type Tree a + type Proof a + type Root a + + label :: String + tree :: [B.ByteString] -> Tree a + root :: Tree a -> Root a + proof :: Tree a -> B.ByteString -> Int -> Proof a + verify :: Proof a -> Bool + +-- -------------------------------------------------------------------------- -- +-- merkle-log + +data MLProof a = MLProof + {-# UNPACK #-} !(ML.MerkleProof a) + {-# UNPACK #-} !(ML.MerkleRoot a) + -- ^ Root of the Tree + deriving (Generic) + +instance NFData (MLProof a) + +data ML a + +instance HashAlgorithm a => Impl (ML a) where + type Tree (ML a) = ML.MerkleTree a + type Proof (ML a) = MLProof a + type Root (ML a) = ML.MerkleRoot a + + label = "merkle-log" + tree = ML.merkleTree @a + root = ML.merkleRoot + proof t ix i = + let Right p = ML.merkleProof i ix t + in MLProof p (ML.merkleRoot t) + verify (MLProof p r) = ML.runMerkleProof p == r + + {-# INLINE label #-} + {-# INLINE tree #-} + {-# INLINE root #-} + {-# INLINE proof #-} + {-# INLINE verify #-} + +-- -------------------------------------------------------------------------- -- +-- merkle-tree package + +data MTProof = MTProof + !(MT.MerkleProof B.ByteString) + {-# UNPACK #-} !B.ByteString + -- ^ Proof subject (leaf) + {-# UNPACK #-} !(MT.MerkleRoot B.ByteString) + -- ^ Root of the Tree + +-- | The merkle-tree package doesn't export the 'ProofElem'. Without that the +-- 'Generic' instance for 'MT.MerkleProof' become almost useless. In particular +-- we can't define an 'NFData' instance. +-- +-- This instance is a workaround that probably leads to worse benchmark results. +-- +instance NFData MTProof where + -- rnf (MTProof p subj r) = rnf + -- $ MT.validateMerkleProof p r $ MT.mkLeafRootHash subj + rnf (MTProof p _ _) = rnf $ encode p + {-# INLINE rnf #-} + +instance NFData (MT.MerkleRoot B.ByteString) where + rnf r = rnf (MT.getMerkleRoot r) + {-# INLINE rnf #-} + +instance NFData (MT.MerkleTree B.ByteString) where + rnf t = rnf $ MT.mtRoot t + {-# INLINE rnf #-} + +data MT + +instance Impl MT where + type Tree MT = MT.MerkleTree B.ByteString + type Proof MT = MTProof + type Root MT = MT.MerkleRoot B.ByteString + + label = "merkle-tree" + tree = MT.mkMerkleTree + root = MT.mtRoot + proof t subj _ = MTProof + (MT.merkleProof t (MT.mkLeafRootHash subj)) + subj + (MT.mtRoot t) + verify (MTProof p subj r) + = MT.validateMerkleProof p r (MT.mkLeafRootHash subj) + + {-# INLINE label #-} + {-# INLINE tree #-} + {-# INLINE root #-} + {-# INLINE proof #-} + {-# INLINE verify #-} + +-- -------------------------------------------------------------------------- -- +-- hash-tree package + +data HTProof a = HTProof + {-# UNPACK #-} !(HT.InclusionProof a) + {-# UNPACK #-} !B.ByteString + -- ^ Proof subject (leaf) + {-# UNPACK #-} !(Digest a) + -- ^ Root of the Tree + deriving (Generic) + +instance NFData (HTProof a) + +instance NFData (HT.MerkleHashTrees B.ByteString a) where + rnf t = rnf $ HT.digest (HT.size t) t + {-# INLINE rnf #-} + +instance NFData (HT.InclusionProof a) where + rnf p = rnf (HT.leafIndex p) + `seq` rnf (HT.treeSize p) + `seq` rnf (HT.inclusion p) + {-# INLINE rnf #-} + +data HT a + +htSettings :: forall a . HashAlgorithm a => HT.Settings B.ByteString a +htSettings = HT.defaultSettings + { HT.hash0 = hash @B.ByteString @a mempty + , HT.hash1 = \x -> hash @_ @a (B.singleton 0x00 `B.append` x) + , HT.hash2 = \x y -> hash @_ @a $ B.concat [B.singleton 0x01, BA.convert x, BA.convert y] + } + +instance HashAlgorithm a => Impl (HT a) where + type Tree (HT a) = HT.MerkleHashTrees B.ByteString a + type Proof (HT a) = HTProof a + type Root (HT a) = Digest a + + label = "hash-tree" + tree = HT.fromList htSettings + root t = fromJust $ HT.digest (HT.size t) t + proof t ix _ = HTProof + (fromJust $ HT.generateInclusionProof (HT.hash1 (htSettings @a) ix) (HT.size t) t) + ix + (root @(HT a) t) + verify (HTProof p subj r) = HT.verifyInclusionProof + (htSettings @a) (HT.hash1 (htSettings @a) subj) r p + + {-# INLINE label #-} + {-# INLINE tree #-} + {-# INLINE root #-} + {-# INLINE proof #-} + {-# INLINE verify #-} + diff --git a/bench/results/create-inclusion-proof.png b/bench/results/create-inclusion-proof.png new file mode 100644 index 0000000000000000000000000000000000000000..06839f419899b5e93685fd340dbeb2277eda84c9 GIT binary patch literal 53605 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

n-b?z<#Lp^85g}6+KDaPqM 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

hD$#H? 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 literal 0 HcmV?d00001 diff --git a/merkle-log.cabal b/merkle-log.cabal new file mode 100644 index 0000000..d18935e --- /dev/null +++ b/merkle-log.cabal @@ -0,0 +1,80 @@ +cabal-version: 2.2 +name: merkle-log +version: 0.1.0.0 +synopsis: Merkle Tree Logs +description: A implementation of Merkle Trees from RFC 6962 +homepage: https://github.com/kadena-io/merkle-log +bug-reports: https://github.com/kadena-io/merkle-log/issues +license: BSD-3-Clause +license-file: LICENSE +author: Lars Kuhtz +maintainer: Lars Kuhtz +copyright: Copyright (c) 2019, Kadena LLC +category: Data +extra-source-files: + README.md + CHANGELOG.md + +library + hs-source-dirs: src + default-language: Haskell2010 + ghc-options: + -Wall + exposed-modules: + Data.MerkleLog + build-depends: + base >=4.12 + , bytestring >=0.10 + , cryptonite >=0.25 + , deepseq >=1.4 + , memory >=0.14 + +test-suite test + type: exitcode-stdio-1.0 + hs-source-dirs: test + ghc-options: + -Wall + -threaded + -with-rtsopts=-N + default-language: Haskell2010 + main-is: Main.hs + build-depends: + -- internal + merkle-log + + -- external + , QuickCheck >=2.12 + , base >=4.11 + , bytestring >=0.10 + , cryptonite >=0.25 + , deepseq >=1.4 + , memory >=0.14 + +benchmark benchmarks + type: exitcode-stdio-1.0 + hs-source-dirs: bench + ghc-options: + -Wall + -threaded + -with-rtsopts=-N + default-language: Haskell2010 + main-is: Main.hs + build-depends: + -- internal + merkle-log + + -- external + , QuickCheck >=2.12 + , base >=4.11 + , bytestring >=0.10 + , cereal >=0.5 + , criterion >=1.5 + , cryptonite >=0.25 + , deepseq >=1.4 + , hash-tree >=0.0 + , memory >=0.14 + , merkle-tree >=0.1 + , mwc-random >=0.14 + , random >=1.1 + , random-bytestring >=0.1 + diff --git a/src/Data/MerkleLog.hs b/src/Data/MerkleLog.hs new file mode 100644 index 0000000..efcaef2 --- /dev/null +++ b/src/Data/MerkleLog.hs @@ -0,0 +1,516 @@ +{-# LANGUAGE AllowAmbiguousTypes #-} +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} + +-- | +-- Module: Data.MerkleLog +-- Copyright: Copyright © 2019 Kadena LLC. +-- License: MIT +-- Maintainer: Lars Kuhtz +-- Stability: experimental +-- +-- Merkle Logs are a append-only data structure. This implementation is based on +-- the description in RFC 6962. Extending a Merkle tree requires chaining a +-- logarithmic number of nodes at the end of the tree. +-- +-- TODO: +-- +-- * implement extension of trees (possibly by linking memory chunks of maximal full trees) +-- (how important is this?) +-- * implement consistency proofs +-- * more tests +-- * Exceptions + MonadThrow (or at least as SomeException?) +-- * document encodings and hash format +-- * describe tree layout +-- * more code cleanup +-- * Resolve all TODOs and FIXMEs +-- * reduce dependency on memory package by storing everything in +-- (pinned) 'B.ByteString's or unpinned 'BA.ByteArray's +-- * put on Hackage? +-- +module Data.MerkleLog +( +-- * Merkle Tree + MerkleTree +, merkleTree +, encodeMerkleTree +, decodeMerkleTree + +-- * Merkle Root +, MerkleRoot +, merkleRoot +, encodeMerkleRoot +, decodeMerkleRoot + +-- * Merkle Proofs +, MerkleProof(..) +, MerkleProofSubject(..) +, MerkleProofObject +, encodeMerkleProofObject +, decodeMerkleProofObject +, merkleProof +, runMerkleProof + +-- * Internal + +, isEmpty +, emptyMerkleTree +, size +, leafCount +, MerkleHash +, getHash + +) where + +import Control.DeepSeq +import Control.Monad + +import Crypto.Hash (hash) +import Crypto.Hash.Algorithms (HashAlgorithm) +import Crypto.Hash.IO + +import qualified Data.ByteArray as BA +import Data.ByteArray.Encoding +import qualified Data.ByteString as B +import Data.Word + +import Foreign.Ptr +import Foreign.Storable + +import GHC.Generics + +-- -------------------------------------------------------------------------- -- +-- Hashes + +newtype MerkleHash a = MerkleHash BA.Bytes + deriving (Eq, Generic) + deriving newtype (NFData, BA.ByteArrayAccess) + +instance Show (MerkleHash a) where + show = fmap (toEnum . fromEnum) + . BA.unpack @BA.Bytes + . convertToBase Base64URLUnpadded + {-# INLINEABLE show #-} + +hashSize :: forall a c . HashAlgorithm a => Num c => c +hashSize = fromIntegral $ hashDigestSize @a undefined +{-# INLINE hashSize #-} + +decodeMerkleHash + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => b + -> Either String (MerkleHash a) +decodeMerkleHash b + | BA.length b /= hashSize @a = Left m + | otherwise = Right $ MerkleHash $ BA.convert b + where + m = "failed to decode Merkle hash. Expected size: " + <> show (hashSize @a @Int) <> ". Actual size: " <> show (BA.length b) +{-# INLINE decodeMerkleHash #-} + +-- -------------------------------------------------------------------------- -- +-- Merkle Tree Nodes + +leafTag :: BA.ByteArray a => a +leafTag = BA.singleton 0 +{-# INLINE leafTag #-} + +nodeTag :: BA.ByteArray a => a +nodeTag = BA.singleton 1 +{-# INLINE nodeTag #-} + +merkleLeaf + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => b + -> MerkleHash a +merkleLeaf !bytes = MerkleHash $ BA.allocAndFreeze (hashSize @a) $ \ptr -> do + !ctx <- hashMutableInit @a + merkleLeafPtr ctx bytes ptr + +merkleNodePtr + :: forall a + . HashAlgorithm a + => MutableContext a + -> Ptr (MerkleHash a) + -> Ptr (MerkleHash a) + -> Ptr (MerkleHash a) + -> IO () +merkleNodePtr !ctx !a !b !r = do + hashMutableReset ctx + hashMutableUpdate ctx (nodeTag @BA.Bytes) + BA.withByteArray ctx $ \ctxPtr -> do + hashInternalUpdate @a ctxPtr (castPtr a) (hashSize @a) + hashInternalUpdate ctxPtr (castPtr b) (hashSize @a) + hashInternalFinalize ctxPtr (castPtr r) + +merkleLeafPtr + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => MutableContext a + -> b + -> Ptr (MerkleHash a) + -> IO () +merkleLeafPtr !ctx !b !r = do + hashMutableReset ctx + hashMutableUpdate ctx (leafTag @BA.Bytes) + hashMutableUpdate ctx b + BA.withByteArray ctx $ \ctxPtr -> + hashInternalFinalize @a ctxPtr (castPtr r) + +-- -------------------------------------------------------------------------- -- +-- Merkle Tree +-- +-- Using unsafe operations in the implementation is fine, since proof testing +-- of Merkle proof validation provides robust assurance that the data in the +-- underlying memory is correct to the bit level. +-- + +-- | Binary Merkle Tree. +-- +-- A Merkle Tree is only an index. It doesn't store any data but only hashes of +-- the data that is referenced in the tree. +-- +newtype MerkleTree a = MerkleTree BA.Bytes + deriving (Eq, Generic) + deriving newtype (NFData, BA.ByteArrayAccess) + +instance Show (MerkleTree a) where + show = fmap (toEnum . fromEnum) + . BA.unpack @BA.Bytes + . convertToBase Base64URLUnpadded + {-# INLINEABLE show #-} + +-- | Merkle Tree as described in RFC 6962, but with configurable hash function. +-- +-- For full RFC 6962 compliance 'Crypto.Hash.SHA256' should be used as hash algorithm. +-- +-- The Merkle tree for the empty input log is the hash of the empty string. +-- +-- TODO: The length of the list is forced before the algorithm starts processing +-- the items. Either demand a strict structure (e.g. vector or array) or +-- allocate tree memory dynamically while traversing the log structure. +-- +merkleTree + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => [b] + -> MerkleTree a +merkleTree [] = MerkleTree $ BA.convert $ hash @_ @a (mempty @B.ByteString) +merkleTree !items = MerkleTree $ BA.allocAndFreeze (tsize * hashSize @a) $ \ptr -> do + + !ctx <- hashMutableInit @a + + -- TODO compare performance with explicit construction + let + -- | This uses logarithmic stack space + -- + go + :: Ptr (MerkleHash a) + -- ^ ptr into output tree + -> [b] + -- ^ input log + -> [(Int, Ptr (MerkleHash a))] + -- stack of tree hight and ptr into tree + -> IO () + + -- Create new inner node from stack tree positions on stack + -- + go !i t ((!a, !ia) : (!b, !ib) : s) | a == b = do + merkleNodePtr ctx ib ia i + go (i `plusPtr` hs) t ((succ a, i) : s) + + -- Create new leaf node on the stack + -- + go !i (h : t) !s = do + merkleLeafPtr ctx h i + go (i `plusPtr` hs) t ((0, i) : s) + + -- When all inputs are consumed, include remaining nodes on the + -- stack as unbalanced subtree + -- + go !i [] ((!a, !ia) : (!_, !ib) : s) = do + merkleNodePtr ctx ib ia i + go (i `plusPtr` hs) [] ((succ a, i) : s) + + go _ [] [_] = return () + + go _ [] [] = error "TODO: empty hash" + + go ptr items [] + + where + !isize = length items + !tsize = isize + (isize - 1) + !hs = hashSize @a + +-- | Test a Merkle tree is the tree of the empty log. +-- +isEmpty :: forall a . HashAlgorithm a => MerkleTree a -> Bool +isEmpty = BA.constEq (emptyMerkleTree @a) +{-# INLINE isEmpty #-} + +-- | The Merkle tree of the empty log. RFC 6962 specifies that this is the hash +-- of the empty string. +-- +emptyMerkleTree :: forall a . HashAlgorithm a => MerkleTree a +emptyMerkleTree = merkleTree @a ([] @B.ByteString) +{-# INLINEABLE emptyMerkleTree #-} + +-- | Binary encoding of a Merkle tree. +-- +encodeMerkleTree :: BA.ByteArray b => MerkleTree a -> b +encodeMerkleTree = BA.convert +{-# INLINE encodeMerkleTree #-} + +-- | The number of nodes (including leafs) in a Merkle tree. +-- +size :: forall a . HashAlgorithm a => MerkleTree a -> Int +size t = BA.length t `div` hashSize @a +{-# INLINE size #-} + +-- | Decode are Merkle tree from a binary representation. +-- +decodeMerkleTree + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => b + -> Either String (MerkleTree a) +decodeMerkleTree b + | BA.length b `mod` hashSize @a == 0 = Right $ MerkleTree $ BA.convert b + | otherwise = Left + $ "failed to decode Merkle tree. The size must be a multiple of " + <> show (hashSize @a @Int) + <> ". But the input has size " <> show (BA.length b) +{-# INLINE decodeMerkleTree #-} + +-- -------------------------------------------------------------------------- -- +-- Merkle Root + +-- | The root of a Merkle tree. +-- +newtype MerkleRoot a = MerkleRoot (MerkleHash a) + deriving (Eq, Generic) + deriving newtype (Show, NFData, BA.ByteArrayAccess) + +-- | Get the root of Merkle tree. +-- +merkleRoot :: forall a . HashAlgorithm a => MerkleTree a -> MerkleRoot a +merkleRoot t = MerkleRoot $ getHash t (size t - 1) +{-# INLINE merkleRoot #-} + +-- | Encode a Merkle tree root into binary format. +-- +encodeMerkleRoot :: BA.ByteArray b => MerkleRoot a -> b +encodeMerkleRoot = BA.convert +{-# INLINE encodeMerkleRoot #-} + +-- | Decode a Merkle tree root from a binary representation. +-- +decodeMerkleRoot + :: HashAlgorithm a + => BA.ByteArrayAccess b + => b + -> Either String (MerkleRoot a) +decodeMerkleRoot = fmap MerkleRoot . decodeMerkleHash +{-# INLINE decodeMerkleRoot #-} + +-- -------------------------------------------------------------------------- -- +-- Proof Object + +-- | Opaque proof object. +-- +newtype MerkleProofObject a = MerkleProofObject BA.Bytes + deriving (Eq, Generic) + deriving anyclass (NFData) + deriving newtype (BA.ByteArrayAccess) + +instance Show (MerkleProofObject a) where + show = fmap (toEnum . fromEnum) + . BA.unpack @BA.Bytes + . convertToBase @_ @BA.Bytes Base64URLUnpadded + {-# INLINEABLE show #-} + +-- | Encode a Merkle proof object into binary format. +-- +encodeMerkleProofObject :: BA.ByteArray b => MerkleProofObject a -> b +encodeMerkleProofObject = BA.convert +{-# INLINE encodeMerkleProofObject #-} + +-- | Encode a Merkle proof object from a binary representation. +-- +decodeMerkleProofObject + :: forall a b + . HashAlgorithm a + => BA.ByteArrayAccess b + => b + -> Either String (MerkleProofObject a) +decodeMerkleProofObject bytes + | BA.length bytes `mod` stepSize @a /= 0 = + Left "invalid merkle proof object, wrong size" + | otherwise = Right $ MerkleProofObject $ BA.convert bytes + +stepSize :: forall a . HashAlgorithm a => Int +stepSize = hashSize @a + 1 +{-# INLINE stepSize #-} + +-- -------------------------------------------------------------------------- -- +-- Proof Subject + +-- | The subject for which inclusion is proven. +-- +newtype MerkleProofSubject = MerkleProofSubject B.ByteString + deriving (Show, Eq, Ord, Generic) + deriving newtype (BA.ByteArrayAccess) + deriving anyclass (NFData) + +-- -------------------------------------------------------------------------- -- +-- Merkle Proof + +-- | Merkle Inclusion Proof. In RFC 6962 this is called an audit proof. +-- +-- The proof is self-contained. It is independent of the concrete implementation +-- of the Merkle tree. This type works with any binary Merkle tree type and +-- doesn't make any assumptions about the balancing of the tree. +-- +-- The proof includes the subject of the proof (for which inclusion is proven) +-- as a plaintext bytestring. The proof does not include the root hash of the +-- Merkle tree, because the proof is only meaningful if the root is available +-- from a trusted source. Including it into the proof would thus be redundant or +-- even misleading. +-- +-- A more compact encoding would use the first bit of each hash to encode the +-- side, but that would require to alter the hash computation. We also could +-- pack the sides into a bit array. However, the total number of bytes for the +-- sides will be most likely less than two hashes, so the overhead is small and +-- doesn't justify more clever encodings. +-- +data MerkleProof a = MerkleProof + { _merkleProofSubject :: !MerkleProofSubject + , _merkleProofObject :: !(MerkleProofObject a) + } + deriving (Show, Eq, Generic) + deriving anyclass (NFData) + +-- | Construct a self-contained Merkle inclusion proof. +-- +merkleProof + :: forall a + . HashAlgorithm a + => Int + -> B.ByteString + -> MerkleTree a + -> Either String (MerkleProof a) +merkleProof pos a t + | pos < 0 = Left "index too small" + | pos >= leafCount t = Left "index too large" + | not (BA.constEq (view t tpos) (merkleLeaf @a a)) = Left "item not in the tree at the given index" + | otherwise = Right $ MerkleProof + { _merkleProofSubject = MerkleProofSubject a + , _merkleProofObject = MerkleProofObject go + } + where + (tpos, path) = proofPath pos (leafCount t) + go = BA.allocAndFreeze (length path * stepSize @a) $ \ptr -> + forM_ (path `zip` [0, fromIntegral (stepSize @a) ..]) $ \((s, i), x) -> do + poke (ptr `plusPtr` x) (sideWord8 s) + BA.copyByteArrayToPtr (view t i) (ptr `plusPtr` succ x) + +proofPath + :: Int + -- ^ Position in log + -> Int + -- ^ Size of log + -> (Int, [(Side, Int)]) + -- ^ The tree position of the target node and tree + -- positions and directions of the audit proof. +proofPath b c = go 0 0 b c [] + where + go _ !treeOff _ 1 !acc = (treeOff, acc) + go !logOff !treeOff !m !n !acc + | m < k = go logOff treeOff m k $ (R, treeOff + 2 * n - 3) : acc + | otherwise = go (logOff + k) (treeOff + 2 * k - 1) (m - k) (n - k) + $ (L, treeOff + 2 * k - 2) : acc + where + k = k2 n + +-- | Execute an inclusion proof. The result of the execution is a Merkle root +-- that must be compared to the trusted root of the Merkle tree. +-- +runMerkleProof :: forall a . HashAlgorithm a => MerkleProof a -> MerkleRoot a +runMerkleProof p = MerkleRoot + $ MerkleHash + $ BA.allocAndFreeze hs $ \ptr -> do + ctx <- hashMutableInit @a + merkleLeafPtr ctx subj ptr + BA.withByteArray obj $ \objPtr -> + forM_ [0, stepSize @a .. BA.length obj - 1] $ \i -> + peekByteOff @Word8 objPtr i >>= \case + 0x00 -> merkleNodePtr ctx (objPtr `plusPtr` succ i) ptr ptr + 0x01 -> merkleNodePtr ctx ptr (objPtr `plusPtr` succ i) ptr + _ -> error "invalid proof object" + -- FIXME: check this when decoding ? + where + MerkleProofSubject subj = _merkleProofSubject p + MerkleProofObject obj = _merkleProofObject p + hs = hashSize @a + +-- -------------------------------------------------------------------------- -- +-- Utils + +k2 :: Int -> Int +k2 i = 2 ^ floor @Double @Int (logBase 2 $ fromIntegral i - 1) +{-# INLINE k2 #-} + +data Side = L | R + deriving (Show, Eq) + +sideWord8 :: Side -> Word8 +sideWord8 L = 0x00 +sideWord8 R = 0x01 +{-# INLINE sideWord8 #-} + +view :: forall a . HashAlgorithm a => MerkleTree a -> Int -> BA.View BA.Bytes +view (MerkleTree v) i = BA.view v (i * hashSize @a) (hashSize @a) +{-# INLINE view #-} + +-- | Get the hash of a node in the Merkle tree. +-- +getHash :: HashAlgorithm a => MerkleTree a -> Int -> MerkleHash a +getHash t = MerkleHash . BA.convert . view t +{-# INLINE getHash #-} + +-- | Get the number of leafs in a Merkle tree. +-- +leafCount :: HashAlgorithm a => MerkleTree a -> Int +leafCount t + | isEmpty t = 0 + | otherwise = 1 + size t `div` 2 +{-# INLINE leafCount #-} + +{- Useful for debugging + +hex :: BA.ByteArrayAccess a => a -> String +hex = fmap (toEnum . fromEnum) + . BA.unpack @BA.Bytes + . convertToBase Base16 + +b64 :: BA.ByteArrayAccess a => a -> String +b64 = fmap (toEnum . fromEnum) + . BA.unpack @BA.Bytes + . convertToBase Base64URLUnpadded +-} + diff --git a/test/Main.hs b/test/Main.hs new file mode 100644 index 0000000..3daa5d8 --- /dev/null +++ b/test/Main.hs @@ -0,0 +1,131 @@ +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} + +-- | +-- Module: Main +-- Copyright: Copyright © 2019 Kadena LLC. +-- License: MIT +-- Maintainer: Lars Kuhtz +-- Stability: experimental +-- +-- TODO +-- +module Main +( main + +-- * Properties +, properties +, prop_proof +, prop_proofExhaustive +, prop_proofSize +, prop_encodeProofObject +, prop_encodeMerkleRoot +, prop_encodeMerkleTree +) where + +import Control.DeepSeq + +import Crypto.Hash.Algorithms (SHA512t_256) + +import Data.Bifoldable +import qualified Data.ByteArray as BA +import qualified Data.ByteString as B +import Data.Foldable +import Data.Word + +import Test.QuickCheck + +-- internal modules + +import Data.MerkleLog + +-- -------------------------------------------------------------------------- -- +-- Main + +main :: IO () +main = traverse_ (bitraverse_ print quickCheck) properties + +-- | Properties +-- +-- +properties :: [(String, Property)] +properties = + [ ("create merkle tree and confirm the size", property prop_tree) + , ("create and verify merkle proof", property prop_proof) + , ("create and verify merkle proof for all tree items for tree of size 30", prop_proofExhaustive 30) + , ("create and verify merkle proof for tree of size 1000 with items of sizes up to 1000 bytes", prop_proofSize 1000 1000) + , ("encoding roundtrip for merkle proof object", property prop_encodeProofObject) + , ("encoding roundtrip for merkle root", property prop_encodeMerkleRoot) + , ("encoding roundtrip for merkle tree", property prop_encodeMerkleTree) + ] + +-- -------------------------------------------------------------------------- -- +-- Utils + +nodeCount :: Int -> Int +nodeCount i = max 1 (2 * i - 1) +{-# INLINE nodeCount #-} + +-- -------------------------------------------------------------------------- -- +-- Properties + +prop_tree :: [[Word8]] -> Property +prop_tree a = size t === nodeCount (length a) .&. leafCount t === length a + where + l = B.pack <$> a + t = force $ merkleTree @SHA512t_256 l + +prop_proof :: [[Word8]] -> NonNegative Int -> Property +prop_proof a (NonNegative i) = i < length a ==> runMerkleProof p === merkleRoot t + where + l = B.pack <$> a + t = merkleTree @SHA512t_256 l + p = case merkleProof i (l !! i) t of + Left e -> error e + Right x -> x + +-- | Runtime is quadradic in the input parameter. 50 ~ 1sec, 100 ~ 5sec. +-- +prop_proofExhaustive :: Int -> Property +prop_proofExhaustive n = once $ conjoin + [ prop_proof (pure <$> [0 .. fromIntegral i]) (NonNegative j) + | i <- [0..n] + , j <- [0..i] + ] + +-- | Runtime of @testSize n m@ can be expected to be bounded by @Ω(n * m)@. +-- @testSize 1000 1000@ ~ 1sec. +-- +prop_proofSize :: Int -> Int -> Property +prop_proofSize n m = once $ do + l <- vectorOf n (resize m arbitrary) + i <- choose (0, n - 1) + return $ prop_proof l (NonNegative i) + +prop_encodeProofObject :: NonEmptyList [Word8] -> NonNegative Int -> Property +prop_encodeProofObject a (NonNegative i) = i < length l + ==> Right po === decodeMerkleProofObject (encodeMerkleProofObject @BA.Bytes po) + where + l = B.pack <$> getNonEmpty a + t = merkleTree @SHA512t_256 l + p = case merkleProof i (l !! i) t of + Left e -> error e + Right x -> x + po = _merkleProofObject p + +prop_encodeMerkleRoot :: NonEmptyList [Word8] -> Property +prop_encodeMerkleRoot a + = Right r === decodeMerkleRoot (encodeMerkleRoot @BA.Bytes r) + where + l = B.pack <$> getNonEmpty a + t = merkleTree @SHA512t_256 l + r = merkleRoot t + +prop_encodeMerkleTree :: NonEmptyList [Word8] -> Property +prop_encodeMerkleTree a + = Right t === decodeMerkleTree (encodeMerkleTree @BA.Bytes t) + where + l = B.pack <$> getNonEmpty a + t = merkleTree @SHA512t_256 l