From e86e4c73abb3f0b46b5c9f48226a630895811c41 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Mon, 12 Feb 2024 15:08:36 -0600 Subject: [PATCH 1/3] Update to new version of ZH --- stack.yaml | 2 +- stack.yaml.lock | 8 ++++---- zenith.cabal | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/stack.yaml b/stack.yaml index 46515d8..4286f97 100644 --- a/stack.yaml +++ b/stack.yaml @@ -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 diff --git a/stack.yaml.lock b/stack.yaml.lock index 0d86d36..fe64ec4 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -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 diff --git a/zenith.cabal b/zenith.cabal index 66e50e1..64795e1 100644 --- a/zenith.cabal +++ b/zenith.cabal @@ -43,6 +43,7 @@ library , base64-bytestring , brick , bytestring + , http-client , http-conduit , http-types , microlens From 3ccee4ecb65394be3bb964b0b94c4a3f741c15e2 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Mon, 12 Feb 2024 15:09:12 -0600 Subject: [PATCH 2/3] Add new config parameter for Zebra port --- app/Main.hs | 3 ++- zenith.cfg | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Main.hs b/app/Main.hs index f0faf47..f64421e 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -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 diff --git a/zenith.cfg b/zenith.cfg index 77461ba..7a1dc51 100644 --- a/zenith.cfg +++ b/zenith.cfg @@ -1,3 +1,4 @@ nodeUser = "user" nodePwd = "superSecret" dbName = "zenith.db" +zebraPort = 18232 From 268d17c09417d3a901e438e1d73167043867cce7 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Mon, 12 Feb 2024 15:09:36 -0600 Subject: [PATCH 3/3] Implement functions to make RPC calls to Zebra --- CHANGELOG.md | 4 +++- package.yaml | 1 + src/Zenith/CLI.hs | 41 +++++++++++++++++++++++++---------------- src/Zenith/Core.hs | 42 +++++++++++++++++++++++++++++++++++++++--- 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0035626..11b8225 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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] diff --git a/package.yaml b/package.yaml index d986cc6..4d5b0e1 100644 --- a/package.yaml +++ b/package.yaml @@ -30,6 +30,7 @@ library: - text - bytestring - http-conduit + - http-client - scientific - vector - regex-base diff --git a/src/Zenith/CLI.hs b/src/Zenith/CLI.hs index b2682f4..37c5fe4 100644 --- a/src/Zenith/CLI.hs +++ b/src/Zenith/CLI.hs @@ -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" diff --git a/src/Zenith/Core.hs b/src/Zenith/Core.hs index 1356300..f2f2bbb 100644 --- a/src/Zenith/Core.hs +++ b/src/Zenith/Core.hs @@ -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