def homepage():
    statusMsg = Message("getData")
    webGUIData = parseWebGUIDataMessage(ActorSystem().ask(
        aSys.createActor(WebGUI, globalName='WebGUISingleton'),
        statusMsg.encode(), 60))
    templateData = {
        'time':
        webGUIData.webGUIData.time,
        'envData':
        webGUIData.webGUIData.envData,
        'triggerTemperature':
        webGUIData.webGUIData.triggerTemperature,
        'triggerHumidity':
        webGUIData.webGUIData.triggerHumidity,
        'lightStatus':
        "ON" if webGUIData.webGUIData.envData.lightOn else "OFF",
        'currentOn':
        datetime.datetime.strftime(
            webGUIData.webGUIData.lightSchedule.currentOn, "%H:%M"),
        'currentOff':
        datetime.datetime.strftime(
            webGUIData.webGUIData.lightSchedule.currentOff, "%H:%M"),
        'upcomingOn':
        datetime.datetime.strftime(
            webGUIData.webGUIData.lightSchedule.upcomingOn, "%H:%M"),
        'upcomingOff':
        datetime.datetime.strftime(
            webGUIData.webGUIData.lightSchedule.upcomingOff, "%H:%M")
    }

    return render_template("homepage.html", **templateData)
Example #2
0
 def run_node(self):
     round = self.env.get_round()
     myid = self.env.get_id(self)
     if round == 0:
         if self.env.get_id(self) == NaiveVoting.SENDER:
             self.input = self.env.get_input(self)
             self.env.put_broadcast(self, self.pki.sign(
                 self, Message(myid, self.input)))
     elif round == 1:
         msgs = self.env.get_input_msgs(self)
         for msg in msgs:
             if self.pki.verify(msg) and msg.get_sender() == NaiveVoting.SENDER and (
                     msg.get_extraction() == 0 or msg.get_extraction() == 1):
                 self.env.put_broadcast(
                     self, self.pki.sign(self, Message(myid, msg)))
     elif round == 2:
         msgs = self.env.get_input_msgs(self)
         seen = set()
         cnt = [0, 0]
         for msg in msgs:
             if self.pki.verify(msg) and (msg.get_sender() not in seen) and (
                     msg.get_extraction() == 0 or msg.get_extraction() == 1):
                 seen.add(msg.get_sender())
                 cnt[msg.get_extraction()] += 1
         bar = self.env.get_n() * 2 / 3
         if cnt[0] >= bar:
             self.env.put_output(self, 0)
         elif cnt[1] >= bar:
             self.env.put_output(self, 1)
         else:
             self.env.put_output(self, None)
     else:
         raise RuntimeError
Example #3
0
 def run_node(self):
     round = self.env.get_round()
     myid = self.env.get_id(self)
     if round == 0:
         if self.env.get_id(self) == DolevStrong.SENDER:
             self.input = self.env.get_input(self)
             self.env.put_broadcast(
                 self, self.pki.sign(self, Message(myid, self.input)))
             self.seen[self.input] = True
     elif 1 <= round <= self.env.get_tf():
         msgs = self.env.get_input_msgs(self)
         for msg in msgs:
             if self.pki.verify(msg) and self.my_verify(round, msg):
                 b = msg.get_extraction()
                 if (b == 0 or b == 1) and not self.seen[b]:
                     self.seen[b] = True
                     self.env.put_broadcast(
                         self, self.pki.sign(self, Message(myid, msg)))
         if round == self.env.get_tf():
             if self.seen[1] and not self.seen[0]:
                 self.env.put_output(self, 1)
             else:
                 self.env.put_output(self, 0)
     else:
         raise RuntimeErro
Example #4
0
 def mine_block(self):
     myid = self.env.get_id(self)
     new_block = Nakamoto_Block(
         self.block_forest.query_max_depth_block_id(), miner=myid)
     self.env.insert_block(new_block)
     self.block_forest.insert(new_block)
     self.env.put_broadcast(
         self, myid, self.pki.sign(self, Message(myid, new_block, round)))
     self.env.dispatch_message()
