wip, emitting accept message

This commit is contained in:
Dmitry Zuikov 2023-07-17 13:34:18 +03:00
parent 07003409c3
commit 2bb5b83eb9
2 changed files with 39 additions and 14 deletions

View File

@ -1,6 +1,7 @@
{-# Language UndecidableInstances #-} {-# Language UndecidableInstances #-}
{-# Language AllowAmbiguousTypes #-} {-# Language AllowAmbiguousTypes #-}
{-# Language TemplateHaskell #-} {-# Language TemplateHaskell #-}
{-# Language FunctionalDependencies #-}
module HBS2.Net.Proto.RefChan where module HBS2.Net.Proto.RefChan where
import HBS2.Prelude.Plated import HBS2.Prelude.Plated
@ -117,7 +118,12 @@ instance ForRefChans e => Serialise (RefChanHead e)
data ProposeTran e = ProposeTran HashRef (SignedBox ByteString e) -- произвольная бинарная транзакция, data ProposeTran e = ProposeTran HashRef (SignedBox ByteString e) -- произвольная бинарная транзакция,
deriving stock (Generic) -- подписанная ключом **АВТОРА**, который её рассылает deriving stock (Generic) -- подписанная ключом **АВТОРА**, который её рассылает
data AcceptTran e = AcceptTran HashRef HashRef -- ссылка на (ProposTran e)
deriving stock (Generic)
instance ForRefChans e => Serialise (ProposeTran e) instance ForRefChans e => Serialise (ProposeTran e)
instance ForRefChans e => Serialise (AcceptTran e)
-- TODO: find-out-sure-transaction-size -- TODO: find-out-sure-transaction-size
-- транзакция должна быть маленькая! -- транзакция должна быть маленькая!
@ -126,6 +132,8 @@ instance ForRefChans e => Serialise (ProposeTran e)
-- надо посмотреть. байт, небось, 400 -- надо посмотреть. байт, небось, 400
data RefChanUpdate e = data RefChanUpdate e =
Propose (RefChanId e) (SignedBox (ProposeTran e) e) -- подписано ключом пира Propose (RefChanId e) (SignedBox (ProposeTran e) e) -- подписано ключом пира
| Accept (RefChanId e) (SignedBox (AcceptTran e) e) -- подписано ключом пира
deriving stock (Generic) deriving stock (Generic)
instance ForRefChans e => Serialise (RefChanUpdate e) instance ForRefChans e => Serialise (RefChanUpdate e)
@ -145,9 +153,6 @@ deriving stock instance ForRefChans L4Proto
instance Expires (SessionKey L4Proto (RefChanHeadBlock L4Proto)) where instance Expires (SessionKey L4Proto (RefChanHeadBlock L4Proto)) where
expiresIn = const (Just defCookieTimeoutSec) expiresIn = const (Just defCookieTimeoutSec)
-- data RefChanNotifyMsg e =
-- Notify (SignedBox ByteString e)
-- deriving stock (Generic)
data RefChanHeadAdapter e m = data RefChanHeadAdapter e m =
RefChanHeadAdapter RefChanHeadAdapter
@ -232,11 +237,12 @@ refChanUpdateProto :: forall e s m . ( MonadIO m
, s ~ Encryption e , s ~ Encryption e
) )
=> Bool => Bool
-> PeerCredentials s
-> RefChanHeadAdapter e m -> RefChanHeadAdapter e m
-> RefChanUpdate e -> RefChanUpdate e
-> m () -> m ()
refChanUpdateProto self adapter msg = do refChanUpdateProto self pc adapter msg = do
-- авторизовать пира -- авторизовать пира
peer <- thatPeer proto peer <- thatPeer proto
@ -248,6 +254,12 @@ refChanUpdateProto self adapter msg = do
guard (auth || self) guard (auth || self)
-- TODO: process-each-message-only-once
-- где-то тут мы разбираемся, что такое сообщеине
-- уже отправляли и больше одного раза не реагируем
guard =<< lift (refChanHeadSubscribed adapter undefined)
case msg of case msg of
Propose chan box -> do Propose chan box -> do
guard =<< lift (refChanHeadSubscribed adapter chan) guard =<< lift (refChanHeadSubscribed adapter chan)
@ -283,7 +295,7 @@ refChanUpdateProto self adapter msg = do
(peerKey, ProposeTran headRef abox) <- MaybeT $ pure $ unboxSignedBox0 box (peerKey, ProposeTran headRef abox) <- MaybeT $ pure $ unboxSignedBox0 box
-- проверили подпись автора -- проверили подпись автора
(authorKey, bs) <- MaybeT $ pure $ unboxSignedBox0 abox (authorKey, _) <- MaybeT $ pure $ unboxSignedBox0 abox
-- итак, сначала достаём голову. как мы достаём голову? -- итак, сначала достаём голову. как мы достаём голову?
@ -309,17 +321,30 @@ refChanUpdateProto self adapter msg = do
debug $ "OMG!!! TRANS AUTHORIZED" <+> pretty (AsBase58 peerKey) <+> pretty (AsBase58 authorKey) debug $ "OMG!!! TRANS AUTHORIZED" <+> pretty (AsBase58 peerKey) <+> pretty (AsBase58 authorKey)
-- ок, теперь мы можем: -- если не смогли сохранить транзу, то и Accept разослать
-- gossip propose если еще нет -- не сможем
hash <- MaybeT $ liftIO $ putBlock sto (serialise msg)
lift $ gossip msg lift $ gossip msg
-- генерируем Accept и рассылаем всем let tran = AcceptTran headRef (HashRef hash)
-- рассылаем ли себе?
-- как сюда просунуть ручку Gossip ?
pure () let pk = view peerSignPk pc
let sk = view peerSignSk pc
-- генерируем Accept
let accept = Accept chan (makeSignedBox @e pk sk tran)
-- и рассылаем всем
debug "GOSSIP ACCEPT TRANSACTION"
lift $ gossip accept
-- рассылаем ли себе? что бы был хоть один accept
lift $ refChanUpdateProto True pc adapter accept
Accept chan box -> do
guard =<< lift (refChanHeadSubscribed adapter chan)
debug "RefChanUpdate/Propose"
where where
proto = Proxy @(RefChanUpdate e) proto = Proxy @(RefChanUpdate e)

View File

@ -891,7 +891,7 @@ runPeer opts = U.handle (\e -> myException e
, makeResponse (refLogRequestProto reflogReqAdapter) , makeResponse (refLogRequestProto reflogReqAdapter)
, makeResponse (peerMetaProto (mkPeerMeta conf)) , makeResponse (peerMetaProto (mkPeerMeta conf))
, makeResponse (refChanHeadProto False refChanHeadAdapter) , makeResponse (refChanHeadProto False refChanHeadAdapter)
, makeResponse (refChanUpdateProto False refChanHeadAdapter) , makeResponse (refChanUpdateProto False pc refChanHeadAdapter)
] ]
void $ liftIO $ waitAnyCancel workers void $ liftIO $ waitAnyCancel workers
@ -1022,7 +1022,7 @@ runPeer opts = U.handle (\e -> myException e
-- FIXME: remove-this-debug-stuff -- FIXME: remove-this-debug-stuff
-- или оставить? нода будет сама себе -- или оставить? нода будет сама себе
-- консенсус слать тогда. может, и оставить -- консенсус слать тогда. может, и оставить
lift $ runResponseM me $ refChanUpdateProto @e True refChanHeadAdapter (Propose @e puk proposed) lift $ runResponseM me $ refChanUpdateProto @e True pc refChanHeadAdapter (Propose @e puk proposed)
let arpc = RpcAdapter pokeAction let arpc = RpcAdapter pokeAction
dieAction dieAction