def onSuccess(self, callback=None): for inventory in self.inventory: if inventory.invType == InventoryType.BLOCK: message = MessageFactory.getInstance(MessageType.BLOCK) block = self.chain.getBlockByHash(inventory.getInvHash()) message.addrRecv = self.addrFrom message.block = block.serialize() message.send() elif inventory.invType == InventoryType.TRANSACTION: message = MessageFactory.getInstance(MessageType.TX) txHash = inventory.getInvHash() transaction = self.memoryPool[txHash] message.addrRecv = self.addrFrom message.transaction = transaction.serialize() message.send()
def onSuccess(self, callback=None): message = MessageFactory.getInstance(MessageType.ADDR) peers = Peers.getPeers() message.count = len(peers) for peer in peers.copy(): message.addrList.append(peer.host) callback(message.serialize())
def inv(invType, invHash): message = MessageFactory.getInstance(MessageType.INV) inventory = [] inventory.append(Inventory(invType, invHash)) message.inventory.extend(inventory) message.count = len(inventory) broadcastMessage(message)
def handlePayload(self, payload): message = MessageFactory.getInstance(payload) message.addrRecv = self.getAddrRecv() message.addrFrom = self.getAddrFrom() if message.deserialize(payload): message.onSuccess(self.writeResponse) else: message.onFailure(self.writeResponse)
def send(self): payload = Network.sendData(self.addrRecv, self.serialize()) message = MessageFactory.getInstance(MessageType.INV) message.addrRecv = self.addrRecv if message.deserialize(payload): message.onSuccess() else: message.onFailure(self.sendFailure)
def onSuccess(self, callback=None): message = MessageFactory.getInstance(MessageType.INV) inventory = [] for txId in self.memoryPool: unconfirmedTransaction = self.memoryPool[txId] inventory.append( Inventory(InventoryType.TRANSACTION, unconfirmedTransaction.hash())) message.inventory.extend(inventory) callback(message.serialize())
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)
def send(self): peer = Peers.getPeerByHost(self.addrRecv) self.blockHashes.append(peer.chainHeadBlockHash) payload = Network.sendData(self.addrRecv, self.serialize()) message = MessageFactory.getInstance(MessageType.INV) message.addrFrom = self.addrRecv if message.deserialize(payload): message.onSuccess() else: message.onFailure(self.sendFailure)
def onSuccess(self, callback=None): message = MessageFactory.getInstance(MessageType.GETDATA) message.addrRecv = self.addrFrom for inventory in self.inventory: if inventory.invType == InventoryType.BLOCK: if self.chain.getBlockByHash(inventory.getInvHash()) == None: message.inventory.append(inventory) elif inventory.invType == InventoryType.TRANSACTION: if MemoryPool.getTransactionById( inventory.getInvHash()) == None: message.inventory.append(inventory) if len(message.inventory) > 0: message.send()
def onSuccess(self, callback=None): message = MessageFactory.getInstance(MessageType.INV) inventory = [] for blockHash in self.blockHashes: previousHash = blockHash while previousHash != None: block = self.chain.getBlockByHash(previousHash) if block != None: inventory.append( Inventory(InventoryType.BLOCK, block.hash())) previousHash = block.previousHash else: previousHash = None message.inventory.extend(inventory) callback(message.serialize())
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)
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())
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)
def getdata(inventoryType, inventoryHash): message = MessageFactory.getInstance(MessageType.GETDATA) message.inventory.append(Inventory(inventoryType, inventoryHash)) broadcastMessage(message)
def mempool(): message = MessageFactory.getInstance(MessageType.MEMPOOL) broadcastMessage(message)
def ping(): message = MessageFactory.getInstance(MessageType.PING) while True: broadcastMessage(message) time.sleep(Config.getIntValue("PING_BROADCAST_SECONDS"))
def onSuccess(self, callback = None): message = MessageFactory.getInstance(MessageType.PONG) message.nonce = self.nonce callback(message.serialize())
def getblocks(): message = MessageFactory.getInstance(MessageType.GETBLOCKS) broadcastMessage(message)
def version(): message = MessageFactory.getInstance(MessageType.VERSION) broadcastMessage(message)
def synchronizeMessage(messageType, host): message = MessageFactory.getInstance(messageType) processMessage(message, host)
def getaddr(): message = MessageFactory.getInstance(MessageType.GETADDR) broadcastMessage(message)
def addr(host): message = MessageFactory.getInstance(MessageType.ADDR) message.addrList.append(host) broadcastMessage(message)