def __init__(self): self.primary_representatives = dict() self.blockchain = BlockChain() self.fund_addr = "" self.redis_client = redis.Redis(host='localhost', port=6379, db=0) self.redis_client.hmset('fund ' + self.fund_addr, {'total fund': 00}) self.this_node_addr = get_own_ip() self.stakes_map = dict() self.votes_map = dict() self.verification = Verification() self.load_election_fund_details()
def memsync(self): ip_address = utils.get_own_ip() print("Mempool sync started ...") redis_client = redis.Redis(host='localhost', port=6379, db=0) ip_list = [] ip_list.append(ip_address) nodes_map = utils.decode_redis(redis_client.hgetall("nodes_map")) for ip_addr, raw_data in nodes_map.items(): if ip_addr == ip_address: continue if ip_addr in settings.EXPLORER_IP: continue else: ip_list.append(ip_addr) print("Nodes list : " + str(ip_list)) ip_list.sort() length = len(ip_list) send = "" if length == 0: print("NO NODES ACTIVE TO SYNC WITH!!!") return for i in range(0, length): if ip_list[i] == ip_address: if i == 0: send = ip_list[-1] else: send = ip_list[i - 1] print("Starting mempool transaction sync ...") # UDP command to send txs to prev addr i = 0 while True: tx = redis_client.lindex("mempool", i) if tx == None: break udp = UDPHandler() print("Sending transaction for sync " + str(i) + "....") udp.synctx({"body": tx.decode(), "ip_addr": send}) i = i + 1 time.sleep(1) print("Mempool sync finished!!!")
def fetch_nodes(self): own_ip = get_own_ip() for url in settings.DNS_SERVERS: try: response = urllib.request.urlopen(url + "/get_nodes") except URLError as e: handle_network_error(e) else: raw = response.read() result = json.loads(raw.decode("utf-8")) for value in result['nodes']: if value['ip_addr'] == own_ip or value[ 'ip_addr'] == settings.EXPLORER_IP[0]: continue else: return value['ip_addr'] break
def dns_fetch(self): own_ip = get_own_ip() redis_client = redis.Redis(host='localhost', port=6379, db=0) pipe = redis_client.pipeline() for url in settings.DNS_SERVERS: try: response = urllib.request.urlopen(url + "/get_nodes") except URLError as e: handle_network_error(e) else: raw = response.read() result = json.loads(raw.decode("utf-8")) for value in result["nodes"]: if value["ip_addr"] == own_ip: continue pipe.hset("nodes_map", value["ip_addr"], json.dumps(value)) pipe.execute() redis_client.close()
def broadcastmessage(message): """ This method is to broadcast message to all IPs """ own_ip = get_own_ip() host = '0.0.0.0' port = settings.UDP_BROADCAST_PORT udpsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) udpsock.bind((host, port)) redis_client = redis.Redis(host='localhost', port=6379, db=0) nodes_map = decode_redis(redis_client.hgetall("nodes_map")) # print(nodes_map) for ip_addr, raw_data in nodes_map.items(): if ip_addr == own_ip: continue data = json.loads(raw_data) # print(data) udpsock.sendto(message.encode('utf-8'), (ip_addr, int(data["receiver_port"]))) udpsock.close()
def dns_push(self): my_node_info = self.load_node_json() headers = {'Content-Type': "application/json"} data = json.dumps({ "ip_addr": get_own_ip(), "node_addr": my_node_info["address"], "receiver_port": settings.UDP_RECEIVER_PORT, "rpc_port": settings.RPC_PORT, "storage_port": settings.FILE_RECV_PORT }) for url in settings.DNS_SERVERS: req = urllib.request.Request(url + "/add_node", data.encode(), headers) try: response = urllib.request.urlopen(req) except URLError as e: handle_network_error(e) else: result = response.read() print(result)