Skip to content

Commit

Permalink
Propagate typed api through local state queries
Browse files Browse the repository at this point in the history
  • Loading branch information
Jimbo4350 committed Jul 8, 2020
1 parent 58a6c02 commit 8b12747
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 147 deletions.
20 changes: 10 additions & 10 deletions cardano-api/src/Cardano/Api/LocalChainSync.hs
Expand Up @@ -10,7 +10,7 @@ import Cardano.Prelude hiding (atomically, catch)

import qualified Data.ByteString.Lazy as LBS

import Cardano.Api.Types (Network(..), toNetworkMagic)
import qualified Cardano.Api.Typed as Typed

import Cardano.Config.Types (SocketPath (..))

Expand Down Expand Up @@ -52,27 +52,27 @@ getLocalTip
:: forall blk . RunNode blk
=> IOManager
-> CodecConfig blk
-> Network
-> Typed.NetworkId
-> SocketPath
-> IO (Tip blk)
getLocalTip iomgr cfg nm sockPath = do
getLocalTip iomgr cfg nId sockPath = do
tipVar <- newEmptyTMVarM
createNodeConnection iomgr cfg nm sockPath tipVar
createNodeConnection iomgr cfg nId sockPath tipVar
atomically $ takeTMVar tipVar

createNodeConnection
:: forall blk . RunNode blk
=> IOManager
-> CodecConfig blk
-> Network
-> Typed.NetworkId
-> SocketPath
-> StrictTMVar IO (Tip blk)
-> IO ()
createNodeConnection iomgr cfg nm (SocketPath path) tipVar =
createNodeConnection iomgr cfg nId (SocketPath path) tipVar =
connectTo
(localSnocket iomgr path)
(NetworkConnectTracers nullTracer nullTracer)
(localInitiatorNetworkApplication cfg nm tipVar)
(localInitiatorNetworkApplication cfg nId tipVar)
path
`catch` handleMuxError

