montana/Русский/Коммуникация/СПЕЦИФИКАЦИЯ.md

535 lines
18 KiB
Markdown
Raw 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.

# Montana Communications — Техническая Спецификация
**Версия:** 1.0
**Дата:** 2026-01-21
**Автор:** Alejandro Montana
---
## Обзор
Montana Communications — единая система коммуникаций протокола Montana, где **время = деньги** в буквальном смысле. Каждая секунда голосового или видеозвонка стоит 1 Jcoin.
**Принцип:** Телефон — это адрес кошелька. SMS — это транзакция. Звонок — это стриминг времени.
---
## Архитектура
```
┌─────────────────────────────────────────────────────────────────────┐
│ MONTANA COMMUNICATIONS │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ SMS │ │ VOICE │ │ VIDEO │ │
│ │ Gateway │ │ WebRTC │ │ WebRTC │ │
│ │ │ │ │ │ │ │
│ │ 1 SMS = 1Ɉ │ │ 1 sec = 1Ɉ │ │ 1 sec = 2Ɉ │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ SIGNALING │ │
│ │ (Telegram Bot) │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ BILLING │ │
│ │ (Time = Money) │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ MONTANA DB │ │
│ │ (SQLite) │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
---
## 1. SMS Gateway
### Концепция
**Телефон = Адрес кошелька.** Любой человек в мире может отправить SMS и получить кошелёк Montana без регистрации.
### Формат адреса
```
+79991234567 → Международный (E.164)
телефон = wallet address
```
### Команды SMS
| Команда | Описание | Пример |
|---------|----------|--------|
| `BAL` | Проверить баланс | `BAL` |
| `SEND <тел> <сумма>` | Перевод | `SEND +79991234567 100` |
| `TX` | История транзакций | `TX` |
| `INFO` | Информация об аккаунте | `INFO` |
| `?` | Справка | `?` |
### Архитектура SMS
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Телефон │──SMS─│ Twilio │─HTTP─│ Montana │
│ (+7...) │ │ Webhook │ │ Gateway │
└─────────────┘ └─────────────┘ └──────┬──────┘
┌──────────────────────┤
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Montana │ │ Telegram │
│ DB │ │ Bot │
└─────────────┘ └─────────────┘
```
### Синхронизация Telegram ↔ SMS
Если пользователь привязал телефон к Telegram аккаунту Montana:
- Баланс синхронизирован
- Транзакции видны в обоих каналах
- Можно звонить через любой интерфейс
```python
def link_phone_to_telegram(phone: str, telegram_id: str) -> bool:
"""
Привязка телефона к Telegram.
Балансы объединяются.
"""
phone_balance = get_balance(phone)
tg_balance = get_balance(f"tg:{telegram_id}")
# Объединяем балансы
total = phone_balance + tg_balance
# Устанавливаем единый баланс
set_balance(phone, total)
set_balance(f"tg:{telegram_id}", total)
# Создаём связь
create_link(phone, telegram_id)
return True
```
### Тарификация SMS
| Операция | Стоимость |
|----------|-----------|
| Входящее SMS (команда) | 1 Ɉ |
| Исходящее SMS (ответ) | 0 Ɉ (включено) |
| Перевод (SEND) | 1 Ɉ + комиссия 1% |
---
## 2. Voice (WebRTC P2P)
### Концепция
Голосовые звонки через WebRTC — P2P соединение между устройствами. Montana только обеспечивает signaling и биллинг.
**Принцип:** Голос идёт напрямую между устройствами. Montana не слышит разговор.
### Архитектура WebRTC
```
┌─────────────┐ ┌─────────────┐
│ Телефон A │ │ Телефон B │
│ (Browser) │ │ (Browser) │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. Offer (SDP) │
├──────────────────► Signaling ◄────────────┤
│ (Telegram) │
│ 2. Answer (SDP) │
├◄───────────────────────────────────────────┤
│ │
│ 3. ICE Candidates │
├◄──────────────────────────────────────────►│
│ │
│ 4. P2P Media Stream (Encrypted) │
└◄══════════════════════════════════════════►┘
1 секунда = 1 Ɉ
```
### ICE серверы
```python
ICE_SERVERS = [
# STUN серверы (NAT traversal)
{"urls": "stun:stun.l.google.com:19302"},
{"urls": "stun:stun1.l.google.com:19302"},
{"urls": "stun:stun2.l.google.com:19302"},
{"urls": "stun:stun3.l.google.com:19302"},
{"urls": "stun:stun4.l.google.com:19302"},
# TURN сервер (для symmetric NAT) — опционально
# {"urls": "turn:turn.efir.org:3478",
# "username": "montana",
# "credential": "<from_keychain>"}
]
```
### Signaling через Telegram
Вместо отдельного WebSocket сервера используем Telegram бот как signaling:
1. **Caller** создаёт offer (SDP) в браузере
2. **Offer** передаётся через Telegram бот получателю
3. **Receiver** создаёт answer (SDP)
4. **Answer** передаётся обратно через бот
5. **ICE candidates** обмениваются через бот
6. **P2P соединение** установлено — голос идёт напрямую
### WebRTC клиент
```javascript
// Создание peer connection
const pc = new RTCPeerConnection({iceServers: ICE_SERVERS});
// Получить доступ к микрофону
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
stream.getTracks().forEach(track => pc.addTrack(track, stream));
// Создать offer
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
// Отправить offer через Telegram (signaling)
sendToTelegram({type: 'offer', sdp: offer.sdp});
// Получить answer от второй стороны
pc.ontrack = (e) => {
// Воспроизвести входящий аудиопоток
audioElement.srcObject = e.streams[0];
};
```
### Биллинг звонков
```python
def end_call(call_id: str) -> dict:
"""
Завершение звонка и списание Ɉ
"""
call = get_call(call_id)
# Расчёт времени
duration = (call.ended_at - call.started_at).total_seconds()
duration_seconds = int(duration)
# 1 секунда = 1 Ɉ
cost = duration_seconds
# Списание со звонящего
transfer(
from_address=call.from_address,
to_address="BURN", # или пул узлов
amount=cost,
memo=f"Call {call_id}: {duration_seconds}s"
)
return {
"call_id": call_id,
"duration_seconds": duration_seconds,
"cost_coins": cost
}
```
### Команды Telegram
| Команда | Описание |
|---------|----------|
| `/call @user` | Позвонить пользователю |
| `/call +79991234567` | Позвонить на телефон |
| `/answer` | Принять входящий звонок |
| `/hangup` | Завершить звонок |
| `/calls` | История звонков |
---
## 3. Video (WebRTC P2P)
### Концепция
Видеозвонки используют ту же архитектуру WebRTC, но с видеопотоком.
**Тариф:** 1 секунда = 2 Ɉ (audio + video)
### Отличия от Voice
```javascript
// Видеозвонок — включаем камеру
const stream = await navigator.mediaDevices.getUserMedia({
audio: true,
video: {
width: { ideal: 1280 },
height: { ideal: 720 },
facingMode: "user"
}
});
```
### Тарификация видео
| Тип | Стоимость |
|-----|-----------|
| Voice call | 1 Ɉ/сек |
| Video call | 2 Ɉ/сек |
| Screen share | 2 Ɉ/сек |
---
## База данных
### Таблица calls
```sql
CREATE TABLE IF NOT EXISTS calls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
call_id TEXT UNIQUE NOT NULL,
from_address TEXT NOT NULL,
to_address TEXT NOT NULL,
started_at TEXT,
ended_at TEXT,
duration_seconds INTEGER DEFAULT 0,
cost_coins INTEGER DEFAULT 0,
status TEXT DEFAULT 'pending',
call_type TEXT DEFAULT 'voice', -- voice/video/screen
offer_sdp TEXT,
answer_sdp TEXT,
ice_candidates_from TEXT, -- JSON array
ice_candidates_to TEXT, -- JSON array
created_at TEXT NOT NULL
);
CREATE INDEX idx_calls_from ON calls(from_address);
CREATE INDEX idx_calls_to ON calls(to_address);
CREATE INDEX idx_calls_status ON calls(status);
```
### Статусы звонка
| Статус | Описание |
|--------|----------|
| `pending` | Звонок инициирован, ждёт ответа |
| `ringing` | Получатель видит входящий звонок |
| `active` | Разговор в процессе |
| `ended` | Завершён нормально |
| `missed` | Пропущен |
| `rejected` | Отклонён |
| `failed` | Ошибка соединения |
### Таблица sms_transactions
```sql
CREATE TABLE IF NOT EXISTS sms_transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
phone TEXT NOT NULL,
direction TEXT NOT NULL, -- inbound/outbound
message TEXT,
command TEXT,
result TEXT,
cost_coins INTEGER DEFAULT 1,
created_at TEXT NOT NULL
);
```
---
## Безопасность
### Шифрование
| Компонент | Шифрование |
|-----------|------------|
| WebRTC Media | SRTP (AES-128) |
| Signaling | Telegram TLS |
| SDP | Транспортное шифрование |
| ICE | DTLS |
### Приватность
- **P2P:** Голос/видео идут напрямую между устройствами
- **Montana не слышит:** Сервер только signaling и биллинг
- **Нет записи:** Montana не хранит медиа
- **End-to-End:** SRTP шифрование между браузерами
### Защита от атак
| Атака | Защита |
|-------|--------|
| MITM | DTLS fingerprint verification |
| DoS звонками | Минимальный баланс 60 Ɉ |
| Spam SMS | Rate limiting + стоимость 1 Ɉ |
| Fake caller ID | WebRTC peer verification |
---
## API
### CallManager
```python
from webrtc_signaling import CallManager
manager = CallManager()
# Инициировать звонок
success, msg, call_id = manager.initiate_call(
from_address="tg:123456789",
to_address="tg:987654321"
)
# Установить SDP offer
manager.set_offer(call_id, offer_sdp)
# Принять звонок
manager.answer_call(call_id, answer_sdp)
# Добавить ICE candidate
manager.add_ice_candidate(call_id, candidate, is_from=True)
# Начать тарификацию (P2P соединено)
manager.start_call(call_id)
# Завершить и списать
success, info = manager.end_call(call_id)
# info = {"duration_seconds": 120, "cost_coins": 120}
```
### SMSGateway
```python
from sms_gateway import SMSGateway
gateway = SMSGateway()
# Обработать входящее SMS
response = gateway.process_incoming(
from_phone="+79991234567",
body="BAL"
)
# response = "Баланс: 1000 Ɉ"
# Отправить SMS
gateway.send_sms(
to_phone="+79991234567",
message="Перевод получен: 100 Ɉ"
)
```
---
## Интеграция с Telegram
### MiniApp для звонков
```
https://efir.org/call?id=CALL-XXXXXXXX
```
MiniApp открывается внутри Telegram и использует WebRTC для звонка.
### Webhook обработка
```python
@dp.message(Command("call"))
async def call_cmd(message: Message):
"""Инициировать WebRTC звонок"""
target = extract_target(message.text)
if not target:
await message.answer("Использование: /call @user или /call +79991234567")
return
# Проверяем баланс (минимум 60 Ɉ = 1 минута)
balance = db.get_balance(message.from_user.id)
if balance < 60:
await message.answer("Минимальный баланс для звонка: 60 Ɉ (1 минута)")
return
# Создаём звонок
success, msg, call_id = call_manager.initiate_call(
from_address=f"tg:{message.from_user.id}",
to_address=target
)
# Отправляем ссылку на WebRTC клиент
await message.answer(
f"Звонок: {call_id}\n\n"
f"Откройте для звонка:\n"
f"https://efir.org/call?id={call_id}"
)
```
---
## Тарификация
### Сводная таблица
| Услуга | Стоимость | Минимум |
|--------|-----------|---------|
| SMS команда | 1 Ɉ | 1 Ɉ |
| Voice call | 1 Ɉ/сек | 60 Ɉ |
| Video call | 2 Ɉ/сек | 120 Ɉ |
| Перевод | 1% | 1 Ɉ |
### Экономика
```
1 Ɉ = 1 секунда времени
1 минута звонка = 60 Ɉ
1 час звонка = 3600 Ɉ
TIME IS THE ONLY REAL CURRENCY
```
---
## Файлы модуля
| Файл | Назначение |
|------|------------|
| `sms_gateway.py` | SMS Gateway (Twilio webhook) |
| `webrtc_signaling.py` | WebRTC signaling через Telegram |
| `static/call.html` | WebRTC клиент (браузер) |
| `montana_db.py` | База данных (таблица calls) |
---
## Roadmap
### v1.0 (текущая)
- [x] SMS Gateway (BAL, SEND, TX)
- [x] Voice calls (WebRTC P2P)
- [x] Signaling через Telegram
- [x] Биллинг по секундам
### v1.1 (планируется)
- [ ] Video calls
- [ ] Screen sharing
- [ ] Telegram MiniApp
- [ ] TURN сервер на Timeweb
### v2.0 (будущее)
- [ ] Group calls (до 12 участников)
- [ ] Voicemail (оплата за хранение)
- [ ] Call recording (opt-in, оплата)
- [ ] SIP интеграция
---
**Montana Protocol — Time is the only real currency.**