Example #5
0
 def receive_block(self):
     msgs = self.env.get_input_msg(self.chameleon_dict[self.represent_id])
     if not msgs:
         return
     for msg in msgs:
         block = msg.get_extraction()
         if not self.public_block_forest.block_is_in(block):
             self.public_block_forest.insert(block)
         self.private_chain_len = len(self.private_block_forest.get_chain())
         self.public_chain_len = len(self.public_block_forest.get_chain())
         if self.public_chain_len > self.private_chain_len:
             self.private_block_forest = self.public_block_forest.clone()
             pass
         else:
             if self.private_chain_len - self.public_chain_len == 1:
                 for i in range(len(self.private_blocks)):
                     block = self.private_blocks.pop()
                     self.env.put_broadcast(
                         self, self.represent_id,
                         self.pki.sign(
                             self.chameleon_dict[self.represent_id],
                             Message(self.represent_id, block, round)))
                 self.public_block_forest = self.private_block_forest.clone(
                 )
                 self.con.dispatch_honest_message()
                 self.con.throw_adv_message()
             elif self.private_chain_len - self.public_chain_len == 0:
                 for i in range(len(self.private_blocks)):
                     block = self.private_blocks.pop()
                     self.env.put_broadcast(
                         self, self.represent_id,
                         self.pki.sign(
                             self.chameleon_dict[self.represent_id],
                             Message(self.represent_id, block, round)))
                     if not self.public_block_forest.block_is_in(block):
                         self.public_block_forest.insert(block)
                 self.con.dispatch_honest_message()
                 self.con.throw_adv_message()
             else:
                 pass
Example #6
0
 def run_node(self):
     round = self.env.get_round()
     myid = self.env.get_id(self)
     flag = 0
     if round == 0:
         self.input = self.env.get_input(myid)
         self.env.put_broadcast(self, self.pki.sign(
             self, Message(myid, self.input)))
     else:
         if flag:
             self.env.get_input_msgs(self)
             self.env.put_broadcast(self, self.pki.sign(
                 self, Message(myid, self.input)))
         else:
             msgs = self.env.get_input_msgs(self)
             d = {}
             for msg in msgs:
                 if(not self.pki.verify(msg)):
                     raise RuntimeError
                 key = msg.get_extraction()
                 if key not in d:
                     d[key] = 0
                 d[key] = d[key]+1
             if not d:
                 raise RuntimeError
             d_sorted = sorted(
                 d.items(), key=lambda kv: kv[1], reverse=True)
             if(d_sorted[0][1] >= (self.env.get_n()-self.env.get_f())):
                 self.env.put_output(self, d_sorted[0][0])
                 self.input = d_sorted[0][0]
                 self.env.put_broadcast(self, self.pki.sign(
                     self, Message(myid, self.input)))
             elif (d_sorted[0][1] > (self.env.get_n()-self.env.get_f())/2):
                 if len(d_sorted) > 1 and d_sorted[1][1] > (self.env.get_n()-self.env.get_f())/2:
                     self.env.put_broadcast(self, self.pki.sign(
                         self, Message(myid, self.input)))
                 else:
                     self.input = d_sorted[0][0]
                     self.env.put_broadcast(self, self.pki.sign(
                         self, Message(myid, self.input)))
 def run_node(self):
     running_round = self.env.get_round()
     msgs = self.env.get_input_msgs(self.represent_node)
     for msg in msgs:
         if (not self.pki.verify(msg)):
             raise RuntimeError
         if msg.sender == self.represent_id:
             continue
         new_site = msg.get_extraction().copy()
         if not new_site:
             raise RuntimeError
         self.Tangle.insert_site(new_site)
     for site in self.chameleon_dict.values():
         my_pow = True
         if my_pow:
             new_site = Tangle_Site([], [], self.represent_id, None, [], 0)
             self.my_sites.append(new_site)
     weight1 = self.Tangle.genesis_site.children_list[
         0].calculate_cumulative_weight()
     weight0 = self.Tangle.genesis_site.children_list[
         1].calculate_cumulative_weight()
     if weight0 == weight1:
         if len(self.my_sites) > self.limit:
             self.equal_add(running_round)
         return
     else:
         if weight0 > weight1:
             indicator = 0
         else:
             indicator = 1
         delta = abs(weight0 - weight1) + round(
             (self.con.n - self.con.tf) * abs(weight0 - weight1) /
             (weight0 + weight1))
         for i in range(min(delta, len(self.my_sites))):
             balance_site = self.my_sites.pop()
             balance_site.vote = 1 - indicator
             balance_site.father_id_list = [2 + indicator]
             balance_site.father_list.append(
                 self.Tangle.genesis_site.children_list[indicator])
             balance_site.update_weight()
             self.Tangle.id_node_map[balance_site.id] = balance_site
             signed_site = self.pki.sign(self.represent_node, balance_site)
             self.Tangle.genesis_site.children_list[
                 indicator].children_list.append(signed_site)
             self.env.put_broadcast(
                 self.represent_node,
                 self.pki.sign(
                     self.represent_node,
                     Message(self.represent_id, signed_site,
                             running_round)))
         if len(self.my_sites) > self.limit:
             self.equal_add(running_round)
