322 lines
11 KiB
Markdown
322 lines
11 KiB
Markdown
# Система Кошельков Узлов Montana
|
||
|
||
## Концепция
|
||
|
||
В Montana существует две параллельные системы кошельков:
|
||
|
||
### 1. **Пользовательские Кошельки**
|
||
- **Адрес:** Telegram ID пользователя
|
||
- **Ключ:** Telegram ID (одновременно адрес и ключ)
|
||
- **Хранение:** Привязано к Telegram аккаунту
|
||
- **Команда:** `/start` — показывает TG ID как адрес кошелька
|
||
|
||
### 2. **Кошельки Узлов**
|
||
- **Адрес:** Криптографический хеш (mt + SHA256(public_key)[:20])
|
||
- **Ключ:** Private key ML-DSA-65/ML-DSA-65
|
||
- **Alias:** Удобное имя (например, `amsterdam.efir.org`)
|
||
- **IP:** Только для networking, НЕ для идентификации
|
||
- **Владелец:** Telegram ID оператора узла
|
||
|
||
## Официальные Узлы Montana
|
||
|
||
```
|
||
⭐️ 🇳🇱 Amsterdam — mta46b633d258059b90db46adffc6c5ca08f0e8d6c — FULL NODE — Priority #1
|
||
Alias: amsterdam.efir.org
|
||
IP: 72.56.102.240 (networking only)
|
||
|
||
⭐️ 🇷🇺 Moscow — mta8ae14f74c38294b24c2f1c20c6406e6be929c93 — FULL NODE — Priority #2
|
||
Alias: moscow.efir.org
|
||
IP: 176.124.208.93 (networking only)
|
||
|
||
⭐️ 🇰🇿 Almaty — mtd07b0d9bdab2cb592f509bc1304c368ac703c45e — FULL NODE — Priority #3
|
||
Alias: almaty.efir.org
|
||
IP: 91.200.148.93 (networking only)
|
||
|
||
⭐️ 🇷🇺 St.Petersburg — mtb397e136de69d92e5782f3fe14533a4a37b4ddec — FULL NODE — Priority #4
|
||
Alias: spb.efir.org
|
||
IP: 188.225.58.98 (networking only)
|
||
|
||
⭐️ 🇷🇺 Novosibirsk — mtf3f0254b405382de38494e753924b4b92692bd2c — FULL NODE — Priority #5
|
||
Alias: novosibirsk.efir.org
|
||
IP: 147.45.147.247 (networking only)
|
||
```
|
||
|
||
## Защита от Атак
|
||
|
||
### ✅ IP Hijacking — ЗАБЛОКИРОВАНО
|
||
- Адрес кошелька НЕ привязан к IP
|
||
- IP используется только для networking
|
||
- Атакующий с тем же IP не получит доступ к кошельку
|
||
|
||
### ✅ DNS Spoofing — ЗАБЛОКИРОВАНО
|
||
- Alias только для удобства
|
||
- Реальный адрес криптографический (mt...)
|
||
- Подмена DNS не влияет на кошелек
|
||
|
||
### ✅ Man-in-the-Middle — ЗАБЛОКИРОВАНО
|
||
- Все операции подписаны ML-DSA-65/ML-DSA-65
|
||
- Модифицированное сообщение = невалидная подпись
|
||
|
||
### ✅ Подделка Транзакций — ЗАБЛОКИРОВАНО
|
||
- Требуется private key для подписи
|
||
- Без ключа транзакция отклонена
|
||
|
||
## Команды Бота
|
||
|
||
### `/node`
|
||
Показывает сводку по всем узлам сети:
|
||
```
|
||
Ɉ
|
||
|
||
**MONTANA NETWORK**
|
||
|
||
🌐 **Всего узлов:** 5
|
||
⭐️ **Официальных:** 5
|
||
🔷 **Full nodes:** 5
|
||
💰 **Общий баланс сети:** XXX.XX секунд
|
||
```
|
||
|
||
### `/node <адрес>`
|
||
Показывает детали конкретного узла:
|
||
```
|
||
Ɉ
|
||
|
||
**Узел Montana:** 🇳🇱 Amsterdam
|
||
|
||
**Адрес кошелька:** `mta46b633d258059b90db46adffc6c5ca08f0e8d6c`
|
||
**Alias:** `amsterdam.efir.org`
|
||
_(криптографический адрес — защита от IP hijacking)_
|
||
|
||
**IP:** 72.56.102.240 _(только для networking)_
|
||
**Тип:** FULL NODE
|
||
**Владелец:** Montana Foundation (см. keyring: ADMIN_TELEGRAM_ID)
|
||
**Приоритет:** #1
|
||
|
||
💰 **Баланс:** XXX.XX секунд
|
||
|
||
📊 **Последние транзакции:**
|
||
• +100.50s — Награда за валидацию блоков
|
||
|
||
⚠️ Переводы только по криптографическому адресу или alias.
|
||
```
|
||
|
||
### `/node <alias>`
|
||
Показывает узел по alias:
|
||
```bash
|
||
/node amsterdam.efir.org
|
||
# → Показывает Amsterdam узел
|
||
```
|
||
|
||
### `/network`
|
||
Альтернатива `/node` — показывает ту же сводку по сети.
|
||
|
||
### `/register_node` (admin only)
|
||
**Только для администратора.**
|
||
|
||
Регистрирует новый узел в сети Montana с генерацией криптографических ключей.
|
||
|
||
Пример:
|
||
```bash
|
||
/register_node tokyo "🇯🇵 Tokyo" 1.2.3.4 123456789 light
|
||
```
|
||
|
||
Параметры:
|
||
- `node_name` — Короткое имя узла (станет частью alias)
|
||
- `location` — Локация с флагом (например "🇯🇵 Tokyo")
|
||
- `ip_address` — IP адрес узла (только для networking!)
|
||
- `owner_telegram_id` — Telegram ID владельца узла
|
||
- `node_type` — Тип узла: `full`, `light`, `client` (по умолчанию `light`)
|
||
|
||
**Результат:**
|
||
```
|
||
Ɉ
|
||
|
||
✅ **Узел зарегистрирован**
|
||
|
||
**Адрес:** `mtb9498a702435b2443bd8461574b80d8ed435159b`
|
||
**Alias:** `tokyo.efir.org`
|
||
**Public Key:** `a3f8b2c1d4e5f6789...`
|
||
|
||
⚠️ **КРИТИЧЕСКИ ВАЖНО:**
|
||
**Private Key:** `f9d8c7b6a5e4d3c2b1...`
|
||
|
||
🔐 СОХРАНИ PRIVATE KEY В БЕЗОПАСНОМ МЕСТЕ!
|
||
Без него доступ к кошельку узла невозможен.
|
||
```
|
||
|
||
## Типы Узлов
|
||
|
||
### **Full Node**
|
||
- Полная валидация всех транзакций
|
||
- Хранит весь таймчейн Montana
|
||
- Участвует в консенсусе
|
||
- Может майнить блоки
|
||
|
||
### **Light Node**
|
||
- Валидация только заголовков блоков
|
||
- Хранит заголовки + чекпоинты
|
||
- Не требует полного хранилища
|
||
- Быстрая синхронизация
|
||
|
||
### **Light Client**
|
||
- Только отправка подписей присутствия
|
||
- Хранит только свои данные
|
||
- Минимальные требования
|
||
- Для мобильных устройств
|
||
|
||
## Транзакции Узлов
|
||
|
||
Узлы получают награды за:
|
||
- 🏆 **Валидацию блоков** — подтверждение транзакций
|
||
- 📦 **Хранение данных** — репликация таймчейна
|
||
- 🌐 **Релей трафика** — пересылка сообщений сети
|
||
- ⏱️ **Аптайм** — стабильная работа 24/7
|
||
|
||
Узлы платят за:
|
||
- 💸 **Bandwidth** — исходящий трафик
|
||
- 🔧 **Операционные расходы** — сервер, электричество
|
||
- 🔄 **Синхронизацию** — обмен данными с другими узлами
|
||
|
||
## API (программный доступ)
|
||
|
||
### Python
|
||
|
||
```python
|
||
from node_crypto import get_node_crypto_system
|
||
|
||
# Инициализация
|
||
ncs = get_node_crypto_system()
|
||
|
||
# Получить все узлы
|
||
nodes = ncs.get_all_nodes()
|
||
|
||
# Получить узел по адресу
|
||
node = ncs.get_node_by_address("mta46b633d258059b90db46adffc6c5ca08f0e8d6c")
|
||
print(f"Узел: {node['node_name']}")
|
||
print(f"Баланс: {node['balance']} секунд")
|
||
|
||
# Получить узел по alias
|
||
node = ncs.get_node_by_alias("amsterdam.efir.org")
|
||
|
||
# Зарегистрировать новый узел
|
||
result = ncs.register_node(
|
||
owner_telegram_id=123456789,
|
||
node_name="tokyo",
|
||
location="🇯🇵 Tokyo",
|
||
ip_address="1.2.3.4",
|
||
node_type="light"
|
||
)
|
||
|
||
# ⚠️ СОХРАНИ PRIVATE KEY!
|
||
print(f"Address: {result['address']}")
|
||
print(f"Private Key: {result['private_key']}") # КРИТИЧЕСКИ ВАЖНО
|
||
print(f"Public Key: {result['public_key']}")
|
||
print(f"Alias: {result['alias']}")
|
||
|
||
# Проверить владение узлом (подпись)
|
||
message = "Transfer 500 seconds to mt9876543210"
|
||
signature = sign_message(private_key, message)
|
||
|
||
is_valid = ncs.verify_node_ownership(
|
||
address="mta46b633d258059b90db46adffc6c5ca08f0e8d6c",
|
||
message=message,
|
||
signature_hex=signature
|
||
)
|
||
```
|
||
|
||
## Файлы Данных
|
||
|
||
Система хранит данные в:
|
||
```
|
||
data/
|
||
└── nodes/
|
||
├── registered_nodes.json # Зарегистрированные узлы
|
||
├── node_keys.json # Криптографические ключи
|
||
└── node_wallets.json # Кошельки узлов (deprecated)
|
||
```
|
||
|
||
### registered_nodes.json
|
||
```json
|
||
{
|
||
"mta46b633d258059b90db46adffc6c5ca08f0e8d6c": {
|
||
"address": "mta46b633d258059b90db46adffc6c5ca08f0e8d6c",
|
||
"public_key": "a3f8b2c1d4e5f6789...",
|
||
"owner": "ADMIN_TELEGRAM_ID",
|
||
"node_name": "amsterdam",
|
||
"alias": "amsterdam.efir.org",
|
||
"location": "🇳🇱 Amsterdam",
|
||
"ip": "72.56.102.240",
|
||
"type": "full",
|
||
"created_at": "2026-01-19T...",
|
||
"official": true,
|
||
"priority": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
### node_keys.json
|
||
```json
|
||
{
|
||
"mta46b633d258059b90db46adffc6c5ca08f0e8d6c": {
|
||
"private_key": "f9d8c7b6a5e4d3c2b1...",
|
||
"public_key": "a3f8b2c1d4e5f6789...",
|
||
"algorithm": "ML-DSA-65 (FIPS 204)"
|
||
}
|
||
}
|
||
```
|
||
|
||
⚠️ **КРИТИЧЕСКИ ВАЖНО:** `node_keys.json` содержит private keys. НИКОГДА не коммить в git!
|
||
|
||
## Безопасность
|
||
|
||
### 🔒 Криптографическая Защита (MAINNET)
|
||
- Private keys никогда не покидают сервер (4032 байта)
|
||
- Подпись ML-DSA-65 (FIPS 204) для всех операций
|
||
- SHA256 хеширование для адресов
|
||
- Post-quantum защита АКТИВНА с genesis
|
||
|
||
### ⚠️ Важно
|
||
- Криптографический адрес = идентификатор кошелька
|
||
- IP адрес только для networking
|
||
- Alias только для удобства
|
||
- Private key = полный контроль над узлом
|
||
- При утере private key доступ к кошельку невозможен
|
||
|
||
## Интеграция с Telegram
|
||
|
||
Система полностью интегрирована в [@junomontanaagibot](https://t.me/junomontanaagibot):
|
||
|
||
1. Пользователи видят свой TG ID как адрес кошелька
|
||
2. Узлы имеют криптографические адреса (mt...)
|
||
3. Единая философия: **криптографический идентификатор = адрес**
|
||
4. Операторы узлов идентифицируются по Telegram ID
|
||
5. Переводы поддерживают как полные адреса, так и alias
|
||
|
||
## Статус: MAINNET PRODUCTION
|
||
|
||
**Январь 2026:** ML-DSA-65 АКТИВЕН
|
||
|
||
- ✅ Все узлы на ML-DSA-65 (FIPS 204)
|
||
- ✅ Montana защищена от квантовых компьютеров с первого дня
|
||
- ✅ Нет legacy — чистый post-quantum
|
||
|
||
См. [NODE_CRYPTO_SYSTEM.md](NODE_CRYPTO_SYSTEM.md) для деталей.
|
||
|
||
## Roadmap
|
||
|
||
- [ ] Автоматические награды за аптайм
|
||
- [ ] Интеграция с Montana timechain
|
||
- [ ] Web dashboard для мониторинга узлов
|
||
- [ ] Stake механизм для узлов
|
||
- [ ] Governance через узлы
|
||
- [ ] Multi-sig кошельки для узлов
|
||
- [ ] Hardware Security Module (HSM) для ключей
|
||
|
||
---
|
||
|
||
**Ɉ Montana — Протокол идеальных денег**
|
||
|
||
*Криптографическая защита — безопасность от genesis*
|
||
|
||
*Post-quantum ready — защита от квантовых компьютеров*
|