Implement connection to Zebra RPC #62

Merged
pitmutt merged 3 commits from rav001 into dev041 2024-02-12 21:29:15 +00:00
9 changed files with 77 additions and 26 deletions

View file

@ -7,12 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## Added ### Added
- `Core` module - `Core` module
- `CLI` module - `CLI` module
- `DB` module - `DB` module
- Command line arguments to switch to legacy version - Command line arguments to switch to legacy version
- New configuration parameter for Zebra port
- New functions to call `getinfo` and `getblockchaininfo` RPC methods
## [0.4.1] ## [0.4.1]

View file

@ -202,6 +202,7 @@ main = do
dbName <- require config "dbName" dbName <- require config "dbName"
nodeUser <- require config "nodeUser" nodeUser <- require config "nodeUser"
nodePwd <- require config "nodePwd" nodePwd <- require config "nodePwd"
zebraPort <- require config "zebraPort"
if not (null args) if not (null args)
then do then do
case head args of case head args of
@ -215,7 +216,7 @@ main = do
" ______ _ _ _ \n |___ / (_) | | | \n / / ___ _ __ _| |_| |__ \n / / / _ \\ '_ \\| | __| '_ \\ \n / /_| __/ | | | | |_| | | |\n /_____\\___|_| |_|_|\\__|_| |_|\n Zcash Full Node CLI v0.4.0" " ______ _ _ _ \n |___ / (_) | | | \n / / ___ _ __ _| |_| |__ \n / / / _ \\ '_ \\| | __| '_ \\ \n / /_| __/ | | | | |_| | | |\n /_____\\___|_| |_|_|\\__|_| |_|\n Zcash Full Node CLI v0.4.0"
} }
(root nodeUser nodePwd) (root nodeUser nodePwd)
"cli" -> runZenithCLI dbName "cli" -> runZenithCLI zebraPort dbName
_ -> printUsage _ -> printUsage
else printUsage else printUsage

View file

@ -30,6 +30,7 @@ library:
- text - text
- bytestring - bytestring
- http-conduit - http-conduit
- http-client
- scientific - scientific
- vector - vector
- regex-base - regex-base

View file

@ -1,4 +1,5 @@
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Zenith.CLI where module Zenith.CLI where
@ -33,6 +34,8 @@ import Brick.Widgets.Core
) )
import qualified Brick.Widgets.List as L import qualified Brick.Widgets.List as L
import qualified Data.Vector as Vec import qualified Data.Vector as Vec
import Network.HTTP.Simple
import ZcashHaskell.Types
import Zenith.Core import Zenith.Core
data Name data Name
@ -85,15 +88,6 @@ listDrawElement sel a =
else str s else str s
in C.hCenter $ selStr $ show a in C.hCenter $ selStr $ show a
initialState :: State
initialState =
State
"Main"
(L.list WList (Vec.fromList ["wall1"]) 1)
(L.list AList (Vec.fromList ["addr1", "addr2"]) 1)
(L.list TList (Vec.fromList ["tx1", "tx2", "tx3"]) 1)
"Start up Ok!"
customAttr :: A.AttrName customAttr :: A.AttrName
customAttr = L.listSelectedAttr <> A.attrName "custom" customAttr = L.listSelectedAttr <> A.attrName "custom"
@ -129,10 +123,25 @@ theApp =
, M.appAttrMap = const theMap , M.appAttrMap = const theMap
} }
runZenithCLI :: T.Text -> IO () runZenithCLI :: Int -> T.Text -> IO ()
runZenithCLI dbName = do runZenithCLI port dbName = do
w <- checkWallets dbName w <- checkZebra port
if (null w) case (w :: Maybe ZebraGetInfo) of
then void $ M.defaultMain theApp initialState Just zebra -> do
else do bc <- checkBlockChain port
print "No wallet found. Create one? Y/N" case (bc :: Maybe ZebraGetBlockChainInfo) of
Nothing -> print "Unable to determine blockchain status"
Just chainInfo -> do
void $
M.defaultMain theApp $
State
((show . zgb_net) chainInfo)
(L.list WList (Vec.fromList ["wall1"]) 1)
(L.list AList (Vec.fromList ["addr1", "addr2"]) 1)
(L.list TList (Vec.fromList ["tx1", "tx2", "tx3"]) 1)
("Start up Ok! Connected to Zebra " ++
(T.unpack . zgi_build) zebra ++ " on port " ++ show port ++ ".")
Nothing -> do
print $
"No Zebra node available on port " <>
show port <> ". Check your configuration"

