Compare commits
No commits in common. "865f7241b1fcff64ba26b44a931385bde79685a4" and "a79b86cc0505d40de042e11463a5cbc186a69453" have entirely different histories.
865f7241b1
...
a79b86cc05
6 changed files with 38 additions and 96 deletions
|
@ -8,7 +8,8 @@ import Zenith.Scanner (scanZebra)
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
config <- load ["zenith.cfg"]
|
config <- load ["zenith.cfg"]
|
||||||
dbFilePath <- require config "dbFilePath"
|
--dbFilePath <- require config "dbFilePath"
|
||||||
|
dataStorePath <- require config "dataStorePath"
|
||||||
zebraPort <- require config "zebraPort"
|
zebraPort <- require config "zebraPort"
|
||||||
zebraHost <- require config "zebraHost"
|
zebraHost <- require config "zebraHost"
|
||||||
scanZebra 2762066 zebraHost zebraPort dbFilePath
|
scanZebra 2781518 zebraHost zebraPort dataStorePath
|
||||||
|
|
|
@ -157,11 +157,3 @@ createWalletAddress n i zNet scope za = do
|
||||||
(UnifiedAddressDB $
|
(UnifiedAddressDB $
|
||||||
encodeUnifiedAddress $ UnifiedAddress zNet oRec sRec (Just tRec))
|
encodeUnifiedAddress $ UnifiedAddress zNet oRec sRec (Just tRec))
|
||||||
(ScopeDB scope)
|
(ScopeDB scope)
|
||||||
|
|
||||||
-- * Wallet
|
|
||||||
-- | Sync the wallet with the data store
|
|
||||||
syncWallet ::
|
|
||||||
T.Text -- ^ The database path
|
|
||||||
-> Entity ZcashWallet
|
|
||||||
-> IO ()
|
|
||||||
syncWallet walletDb w = undefined
|
|
||||||
|
|
|
@ -78,49 +78,23 @@ share
|
||||||
UniqueAddress index scope accId
|
UniqueAddress index scope accId
|
||||||
UniqueAddName accId name
|
UniqueAddName accId name
|
||||||
deriving Show Eq
|
deriving Show Eq
|
||||||
|
|]
|
||||||
|
|
||||||
|
share
|
||||||
|
[mkPersist sqlSettings, mkMigrate "rawStorage"]
|
||||||
|
[persistLowerCase|
|
||||||
WalletTransaction
|
WalletTransaction
|
||||||
txId HexStringDB
|
|
||||||
block Int
|
|
||||||
conf Int
|
|
||||||
time Int
|
|
||||||
deriving Show Eq
|
|
||||||
WalletTrNote
|
|
||||||
tx WalletTransactionId
|
|
||||||
addrId WalletAddressId
|
|
||||||
value Int
|
|
||||||
rawId TransparentNoteId
|
|
||||||
spent Bool
|
|
||||||
deriving Show Eq
|
|
||||||
WalletSapNote
|
|
||||||
tx WalletTransactionId
|
|
||||||
addrId WalletAddressId
|
|
||||||
value Int
|
|
||||||
recipient BS.ByteString
|
|
||||||
memo T.Text
|
|
||||||
rawId ShieldOutputId
|
|
||||||
spent Bool
|
|
||||||
deriving Show Eq
|
|
||||||
WalletOrchNote
|
|
||||||
tx WalletTransactionId
|
|
||||||
addrId WalletAddressId
|
|
||||||
value Int
|
|
||||||
recipient BS.ByteString
|
|
||||||
memo T.Text
|
|
||||||
rawId OrchActionId
|
|
||||||
spent Bool
|
|
||||||
deriving Show Eq
|
|
||||||
ZcashTransaction
|
|
||||||
block Int
|
block Int
|
||||||
txId HexStringDB
|
txId HexStringDB
|
||||||
conf Int
|
conf Int
|
||||||
time Int
|
time Int
|
||||||
deriving Show Eq
|
deriving Show Eq
|
||||||
TransparentNote
|
TransparentNote
|
||||||
tx ZcashTransactionId
|
tx WalletTransactionId
|
||||||
value Int
|
value Int
|
||||||
script BS.ByteString
|
script BS.ByteString
|
||||||
OrchAction
|
OrchAction
|
||||||
tx ZcashTransactionId
|
tx WalletTransactionId
|
||||||
nf HexStringDB
|
nf HexStringDB
|
||||||
rk HexStringDB
|
rk HexStringDB
|
||||||
cmx HexStringDB
|
cmx HexStringDB
|
||||||
|
@ -131,7 +105,7 @@ share
|
||||||
auth HexStringDB
|
auth HexStringDB
|
||||||
deriving Show Eq
|
deriving Show Eq
|
||||||
ShieldOutput
|
ShieldOutput
|
||||||
tx ZcashTransactionId
|
tx WalletTransactionId
|
||||||
cv HexStringDB
|
cv HexStringDB
|
||||||
cmu HexStringDB
|
cmu HexStringDB
|
||||||
ephKey HexStringDB
|
ephKey HexStringDB
|
||||||
|
@ -140,7 +114,7 @@ share
|
||||||
proof HexStringDB
|
proof HexStringDB
|
||||||
deriving Show Eq
|
deriving Show Eq
|
||||||
ShieldSpend
|
ShieldSpend
|
||||||
tx ZcashTransactionId
|
tx WalletTransactionId
|
||||||
cv HexStringDB
|
cv HexStringDB
|
||||||
anchor HexStringDB
|
anchor HexStringDB
|
||||||
nullifier HexStringDB
|
nullifier HexStringDB
|
||||||
|
@ -158,6 +132,12 @@ initDb ::
|
||||||
initDb dbName = do
|
initDb dbName = do
|
||||||
runSqlite dbName $ do runMigration migrateAll
|
runSqlite dbName $ do runMigration migrateAll
|
||||||
|
|
||||||
|
-- | Initializes the raw data storage
|
||||||
|
initRawStore ::
|
||||||
|
T.Text -- ^ the database path
|
||||||
|
-> IO ()
|
||||||
|
initRawStore dbFilePath = runSqlite dbFilePath $ runMigration rawStorage
|
||||||
|
|
||||||
-- | Get existing wallets from database
|
-- | Get existing wallets from database
|
||||||
getWallets :: T.Text -> ZcashNet -> IO [Entity ZcashWallet]
|
getWallets :: T.Text -> ZcashNet -> IO [Entity ZcashWallet]
|
||||||
getWallets dbFp n =
|
getWallets dbFp n =
|
||||||
|
@ -197,30 +177,6 @@ saveAccount ::
|
||||||
-> IO (Maybe (Entity ZcashAccount))
|
-> IO (Maybe (Entity ZcashAccount))
|
||||||
saveAccount dbFp a = runSqlite dbFp $ insertUniqueEntity a
|
saveAccount dbFp a = runSqlite dbFp $ insertUniqueEntity a
|
||||||
|
|
||||||
-- | Returns the largest block in storage
|
|
||||||
getMaxBlock ::
|
|
||||||
T.Text -- ^ The database path
|
|
||||||
-> IO Int
|
|
||||||
getMaxBlock dbPath = do
|
|
||||||
b <-
|
|
||||||
runSqlite dbPath $
|
|
||||||
selectFirst [ZcashTransactionBlock >. 0] [Desc ZcashTransactionBlock]
|
|
||||||
case b of
|
|
||||||
Nothing -> return $ -1
|
|
||||||
Just x -> return $ zcashTransactionBlock $ entityVal x
|
|
||||||
|
|
||||||
-- | Returns the largest block in the wallet
|
|
||||||
getMaxWalletBlock ::
|
|
||||||
T.Text -- ^ The database path
|
|
||||||
-> IO Int
|
|
||||||
getMaxWalletBlock dbPath = do
|
|
||||||
b <-
|
|
||||||
runSqlite dbPath $
|
|
||||||
selectFirst [WalletTransactionBlock >. 0] [Desc WalletTransactionBlock]
|
|
||||||
case b of
|
|
||||||
Nothing -> return $ -1
|
|
||||||
Just x -> return $ walletTransactionBlock $ entityVal x
|
|
||||||
|
|
||||||
-- | Returns a list of addresses associated with the given account
|
-- | Returns a list of addresses associated with the given account
|
||||||
getAddresses ::
|
getAddresses ::
|
||||||
T.Text -- ^ The database path
|
T.Text -- ^ The database path
|
||||||
|
@ -260,12 +216,12 @@ saveTransaction ::
|
||||||
T.Text -- ^ the database path
|
T.Text -- ^ the database path
|
||||||
-> Int -- ^ block time
|
-> Int -- ^ block time
|
||||||
-> Transaction -- ^ The transaction to save
|
-> Transaction -- ^ The transaction to save
|
||||||
-> IO (Key ZcashTransaction)
|
-> IO (Key WalletTransaction)
|
||||||
saveTransaction dbFp t wt =
|
saveTransaction dbFp t wt =
|
||||||
runSqlite dbFp $ do
|
runSqlite dbFp $ do
|
||||||
w <-
|
w <-
|
||||||
insert $
|
insert $
|
||||||
ZcashTransaction (tx_height wt) (HexStringDB $ tx_id wt) (tx_conf wt) t
|
WalletTransaction (tx_height wt) (HexStringDB $ tx_id wt) (tx_conf wt) t
|
||||||
when (isJust $ tx_transpBundle wt) $
|
when (isJust $ tx_transpBundle wt) $
|
||||||
insertMany_ $
|
insertMany_ $
|
||||||
map (storeTxOut w) $ (tb_vout . fromJust . tx_transpBundle) wt
|
map (storeTxOut w) $ (tb_vout . fromJust . tx_transpBundle) wt
|
||||||
|
@ -282,9 +238,9 @@ saveTransaction dbFp t wt =
|
||||||
map (storeOrchAction w) $ (obActions . fromJust . tx_orchardBundle) wt
|
map (storeOrchAction w) $ (obActions . fromJust . tx_orchardBundle) wt
|
||||||
return w
|
return w
|
||||||
where
|
where
|
||||||
storeTxOut :: ZcashTransactionId -> TxOut -> TransparentNote
|
storeTxOut :: WalletTransactionId -> TxOut -> TransparentNote
|
||||||
storeTxOut wid (TxOut v s) = TransparentNote wid (fromIntegral v) s
|
storeTxOut wid (TxOut v s) = TransparentNote wid (fromIntegral v) s
|
||||||
storeSapSpend :: ZcashTransactionId -> ShieldedSpend -> ShieldSpend
|
storeSapSpend :: WalletTransactionId -> ShieldedSpend -> ShieldSpend
|
||||||
storeSapSpend wid sp =
|
storeSapSpend wid sp =
|
||||||
ShieldSpend
|
ShieldSpend
|
||||||
wid
|
wid
|
||||||
|
@ -294,7 +250,7 @@ saveTransaction dbFp t wt =
|
||||||
(HexStringDB $ sp_rk sp)
|
(HexStringDB $ sp_rk sp)
|
||||||
(HexStringDB $ sp_proof sp)
|
(HexStringDB $ sp_proof sp)
|
||||||
(HexStringDB $ sp_auth sp)
|
(HexStringDB $ sp_auth sp)
|
||||||
storeSapOutput :: ZcashTransactionId -> ShieldedOutput -> ShieldOutput
|
storeSapOutput :: WalletTransactionId -> ShieldedOutput -> ShieldOutput
|
||||||
storeSapOutput wid so =
|
storeSapOutput wid so =
|
||||||
ShieldOutput
|
ShieldOutput
|
||||||
wid
|
wid
|
||||||
|
@ -304,7 +260,7 @@ saveTransaction dbFp t wt =
|
||||||
(HexStringDB $ s_encCipherText so)
|
(HexStringDB $ s_encCipherText so)
|
||||||
(HexStringDB $ s_outCipherText so)
|
(HexStringDB $ s_outCipherText so)
|
||||||
(HexStringDB $ s_proof so)
|
(HexStringDB $ s_proof so)
|
||||||
storeOrchAction :: ZcashTransactionId -> OrchardAction -> OrchAction
|
storeOrchAction :: WalletTransactionId -> OrchardAction -> OrchAction
|
||||||
storeOrchAction wid oa =
|
storeOrchAction wid oa =
|
||||||
OrchAction
|
OrchAction
|
||||||
wid
|
wid
|
||||||
|
|
|
@ -8,7 +8,6 @@ import Data.HexString
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import GHC.Utils.Monad (concatMapM)
|
import GHC.Utils.Monad (concatMapM)
|
||||||
import System.Console.AsciiProgress
|
|
||||||
import ZcashHaskell.Types
|
import ZcashHaskell.Types
|
||||||
( BlockResponse(..)
|
( BlockResponse(..)
|
||||||
, RawZebraTx(..)
|
, RawZebraTx(..)
|
||||||
|
@ -21,7 +20,7 @@ import ZcashHaskell.Types
|
||||||
)
|
)
|
||||||
import ZcashHaskell.Utils (getBlockTime, makeZebraCall, readZebraTransaction)
|
import ZcashHaskell.Utils (getBlockTime, makeZebraCall, readZebraTransaction)
|
||||||
import Zenith.Core (checkBlockChain)
|
import Zenith.Core (checkBlockChain)
|
||||||
import Zenith.DB (getMaxBlock, initDb, saveTransaction)
|
import Zenith.DB (initRawStore, saveTransaction)
|
||||||
import Zenith.Utils (jsonNumber)
|
import Zenith.Utils (jsonNumber)
|
||||||
|
|
||||||
-- | Function to scan the Zcash blockchain through the Zebra node and populate the Zenith database
|
-- | Function to scan the Zcash blockchain through the Zebra node and populate the Zenith database
|
||||||
|
@ -32,23 +31,19 @@ scanZebra ::
|
||||||
-> T.Text -- ^ Path to database file
|
-> T.Text -- ^ Path to database file
|
||||||
-> IO ()
|
-> IO ()
|
||||||
scanZebra b host port dbFilePath = do
|
scanZebra b host port dbFilePath = do
|
||||||
_ <- initDb dbFilePath
|
_ <- initRawStore dbFilePath
|
||||||
bc <-
|
bc <-
|
||||||
try $ checkBlockChain host port :: IO
|
try $ checkBlockChain host port :: IO
|
||||||
(Either IOError ZebraGetBlockChainInfo)
|
(Either IOError ZebraGetBlockChainInfo)
|
||||||
case bc of
|
case bc of
|
||||||
Left e -> print e
|
Left e -> print e
|
||||||
Right bStatus -> do
|
Right bStatus -> do
|
||||||
dbBlock <- getMaxBlock dbFilePath
|
if b > zgb_blocks bStatus || b < 1
|
||||||
let sb = max dbBlock b
|
|
||||||
if sb > zgb_blocks bStatus || sb < 1
|
|
||||||
then throwIO $ userError "Invalid starting block for scan"
|
then throwIO $ userError "Invalid starting block for scan"
|
||||||
else do
|
else do
|
||||||
let bList = [sb .. (zgb_blocks bStatus)]
|
let bList = [b .. (zgb_blocks bStatus)]
|
||||||
displayConsoleRegions $ do
|
|
||||||
pg <- newProgressBar def {pgTotal = fromIntegral $ length bList}
|
|
||||||
txList <-
|
txList <-
|
||||||
try $ mapM_ (processBlock host port dbFilePath pg) bList :: IO
|
try $ mapM_ (processBlock host port dbFilePath) bList :: IO
|
||||||
(Either IOError ())
|
(Either IOError ())
|
||||||
case txList of
|
case txList of
|
||||||
Left e1 -> print e1
|
Left e1 -> print e1
|
||||||
|
@ -59,10 +54,9 @@ processBlock ::
|
||||||
T.Text -- ^ Host name for `zebrad`
|
T.Text -- ^ Host name for `zebrad`
|
||||||
-> Int -- ^ Port for `zebrad`
|
-> Int -- ^ Port for `zebrad`
|
||||||
-> T.Text -- ^ DB file path
|
-> T.Text -- ^ DB file path
|
||||||
-> ProgressBar -- ^ Progress bar
|
|
||||||
-> Int -- ^ The block number to process
|
-> Int -- ^ The block number to process
|
||||||
-> IO ()
|
-> IO ()
|
||||||
processBlock host port dbFp pg b = do
|
processBlock host port dbFp b = do
|
||||||
r <-
|
r <-
|
||||||
makeZebraCall
|
makeZebraCall
|
||||||
host
|
host
|
||||||
|
@ -84,7 +78,6 @@ processBlock host port dbFp pg b = do
|
||||||
let blockTime = getBlockTime hb
|
let blockTime = getBlockTime hb
|
||||||
mapM_ (processTx host port blockTime dbFp) $
|
mapM_ (processTx host port blockTime dbFp) $
|
||||||
bl_txs $ addTime blk blockTime
|
bl_txs $ addTime blk blockTime
|
||||||
tick pg
|
|
||||||
where
|
where
|
||||||
addTime :: BlockResponse -> Int -> BlockResponse
|
addTime :: BlockResponse -> Int -> BlockResponse
|
||||||
addTime bl t =
|
addTime bl t =
|
||||||
|
@ -115,7 +108,7 @@ processTx host port bt dbFp t = do
|
||||||
case readZebraTransaction (ztr_hex rawTx) of
|
case readZebraTransaction (ztr_hex rawTx) of
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
Just rzt -> do
|
Just rzt -> do
|
||||||
_ <-
|
k <-
|
||||||
saveTransaction dbFp bt $
|
saveTransaction dbFp bt $
|
||||||
Transaction
|
Transaction
|
||||||
t
|
t
|
||||||
|
@ -125,4 +118,4 @@ processTx host port bt dbFp t = do
|
||||||
(fromRawTBundle $ zt_tBundle rzt)
|
(fromRawTBundle $ zt_tBundle rzt)
|
||||||
(fromRawSBundle $ zt_sBundle rzt)
|
(fromRawSBundle $ zt_sBundle rzt)
|
||||||
(fromRawOBundle $ zt_oBundle rzt)
|
(fromRawOBundle $ zt_oBundle rzt)
|
||||||
return ()
|
print k
|
||||||
|
|
|
@ -65,7 +65,6 @@ library
|
||||||
, vector
|
, vector
|
||||||
, vty
|
, vty
|
||||||
, word-wrap
|
, word-wrap
|
||||||
, ascii-progress
|
|
||||||
, zcash-haskell
|
, zcash-haskell
|
||||||
--pkgconfig-depends: rustzcash_wrapper
|
--pkgconfig-depends: rustzcash_wrapper
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
|
@ -3,3 +3,4 @@ nodePwd = "superSecret"
|
||||||
dbFilePath = "zenith.db"
|
dbFilePath = "zenith.db"
|
||||||
zebraHost = "127.0.0.1"
|
zebraHost = "127.0.0.1"
|
||||||
zebraPort = 18232
|
zebraPort = 18232
|
||||||
|
dataStorePath = "datastore.db"
|
||||||
|
|
Loading…
Reference in a new issue