Example #8
0
 def run_node(self):
     round = self.env.get_round()
     myid = self.env.get_id(self)
     if round == 0:
         self.belief = self.env.get_input(myid)
         pass
     elif round <= self.bar:
         msgs = self.env.get_input_msgs(self)
         bucket_lists = [[], []]
         for msg in msgs:
             if (not self.pki.verify(msg)):
                 raise RuntimeError
             bucket = msg.get_extraction()
             if not bool(bucket):
                 bool(bucket)
                 raise RuntimeError
             if self.bucket_verify(bucket):
                 bucket_lists[bucket[0].belief].append(bucket.copy())
         for bucket in self.buckets:
             if bucket:
                 bucket_lists[bucket[0].belief].append(bucket.copy())
         for bucket_list in bucket_lists:
             if bucket_list:
                 self.buckets[bucket_list[0][0].belief] = max(
                     bucket_list, key=lambda x: len(x))
         l0 = len(self.buckets[0])
         l1 = len(self.buckets[1])
         if l0 != 0 or l1 != 0:
             if (l0 > l1) or (l0 == l1):
                 self.belief = 0
             else:
                 self.belief = 1
         if round == self.bar:
             self.env.put_output(self, self.belief)
             return
         my_pow = self.my_mine.POW(round, myid, self.belief)
         if my_pow:
             new_block = self.pki.sign(self, Block(round, myid,
                                                   self.belief))
             self.buckets[self.belief].append(new_block)
             self.env.put_broadcast(
                 self,
                 self.pki.sign(
                     self,
                     Message(myid, (self.buckets[self.belief]).copy(),
                             round)))
Example #9
0
 def run_node(self):
     round = self.env.get_round()
     if round > self.running_rounds:
         return
     if round == self.running_rounds:
         self.env.put_output(self, self.plotdata)
         return
     myid = self.env.get_id(self)
     msgs = self.env.get_input_msgs(self)
     for msg in msgs:
         if (not self.pki.verify(msg)):
             raise RuntimeError
         if msg.sender == myid:
             continue
         new_site = msg.get_extraction().copy()
         if not new_site:
             raise RuntimeError
         self.Tangle.insert_site(new_site)
     my_pow = self.mine.POW(round, myid)
     if my_pow:
         selected_tips = self.Tangle.random_walk()
         if selected_tips[0].vote != selected_tips[1].vote:
             raise RuntimeError
         if selected_tips[0] == selected_tips[1]:
             del selected_tips[1]
         father_id_list = []
         father_list = []
         for tip in selected_tips:
             father_id_list.append(tip.id)
         for tip in selected_tips:
             father_list.append(tip)
         new_site = self.pki.sign(
             self,
             Tangle_Site(father_id_list, [], myid, selected_tips[0].vote,
                         father_list, 0))
         for tip in selected_tips:
             if new_site in tip.children_list:
                 continue
             tip.children_list.append(new_site)
         new_site.update_weight()
         self.Tangle.id_node_map[new_site.id] = new_site
         self.env.put_broadcast(
             self, self.pki.sign(self, Message(myid, new_site, round)))
     self.update_plotdata()
 def equal_add(self, running_round):
     add_num = math.ceil((len(self.my_sites) - self.limit) / 2)
     for i in range(add_num):
         for indicator in range(2):
             balance_site = self.my_sites.pop()
             balance_site.vote = 1 - indicator
             balance_site.father_id_list = [2 + indicator]
             balance_site.father_list.append(
                 self.Tangle.genesis_site.children_list[indicator])
             balance_site.update_weight()
             self.Tangle.id_node_map[balance_site.id] = balance_site
             signed_site = self.pki.sign(self.represent_node, balance_site)
             self.Tangle.genesis_site.children_list[
                 indicator].children_list.append(signed_site)
             self.env.put_broadcast(
                 self.represent_node,
                 self.pki.sign(
                     self.represent_node,
                     Message(self.represent_id, signed_site,
                             running_round)))
