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

9.2 KiB
Raw Blame 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

@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

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

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

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

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 Регистрация узла

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 Проверка статуса

# Находится ли узел в cooldown?
in_cooldown = cooldown.is_in_cooldown(registration_tau2=100, tier=1)

# Оставшийся cooldown
remaining = cooldown.cooldown_remaining(registration_tau2=100, tier=1)

6.3 Статистика

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 Работает
CooldownConstants adaptive_cooldown.py:28-52 Работает
Smoothed median adaptive_cooldown.py:170-200 Работает
Rate limiting adaptive_cooldown.py:233-249 Работает

9. Тестирование

# Запуск тестов
python adaptive_cooldown.py test

# Симуляция нагрузки
python adaptive_cooldown.py simulate

# Статистика
python adaptive_cooldown.py stats

Alejandro Montana
Montana Protocol v1.0
Январь 2026