diff --git a/bittensor/__init__.py b/bittensor/__init__.py index d1a06b1e64..3947d2be24 100644 --- a/bittensor/__init__.py +++ b/bittensor/__init__.py @@ -78,7 +78,7 @@ def turn_console_off(): # Needs to use wss:// __bellagene_entrypoint__ = "wss://parachain.opentensor.ai:443" -__local_entrypoint__ = "ws://127.0.0.1:9945" +__local_entrypoint__ = "ws://127.0.0.1:9944" __tao_symbol__: str = chr(0x03C4) diff --git a/bittensor/_cli/commands/delegates.py b/bittensor/_cli/commands/delegates.py index 18ea1cd8f7..37b8a63f63 100644 --- a/bittensor/_cli/commands/delegates.py +++ b/bittensor/_cli/commands/delegates.py @@ -16,6 +16,7 @@ # DEALINGS IN THE SOFTWARE. import sys +import os import json import argparse import bittensor @@ -46,7 +47,17 @@ def show_delegates( delegates: List['bittensor.DelegateInfo'], width: Optional[i """ Pretty prints a table of delegates sorted by total stake. """ delegates.sort(key=lambda delegate: delegate.total_stake, reverse=True) - registered_delegate_info = json.load( open("delegates.json") ) + try: + package_dir = os.path.dirname(bittensor.__file__) + root_dir = os.path.dirname(package_dir) + filename = os.path.join(root_dir, 'delegates.json') + if os.path.exists(filename): + registered_delegate_info = json.load( open(filename, 'r') ) + else: + registered_delegate_info = {} + except: + registered_delegate_info = {} + table = Table(show_footer=True, width=width, pad_edge=False, box=None, expand=True) table.add_column("[overline white]INDEX", str(len(delegates)), footer_style = "overline white", style='bold white') table.add_column("[overline white]OWNER", style='rgb(50,163,219)', no_wrap=True, justify='left') @@ -406,7 +417,13 @@ def run( cli ): delegates.sort(key=lambda delegate: delegate[0].total_stake, reverse=True) try: - registered_delegate_info = json.load( open("delegates.json") ) + package_dir = os.path.dirname(bittensor.__file__) + root_dir = os.path.dirname(package_dir) + filename = os.path.join(root_dir, 'delegates.json') + if os.path.exists(filename): + registered_delegate_info = json.load( open(filename, 'r') ) + else: + registered_delegate_info = {} except: registered_delegate_info = {} diff --git a/bittensor/_metagraph/__init__.py b/bittensor/_metagraph/__init__.py index 3b0d9fd244..9f8bbd6a8d 100644 --- a/bittensor/_metagraph/__init__.py +++ b/bittensor/_metagraph/__init__.py @@ -24,7 +24,7 @@ import bittensor from . import metagraph_impl from . import metagraph_mock -from typing import Optional, List +from typing import Optional, List, Union import bittensor.utils.weight_utils as weight_utils from .naka_metagraph_impl import Metagraph as naka_metagraph @@ -77,11 +77,11 @@ def __new__( if network == None: network = config.subtensor.get('network', bittensor.defaults.subtensor.network) - if network =='finney': - return metagraph_impl.Metagraph( network = network, netuid = netuid ) - elif network =='nakamoto': + if network =='nakamoto': config.subtensor.network = 'nakamoto' return naka_metagraph(config = config, subtensor = subtensor) + else: + return metagraph_impl.Metagraph( network = network, netuid = netuid ) @classmethod def config(cls) -> 'bittensor.Config': @@ -123,7 +123,7 @@ def check_config( cls, config: 'bittensor.Config' ): pass @staticmethod - def from_neurons( network: str, netuid: int, info: 'bittensor.SubnetInfo', neurons: List['bittensor.NeuronInfo'], block: int ) -> 'bittensor.Metagraph': + def from_neurons( network: str, netuid: int, info: 'bittensor.SubnetInfo', neurons: Union[List['bittensor.NeuronInfo'], List['bittensor.NeuronInfoLite']], block: int ) -> 'bittensor.Metagraph': r""" Creates a metagraph from a list of neurons. Args: network: (:obj:`str`, required): @@ -179,6 +179,9 @@ def from_neurons( network: str, netuid: int, info: 'bittensor.SubnetInfo', neuro endpoint = bittensor.endpoint.from_neuron(n) metagraph._endpoint_objs[n.uid] = endpoint endpoints[n.uid] = endpoint.to_tensor().tolist() + if isinstance(n, bittensor.NeuronInfoLite): + continue + # Weights and bonds only for full neurons. if len(n.weights) > 0: w_uids, w_weights = zip(*n.weights) weights[n.uid] = weight_utils.convert_weight_uids_and_vals_to_tensor( n_total, w_uids, w_weights ).tolist() diff --git a/bittensor/_metagraph/metagraph_impl.py b/bittensor/_metagraph/metagraph_impl.py index 5b5e2ab4f6..5496a0d5b0 100644 --- a/bittensor/_metagraph/metagraph_impl.py +++ b/bittensor/_metagraph/metagraph_impl.py @@ -342,7 +342,7 @@ def load_from_state_dict(self, state_dict: dict ) -> 'Metagraph': self.info = bittensor.SubnetInfo.from_parameter_dict( state_dict['info'] ) if 'info' in state_dict else None return self - def sync ( self, netuid: Optional[int] = None, subtensor: 'bittensor.Subtensor' = None, block: Optional[int] = None ) -> 'Metagraph': + def sync ( self, netuid: Optional[int] = None, subtensor: 'bittensor.Subtensor' = None, block: Optional[int] = None, lite: bool = True ) -> 'Metagraph': r""" Synchronizes this metagraph with the chain state. Args: subtensor: (:obj:`bittensor.Subtensor`, optional, defaults to None): @@ -353,6 +353,9 @@ def sync ( self, netuid: Optional[int] = None, subtensor: 'bittensor.Subtensor' Defaults to the netuid of the metagraph object. block: (:obj:`int`, optional, defaults to None): block to sync with. If None, syncs with the current block. + lite: (:obj:`bool`, defaults to True): + If true, syncs using the lite version of the metagraph. + Note: lite version does not include weights, bonds Returns: self: (:obj:`Metagraph`, required): Returns self. @@ -365,7 +368,7 @@ def sync ( self, netuid: Optional[int] = None, subtensor: 'bittensor.Subtensor' if netuid == None: raise ValueError('Metagraph.sync() requires a netuid to sync with.') # Pull metagraph from chain using subtensor. - metagraph = subtensor.metagraph( netuid = netuid, block = block ) + metagraph = subtensor.metagraph( netuid = netuid, block = block, lite = lite ) # Update self with new values. self.__dict__.update(metagraph.__dict__) return self diff --git a/bittensor/_subtensor/subtensor_impl.py b/bittensor/_subtensor/subtensor_impl.py index 62618e1418..e8c413c3d2 100644 --- a/bittensor/_subtensor/subtensor_impl.py +++ b/bittensor/_subtensor/subtensor_impl.py @@ -621,7 +621,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="subnetInfo_getSubnetsInfo", # custom rpc method params=params @@ -642,7 +642,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [netuid] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="subnetInfo_getSubnetInfo", # custom rpc method params=params @@ -679,7 +679,7 @@ def make_substrate_call_with_retry(encoded_hotkey: List[int]): block_hash = None if block == None else substrate.get_block_hash( block ) params = [encoded_hotkey] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="delegateInfo_getDelegate", # custom rpc method params=params @@ -702,7 +702,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="delegateInfo_getDelegates", # custom rpc method params=params @@ -724,7 +724,7 @@ def make_substrate_call_with_retry(encoded_coldkey: List[int]): block_hash = None if block == None else substrate.get_block_hash( block ) params = [encoded_coldkey] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="delegateInfo_getDelegated", # custom rpc method params=params @@ -802,7 +802,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [netuid, uid] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="neuronInfo_getNeuron", # custom rpc method params=params @@ -832,7 +832,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [netuid] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="neuronInfo_getNeurons", # custom rpc method params=params @@ -866,7 +866,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [netuid, uid] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="neuronInfo_getNeuronLite", # custom rpc method params=params @@ -896,7 +896,7 @@ def make_substrate_call_with_retry(): block_hash = None if block == None else substrate.get_block_hash( block ) params = [netuid] if block_hash: - params = [block_hash] + params + params = params + [block_hash] return substrate.rpc_request( method="neuronInfo_getNeuronsLite", # custom rpc method params=params @@ -910,7 +910,7 @@ def make_substrate_call_with_retry(): return NeuronInfoLite.list_from_vec_u8( result ) - def metagraph( self, netuid: int, block: Optional[int] = None ) -> 'bittensor.Metagraph': + def metagraph( self, netuid: int, block: Optional[int] = None, lite: bool = True ) -> 'bittensor.Metagraph': r""" Returns the metagraph for the subnet. Args: netuid ( int ): @@ -918,6 +918,8 @@ def metagraph( self, netuid: int, block: Optional[int] = None ) -> 'bittensor.Me block (Optional[int]): The block to create the metagraph for. Defaults to latest. + lite (bool, default=True): + If true, returns a metagraph using the lite sync (no weights, no bonds) Returns: metagraph ( `bittensor.Metagraph` ): The metagraph for the subnet at the block. @@ -928,7 +930,11 @@ def metagraph( self, netuid: int, block: Optional[int] = None ) -> 'bittensor.Me status.start() # Get neurons. - neurons = self.neurons( netuid = netuid, block = block ) + if lite: + neurons = self.neurons_lite( netuid = netuid, block = block ) + else: + neurons = self.neurons( netuid = netuid, block = block ) + # Get subnet info. subnet_info: Optional[bittensor.SubnetInfo] = self.get_subnet_info( netuid = netuid, block = block ) if subnet_info == None: @@ -939,7 +945,7 @@ def metagraph( self, netuid: int, block: Optional[int] = None ) -> 'bittensor.Me # Create metagraph. block_number = self.block - + metagraph = bittensor.metagraph.from_neurons( network = self.network, netuid = netuid, info = subnet_info, neurons = neurons, block = block_number ) print("Metagraph subtensor: ", self.network) return metagraph diff --git a/requirements/prod.txt b/requirements/prod.txt index 88bedfb26a..6bdfb67e1a 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -31,7 +31,7 @@ pyyaml==6.0 rich==12.5.1 retry==0.9.2 requests==2.25.0 -scalecodec>=1.2,<1.3 +scalecodec==1.2.0 sentencepiece==0.1.97 termcolor==2.1.1 torch==1.13.1 @@ -43,4 +43,5 @@ qqdm==0.0.7 wandb>=0.11.1,<0.13.4 ansible_vault>=2.1 substrate-interface==1.5.0 +jsonschema[format-nongpl]>=4.14.0,<=4.17.0 markupsafe==2.0.1