Example #11
0
 def run_node(self):
     round = self.env.get_round()
     myid = self.env.get_id(self)
     if round == 0:
         self.belief = self.env.get_input(myid)
     elif round <= self.bar:
         msgs = self.env.get_input_msgs(self)
         bucket_lens = [len(self.buckets[0]), len(self.buckets[1])]
         for msg in msgs:
             if not self.pki.verify(msg):
                 raise RuntimeError
             bucket = msg.get_extraction()
             if not bucket:
                 raise RuntimeError
             if self.bucket_verify(bucket, round) and len(bucket) > len(
                     self.buckets[bucket[0].belief]):
                 self.buckets[bucket[0].belief] = bucket
         l0 = len(self.buckets[0])
         l1 = len(self.buckets[1])
         if l0 != 0 or l1 != 0:
             if (l0 > l1) or (l0 == l1):
                 self.belief = 0
             else:
                 self.belief = 1
         if round == self.bar:
             self.env.put_output(self, self.belief)
             return
         my_pow = self.my_mine.POW(round, myid, self.belief)
         if my_pow:
             new_block = self.pki.sign(self, Block(round, myid,
                                                   self.belief))
             self.buckets[self.belief] = self.buckets[self.belief].copy()
             self.buckets[self.belief].append(new_block)
         for i in range(2):
             if len(self.buckets[i]) > bucket_lens[i]:
                 self.env.put_broadcast(
                     self,
                     self.pki.sign(self,
                                   Message(myid, self.buckets[i], round)))
def ToggleLightStatus():
    webGUI = ActorSystem().createActor(WebGUI, globalName='WebGUISingleton')
    ActorSystem().tell(webGUI, Message("ToggleLightStatus").encode())
    return redirect('/')
    #    sys.exit(0)
    # asys = ActorSystem('simpleSystemBase')
    # Setup this system as the convention leader, and give it a capability "Server"
    # Note by default actor systems use port 1900, so we'll set this here too
    # capabilities = {"Convention Address.IPv4": (get_my_ip(), 1900)}
    # aSys = ActorSystem("multiprocTCPBase", capabilities)

    # aSys = ActorSystem('simpleSystemBase')

    aSys = ActorSystem('multiprocQueueBase')

    webGUI = aSys.createActor(WebGUI, globalName='WebGUISingleton')
    loggingActor = aSys.createActor(LoggingActor)
    envCtrl = aSys.createActor(EnvironmentController)

    launchMsg = Message("Launch")
    ActorSystem().tell(envCtrl, launchMsg.encode())

    msg = SysLogMessage("INFO", "System launched")
    ActorSystem().tell(loggingActor, msg.encode())

    msg = DataLogMessage(21, 53, True, True)
    ActorSystem().tell(loggingActor, msg.encode())

    actorAddrMsg = ActorAddressMessage(webGUI, envCtrl, loggingActor)
    ActorSystem().tell(webGUI, actorAddrMsg.encode())
    ActorSystem().tell(envCtrl, actorAddrMsg.encode())
    ActorSystem().tell(loggingActor, actorAddrMsg.encode())

    msg = Message("StartEnvironmentTasks")
    ActorSystem().tell(envCtrl, msg.encode())
