18 KiB
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:
- Баланс синхронизирован
- Транзакции видны в обоих каналах
- Можно звонить через любой интерфейс
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 серверы
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:
- Caller создаёт offer (SDP) в браузере
- Offer передаётся через Telegram бот получателю
- Receiver создаёт answer (SDP)
- Answer передаётся обратно через бот
- ICE candidates обмениваются через бот
- P2P соединение установлено — голос идёт напрямую
WebRTC клиент
// Создание 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];
};
Биллинг звонков
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
// Видеозвонок — включаем камеру
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
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
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
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
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 обработка
@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 (текущая)
- SMS Gateway (BAL, SEND, TX)
- Voice calls (WebRTC P2P)
- Signaling через Telegram
- Биллинг по секундам
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.