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)
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)
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)
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
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))
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
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)
def start(self): msg = Message(self.id, None, "Hello", {"content" : "Hello world!"}, 0) self.send(msg)