Example #14
0
    def receiveMessage(self, message, sender):
        msg = parseMessage(message)
        if msg.name == "ActorAddress":
            msg = parseActorAddressMessage(message)
            self.loggingAddr = msg.loggingAddr
            self.webGUIAddr = msg.webGUIAddr
        elif msg.name == "Launch":
            self.fanCtrlAddr = self.createActor(FanController)
            self.climRdrAddr = self.createActor(ClimateReader)
            self.lightCtrlAddr = self.createActor(LightController)
        elif msg.name == "StartEnvironmentTasks":
            fanCtrlMessage = Message("UpdateFanStatus")
            self.scheduleMsg(self.fanCtrlAddr, fanCtrlMessage.encode(), 30)

            lightCtrlMessage = Message("UpdateLightStatus")
            self.scheduleMsg(self.lightCtrlAddr, lightCtrlMessage.encode(), 30)

            climRdrMessage = Message("UpdateClimateStatus")
            self.scheduleMsg(self.climRdrAddr, climRdrMessage.encode(), 30)

            environmentDataMsg = Message("UpdateEnvironmentData")
            self.scheduleMsg(self.myAddress, environmentDataMsg.encode(), 30)
        elif msg.name == "ClimateData":
            msg = parseClimateDataMessage(message)
            self.logInfo("Environment Received Climate Temp, Humidity : " +
                         str(msg.climateData.temperature) + ", " +
                         str(msg.climateData.humidity))
            if (msg.climateData.temperature > self.triggerClimateData.temperature) or\
               (msg.climateData.humidity > self.triggerClimateData.humidity):
                self.logWarning("Overheating! Turning fan on")
                self.overheated = True
                self.send(self.fanCtrlAddr, UpdateFanLevelMessage(5).encode())
            elif self.overheated and\
                 (msg.climateData.temperature < (self.triggerClimateData.temperature - 3)) and\
                 (msg.climateData.humidity < (self.triggerClimateData.humidity - 5)):
                self.logInfo("Temperature has returned to suitable levels")
                self.overheated = False
                self.send(self.fanCtrlAddr,
                          UpdateFanLevelMessage(self.fanLevel).encode())

            self.envData.climateData = msg.climateData
        elif msg.name == "FanLevel":
            msg = parseFanLevelMessage(message)
            self.logInfo("Environment Received Fan Level : " +
                         str(msg.fanLevel))
            self.envData.fanLevel = msg.fanLevel
        elif msg.name == "LightData":
            msg = parseLightDataMessage(message)
            self.envData.lightOn = msg.lightOn
        elif msg.name == "UpdateEnvironmentData":
            msg = EnvironmentDataMessage(self.envData)
            self.send(self.webGUIAddr, msg.encode())
            self.send(self.loggingAddr, msg.encode())
        elif msg.name == "LightScheduleComplete":
            self.logInfo("LightScheduleComplete")
            self.send(self.webGUIAddr, message)
            replyMsg = LightScheduleMessage(self.lightSchedule.upcomingOn,
                                            self.lightSchedule.upcomingOff)
            self.send(self.lightCtrlAddr, replyMsg.encode())
        elif msg.name == "LightScheduleStarted":
            self.logInfo("LightScheduleStarted")
        elif msg.name == "LightSchedule":
            msg = parseLightScheduleMessage(message)
            self.lightSchedule.currentOn = msg.lightOn[0]
            self.lightSchedule.currentOff = msg.lightOff[0]
            self.lightSchedule.upcomingOn = msg.lightOn[1]
            self.lightSchedule.upcomingOff = msg.lightOff[1]
            fwMsg = LightScheduleMessage(self.lightSchedule.currentOn,
                                         self.lightSchedule.currentOff)
            self.send(self.lightCtrlAddr, fwMsg.encode())
        elif msg.name == "UpdateLight":
            self.send(self.lightCtrlAddr, message)
        elif msg.name == "UpdateFanLevel":
            msg = parseUpdateFanLevelMessage(message)
            self.fanLevel = msg.fanLevel
            self.send(self.fanCtrlAddr, message)
        elif msg.name == "TriggerClimateData":
            msg = parseTriggerClimateDataMessage(message)
            self.logInfo("Trigger climate temperature set to " +
                         str(msg.triggerTemperature))
            self.logInfo("Trigger climate humidity set to " +
                         str(msg.triggerHumidity))
            self.triggerClimateData.temperature = msg.triggerTemperature
            self.triggerClimateData.humidity = msg.triggerHumidity
        else:
            return
 def run_node(self):
     if self.env.get_f() == 0:
         return
     self.called += 1
     if (self.called % self.con.f) != 1:
         return
     round = self.env.get_round()
     if round == 0:
         pass
     elif round < self.bar:
         current_buckets = [[], []]
         msgs = self.env.get_input_msgs(self.represent_node)
         for chameleon in self.chameleon_dict.values():
             self.env.get_input_msgs(chameleon)
         for msg in msgs:
             bucket = msg.get_extraction()
             if not bucket:
                 raise RuntimeError
             b = bucket[0].belief
             if len(bucket) > len(current_buckets[b]):
                 current_buckets[b] = bucket
         l = [len(current_buckets[0]), len(current_buckets[1])]
         for i in self.good_node_list:
             for j in range(2):
                 self.node_receive_bucket_len[i][j] = max(
                     l[j], self.node_receive_bucket_len[i][j])
         for i in range(2):
             if len(current_buckets[i]) > len(self.buckets[i]):
                 self.buckets[i] = current_buckets[i]
         for i in self.good_node_list:
             if self.node_receive_bucket_len[i][
                     0] == 0 and self.node_receive_bucket_len[i][1] == 0:
                 continue
             if self.node_receive_bucket_len[i][
                     0] >= self.node_receive_bucket_len[i][1]:
                 # current belief of node i is 0
                 self.predict_node_belief[i] = 0
             else:
                 # current belief of node i is 1
                 self.predict_node_belief[i] = 1
         for i in range(2):
             for id in self.corrupt_node_list:
                 my_pow = self.pow_info[round][id][i]
                 if my_pow:
                     new_block = self.pki.sign(self.represent_node,
                                               Block(round, id, i))
                     self.buckets[i] = self.buckets[i].copy()
                     self.buckets[i].append(new_block)
                     break
         # the max len of the bucket that all honest nodes will receive in next round
         predict_bucketslen = self.bak_len
         for i in self.good_node_list:
             b = self.predict_node_belief[i]
             if self.pow_info[round][i][b]:
                 predict_bucketslen[b] = max(
                     predict_bucketslen[b],
                     self.node_receive_bucket_len[i][b] + 1)
         for i in self.good_node_list:
             self.node_receive_bucket_len[i][0] = max(
                 self.node_receive_bucket_len[i][0], predict_bucketslen[0])
             self.node_receive_bucket_len[i][1] = max(
                 self.node_receive_bucket_len[i][1], predict_bucketslen[1])
             if self.node_receive_bucket_len[i][
                     0] == 0 and self.node_receive_bucket_len[i][1] == 0:
                 continue
             if self.node_receive_bucket_len[i][
                     0] >= self.node_receive_bucket_len[i][1]:
                 self.predict_node_belief[i] = 0
             else:
                 self.predict_node_belief[i] = 1
         if round < self.bar - 1:
             for i in self.good_node_list:
                 b = self.predict_node_belief[b]
                 tosend = []
                 if b == 0 and self.pow_info[
                         round +
                         1][i][0] == 1 and self.pow_info[round +
                                                         1][i][1] == 0:
                     if len(self.buckets[1]
                            ) > self.node_receive_bucket_len[i][0]:
                         tosend = self.buckets[
                             1][:self.node_receive_bucket_len[i][0] + 1]
                 elif b == 1 and self.pow_info[
                         round +
                         1][i][1] == 1 and self.pow_info[round +
                                                         1][i][0] == 0:
                     if len(self.buckets[0]) > 0 and len(
                             self.buckets[0]
                     ) >= self.node_receive_bucket_len[i][1]:
                         tosend = self.buckets[
                             0][:self.node_receive_bucket_len[i][1]]
                 if tosend:
                     self.represent_node.env.put_packet(
                         self.represent_node,
                         self.represent_node.pki.sign(
                             self.represent_node,
                             Message(self.represent_id, tosend)), i)
                     self.node_receive_bucket_len[i][1 - b] = len(tosend)
                     self.bak_len[1 - b] = max(self.bak_len[1 - b],
                                               len(tosend))
         else:
             can0 = []
             can1 = []
             for i in self.good_node_list:
                 if (len(self.buckets[0]) > 0 and len(self.buckets[0]) >=
                         self.node_receive_bucket_len[i][1]
                     ) or self.predict_node_belief[i] == 0:
                     can0.append(i)
                 if len(self.buckets[1]) > self.node_receive_bucket_len[i][
                         0] or self.predict_node_belief[i] == 1:
                     can1.append(i)
             if can0 and can1:
                 flag = False
                 for t0 in can0:
                     for t1 in can1:
                         if t0 != t1:
                             if self.predict_node_belief[t0] == 1:
                                 self.represent_node.env.put_packet(
                                     self.represent_node,
                                     self.represent_node.pki.sign(
                                         self.represent_node,
                                         Message(self.represent_id,
                                                 self.buckets[0])), t0)
                             if self.predict_node_belief[t1] == 0:
                                 self.represent_node.env.put_packet(
                                     self.represent_node,
                                     self.represent_node.pki.sign(
                                         self.represent_node,
                                         Message(self.represent_id,
                                                 self.buckets[1])), t1)
                             flag = True
                             break
                     if flag:
                         break