wip, hbs2-git-oracle refchan write

This commit is contained in:
Dmitry Zuikov 2024-03-25 11:48:43 +03:00
parent 8f1b59b0a0
commit 027e949ac8
6 changed files with 69 additions and 18 deletions

View File

@ -13,21 +13,30 @@ main = do
<> short 's' <> short 's'
<> help "serve" <> help "serve"
) )
<*> option pkey ( long "refchan" <> short 'r' <> help "refchan to post" )
<*> option pkey ( long "author" <> short 'a' <> help "author" )
join $ execParser (O.info (parser <**> helper) join $ execParser (O.info (parser <**> helper)
( fullDesc ( fullDesc
<> progDesc "hbs2-git oracle / distributed index builder" <> progDesc "hbs2-git oracle / distributed index builder"
<> header "hbs2-git-oracle")) <> header "hbs2-git-oracle"))
runApp :: MonadUnliftIO m => Bool -> m () where
runApp _ = do pkey = maybeReader fromStringMay
runApp :: MonadUnliftIO m
=> Bool
-> RefChanId L4Proto
-> RefChanAuthor L4Proto
-> m ()
runApp _ rchan author = do
setLogging @DEBUG (toStderr . logPrefix "[debug] ") setLogging @DEBUG (toStderr . logPrefix "[debug] ")
setLogging @WARN (toStderr . logPrefix "[warn] ") setLogging @WARN (toStderr . logPrefix "[warn] ")
setLogging @ERROR (toStderr . logPrefix "[error] ") setLogging @ERROR (toStderr . logPrefix "[error] ")
setLogging @NOTICE (toStderr . logPrefix "[debug] ") setLogging @NOTICE (toStderr . logPrefix "[debug] ")
runWithOracleEnv runOracle runWithOracleEnv rchan author runOracle
`finally` do `finally` do
setLoggingOff @DEBUG setLoggingOff @DEBUG

View File

@ -0,0 +1,8 @@
(version 1)
(quorum 1)
(wait 5)
(peer "yFSaUfb97ZRtQqzHWdERsR7KJvN8qyWX1M8rJcxnsiu" 1)
(peer "5GnroAC8FXNRL8rcgJj6RTu9mt1AbuNd5MZVnDBcCKzb" 1)
(author "9zbtm335CDwgZeuutgp6kJFwUQ8Wn68izD5Qpmkr2U99")

View File

@ -16,8 +16,11 @@ import Codec.Serialise
data OracleEnv = data OracleEnv =
OracleEnv OracleEnv
{ _peerAPI :: ServiceCaller PeerAPI UNIX { _refchanId :: RefChanId L4Proto
, _refchanAuthor :: RefChanAuthor L4Proto
, _peerAPI :: ServiceCaller PeerAPI UNIX
, _reflogAPI :: ServiceCaller RefLogAPI UNIX , _reflogAPI :: ServiceCaller RefLogAPI UNIX
, _refchanAPI :: ServiceCaller RefChanAPI UNIX
, _lwwAPI :: ServiceCaller LWWRefAPI UNIX , _lwwAPI :: ServiceCaller LWWRefAPI UNIX
, _storage :: AnyStorage , _storage :: AnyStorage
} }
@ -34,8 +37,12 @@ newtype Oracle m a =
, MonadUnliftIO , MonadUnliftIO
) )
runWithOracleEnv :: MonadUnliftIO m => Oracle m () -> m () runWithOracleEnv :: MonadUnliftIO m
runWithOracleEnv m = do => RefChanId L4Proto
-> RefChanAuthor L4Proto
-> Oracle m ()
-> m ()
runWithOracleEnv rchan author m = do
soname <- detectRPC soname <- detectRPC
`orDie` "can't locate rpc" `orDie` "can't locate rpc"
@ -45,17 +52,22 @@ runWithOracleEnv m = do
peerAPI <- makeServiceCaller @PeerAPI (fromString soname) peerAPI <- makeServiceCaller @PeerAPI (fromString soname)
reflogAPI <- makeServiceCaller @RefLogAPI (fromString soname) reflogAPI <- makeServiceCaller @RefLogAPI (fromString soname)
refchanAPI <- makeServiceCaller @RefChanAPI (fromString soname)
lwwAPI <- makeServiceCaller @LWWRefAPI (fromString soname) lwwAPI <- makeServiceCaller @LWWRefAPI (fromString soname)
storageAPI <- makeServiceCaller @StorageAPI (fromString soname) storageAPI <- makeServiceCaller @StorageAPI (fromString soname)
let sto = AnyStorage (StorageClient storageAPI) let sto = AnyStorage (StorageClient storageAPI)
env <- pure $ OracleEnv peerAPI env <- pure $ OracleEnv rchan
author
peerAPI
reflogAPI reflogAPI
refchanAPI
lwwAPI lwwAPI
sto sto
let endpoints = [ Endpoint @UNIX peerAPI let endpoints = [ Endpoint @UNIX peerAPI
, Endpoint @UNIX reflogAPI , Endpoint @UNIX reflogAPI
, Endpoint @UNIX refchanAPI
, Endpoint @UNIX lwwAPI , Endpoint @UNIX lwwAPI
, Endpoint @UNIX storageAPI , Endpoint @UNIX storageAPI
] ]

View File

