From 251204cbf876106dcc67bd2c2ca9bd11450f63fe Mon Sep 17 00:00:00 2001 From: joe Date: Sun, 10 Aug 2014 18:56:41 -0400 Subject: initiateSybilCheck --- SybilLimit.hs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/SybilLimit.hs b/SybilLimit.hs index 903ccd0..8d053f9 100644 --- a/SybilLimit.hs +++ b/SybilLimit.hs @@ -1,9 +1,10 @@ -{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE StandaloneDeriving, TupleSections #-} module SybilLimit where import Data.List ( foldl', minimumBy ) import Data.Maybe ( fromMaybe ) import Data.Ord ( comparing ) +import Data.Tuple ( swap ) import Data.IntMap.Strict ( IntMap, (!) ) import qualified Data.IntMap.Strict as IntMap import Data.Traversable ( sequenceA ) @@ -47,8 +48,7 @@ data FriendNode = FriendNode -- | When 'sybPendingTails' is empty, the intersection condition is passed if and -- only if 'sybVerifiedTails' is not empty. data PendingSybilCheck = PendingSybilCheck - { sybSuspect :: NodeId -- todo: neccessary? - , sybPendingTails :: Map (NodeId,NodeId) [Int] + { sybPendingTails :: Map (NodeId,NodeId) [Int] , sybVerifiedTails :: Map (NodeId,NodeId) [Int] } @@ -76,6 +76,11 @@ data MessageReaction = MessageReaction , sybilChecks :: [SybilCheck] } +data SuspectCredentials + = SuspectCredentials { suspectId :: NodeId + , suspectTails :: [(NodeId,NodeId)] + } + friendNode :: NodeId -> FriendNode friendNode nid = FriendNode nid IntMap.empty IntMap.empty Nothing @@ -223,3 +228,23 @@ balanceCondition (ka,kb) routeNums me = (me',didPass) where tieBreak EQ = compare ca cb tieBreak x = x + +initiateSybilCheck :: SuspectCredentials -> ThisNode -> MessageReaction +initiateSybilCheck cred me = MessageReaction me' msgs [] + where + me' = me { pendingChecks = Map.insert (suspectId cred) p + $ pendingChecks me } + msgs = map (\(a,b) -> (b, RegistrationQuery (suspectId cred) a)) + $ Map.keys tmap + p = PendingSybilCheck { sybPendingTails = tmap + , sybVerifiedTails = Map.empty + } + tmap = tmap0 `Map.intersection` smap + where + smap = Map.fromList $ map (,()) (suspectTails cred) + tmap0 = foldl' build + Map.empty + (map swap $ IntMap.toList $ routeTails me) + build mp (tl,i) = Map.alter insert tl mp + where insert Nothing = Just [i] + insert (Just is) = Just (i:is) -- cgit v1.2.3