Source code for bittensor.core.chain_data.ip_info
from dataclasses import dataclass
from typing import Optional, Any, Union
from bittensor.core.chain_data.utils import from_scale_encoding, ChainDataType
from bittensor.utils import networking as net
from bittensor.utils.registration import torch, use_torch
[docs]
@dataclass
class IPInfo:
"""
Dataclass representing IP information.
Attributes:
ip (str): The IP address as a string.
ip_type (int): The type of the IP address (e.g., IPv4, IPv6).
protocol (int): The protocol associated with the IP (e.g., TCP, UDP).
"""
ip: str
ip_type: int
protocol: int
[docs]
def encode(self) -> dict[str, Any]:
"""Returns a dictionary of the IPInfo object that can be encoded."""
return {
"ip": net.ip_to_int(
self.ip
), # IP type and protocol are encoded together as a u8
"ip_type_and_protocol": ((self.ip_type << 4) + self.protocol) & 0xFF,
}
[docs]
@classmethod
def from_vec_u8(cls, vec_u8: list[int]) -> Optional["IPInfo"]:
"""Returns a IPInfo object from a ``vec_u8``."""
if len(vec_u8) == 0:
return None
decoded = from_scale_encoding(vec_u8, ChainDataType.IPInfo)
if decoded is None:
return None
return IPInfo.fix_decoded_values(decoded)
[docs]
@classmethod
def list_from_vec_u8(cls, vec_u8: list[int]) -> list["IPInfo"]:
"""Returns a list of IPInfo objects from a ``vec_u8``."""
decoded = from_scale_encoding(vec_u8, ChainDataType.IPInfo, is_vec=True)
if decoded is None:
return []
return [IPInfo.fix_decoded_values(d) for d in decoded]
[docs]
@classmethod
def fix_decoded_values(cls, decoded: dict) -> "IPInfo":
"""Returns a SubnetInfo object from a decoded IPInfo dictionary."""
return IPInfo(
ip=net.int_to_ip(decoded["ip"]),
ip_type=decoded["ip_type_and_protocol"] >> 4,
protocol=decoded["ip_type_and_protocol"] & 0xF,
)
[docs]
def to_parameter_dict(
self,
) -> Union[dict[str, Union[str, int]], "torch.nn.ParameterDict"]:
"""Returns a torch tensor or dict of the subnet IP info."""
if use_torch():
return torch.nn.ParameterDict(self.__dict__)
else:
return self.__dict__
[docs]
@classmethod
def from_parameter_dict(
cls, parameter_dict: Union[dict[str, Any], "torch.nn.ParameterDict"]
) -> "IPInfo":
"""Creates a IPInfo instance from a parameter dictionary."""
if use_torch():
return cls(**dict(parameter_dict))
else:
return cls(**parameter_dict)