@ -4,15 +4,18 @@ module HBS2.Git.Oracle.Prelude
, module HBS2.OrDie , module HBS2.OrDie
, module HBS2.Data.Types.Refs , module HBS2.Data.Types.Refs
, module HBS2.Net.Auth.Schema , module HBS2.Net.Auth.Schema
, module HBS2.Net.Auth.Credentials
, module HBS2.Storage , module HBS2.Storage
, module HBS2.System.Logger.Simple.ANSI , module HBS2.System.Logger.Simple.ANSI
, module HBS2.Peer.Proto.RefLog , module HBS2.Peer.Proto.RefLog
, module HBS2.Peer.Proto.LWWRef , module HBS2.Peer.Proto.LWWRef
, module HBS2.Peer.Proto.RefChan
, module HBS2.Net.Proto.Service , module HBS2.Net.Proto.Service
, module HBS2.Peer.RPC.API.Peer , module HBS2.Peer.RPC.API.Peer
, module HBS2.Peer.RPC.API.RefLog , module HBS2.Peer.RPC.API.RefLog
, module HBS2.Peer.RPC.API.RefChan
, module HBS2.Peer.RPC.API.LWWRef , module HBS2.Peer.RPC.API.LWWRef
, module HBS2.Peer.RPC.API.Storage , module HBS2.Peer.RPC.API.Storage
, module HBS2.Peer.RPC.Client.StorageClient , module HBS2.Peer.RPC.Client.StorageClient
@ -29,7 +32,9 @@ import HBS2.Base58
import HBS2.OrDie import HBS2.OrDie
import HBS2.Data.Types.Refs import HBS2.Data.Types.Refs
import HBS2.Net.Auth.Schema import HBS2.Net.Auth.Schema
import HBS2.Net.Auth.Credentials
import HBS2.Net.Proto.Service import HBS2.Net.Proto.Service
import HBS2.Peer.Proto.RefChan
import HBS2.Storage import HBS2.Storage
import HBS2.System.Logger.Simple.ANSI import HBS2.System.Logger.Simple.ANSI
@ -38,6 +43,7 @@ import HBS2.Peer.Proto.LWWRef
import HBS2.Peer.Proto.RefLog import HBS2.Peer.Proto.RefLog
import HBS2.Peer.RPC.API.Peer import HBS2.Peer.RPC.API.Peer
import HBS2.Peer.RPC.API.RefLog import HBS2.Peer.RPC.API.RefLog
import HBS2.Peer.RPC.API.RefChan
import HBS2.Peer.RPC.API.LWWRef import HBS2.Peer.RPC.API.LWWRef
import HBS2.Peer.RPC.API.Storage import HBS2.Peer.RPC.API.Storage
import HBS2.Peer.RPC.Client.StorageClient import HBS2.Peer.RPC.Client.StorageClient

View File

@ -5,10 +5,14 @@ import HBS2.Git.Oracle.App
import HBS2.Hash import HBS2.Hash
import HBS2.Merkle import HBS2.Merkle
import HBS2.Data.Types.SignedBox
import HBS2.KeyMan.Keys.Direct
import HBS2.Git.Data.LWWBlock import HBS2.Git.Data.LWWBlock
import HBS2.Git.Data.Tx import HBS2.Git.Data.Tx
import Data.Maybe import Data.Maybe
import Lens.Micro.Platform import Lens.Micro.Platform
@ -21,6 +25,7 @@ import Data.Ord
import Data.Text qualified as Text import Data.Text qualified as Text
import Control.Monad.Trans.Except import Control.Monad.Trans.Except
import Data.List import Data.List
import Data.ByteString.Lazy qualified as LBS
import Safe import Safe
{- HLINT ignore "Functor law" -} {- HLINT ignore "Functor law" -}
@ -66,7 +71,8 @@ instance Pretty GitRepoHeadFact where
parens ( "gitrepoheadfact1" <+> hsep [pretty gitRepoHeadRef]) parens ( "gitrepoheadfact1" <+> hsep [pretty gitRepoHeadRef])
runOracle :: forall m . MonadUnliftIO m => Oracle m () runOracle :: forall m . MonadUnliftIO m
=> Oracle m ()
runOracle = do runOracle = do
debug "hbs2-git-oracle" debug "hbs2-git-oracle"
@ -141,8 +147,18 @@ runOracle = do
lift $ S.yield f1 lift $ S.yield f1
lift $ S.yield f2 lift $ S.yield f2
rchanAPI <- asks _refchanAPI
chan <- asks _refchanId
auPk <- asks _refchanAuthor
auCreds <- runKeymanClient do
loadCredentials auPk >>= orThrowUser "can't load credentials"
let ppk = view peerSignPk auCreds
let psk = view peerSignSk auCreds
for_ facts $ \f -> do for_ facts $ \f -> do
debug $ pretty f let box = makeSignedBox @L4Proto ppk psk (LBS.toStrict $ serialise f)
pure () void $ callRpcWaitMay @RpcRefChanPropose (TimeoutSec 1) rchanAPI (chan, box)
debug $ "posted tx" <+> pretty (hashObject @HbSync (serialise f))

View File

@ -189,7 +189,7 @@ executable hbs2-git-oracle
-- other-modules: -- other-modules:
-- other-extensions: -- other-extensions:
build-depends: build-depends:
base, hbs2-git, hbs2-git-oracle-oracle-lib base, hbs2-git, hbs2-git-oracle-oracle-lib, hbs2-keyman
, binary , binary
, vector , vector
, optparse-applicative , optparse-applicative