Skip to content

Commit 001c183

Browse files
committed
add migration to set ip and hotkey on miner
1 parent d24e972 commit 001c183

15 files changed

Lines changed: 99 additions & 113 deletions

File tree

subvortex/core/metagraph/database.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import bittensor.utils.btlogging as btul
55

66
import subvortex.core.model.neuron.neuron as scmm
7-
from subvortex.core.database.database_utils import decode_hash, decode_value
7+
from subvortex.core.database.database_utils import decode_value
88
from subvortex.core.database.database import Database as BaseDatabase
99
from subvortex.core.model.neuron import (
1010
Neuron,
1111
NeuronModel210,
12+
NeuronModel211,
1213
)
1314

1415

@@ -27,7 +28,7 @@ class NeuronReadOnlyDatabase(BaseDatabase):
2728

2829
def setup_neuron_models(self):
2930
# Register neuron models keyed by their version
30-
self.models["neuron"] = {x.version: x for x in [NeuronModel210()]}
31+
self.models["neuron"] = {x.version: x for x in [NeuronModel210(), NeuronModel211()]}
3132

3233
async def get_neuron(self, hotkey: str) -> scmm.Neuron:
3334
# Ensure the connection is up and running
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from .neuron import Neuron
22
from .model_neuron_210 import NeuronModel as NeuronModel210
3+
from .model_neuron_211 import NeuronModel as NeuronModel211
34

45
__all__ = [
56
"Neuron",
6-
"NeuronModel210"
7+
"NeuronModel210",
8+
"NeuronModel211"
79
]

subvortex/core/model/neuron/model_neuron_210.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
from redis import asyncio as Redis
2-
from traceback import print_exception
3-
4-
import bittensor.utils.btlogging as btul
52

63
from subvortex.core.model.neuron import Neuron
74
from subvortex.core.database.database_utils import decode_hash
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from subvortex.core.model.neuron import NeuronModel210
2+
3+
4+
class NeuronModel(NeuronModel210):
5+
"""
6+
Versioned model for storing and retrieving hotkey neuron from Redis.
7+
This is version 2.1.1 of the model.
8+
"""
9+
10+
version = "2.1.1"

subvortex/validator/neuron/src/database.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
from subvortex.validator.neuron.src.models.selection import (
99
SelectionModel200,
1010
SelectionModel210,
11+
SelectionModel211,
1112
)
1213
from subvortex.validator.neuron.src.models.miner import (
1314
Miner,
1415
MinerModel210,
16+
MinerModel211,
1517
)
1618

1719

@@ -35,9 +37,12 @@ def __init__(self, settings):
3537

3638
self.setup_neuron_models()
3739
self.models["selection"] = {
38-
x.version: x for x in [SelectionModel200(), SelectionModel210()]
40+
x.version: x
41+
for x in [SelectionModel200(), SelectionModel210(), SelectionModel211()]
42+
}
43+
self.models["miner"] = {
44+
x.version: x for x in [MinerModel210(), MinerModel211()]
3945
}
40-
self.models["miner"] = {x.version: x for x in [MinerModel210()]}
4146

