def _on_inbox_packet(self, newpacket, info, status, error_message): if status != "finished": return False if newpacket.Command == commands.RetreiveCoin(): query_j = coins_db.read_query_from_packet(newpacket) if not query_j: p2p_service.SendFail(newpacket, "incorrect query received") return False coins = coins_db.query_json(query_j) p2p_service.SendCoin(newpacket.CreatorID, coins, packet_id=newpacket.PacketID) return True if newpacket.Command == commands.Coin(): coins_list = coins_db.read_coins_from_packet(newpacket) if not coins_list: p2p_service.SendFail(newpacket, "failed to read coins from packet") return True if len(coins_list) == 1: acoin = coins_list[0] if not coins_db.validate_coin(acoin): p2p_service.SendFail(newpacket, "coin validation failed") return True if not coins_db.verify_coin(acoin): p2p_service.SendFail(newpacket, "coin verification failed") return True if coins_db.exist(acoin): self.automat("valid-coins-received", [acoin]) else: self.automat("new-coin-mined", acoin) return True valid_coins = [] for acoin in coins_list: if not coins_db.validate_coin(acoin): continue if not coins_db.verify_coin(acoin): continue valid_coins.append(acoin) if len(valid_coins) == len(coins_list): self.automat("valid-coins-received", valid_coins) else: p2p_service.SendFail(newpacket, "some non-valid coins received") return True return False
def _on_command_retrieve_coin(self, newpacket, info): query_j = coins_io.read_query_from_packet(newpacket) if not query_j: p2p_service.SendFail(newpacket, 'incorrect query received') return False coins, error = coins_db.query_json(query_j) if error: p2p_service.SendFail(newpacket, error) return False result_coins = [] for coin in coins: result_coins.append(coin) if len(result_coins) > self.max_coins_per_packet: result_coins.append(None) break if not result_coins: p2p_service.SendFail(newpacket, 'no coins found') return False p2p_service.SendCoin(newpacket.CreatorID, result_coins, packet_id=newpacket.PacketID) return True