404 lines
14 KiB
Markdown
404 lines
14 KiB
Markdown
# 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
|
||
```
|