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

290 lines
9.2 KiB
Markdown
Raw Permalink Normal View History

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