View file

@ -1,12 +1,48 @@
{-# LANGUAGE OverloadedStrings #-}
-- Core wallet functionality for Zenith
module Zenith.Core where module Zenith.Core where
import Data.Aeson
import qualified Data.Text as T import qualified Data.Text as T
import Database.Persist import Database.Persist
import Database.Persist.Sqlite import Database.Persist.Sqlite
import Network.HTTP.Client
import ZcashHaskell.Types
import ZcashHaskell.Utils
import Zenith.DB import Zenith.DB
checkWallets :: T.Text -> IO [Entity ZcashWallet] -- * Database functions
-- | Returns the list of wallets available in the given database
checkWallets ::
T.Text -- ^ The database name to check
-> IO [Entity ZcashWallet]
checkWallets dbName = do checkWallets dbName = do
runSqlite dbName $ do runMigration migrateAll runSqlite dbName $ do runMigration migrateAll
wallets <- runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] [] runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] []
return wallets
-- * Zebra Node interaction
-- | Checks the status of the `zebrad` node
checkZebra ::
Int -- ^ Port where `zebrad` is available
-> IO (Maybe ZebraGetInfo)
checkZebra port = do
res <- makeZebraCall port "getinfo" []
let body = responseBody (res :: Response (RpcResponse ZebraGetInfo))
return $ result body
-- | Checks the status of the Zcash blockchain
checkBlockChain ::
Int -- ^ Port where `zebrad` is available
-> IO (Maybe ZebraGetBlockChainInfo)
checkBlockChain port = do
let f = makeZebraCall port
result <$> (responseBody <$> f "getblockchaininfo" [])
-- | Generic RPC call function
connectZebra ::
FromJSON a => Int -> T.Text -> [Data.Aeson.Value] -> IO (Maybe a)
connectZebra port m params = do
res <- makeZebraCall port m params
let body = responseBody res
return $ result body

View file

@ -44,7 +44,7 @@ packages:
# extra-deps: [] # extra-deps: []
extra-deps: extra-deps:
- git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git - git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git
commit: c4f345b1deb876e19a51c5f7ae1b4402fae14126 commit: 09cee9a064219e4be89413ef86341aa18b62be68
- git: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git - git: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git
commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d
- git: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git - git: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git

View file

@ -5,15 +5,15 @@
packages: packages:
- completed: - completed:
commit: c4f345b1deb876e19a51c5f7ae1b4402fae14126 commit: 09cee9a064219e4be89413ef86341aa18b62be68
git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git
name: zcash-haskell name: zcash-haskell
pantry-tree: pantry-tree:
sha256: 1bf709484bc488e51e18aa11001abdc06100ed7086b9bbd765d28c4a3d8e9113 sha256: 6bf1902a377bf9399442de6f0b89219479fa908e70706918e81b88caa28dc0f5
size: 1366 size: 1367
version: 0.4.1 version: 0.4.1
original: original:
commit: c4f345b1deb876e19a51c5f7ae1b4402fae14126 commit: 09cee9a064219e4be89413ef86341aa18b62be68
git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git
- completed: - completed:
commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d

View file

@ -43,6 +43,7 @@ library
, base64-bytestring , base64-bytestring
, brick , brick
, bytestring , bytestring
, http-client
, http-conduit , http-conduit
, http-types , http-types
, microlens , microlens

View file

@ -1,3 +1,4 @@
nodeUser = "user" nodeUser = "user"
nodePwd = "superSecret" nodePwd = "superSecret"
dbName = "zenith.db" dbName = "zenith.db"
zebraPort = 18232