Merge pull request 'Implement connection to Zebra RPC' (#62) from rav001 into dev041

Reviewed-on: #62
This commit is contained in:
pitmutt 2024-02-12 21:29:15 +00:00 committed by Vergara Technologies LLC
commit d37e33de3f
Signed by: Vergara Technologies LLC
GPG key ID: 99DB473BB4715618
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]
## Added
### Added
- `Core` module
- `CLI` module
- `DB` module
- 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]

View file

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

View file

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

View file

@ -1,4 +1,5 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Zenith.CLI where
@ -33,6 +34,8 @@ import Brick.Widgets.Core
)
import qualified Brick.Widgets.List as L
import qualified Data.Vector as Vec
import Network.HTTP.Simple
import ZcashHaskell.Types
import Zenith.Core
data Name
@ -85,15 +88,6 @@ listDrawElement sel a =
else str s
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 = L.listSelectedAttr <> A.attrName "custom"
@ -129,10 +123,25 @@ theApp =
, M.appAttrMap = const theMap
}
runZenithCLI :: T.Text -> IO ()
runZenithCLI dbName = do
w <- checkWallets dbName
if (null w)
then void $ M.defaultMain theApp initialState
else do
print "No wallet found. Create one? Y/N"
runZenithCLI :: Int -> T.Text -> IO ()
runZenithCLI port dbName = do
w <- checkZebra port
case (w :: Maybe ZebraGetInfo) of
Just zebra -> do
bc <- checkBlockChain port
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
import Data.Aeson
import qualified Data.Text as T
import Database.Persist
import Database.Persist.Sqlite
import Network.HTTP.Client
import ZcashHaskell.Types
import ZcashHaskell.Utils
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
runSqlite dbName $ do runMigration migrateAll
wallets <- runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] []
return wallets
runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] []
-- * 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:
- git: https://git.vergara.tech/Vergara_Tech/zcash-haskell.git
commit: c4f345b1deb876e19a51c5f7ae1b4402fae14126
commit: 09cee9a064219e4be89413ef86341aa18b62be68
- git: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git
commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d
- git: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git

View file

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

View file

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

View file

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