예제 #1
0
 def onFailure(self, callback = None):
     peer = Peer()
     peer.host = self.addrFrom
     Peers.removePeer(peer)
     callback(
         'error: Invalid ping message'
     )
예제 #2
0
 def onSuccess(self, callback=None):
     if len(self.addrList) > 0:
         peers = []
         for addr in self.addrList:
             peer = Peer()
             peer.host = addr
             peers.append(peer)
         Peers.addPeers(peers)
예제 #3
0
 def send(self):
     payload = Network.sendData(self.addrRecv, self.serialize())
     message = MessageFactory.getInstance(MessageType.ADDR)
     if message.deserialize(payload):
         message.onSuccess()
     else:
         peer = Peer()
         peer.host = self.addrRecv
         Peers.removePeer(peer)
         message.onFailure(self.sendFailure)
예제 #4
0
 def send(self):
     payload = Network.sendData(self.addrRecv, self.serialize())
     isValid = True
     message = MessageFactory.getInstance(MessageType.PONG)
     if message.deserialize(payload):
         if message.nonce == self.nonce:
             message.onSuccess()
         else:
             isValid = False 
     else:
         isValid = False 
     if isValid == False:
         peer = Peer()
         peer.host = self.addrRecv
         Peers.removePeer(peer)
         message.onFailure(self.sendFailure)
예제 #5
0
    def send(self):
        peer = Peers.getPeerByHost(self.addrRecv)
        if peer.lastVersionNonce == None:
            peer.lastVersionNonce = self.nonce
            Peers.addPeer(peer)
        else:
            self.nonce = peer.lastVersionNonce

        chainHeadBlock = Chain.getChain().getChainHeadBlock()
        self.chainHeadBlockHash = chainHeadBlock.hash()

        payload = Network.sendData(self.addrRecv, self.serialize())
        message = MessageFactory.getInstance(MessageType.VERACK)
        message.addrFrom = self.addrRecv
        if message.deserialize(payload):
            message.onSuccess()
        else:
            peer = Peer()
            peer.host = self.addrRecv
            Peers.removePeer(peer)
            message.onFailure(self.sendFailure)
예제 #6
0
class Peers:
    db = Config.getValue("PEERS_DB")
    subDb = Config.getValue("PEERS_SUB_DB")
    peers = Storage(db, subDb)

    hostname = Network.getHostname()
    ipAddress = Network.getIpAddress()

    if Config.getBoolValue('PEERS_ENABLE_SEEDS'):
        with open(Config.getValue('SEEDS_DIR')) as seeds:
            hosts = json.load(seeds)
            for host in hosts:
                if host != hostname and host != ipAddress:
                    hostBytes = DataType.serialize(host)
                    if peers.get(hostBytes) == None:
                        peer = Peer()
                        peer.host = host
                        peer.lastUpdate = DataType.asTime()
                        peers.set(hostBytes, peer.serialize())
예제 #7
0
 def onSuccess(self, callback=None):
     peer = Peers.getPeerByHost(self.addrFrom)
     syncVersion = False
     if peer == None:
         peer = Peer()
     else:
         syncVersion = peer.lastVersionNonce == None
     if peer.lastVersionNonce == None or peer.lastVersionNonce == self.nonce:
         peer.host = self.addrFrom
         peer.version = self.version
         peer.lastVersionNonce = self.nonce
         peer.chainHeadBlockHash = self.chainHeadBlockHash
         Peers.addPeer(peer)
         if syncVersion:
             Sync.synchronizeMessage(MessageType.VERSION, peer.host)
     message = MessageFactory.getInstance(MessageType.VERACK)
     callback(message.serialize())
예제 #8
0
def getPeerFromBytes(peerBytes):
    if peerBytes != None:
        peer = Peer()
        peer.deserialize(peerBytes)
        return peer
    return None