# Adaptive Cooldown **Адаптивный период ожидания Montana** **Montana Protocol v1.0** **Статус:** ✅ Реализовано в Python --- ## Абстракт Adaptive Cooldown — механизм динамической защиты от Sybil-атак посредством адаптивного периода ожидания для новых узлов сети. Период ожидания вычисляется на основе сглаженной медианы регистраций за последние 56 дней (4 × τ₃). Диапазон: от 1 дня при низкой нагрузке до 180 дней при аномальном спайке. Стоимость Sybil-атаки определяется формулой: ``` Sybil_cost = cooldown × N_nodes ``` где `cooldown ∈ [1, 180]` дней, `N_nodes` — количество атакующих узлов. --- ## 1. Константы протокола **Исходный код:** [adaptive_cooldown.py:28-52](../бот/adaptive_cooldown.py#L28-L52) ```python @dataclass(frozen=True) class CooldownConstants: # Временные единицы (в τ₂ слайсах, 1 τ₂ = 10 минут) TAU2_DURATION_SEC: int = 600 # τ₂ = 10 минут TAU3_IN_TAU2: int = 2016 # τ₃ = 14 дней = 2016 τ₂ # Границы cooldown (в τ₂) COOLDOWN_MIN_TAU2: int = 144 # 1 день COOLDOWN_MID_TAU2: int = 1008 # 7 дней COOLDOWN_MAX_TAU2: int = 25920 # 180 дней # Сглаживание и rate limiting SMOOTH_WINDOWS: int = 4 # 4 × τ₃ = 56 дней MAX_CHANGE_PERCENT: int = 20 # ±20% за τ₃ # Genesis DEFAULT_COOLDOWN_TAU2: int = 144 # 1 день ``` ### 1.1 Таблица границ | Параметр | Значение τ₂ | Значение в днях | |----------|-------------|-----------------| | `COOLDOWN_MIN` | 144 | 1 | | `COOLDOWN_MID` | 1008 | 7 | | `COOLDOWN_MAX` | 25920 | 180 | ### 1.2 Преобразование единиц ``` 1 день = 144 τ₂ = 24 × 6 τ₂ = 24 часа × 6 слайсов/час 1 τ₃ = 2016 τ₂ = 14 дней ``` --- ## 2. Алгоритм вычисления cooldown ### 2.1 Основная формула **Исходный код:** [adaptive_cooldown.py:202-231](../бот/adaptive_cooldown.py#L202-L231) ```python def _calculate_raw_cooldown(self, current_count: int, median: int) -> int: ratio = current_count / median if ratio <= 1.0: # Линейная интерполяция: MIN → MID cooldown = COOLDOWN_MIN_TAU2 + ratio * (COOLDOWN_MID_TAU2 - COOLDOWN_MIN_TAU2) else: # Линейная интерполяция: MID → MAX cooldown = COOLDOWN_MID_TAU2 + (ratio - 1.0) * (COOLDOWN_MAX_TAU2 - COOLDOWN_MID_TAU2) return int(max(COOLDOWN_MIN_TAU2, min(COOLDOWN_MAX_TAU2, cooldown))) ``` ### 2.2 Математическая формулировка Пусть: - `r = current_count / smoothed_median` — коэффициент нагрузки - `C_min = 1` день, `C_mid = 7` дней, `C_max = 180` дней Тогда cooldown `C(r)` определяется кусочно-линейной функцией: ``` ⎧ C_min + r × (C_mid - C_min), если r ≤ 1 C(r) = ⎨ ⎩ C_mid + (r - 1) × (C_max - C_mid), если r > 1 ``` ### 2.3 Таблица значений | Коэффициент r | Cooldown (дней) | |---------------|-----------------| | 0.0 | 1 | | 0.5 | 4 | | 1.0 | 7 | | 1.5 | 93.5 | | 2.0 | 180 | --- ## 3. Сглаживание медианы ### 3.1 Алгоритм **Исходный код:** [adaptive_cooldown.py:170-200](../бот/adaptive_cooldown.py#L170-L200) ```python def _compute_smoothed_median(self, current_tau3: int, tier: int) -> int: """Вычислить сглаженную медиану за 4 τ₃ (56 дней)""" medians = [] for i in range(SMOOTH_WINDOWS): # SMOOTH_WINDOWS = 4 tau3_idx = current_tau3 - i if tau3_idx < 0: continue key = (tau3_idx, tier) if key in self._median_history: medians.append(self._median_history[key]) else: count = self.get_registrations_count(tau3_idx, tier) if count > 0: medians.append(count) if not medians: return 1 return max(1, int(statistics.mean(medians))) ``` ### 3.2 Цель сглаживания Скользящее среднее за 4 × τ₃ (56 дней) предотвращает манипуляцию cooldown через краткосрочные спайки регистраций. --- ## 4. Rate Limiting ### 4.1 Механизм **Исходный код:** [adaptive_cooldown.py:233-249](../бот/adaptive_cooldown.py#L233-L249) ```python def _apply_rate_limit(self, raw_cooldown: int, previous_cooldown: int) -> int: """Ограничить изменение cooldown до ±20% за τ₃""" max_change = (previous_cooldown * MAX_CHANGE_PERCENT) // 100 if raw_cooldown > previous_cooldown: return min(raw_cooldown, previous_cooldown + max_change) else: return max(raw_cooldown, previous_cooldown - max_change) ``` ### 4.2 Пример При `previous_cooldown = 144 τ₂` (1 день): - Максимальное увеличение: `144 + 144 × 0.20 = 172.8 ≈ 172 τ₂` - Максимальное уменьшение: `144 - 144 × 0.20 = 115.2 ≈ 115 τ₂` --- ## 5. Обработка завершения τ₃ **Исходный код:** [adaptive_cooldown.py:251-281](../бот/adaptive_cooldown.py#L251-L281) ```python def on_tau3_end(self, tau3_index: int): """Пересчёт cooldown при завершении τ₃""" for tier in range(1, 5): # 1. Получить текущее количество регистраций current_count = self.get_registrations_count(tau3_index, tier) # 2. Сохранить в историю медиан self._median_history[(tau3_index, tier)] = max(1, current_count) # 3. Вычислить сглаженную медиану smoothed_median = self._compute_smoothed_median(tau3_index, tier) # 4. Рассчитать raw cooldown raw_cooldown = self._calculate_raw_cooldown(current_count, smoothed_median) # 5. Применить rate limit previous = self._current_cooldown.get(tier, DEFAULT_COOLDOWN_TAU2) new_cooldown = self._apply_rate_limit(raw_cooldown, previous) # 6. Сохранить новый cooldown self._current_cooldown[tier] = new_cooldown ``` --- ## 6. API ### 6.1 Регистрация узла ```python from adaptive_cooldown import get_adaptive_cooldown cooldown = get_adaptive_cooldown() cd_tau2 = cooldown.register_node("mta46b633d...", tier=1) print(f"Cooldown: {cd_tau2 // 144} дней") ``` ### 6.2 Проверка статуса ```python # Находится ли узел в cooldown? in_cooldown = cooldown.is_in_cooldown(registration_tau2=100, tier=1) # Оставшийся cooldown remaining = cooldown.cooldown_remaining(registration_tau2=100, tier=1) ``` ### 6.3 Статистика ```python stats = cooldown.get_stats() # { # "current_tau2": 2016, # "cooldowns": {"tier_1": {"tau2": 172, "days": 1.19}, ...}, # "constants": {"min_days": 1, "max_days": 180, ...} # } ``` --- ## 7. Защита от атак | Вектор атаки | Механизм защиты | Эффективность | |--------------|-----------------|---------------| | Spike manipulation | 56-дневное сглаживание | Высокая | | Fast pump | ±20% rate limit за τ₃ | Высокая | | Sybil (низкая нагрузка) | Минимум 1 день | Гарантировано | | Sybil (спайк) | До 180 дней | Линейный рост стоимости | ### 7.1 Стоимость Sybil-атаки Для создания N фальшивых узлов атакующий должен потратить: ``` T_total = Σ cooldown_i для i = 1..N ``` При стабильной нагрузке `cooldown ≈ 7 дней`: - 10 узлов: 70 дней - 100 узлов: 700 дней (≈ 2 года) - 1000 узлов: 7000 дней (≈ 19 лет) --- ## 8. Реализация | Компонент | Файл | Статус | |-----------|------|--------| | AdaptiveCooldown | [adaptive_cooldown.py](../бот/adaptive_cooldown.py) | ✅ Работает | | CooldownConstants | [adaptive_cooldown.py:28-52](../бот/adaptive_cooldown.py#L28-L52) | ✅ Работает | | Smoothed median | [adaptive_cooldown.py:170-200](../бот/adaptive_cooldown.py#L170-L200) | ✅ Работает | | Rate limiting | [adaptive_cooldown.py:233-249](../бот/adaptive_cooldown.py#L233-L249) | ✅ Работает | --- ## 9. Тестирование ```bash # Запуск тестов python adaptive_cooldown.py test # Симуляция нагрузки python adaptive_cooldown.py simulate # Статистика python adaptive_cooldown.py stats ``` --- ``` Alejandro Montana Montana Protocol v1.0 Январь 2026 ```