montana/Русский/Технологии/001_ВКП.md

14 KiB
Raw Blame History

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

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

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

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

Каждую τ₁ (1 минуту) узел подписывает доказательство присутствия:

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

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

# Проверяем τ₃ 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

# Проверяем τ₄ 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 Управление присутствием

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

# Подтверждённый баланс
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

# Установить ключи узла
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 Работает
Protocol constants time_bank.py:44-80 Работает
halving_coefficient time_bank.py:82-107 Работает
Presence Proof time_bank.py:271-327 Работает
τ₃/τ₄ checkpoints time_bank.py:573-594 Работает
get_balance_with_pending time_bank.py:388-415 Работает
ML-DSA-65 ключи node_crypto.py Работает

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

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

# Демо
python time_bank.py demo

# Баланс
python time_bank.py balance <address>

# Presence proofs
python time_bank.py proofs
python time_bank.py proof-status

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