4247
async def get_selected_miners(self, ss58_address: str):
4348
"""

subvortex/validator/neuron/src/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
)
5959
from subvortex.validator.neuron.src.settings import Settings
6060
from subvortex.validator.neuron.src.database import Database
61-
from subvortex.validator.neuron.src.miner import get_miners, sync_miners
61+
from subvortex.validator.neuron.src.miner import sync_miners
6262
from subvortex.validator.neuron.src.weights import (
6363
should_set_weights,
6464
reset_scores_for_not_serving_miners,
@@ -208,7 +208,7 @@ async def run(self):
208208
init_wandb(self)
209209

210210
# Init miners
211-
self.miners = await get_miners(database=self.database)
211+
self.miners = (await self.database.get_miners()).values()
212212
btul.logging.debug(f"Miners loaded {len(self.miners)}")
213213

214214
# Load the state

subvortex/validator/neuron/src/miner.py

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,6 @@
1515
from subvortex.validator.neuron.src.database import Database
1616

1717

18-
async def get_miners(database: Database) -> List[Miner]:
19-
miners: List[Miner] = []
20-
21-
# Get the list of neuron
22-
neurons = await database.get_neurons()
23-
if not neurons:
24-
return []
25-
26-
for hotkey, neuron in neurons.items():
27-
# Get the miner
28-
miner = await database.get_miner(hotkey=hotkey)
29-
if not miner:
30-
# Miner does not exist in the database
31-
32-
# Create an instance of miner
33-
miner = Miner.create_new_miner(
34-
uid=neuron.uid,
35-
)
36-
37-
# Add the new miner
38-
await database.add_miner(miner)
39-
40-
# Set the property that comes from neuron
41-
miner.ip = neuron.ip
42-
miner.port = neuron.port
43-
miner.coldkey = neuron.coldkey
44-
miner.hotkey = neuron.hotkey
45-
miner.country = neuron.country
46-
miner.axon_version = neuron.version
47-
miner.ip_type = neuron.ip_type
48-
miner.protocol = neuron.protocol
49-
miner.placeholder1 = neuron.placeholder1
50-
miner.placeholder2 = neuron.placeholder2
51-
52-
# Add the new miner to the list
53-
miners.append(miner)
54-
55-
return miners
56-
57-
5818
async def sync_miners(
5919
database: Database,
6020
neurons: Dict[str, Neuron],
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from .miner import Miner
22
from .model_miner_210 import MinerModel as MinerModel210
3+
from .model_miner_211 import MinerModel as MinerModel211
34

4-
__all__ = [
5-
"Miner",
6-
"MinerModel210"
7-
]
5+
__all__ = ["Miner", "MinerModel210", "MinerModel211"]

subvortex/validator/neuron/src/models/miner/miner.py

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,11 @@ def create_new_miner(uid: int):
5959
)
6060

6161
@classmethod
62-
def from_dict(cls, data: Dict[str, Any]) -> "Miner":
63-
return cls(
64-
uid=int(data.get("uid", -1)),
65-
country=data.get("country", None),
66-
version=data.get("version", "0.0.0"),
67-
verified=bool(int(data.get("verified", 0))),
68-
score=float(data.get("score", 0)),
69-
availability_score=float(data.get("availability_score", 0)),
70-
latency_score=float(data.get("latency_score", 0)),
71-
reliability_score=float(data.get("reliability_score", 0)),
72-
distribution_score=float(data.get("distribution_score", 0)),
73-
challenge_successes=int(data.get("challenge_successes", 0)),
74-
challenge_attempts=int(data.get("challenge_attempts", 0)),
75-
process_time=float(data.get("process_time", 0)),
76-
)
77-
78-
def to_redis_mapping(self) -> Dict[str, str]:
62+
def to_dict(self) -> Dict[str, str]:
7963
return {
8064
"uid": self.uid,
65+
"hotkey": self.hotkey,
66+
"ip": self.ip or "0.0.0.0",
8167
"country": self.country or "",
8268
"version": self.version,
8369
"verified": int(self.verified),
@@ -91,10 +77,12 @@ def to_redis_mapping(self) -> Dict[str, str]:
9177
"process_time": self.process_time,
9278
}
9379

94-
@classmethod
95-
def from_redis_mapping(cls, data: Dict[str, str]) -> "Miner":
96-
return cls(
80+
@staticmethod
81+
def from_dict(data: Dict[str, str]) -> "Miner":
82+
return Miner(
9783
uid=int(data.get("uid", -1)),
84+
hotkey=data.get("hotkey", None),
85+
ip=data.get("ip", "0.0.0.0"),
9886
country=data.get("country", None),
9987
version=data.get("version", "0.0.0"),
10088
verified=bool(int(data.get("verified", 0))),

subvortex/validator/neuron/src/models/miner/model_miner_210.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ async def read(self, redis: Redis, ss58_address: str) -> Miner | None:
2626
raw = await redis.hgetall(key)
2727
if not raw:
2828
return None
29-
29+
3030
data = decode_hash(raw)
31-
return Miner.from_redis_mapping(data)
31+
return Miner.from_dict(data)
3232

3333
async def read_all(self, redis: Redis) -> dict[str, Miner]:
3434
"""
@@ -46,7 +46,7 @@ async def read_all(self, redis: Redis) -> dict[str, Miner]:
4646
continue
4747

4848
data = decode_hash(raw)
49-
miners[ss58_address] = Miner.from_redis_mapping(data)
49+
miners[ss58_address] = Miner.from_dict(data)
5050

5151
return miners
5252

@@ -57,7 +57,7 @@ async def write(self, redis: Redis, miner: Miner):
5757
Converts all values to string before storing.
5858
"""
5959
key = self._key(miner.hotkey)
60-
data = Miner.to_redis_mapping(miner)
60+
data = Miner.to_dict(miner)
6161
await redis.hset(key, mapping=data)
6262

6363
async def write_all(self, redis: Redis, miners: list[Miner]):
@@ -68,7 +68,7 @@ async def write_all(self, redis: Redis, miners: list[Miner]):
6868

6969
for miner in miners:
7070
key = self._key(miner.hotkey)
71-
data = Miner.to_redis_mapping(miner)
71+
data = Miner.to_dict(miner)
7272
pipe.hset(key, mapping=data)
7373

7474
await pipe.execute()

0 commit comments

Comments
 (0)