# Atemporal Coordinate Presence (ACP) **Presence-Based Consensus Protocol** **Montana Protocol v1.0** **Статус:** ✅ Реализовано в Python --- ## Абстракт ACP — консенсус-механизм, где доказательство основано на **присутствии во времени**. Время нельзя ускорить, купить или накопить заранее. 14 дней требуют 14 дней — для всех одинаково. Эмиссия уменьшается вдвое каждые τ₄ (4 года). **Ключевая формула:** ``` 1 секунда присутствия = 1 Ɉ × halving_coefficient ``` --- ## 1. Константы протокола **Исходный код:** [time_bank.py:44-80](../бот/time_bank.py#L44-L80) ```python class Protocol: """Константы протокола TIME_BANK v3.0""" VERSION = "3.0" # Сеть NODES_COUNT = 5 # 5 узлов Montana BANK_PRESENCE_PER_T2 = 600 # Банк присутствует 600 сек (10 мин) # TIME_BANK Reserve BANK_TOTAL_MINUTES = 21_000_000 # Резерв банка: 21 млн минут (~40 лет) # Временные координаты (Temporal Coordinates) TAU1_INTERVAL_SEC = 60 # τ₁ = 1 минута — интервал подписи T2_DURATION_SEC = 10 * 60 # τ₂ = 10 минут = 600 секунд (slice) TAU3_DURATION_SEC = 14 * 24 * 60 * 60 # τ₃ = 14 дней = 1,209,600 сек TAU4_DURATION_SEC = 4 * 365 * 24 * 60 * 60 # τ₄ = 4 года (эпоха халвинга) # Иерархия T2_PER_TAU3 = 2016 # 2016 × τ₂ в τ₃ TAU3_PER_YEAR = 26 # 26 × τ₃ в году TAU3_PER_TAU4 = 104 # 104 × τ₃ в τ₄ # Монеты COINS_PER_SECOND = 1 # 1 секунда = 1 Ɉ INACTIVITY_LIMIT_SEC = 3 * 60 # 3 минуты без активности = пауза # Presence Proof PRESENCE_PROOF_VERSION = "MONTANA_PRESENCE_V1" GENESIS_HASH = "0" * 64 # Genesis prev_hash ``` ### 1.1 Таблица временных единиц | Единица | Значение | В секундах | |---------|----------|------------| | τ₁ | 1 минута | 60 | | τ₂ | 10 минут | 600 | | τ₃ | 14 дней | 1,209,600 | | τ₄ | 4 года | 126,144,000 | ### 1.2 Иерархия ``` 1 τ₄ = 104 τ₃ = 209,664 τ₂ = 126,144,000 секунд 1 τ₃ = 2016 τ₂ = 1,209,600 секунд 1 τ₂ = 600 секунд = 600 Ɉ (базовая) ``` --- ## 2. Halving — Эмиссия ### 2.1 Алгоритм халвинга **Исходный код:** [time_bank.py:82-107](../бот/time_bank.py#L82-L107) ```python def halving_coefficient(tau4_count: int) -> float: """ Коэффициент халвинга — деление на 2 каждые τ₄ (4 года) Args: tau4_count: Количество пройденных τ₄ эпох Returns: Коэффициент эмиссии (1.0, 0.5, 0.25, 0.125...) Формула: emission_per_second = 1.0 / (2 ** tau4_count) """ return 1.0 / (2 ** tau4_count) ``` ### 2.2 Таблица халвингов | τ₄ | Период | Коэффициент | 1 сек = | |----|--------|-------------|---------| | 0 | Годы 1-4 | 1.0 | 1.0 Ɉ | | 1 | Годы 5-8 | 0.5 | 0.5 Ɉ | | 2 | Годы 9-12 | 0.25 | 0.25 Ɉ | | 3 | Годы 13-16 | 0.125 | 0.125 Ɉ | | ... | ... | ... | ... | | 64 | ~260 лет | ~0 | ~0 Ɉ | ### 2.3 Математическая формулировка Пусть `n` — номер эпохи τ₄. Эмиссия за 1 секунду присутствия: ``` E(n) = 1 / 2ⁿ Ɉ Где: n = 0: E(0) = 1.0 Ɉ/сек n = 1: E(1) = 0.5 Ɉ/сек n = 2: E(2) = 0.25 Ɉ/сек ``` ### 2.4 TIME_BANK Reserve — 21 млн минут Банк времени имеет резерв **21,000,000 минут** (~40 лет). Каждый τ₂ (10 минут) банк "расходует" 10 минут своего резерва: ``` Резерв при генезисе: 21,000,000 минут Расход за τ₂: -10 минут Расход за год: -525,600 минут (365.25 × 24 × 6) Расход за 40 лет: -21,024,000 минут ``` **Oracle Mode:** Когда резерв исчерпан, TIME_BANK переходит в режим "чистого оракула": - Не эмитирует монеты - Только аттестует временные координаты сети - Халвинг продолжает работать --- ## 3. Механизм эмиссии ### 3.1 Завершение τ₂ **Исходный код:** [time_bank.py:529-602](../бот/time_bank.py#L529-L602) ```python def _finalize_t2(self): """Завершает T2, начисляет монеты с халвингом""" self.t2_count += 1 # Вычисляем коэффициент халвинга self.current_halving_coefficient = halving_coefficient(self.tau4_count) # Считаем общую сумму секунд присутствия total_users_seconds = 0 for address, entry in self.presence.all().items(): total_users_seconds += entry["t2_seconds"] # Распределяем: каждый получает свои секунды × halving for address, entry in self.presence.all().items(): if entry["t2_seconds"] > 0: coins = int(entry["t2_seconds"] * self.current_halving_coefficient) self.db.credit(address, coins, entry.get("addr_type", "unknown")) entry["t2_seconds"] = 0 ``` ### 3.2 Параллельное распределение ``` ┌─────────────────────────────────────────────────────────────┐ │ ЭМИССИЯ MONTANA │ ├─────────────────────────────────────────────────────────────┤ │ τ₄ = 0 (первые 4 года) │ │ halving_coefficient = 1.0 │ ├─────────────────────────────────────────────────────────────┤ │ User A │ +600 сек × 1.0 = │ +600 Ɉ │ │ User B │ +450 сек × 1.0 = │ +450 Ɉ │ │ User C │ +600 сек × 1.0 = │ +600 Ɉ │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ τ₄ = 1 (годы 5-8) │ │ halving_coefficient = 0.5 │ ├─────────────────────────────────────────────────────────────┤ │ User A │ +600 сек × 0.5 = │ +300 Ɉ │ │ User B │ +450 сек × 0.5 = │ +225 Ɉ │ │ User C │ +600 сек × 0.5 = │ +300 Ɉ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 4. Presence Proof (ML-DSA-65) ### 4.1 Подпись присутствия **Исходный код:** [time_bank.py:271-327](../бот/time_bank.py#L271-L327) Каждую τ₁ (1 минуту) узел подписывает доказательство присутствия: ```python def _sign_presence_proof(self) -> Optional[Dict[str, Any]]: """Подписывает доказательство присутствия каждую τ₁""" timestamp = int(time.time()) t2_index = self.t2_count # Формируем сообщение message = f"{Protocol.PRESENCE_PROOF_VERSION}:{timestamp}:{self._last_proof_hash}:{self._node_public_key}:{t2_index}" # Подписываем ML-DSA-65 signature = sign_message(self._node_private_key, message) # Hash для цепочки proofs proof_hash = hashlib.sha256( f"{message}:{signature}".encode('utf-8') ).hexdigest() ``` ### 4.2 Формат сообщения ``` MONTANA_PRESENCE_V1:{timestamp}:{prev_hash}:{pubkey}:{t2_index} ``` ### 4.3 Цепочка доказательств ``` ┌─────────────────────────────────────────────────────────────┐ │ PRESENCE PROOF CHAIN │ ├─────────────────────────────────────────────────────────────┤ │ Genesis │ prev_hash = "0000...0000" (64 нуля) │ │ Proof #1 │ prev_hash = Genesis.hash │ │ Proof #2 │ prev_hash = Proof#1.hash │ │ ... │ ... │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 5. Криптография ML-DSA-65 ### 5.1 Параметры | Параметр | Значение | |----------|----------| | Алгоритм | ML-DSA-65 (Dilithium) | | Стандарт | FIPS 204 | | Уровень | NIST Level 3 (128-bit post-quantum) | | Private Key | 4032 байт | | Public Key | 1952 байт | | Signature | 3309 байт | ### 5.2 Интеграция **Исходный код:** [time_bank.py:31-35](../бот/time_bank.py#L31-L35) ```python try: from node_crypto import sign_message, verify_signature, get_node_crypto_system ML_DSA_AVAILABLE = True except ImportError: ML_DSA_AVAILABLE = False ``` --- ## 6. Checkpoints ### 6.1 τ₃ Checkpoint (14 дней) **Исходный код:** [time_bank.py:573-583](../бот/time_bank.py#L573-L583) ```python # Проверяем τ₃ checkpoint (каждые 2016 T2 = 14 дней) if self.t2_count % Protocol.T2_PER_TAU3 == 0: self.tau3_count += 1 logger.info(f"τ₃ CHECKPOINT #{self.tau3_count} — 14 ДНЕЙ ПРОЙДЕНО") ``` ### 6.2 τ₄ Halving (4 года) **Исходный код:** [time_bank.py:585-594](../бот/time_bank.py#L585-L594) ```python # Проверяем τ₄ epoch (каждые 104 τ₃ = 4 года) — ХАЛВИНГ! if self.tau3_count > 0 and self.tau3_count % Protocol.TAU3_PER_TAU4 == 0: self.tau4_count += 1 logger.info(f"τ₄ HALVING #{self.tau4_count} — ЭМИССИЯ ÷ 2") ``` --- ## 7. API ### 7.1 Управление присутствием ```python from time_bank import get_time_bank bank = get_time_bank() # Начать присутствие bank.start("user_123", "telegram") # Зарегистрировать активность bank.activity("user_123") # Завершить присутствие bank.end("user_123") ``` ### 7.2 Кошелёк **Исходный код:** [time_bank.py:381-419](../бот/time_bank.py#L381-L419) ```python # Подтверждённый баланс balance = bank.balance("user_123") # Баланс с pending (ещё не подтверждённые в T2) balance_info = bank.get_balance_with_pending("user_123") # { # "confirmed": 1000, # В БД # "pending": 45, # Накапливается в текущем T2 # "total": 1045 # Сумма # } # Перевод result = bank.send("from_addr", "to_addr", 100) # История транзакций txs = bank.my_txs("user_123", limit=50) ``` ### 7.3 Presence Proofs ```python # Установить ключи узла bank.set_node_keys(private_key_hex, public_key_hex) # Получить последние proofs proofs = bank.get_presence_proofs(limit=10) # Верифицировать proof is_valid = bank.verify_presence_proof(proof) # Статус цепочки status = bank.get_proof_chain_status() ``` --- ## 8. Защита от атак | Атака | Механизм защиты | Статус | |-------|-----------------|--------| | Quantum | ML-DSA-65 post-quantum | ✅ Реализовано | | IP hijacking | Криптографические адреса | ✅ Реализовано | | Harvest now decrypt later | ML-DSA-65 с genesis | ✅ Реализовано | | Time manipulation | τ₁ подписи каждую минуту | ✅ Реализовано | | Sybil | Adaptive Cooldown | ✅ Реализовано | --- ## 9. Реализация | Компонент | Файл | Статус | |-----------|------|--------| | TimeBank | [time_bank.py](../бот/time_bank.py) | ✅ Работает | | Protocol constants | [time_bank.py:44-80](../бот/time_bank.py#L44-L80) | ✅ Работает | | halving_coefficient | [time_bank.py:82-107](../бот/time_bank.py#L82-L107) | ✅ Работает | | Presence Proof | [time_bank.py:271-327](../бот/time_bank.py#L271-L327) | ✅ Работает | | τ₃/τ₄ checkpoints | [time_bank.py:573-594](../бот/time_bank.py#L573-L594) | ✅ Работает | | get_balance_with_pending | [time_bank.py:388-415](../бот/time_bank.py#L388-L415) | ✅ Работает | | ML-DSA-65 ключи | [node_crypto.py](../бот/node_crypto.py) | ✅ Работает | --- ## 10. Тестирование ```bash # Статистика python time_bank.py stats # Демо python time_bank.py demo # Баланс python time_bank.py balance
# Presence proofs python time_bank.py proofs python time_bank.py proof-status ``` --- ``` Alejandro Montana Montana Protocol v1.0 Январь 2026 ```