예제 #1
0
 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()
예제 #2
0
    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!!!")
예제 #3
0
 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
예제 #4
0
 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()
예제 #5
0
    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()
예제 #6
0
    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)