module Blockchain.ExtDBs (
MP.SHAPtr(..),
MP.emptyTriePtr,
detailsDBPut,
detailsDBGet,
blockDBGet,
blockDBPut,
codeDBGet,
codeDBPut,
stateDBPut,
stateDBGet,
putKeyVal,
getKeyVals,
deleteStorageKey,
putStorageKeyVal,
getStorageKeyVals
) where
import Control.Monad.State
import Control.Monad.Trans.Resource
import Data.Binary hiding (get, put)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import Data.Default
import qualified Database.LevelDB as DB
import Text.PrettyPrint.ANSI.Leijen hiding ((<$>))
import qualified Data.NibbleString as N
import Blockchain.SHA
import Blockchain.Data.RLP
import qualified Blockchain.Database.MerklePatricia as MP
import Blockchain.Context
--import Debug.Trace
detailsDBPut::B.ByteString->B.ByteString->ContextM ()
detailsDBPut key val = do
ctx <- get
runResourceT $
DB.put (detailsDB ctx) def key val
detailsDBGet::B.ByteString->ContextM (Maybe B.ByteString)
detailsDBGet key = do
ctx <- get
runResourceT $
DB.get (detailsDB ctx) def key
blockDBPut::B.ByteString->B.ByteString->ContextM ()
blockDBPut key val = do
ctx <- get
runResourceT $
DB.put (blockDB ctx) def key val
blockDBGet::B.ByteString->ContextM (Maybe B.ByteString)
blockDBGet key = do
ctx <- get
runResourceT $
DB.get (blockDB ctx) def key
codeDBPut::B.ByteString->ContextM ()
codeDBPut code = do
ctx <- get
runResourceT $
DB.put (codeDB ctx) def (BL.toStrict $ encode $ hash code) code
codeDBGet::B.ByteString->ContextM (Maybe B.ByteString)
codeDBGet key = do
ctx <- get
runResourceT $
DB.get (codeDB ctx) def key
stateDBPut::B.ByteString->B.ByteString->ContextM ()
stateDBPut key val = do
ctx <- get
runResourceT $
DB.put (MP.ldb $ stateDB ctx) def key val
put ctx{stateDB=(stateDB ctx){MP.stateRoot=MP.SHAPtr key}}
stateDBGet::B.ByteString->ContextM (Maybe B.ByteString)
stateDBGet key = do
ctx <- get
runResourceT $
DB.get (MP.ldb $ stateDB ctx) def key
putKeyVal::N.NibbleString->RLPObject->ContextM ()
putKeyVal key val = do
ctx <- get
newStateDB <-
liftIO $ runResourceT $ MP.putKeyVal (stateDB ctx) key val
put ctx{stateDB=newStateDB}
getKeyVals::N.NibbleString->ContextM [(N.NibbleString, RLPObject)]
getKeyVals key = do
ctx <- get
liftIO $ runResourceT $ MP.getKeyVals (stateDB ctx) key
deleteStorageKey::N.NibbleString->ContextM ()
deleteStorageKey key = do
ctx <- get
newStorageDB <-
liftIO $ runResourceT $ MP.deleteKey (storageDB ctx) key
put ctx{storageDB=newStorageDB}
putStorageKeyVal::N.NibbleString->RLPObject->ContextM ()
putStorageKeyVal key val = do
ctx <- get
newStorageDB <-
liftIO $ runResourceT $ MP.putKeyVal (storageDB ctx) key val
liftIO $ putStrLn $ "storage state root is " ++ show (pretty $ MP.stateRoot newStorageDB)
put ctx{storageDB=newStorageDB}
getStorageKeyVals::N.NibbleString->ContextM [(N.NibbleString, RLPObject)]
getStorageKeyVals key = do
ctx <- get
liftIO $ runResourceT $ MP.getKeyVals (storageDB ctx) key