montana/Русский/Технологии/004_АДАПТИВНОЕ_ОХЛАЖДЕНИЕ.md

290 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```