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

404 lines
14 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.

# 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 <address>
# Presence proofs
python time_bank.py proofs
python time_bank.py proof-status
```
---
```
Alejandro Montana
Montana Protocol v1.0
Январь 2026
```