Esempio n. 1
0
    def pre_prepare_recv(self, msg, time):
        ## Check if seq_num is used for another msg
        pass

        ## Check if in same view
        if msg.data[0][1] != self.view_num:
            return

        ## Check h < seq_num < H
        pass

        ## Check if signatures in msg are correct
        pass

        ## Send signed <PREPARE, v, n, d, i>
        ## v(view_num), n(seq_num), d(digest of m), i(replica id)
        data = ("PREPARE", self.view_num, msg.data[0][2], msg.data[0][3], \
             self.id)
        new_msg = Message(self.id, None, "PREPARE", data, 20)
        self.send(new_msg)

        ## Append to log
        self.log.append(msg.data[0])
        self.log.append(msg.data[1])
        self.prepare_recv(new_msg, time)
Esempio n. 2
0
 def _broadcast_identities(self):
     for shard_id, shard_members in self.shards.items():
         msg = Message(self.id, None, "SHARD_MEMBERS", (shard_id, \
             shard_members), self._SHARD_MEMBERS_SIZE)
         for member in shard_members:
             new_msg = deepcopy(msg)
             new_msg.receiver = member
             self.send(new_msg)
    def start(self):
        msg = Message(self.id, None, "FIRST-ROUND-CONSENSUS", None, 1)

        shard_id = int(self.id / (self.k * self.c))
        self.logger.info(f"Shard id is {shard_id} for Node {self.id}")
        for i in range(self.c):
            new_msg = deepcopy(msg)
            new_msg.receiver = shard_id * self.k * self.c + i
            self.send(new_msg)
    def recv_microblock(self, msg):
        self.received_microblocks.append(msg)
        if len(self.received_microblocks) > 2 * self.k * self.c / 3:
            self.logger.info(f"Received enough microblocks by Node {self.id}.")
            self.first_finished = True

            block = Message(self.id, None, "SECOND-ROUND-CONSENSUS", None, 1)
            for i in range(self.c):
                new_msg = deepcopy(block)
                new_msg.receiver = i
                self.send(new_msg)
Esempio n. 5
0
 def pow_done(self):
     self.logger.debug(f'Node {self.id} POW calculated.')
     msg = Message(self.id, None, "POW", (sha256(self.id)), 32)
     if len(self.dir_nodes) < self.c:
         self.logger.debug(f'Node {self.id} running as directory.')
         self.state = RUN_AS_DIRECTORY
         self.send(msg)
     else:
         self.state = FORMED_IDENTITY
         for node_id in self.dir_nodes:
             new_msg = deepcopy(msg)
             new_msg.receiver = node_id
             self.send(new_msg)
Esempio n. 6
0
    def req_send(self, time):
        # signed <REQUEST, o, t, c> : o(operation), t(timestmap), c(client)
        data = ("REQUEST", 0, time, self.client_id)
        req = Message(self.id, 0, "REQUEST", data, 16, time)
        self.send(req)

        ## wait for next time
        t = time + numpy.floor(
            numpy.random.exponential(self.mean_wait_time, 1)[0])
        self.setTimeout(t, self.req_send, args={'time': t})

        ## Increase client_id to have unique messages
        self.client_id = self.client_id + 1
Esempio n. 7
0
    def commit_recv(self, msg, time):
        ## Check Signature, view_num, seq_num
        pass

        ## Append to log
        self.log.append(msg.data)

        ## check if msg is commited-local
        if self.commited_local(msg.data[1], msg.data[2], msg.data[3]) and \
            (msg.data[2], 'commited') not in self.log:

            self.log.append((msg.data[2], 'commited'))

            ## Send reply to client
            client_msg = self.get_client_msg(msg.data[3])
            data = ("REPLY", msg.data[1], client_msg[2], client_msg[3],
                    self.id, 0)
            self.send(Message(self.id, self.N, "REPLY", data, 21, time))
Esempio n. 8
0
    def req_recv(self, msg, time):
        if self.is_primary():
            ## Pre-Prepare <signed <PRE-PREPARE, v, n, d>, m>
            ## v(view num), d(digest of m), n(seq num), m(message)
            data = (("PRE_PREPARE", self.view_num, self.seq_num, \
                hash(msg.data))
                    , msg.data)
            new_msg = Message(self.id, None, "PRE_PREPARE", data, 30)
            self.send(new_msg)
            self.logger.debug(f"msg {msg.data[3]} is started.")

            ## Append to log
            self.log.append(msg.data)
            self.log.append(data[0])

            ## Increase seq num
            self.seq_num = self.seq_num + 1

        else:
            ## Send to primary replica
            pass
Esempio n. 9
0
    def prepare_recv(self, msg, time):
        ## Check Signature, view_num, seq_num
        pass

        ## Append to log
        self.log.append(msg.data)

        ## Check if msg is prepared
        if self.prepared(msg.data[1], msg.data[2], msg.data[3]) and \
            (msg.data[2], 'prepared') not in self.log:

            self.log.append((msg.data[2], 'prepared'))

            ## send signed <COMMIT, v, n, d, i>
            data = ("COMMIT", msg.data[1], msg.data[2], msg.data[3], self.id)

            if data in self.log:
                ## we send it before
                return
            else:
                new_msg = Message(self.id, None, "COMMIT", data, 20)
                self.send(new_msg)
                self.commit_recv(new_msg, time)
Esempio n. 10
0
 def start(self):
     msg = Message(self.id, None, "Hello", {"content" : "Hello world!"}, 0)
     self.send(msg)