Expand All @@ -87,11 +87,11 @@ localInitiatorNetworkApplication
, MonadTimer m
)
=> CodecConfig blk
-> Network
-> Typed.NetworkId
-> StrictTMVar m (Tip blk)
-> Versions NodeToClientVersion DictVersion
(OuroborosApplication 'InitiatorMode LocalAddress LBS.ByteString m () Void)
localInitiatorNetworkApplication cfg nm tipVar =
localInitiatorNetworkApplication cfg nId tipVar =
foldMapVersions
(\v ->
versionedNodeToClientProtocols
Expand All @@ -103,7 +103,7 @@ localInitiatorNetworkApplication cfg nm tipVar =
proxy :: Proxy blk
proxy = Proxy

versionData = NodeToClientVersionData { networkMagic = toNetworkMagic nm }
versionData = NodeToClientVersionData { networkMagic = Typed.toNetworkMagic nId }

protocols clientVersion =
NodeToClientProtocols {
Expand Down
32 changes: 31 additions & 1 deletion cardano-api/src/Cardano/Api/Typed.hs
Expand Up @@ -11,6 +11,7 @@
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DefaultSignatures #-}

Expand Down Expand Up @@ -63,6 +64,7 @@ module Cardano.Api.Typed (
-- * Payment addresses
-- | Constructing and inspecting normal payment addresses
Address(..),
Shelley.Addr,
NetworkId(..),
-- * Byron addresses
makeByronAddress,
Expand All @@ -79,6 +81,7 @@ module Cardano.Api.Typed (
StakeCredential(..),
makeStakeAddress,
StakeKey,
Shelley.StakeReference(..),

-- * Building transactions
-- | Constructing and inspecting transactions
Expand All @@ -89,6 +92,7 @@ module Cardano.Api.Typed (
TxOut(..),
TxIx(..),
Lovelace(..),
Shelley.Coin,
makeByronTransaction,
makeShelleyTransaction,
SlotNo,
Expand Down Expand Up @@ -147,6 +151,8 @@ module Cardano.Api.Typed (
validateAndHashStakePoolMetadata,
StakePoolMetadataValidationError(..),

-- ** Rewards
Shelley.RewardAcnt,
-- * Scripts
-- | Both 'PaymentCredential's and 'StakeCredential's can use scripts.
-- Shelley supports multi-signatures via scripts.
Expand Down Expand Up @@ -279,10 +285,18 @@ module Cardano.Api.Typed (
EpochNo,
NetworkMagic(..),
makeShelleyUpdateProposal,

-- ** Utils
toNetworkMagic,
toShelleyAddr,
fromShelleyStakeCredential,
toShelleyStakeCredential,
fromShelleyStakeReference,
) where


import Prelude
import GHC.Generics

import Data.Aeson.Encode.Pretty (encodePretty')
import Data.Proxy (Proxy(..))
Expand Down Expand Up @@ -329,7 +343,7 @@ import Control.Tracer (nullTracer)

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import Data.Aeson (ToJSON(..), FromJSON(..), (.:))
import Data.Aeson (ToJSON(..), FromJSON(..), Value(..), (.:))


--
Expand Down Expand Up @@ -560,6 +574,7 @@ deriving instance Eq (Address Byron)
deriving instance Show (Address Byron)

deriving instance Eq (Address Shelley)
deriving instance Ord (Address Shelley)
deriving instance Show (Address Shelley)

data StakeAddress where
Expand Down Expand Up @@ -779,6 +794,10 @@ toShelleyStakeCredential (StakeCredentialByKey (StakeKeyHash kh)) =
toShelleyStakeCredential (StakeCredentialByScript (ScriptHash kh)) =
Shelley.ScriptHashObj kh

fromShelleyStakeCredential :: Shelley.StakeCredential ShelleyCrypto -> StakeCredential
fromShelleyStakeCredential (Shelley.KeyHashObj kh) = StakeCredentialByKey (StakeKeyHash kh)
fromShelleyStakeCredential (Shelley.ScriptHashObj kh) = StakeCredentialByScript (ScriptHash kh)

toShelleyStakeReference :: StakeAddressReference
-> Shelley.StakeReference ShelleyCrypto
toShelleyStakeReference (StakeAddressByValue stakecred) =
Expand All @@ -789,6 +808,14 @@ toShelleyStakeReference NoStakeAddress =
Shelley.StakeRefNull


fromShelleyStakeReference :: Shelley.StakeReference ShelleyCrypto -> StakeAddressReference
fromShelleyStakeReference (Shelley.StakeRefBase stkCred) =
StakeAddressByValue (fromShelleyStakeCredential stkCred)
fromShelleyStakeReference (Shelley.StakeRefPtr ptr) =
StakeAddressByPointer ptr
fromShelleyStakeReference (Shelley.StakeRefNull) =
NoStakeAddress

-- ----------------------------------------------------------------------------
-- Transaction Ids
--
Expand Down Expand Up @@ -3133,6 +3160,7 @@ instance Key StakePoolKey where

newtype instance Hash StakePoolKey =
StakePoolKeyHash (Shelley.KeyHash Shelley.StakePool ShelleyCrypto)
deriving Generic
deriving (Eq, Ord, Show)

instance SerialiseAsRawBytes (Hash StakePoolKey) where
Expand All @@ -3150,6 +3178,8 @@ instance HasTextEnvelope (SigningKey StakePoolKey) where
textEnvelopeType _ = "Node operator signing key"
-- TODO: include the actual crypto algorithm name, to catch changes

instance ToJSON (Hash StakePoolKey) where
toJSON hKey = String . Text.decodeLatin1 $ serialiseToRawBytes hKey

--
-- KES keys
Expand Down
3 changes: 2 additions & 1 deletion cardano-cli/src/Cardano/CLI/Byron/Commands.hs
Expand Up @@ -17,6 +17,7 @@ import Cardano.Chain.Update
SystemTag(..))

import Cardano.Api (Network)
import qualified Cardano.Api.Typed as Typed
import Cardano.Config.Types

import Cardano.CLI.Byron.UpdateProposal
Expand Down Expand Up @@ -90,7 +91,7 @@ data ByronCommand =
VerificationKeyFile

| GetLocalNodeTip
Network
Typed.NetworkId

-----------------------------------

Expand Down
23 changes: 22 additions & 1 deletion cardano-cli/src/Cardano/CLI/Byron/Parsers.hs
Expand Up @@ -58,6 +58,7 @@ import Cardano.Chain.Genesis
import Cardano.Chain.UTxO (TxId, TxIn(..), TxOut(..))

import Cardano.Api (Network(..), NetworkMagic(..))
import qualified Cardano.Api.Typed as Typed
import Cardano.Config.Types
import Cardano.Config.Parsers
(parseIntegral, parseFraction, parseLovelace, readDouble,
Expand Down Expand Up @@ -249,7 +250,7 @@ parseLocalNodeQueryValues =
mconcat
[ command' "get-tip" "Get the tip of your local node's blockchain"
$ GetLocalNodeTip
<$> parseNetwork
<$> pNetworkId
]

parseMiscellaneous :: Mod CommandFields ByronCommand
Expand Down Expand Up @@ -644,6 +645,26 @@ parseNetwork :: Parser Network
parseNetwork =
parseMainnet <|> fmap Testnet parseTestnetMagic

pNetworkId :: Parser Typed.NetworkId
pNetworkId =
pMainnet' <|> fmap Typed.Testnet pTestnetMagic
where
pMainnet' :: Parser Typed.NetworkId
pMainnet' =
Opt.flag' Typed.Mainnet
( Opt.long "mainnet"
<> Opt.help "Use the mainnet magic id."
)

pTestnetMagic :: Parser NetworkMagic
pTestnetMagic =
NetworkMagic <$>
Opt.option Opt.auto
( Opt.long "testnet-magic"
<> Opt.metavar "NATURAL"
<> Opt.help "Specify a testnet magic id."
)

parseMainnet :: Parser Network
parseMainnet =
Opt.flag' Mainnet
Expand Down
9 changes: 5 additions & 4 deletions cardano-cli/src/Cardano/CLI/Byron/Query.hs
Expand Up @@ -15,6 +15,7 @@ import Cardano.Prelude hiding (unlines)
import Control.Monad.Trans.Except.Extra (firstExceptT)
import qualified Data.Text as T

import qualified Cardano.Api.Typed as Typed
import Cardano.Chain.Slotting (EpochSlots(..))
import Ouroboros.Consensus.Cardano
(protocolClientInfo, SecurityParam(..))
Expand All @@ -23,7 +24,7 @@ import Ouroboros.Consensus.Util.Condense (Condense(..))
import Ouroboros.Network.Block
import Ouroboros.Network.NodeToClient (withIOManager)

import Cardano.Api (Network(..), getLocalTip)
import Cardano.Api (getLocalTip)
import Cardano.Api.Protocol.Byron (mkNodeClientProtocolByron)
import Cardano.CLI.Environment
(EnvSocketError, readEnvSocketPath, renderEnvSocketError)
Expand All @@ -41,8 +42,8 @@ renderByronQueryError err =
-- Query local node's chain tip
--------------------------------------------------------------------------------

runGetLocalNodeTip :: Network -> ExceptT ByronQueryError IO ()
runGetLocalNodeTip network = do
runGetLocalNodeTip :: Typed.NetworkId -> ExceptT ByronQueryError IO ()
runGetLocalNodeTip networkId = do
sockPath <- firstExceptT ByronQueryEnvVarSocketErr $ readEnvSocketPath
let ptclClientInfo = pClientInfoCodecConfig . protocolClientInfo $
mkNodeClientProtocolByron
Expand All @@ -51,7 +52,7 @@ runGetLocalNodeTip network = do

liftIO $ do
tip <- withIOManager $ \iomgr ->
getLocalTip iomgr ptclClientInfo network sockPath
getLocalTip iomgr ptclClientInfo networkId sockPath
putTextLn (getTipOutput tip)
where
getTipOutput :: forall blk. Condense (HeaderHash blk) => Tip blk -> Text
Expand Down
2 changes: 1 addition & 1 deletion cardano-cli/src/Cardano/CLI/Byron/Run.hs
Expand Up @@ -68,7 +68,7 @@ runByronClientCommand c =
case c of
NodeCmd bc -> runNodeCmd bc
Genesis outDir params era -> runGenesisCommand outDir params era
GetLocalNodeTip network -> firstExceptT ByronCmdQueryError $ runGetLocalNodeTip network
GetLocalNodeTip networkId -> firstExceptT ByronCmdQueryError $ runGetLocalNodeTip networkId
ValidateCBOR cborObject fp -> runValidateCBOR cborObject fp
PrettyPrintCBOR fp -> runPrettyPrintCBOR fp
PrettySigningKeyPublic era skF -> runPrettySigningKeyPublic era skF
Expand Down
16 changes: 8 additions & 8 deletions cardano-cli/src/Cardano/CLI/Shelley/Commands.hs
Expand Up @@ -45,10 +45,10 @@ import Data.Text (Text)

import qualified Cardano.Api as OldApi
import Cardano.Api.Typed hiding (Address, PoolId, Hash)
import qualified Cardano.Api.Typed as Typed

import Ouroboros.Consensus.BlockchainTime (SystemStart (..))

import Cardano.Api (Address)
import Cardano.Config.Types
(CertificateFile (..), NodeAddress, SigningKeyFile(..),
UpdateProposalFile(..))
Expand Down Expand Up @@ -170,13 +170,13 @@ data PoolCmd

data QueryCmd
= QueryPoolId NodeAddress
| QueryProtocolParameters OldApi.Network (Maybe OutputFile)
| QueryTip OldApi.Network (Maybe OutputFile)
| QueryStakeDistribution OldApi.Network (Maybe OutputFile)
| QueryStakeAddressInfo OldApi.Address OldApi.Network (Maybe OutputFile)
| QueryUTxO QueryFilter OldApi.Network (Maybe OutputFile)
| QueryProtocolParameters Typed.NetworkId (Maybe OutputFile)
| QueryTip Typed.NetworkId (Maybe OutputFile)
| QueryStakeDistribution Typed.NetworkId (Maybe OutputFile)
| QueryStakeAddressInfo Typed.StakeAddress Typed.NetworkId (Maybe OutputFile)
| QueryUTxO QueryFilter Typed.NetworkId (Maybe OutputFile)
| QueryVersion NodeAddress
| QueryLedgerState OldApi.Network (Maybe OutputFile)
| QueryLedgerState Typed.NetworkId (Maybe OutputFile)
| QueryStatus NodeAddress
deriving (Eq, Show)

Expand Down Expand Up @@ -301,6 +301,6 @@ newtype VerificationKeyFile

-- | UTxO query filtering options.
data QueryFilter
= FilterByAddress !(Set Address)
= FilterByAddress !(Set (Typed.Address Typed.Shelley))
| NoFilter
deriving (Eq, Show)

0 comments on commit 8b12747

Please sign in to comment.