mirror of https://github.com/voidlizard/hbs2
ignore same peer, different address
This commit is contained in:
parent
61a44eb544
commit
ce3cf2728a
|
@ -41,6 +41,8 @@ import Control.Monad.Reader
|
||||||
import Data.ByteString.Lazy (ByteString)
|
import Data.ByteString.Lazy (ByteString)
|
||||||
import Data.ByteString.Lazy qualified as LBS
|
import Data.ByteString.Lazy qualified as LBS
|
||||||
import Data.List qualified as L
|
import Data.List qualified as L
|
||||||
|
import Data.Set qualified as Set
|
||||||
|
import Data.Map qualified as Map
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Lens.Micro.Platform
|
import Lens.Micro.Platform
|
||||||
import Network.Socket
|
import Network.Socket
|
||||||
|
@ -221,7 +223,7 @@ instance ( Monad m
|
||||||
-- FIXME: Убрать хардкод UDP отовсюду ниже.
|
-- FIXME: Убрать хардкод UDP отовсюду ниже.
|
||||||
-- Вынести в сигнатуру.
|
-- Вынести в сигнатуру.
|
||||||
|
|
||||||
runPeer :: PeerOpts -> IO ()
|
runPeer :: forall e . e ~ UDP => PeerOpts -> IO ()
|
||||||
runPeer opts = Exception.handle myException $ do
|
runPeer opts = Exception.handle myException $ do
|
||||||
|
|
||||||
|
|
||||||
|
@ -230,9 +232,9 @@ runPeer opts = Exception.handle myException $ do
|
||||||
let ps = mempty
|
let ps = mempty
|
||||||
|
|
||||||
pc' <- LBS.readFile (view peerCredFile opts)
|
pc' <- LBS.readFile (view peerCredFile opts)
|
||||||
<&> parseCredentials @UDP . AsCredFile
|
<&> parseCredentials @e . AsCredFile
|
||||||
. LBS.toStrict
|
. LBS.toStrict
|
||||||
. LBS.take 4096
|
. LBS.take 4096
|
||||||
|
|
||||||
pc <- pure pc' `orDie` "can't parse credential file"
|
pc <- pure pc' `orDie` "can't parse credential file"
|
||||||
|
|
||||||
|
@ -282,48 +284,54 @@ runPeer opts = Exception.handle myException $ do
|
||||||
adapter <- mkAdapter
|
adapter <- mkAdapter
|
||||||
env <- ask
|
env <- ask
|
||||||
|
|
||||||
pnonce <- peerNonce @UDP
|
pnonce <- peerNonce @e
|
||||||
|
|
||||||
pl <- getPeerLocator @UDP
|
pl <- getPeerLocator @e
|
||||||
|
|
||||||
addPeers @UDP pl ps
|
addPeers @e pl ps
|
||||||
|
|
||||||
subscribe @UDP PeerAnnounceEventKey $ \pe@(PeerAnnounceEvent pip nonce) -> do
|
subscribe @e PeerAnnounceEventKey $ \(PeerAnnounceEvent pip nonce) -> do
|
||||||
unless (nonce == pnonce) $ do
|
unless (nonce == pnonce) $ do
|
||||||
debug $ "Got peer announce!" <+> pretty pip
|
debug $ "Got peer announce!" <+> pretty pip
|
||||||
known <- find (KnownPeerKey pip) id <&> isJust
|
known <- find (KnownPeerKey pip) id <&> isJust
|
||||||
unless known $ sendPing pip
|
unless known $ sendPing pip
|
||||||
|
|
||||||
subscribe @UDP AnyKnownPeerEventKey $ \(KnownPeerEvent p d) -> do
|
subscribe @e AnyKnownPeerEventKey $ \(KnownPeerEvent p d) -> do
|
||||||
|
|
||||||
|
let thatNonce = view peerOwnNonce d
|
||||||
|
|
||||||
-- FIXME: check if we've got a reference to ourselves
|
-- FIXME: check if we've got a reference to ourselves
|
||||||
if pnonce == view peerOwnNonce d then do
|
if pnonce == thatNonce then do
|
||||||
delPeers pl [p]
|
delPeers pl [p]
|
||||||
addExcluded pl [p]
|
addExcluded pl [p]
|
||||||
expire (KnownPeerKey p)
|
expire (KnownPeerKey p)
|
||||||
|
|
||||||
else do
|
else do
|
||||||
|
|
||||||
prev <- find (KnownPeerKey p) (view peerOwnNonce)
|
pd' <- knownPeers @e pl >>=
|
||||||
|
\peers -> forM peers $ \pip -> do
|
||||||
|
pd <- find (KnownPeerKey pip) (view peerOwnNonce)
|
||||||
|
pure $ (,pip) <$> pd
|
||||||
|
|
||||||
case prev of
|
let pd = Map.fromList $ catMaybes pd'
|
||||||
Just nonce0 | nonce0 /= view peerOwnNonce d -> do
|
|
||||||
debug "old peer, new address. ignoring"
|
|
||||||
|
|
||||||
_ -> do
|
case Map.lookup thatNonce pd of
|
||||||
addPeers pl [p]
|
Just p0 | p0 /= p -> debug "Same peer, different address"
|
||||||
|
_ -> do
|
||||||
|
|
||||||
npi <- newPeerInfo
|
addPeers pl [p]
|
||||||
pfails <- fetch True npi (PeerInfoKey p) (view peerPingFailed)
|
|
||||||
liftIO $ atomically $ writeTVar pfails 0
|
|
||||||
|
|
||||||
debug $ "Got authorized peer!" <+> pretty p
|
npi <- newPeerInfo
|
||||||
<+> pretty (AsBase58 (view peerSignKey d))
|
pfails <- fetch True npi (PeerInfoKey p) (view peerPingFailed)
|
||||||
|
liftIO $ atomically $ writeTVar pfails 0
|
||||||
|
|
||||||
|
debug $ "Got authorized peer!" <+> pretty p
|
||||||
|
<+> pretty (AsBase58 (view peerSignKey d))
|
||||||
|
|
||||||
void $ liftIO $ async $ withPeerM env do
|
void $ liftIO $ async $ withPeerM env do
|
||||||
pause @'Seconds 1
|
pause @'Seconds 1
|
||||||
debug "sending first peer announce"
|
debug "sending first peer announce"
|
||||||
request localMulticast (PeerAnnounce @UDP pnonce)
|
request localMulticast (PeerAnnounce @e pnonce)
|
||||||
|
|
||||||
let wo = fmap L.singleton
|
let wo = fmap L.singleton
|
||||||
|
|
||||||
|
@ -332,11 +340,11 @@ runPeer opts = Exception.handle myException $ do
|
||||||
wo $ liftIO $ async $ withPeerM env $ forever $ do
|
wo $ liftIO $ async $ withPeerM env $ forever $ do
|
||||||
pause defPeerAnnounceTime -- FIXME: setting!
|
pause defPeerAnnounceTime -- FIXME: setting!
|
||||||
debug "sending local peer announce"
|
debug "sending local peer announce"
|
||||||
request localMulticast (PeerAnnounce @UDP pnonce)
|
request localMulticast (PeerAnnounce @e pnonce)
|
||||||
|
|
||||||
wo $ liftIO $ async $ withPeerM env (peerPingLoop @UDP)
|
wo $ liftIO $ async $ withPeerM env (peerPingLoop @e)
|
||||||
|
|
||||||
wo $ liftIO $ async $ withPeerM env (pexLoop @UDP)
|
wo $ liftIO $ async $ withPeerM env (pexLoop @e)
|
||||||
|
|
||||||
wo $ liftIO $ async $ withPeerM env (blockDownloadLoop denv)
|
wo $ liftIO $ async $ withPeerM env (blockDownloadLoop denv)
|
||||||
|
|
||||||
|
@ -347,12 +355,12 @@ runPeer opts = Exception.handle myException $ do
|
||||||
|
|
||||||
PING pa r -> do
|
PING pa r -> do
|
||||||
debug $ "ping" <+> pretty pa
|
debug $ "ping" <+> pretty pa
|
||||||
pip <- fromPeerAddr @UDP pa
|
pip <- fromPeerAddr @e pa
|
||||||
subscribe (ConcretePeerKey pip) $ \(ConcretePeerData{}) -> do
|
subscribe (ConcretePeerKey pip) $ \(ConcretePeerData{}) -> do
|
||||||
|
|
||||||
maybe1 r (pure ()) $ \rpcPeer -> do
|
maybe1 r (pure ()) $ \rpcPeer -> do
|
||||||
pinged <- toPeerAddr pip
|
pinged <- toPeerAddr pip
|
||||||
request rpcPeer (RPCPong @UDP pinged)
|
request rpcPeer (RPCPong @e pinged)
|
||||||
|
|
||||||
sendPing pip
|
sendPing pip
|
||||||
|
|
||||||
|
@ -363,24 +371,24 @@ runPeer opts = Exception.handle myException $ do
|
||||||
|
|
||||||
maybe1 mbsize (pure ()) $ \size -> do
|
maybe1 mbsize (pure ()) $ \size -> do
|
||||||
let ann = BlockAnnounceInfo 0 NoBlockInfoMeta size h
|
let ann = BlockAnnounceInfo 0 NoBlockInfoMeta size h
|
||||||
no <- peerNonce @UDP
|
no <- peerNonce @e
|
||||||
request localMulticast (BlockAnnounce @UDP no ann)
|
request localMulticast (BlockAnnounce @e no ann)
|
||||||
|
|
||||||
CHECK nonce pa h -> do
|
CHECK nonce pa h -> do
|
||||||
pip <- fromPeerAddr @UDP pa
|
pip <- fromPeerAddr @e pa
|
||||||
|
|
||||||
n1 <- peerNonce @UDP
|
n1 <- peerNonce @e
|
||||||
|
|
||||||
unless (nonce == n1) do
|
unless (nonce == n1) do
|
||||||
|
|
||||||
peer <- find @UDP (KnownPeerKey pip) id
|
peer <- find @e (KnownPeerKey pip) id
|
||||||
|
|
||||||
debug $ "received announce from"
|
debug $ "received announce from"
|
||||||
<+> pretty pip
|
<+> pretty pip
|
||||||
<+> pretty h
|
<+> pretty h
|
||||||
|
|
||||||
case peer of
|
case peer of
|
||||||
Nothing -> sendPing @UDP pip
|
Nothing -> sendPing @e pip
|
||||||
Just{} -> do
|
Just{} -> do
|
||||||
debug "announce from a known peer"
|
debug "announce from a known peer"
|
||||||
debug "preparing to dowload shit"
|
debug "preparing to dowload shit"
|
||||||
|
@ -393,7 +401,7 @@ runPeer opts = Exception.handle myException $ do
|
||||||
|
|
||||||
|
|
||||||
wo $ liftIO $ async $ withPeerM env $ do
|
wo $ liftIO $ async $ withPeerM env $ do
|
||||||
runProto @UDP
|
runProto @e
|
||||||
[ makeResponse (blockSizeProto blk dontHandle)
|
[ makeResponse (blockSizeProto blk dontHandle)
|
||||||
, makeResponse (blockChunksProto adapter)
|
, makeResponse (blockChunksProto adapter)
|
||||||
, makeResponse blockAnnounceProto
|
, makeResponse blockAnnounceProto
|
||||||
|
@ -410,7 +418,7 @@ runPeer opts = Exception.handle myException $ do
|
||||||
liftIO $ atomically $ writeTQueue rpcQ (ANNOUNCE h)
|
liftIO $ atomically $ writeTQueue rpcQ (ANNOUNCE h)
|
||||||
|
|
||||||
let pingAction pa = do
|
let pingAction pa = do
|
||||||
that <- thatPeer (Proxy @(RPC UDP))
|
that <- thatPeer (Proxy @(RPC e))
|
||||||
liftIO $ atomically $ writeTQueue rpcQ (PING pa (Just that))
|
liftIO $ atomically $ writeTQueue rpcQ (PING pa (Just that))
|
||||||
|
|
||||||
let fetchAction h = do
|
let fetchAction h = do
|
||||||
|
@ -426,7 +434,7 @@ runPeer opts = Exception.handle myException $ do
|
||||||
fetchAction
|
fetchAction
|
||||||
|
|
||||||
rpc <- async $ runRPC udp1 do
|
rpc <- async $ runRPC udp1 do
|
||||||
runProto @UDP
|
runProto @e
|
||||||
[ makeResponse (rpcHandler arpc)
|
[ makeResponse (rpcHandler arpc)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -434,18 +442,18 @@ runPeer opts = Exception.handle myException $ do
|
||||||
|
|
||||||
ann <- async $ runPeerM menv $ do
|
ann <- async $ runPeerM menv $ do
|
||||||
|
|
||||||
self <- ownPeer @UDP
|
self <- ownPeer @e
|
||||||
|
|
||||||
subscribe @UDP BlockAnnounceInfoKey $ \(BlockAnnounceEvent p bi no) -> do
|
subscribe @e BlockAnnounceInfoKey $ \(BlockAnnounceEvent p bi no) -> do
|
||||||
unless (p == self) do
|
unless (p == self) do
|
||||||
pa <- toPeerAddr p
|
pa <- toPeerAddr p
|
||||||
liftIO $ atomically $ writeTQueue rpcQ (CHECK no pa (view biHash bi))
|
liftIO $ atomically $ writeTQueue rpcQ (CHECK no pa (view biHash bi))
|
||||||
|
|
||||||
subscribe @UDP PeerAnnounceEventKey $ \pe@(PeerAnnounceEvent pip nonce) -> do
|
subscribe @e PeerAnnounceEventKey $ \pe@(PeerAnnounceEvent pip nonce) -> do
|
||||||
-- debug $ "Got peer announce!" <+> pretty pip
|
-- debug $ "Got peer announce!" <+> pretty pip
|
||||||
emitToPeer penv PeerAnnounceEventKey pe
|
emitToPeer penv PeerAnnounceEventKey pe
|
||||||
|
|
||||||
runProto @UDP
|
runProto @e
|
||||||
[ makeResponse blockAnnounceProto
|
[ makeResponse blockAnnounceProto
|
||||||
, makeResponse peerAnnounceProto
|
, makeResponse peerAnnounceProto
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue