def highest_td_peer(self) -> BaseChainPeer: peers = tuple(self.connected_nodes.values()) if not peers: raise NoConnectedPeers() peers_by_td = groupby(operator.attrgetter('head_td'), peers) max_td = max(peers_by_td.keys()) return random.choice(peers_by_td[max_td])
def _request_block_parts( self, headers: List[BlockHeader], request_func: Callable[[ETHPeer, List[BlockHeader]], None]) -> int: if not self.peer_pool.peers: raise NoConnectedPeers() length = math.ceil(len(headers) / len(self.peer_pool.peers)) batches = list(partition_all(length, headers)) for peer, batch in zip(self.peer_pool.peers, batches): request_func(cast(ETHPeer, peer), batch) return len(batches)
def highest_td_peer(self) -> BaseChainPeer: peers = tuple(self.connected_nodes.values()) if not peers: raise NoConnectedPeers("No connected peers") td_getter = excepts(UnknownAPI, operator.attrgetter('head_info.head_td'), lambda _: 0) peers_by_td = groupby(td_getter, peers) max_td = max(peers_by_td.keys()) return random.choice(peers_by_td[max_td])
def highest_td_peer(self) -> BasePeer: if not self.connected_nodes: raise NoConnectedPeers() peers_by_td = groupby(operator.attrgetter('head_td'), self.peers) max_td = max(peers_by_td.keys()) return random.choice(peers_by_td[max_td])
def get_peers(self, min_td: int) -> List[BasePeer]: if not self.connected_nodes: raise NoConnectedPeers() return [peer for peer in self.peers if peer.head_td >= min_td]