module Blockchain.Database.MerklePatriciaMem (
putKeyValMem, getKeyValMem, deleteKeyMem, keyExistsMem,
initializeBlankMem,
MPMem(..)
) where
import Data.ByteArray (convert)
import Crypto.Hash as Crypto
import qualified Data.Map as Map
import Data.Maybe (isJust)
import Blockchain.Data.RLP
import Blockchain.Database.MerklePatricia.InternalMem
import Blockchain.Database.MerklePatricia.StateRoot
putKeyValMem::Monad m=>MPMem
->Key
->Val
->m MPMem
putKeyValMem db = unsafePutKeyValMem db . keyToSafeKeyMem
getKeyValMem::Monad m=>MPMem
-> Key
-> m (Maybe Val)
getKeyValMem db key = do
vals <- unsafeGetKeyValsMem db (keyToSafeKeyMem key)
return $
if not (null vals)
then Just $ snd (head vals)
else Nothing
deleteKeyMem::Monad m=>MPMem
->Key
->m MPMem
deleteKeyMem db = unsafeDeleteKeyMem db . keyToSafeKeyMem
keyExistsMem::Monad m=>MPMem
->Key
->m Bool
keyExistsMem db key = isJust <$> getKeyValMem db key
initializeBlankMem ::MPMem
initializeBlankMem =
let theRLP = rlpEncode (0::Integer)
bytes = rlpSerialize theRLP
key = convert $ (Crypto.hash bytes :: Crypto.Digest Crypto.Keccak_256)
in
MPMem {
mpMap = Map.insert key bytes Map.empty,
mpStateRoot = StateRoot bytes
}