17 KiB
Montana Contracts — Техническая Спецификация
Версия: 1.0 Дата: 2026-01-21 Автор: Alejandro Montana
Обзор
Montana Contracts — система умных контрактов с человеческим арбитражем. В отличие от автоматических смарт-контрактов блокчейна, Montana Contracts используют AI-арбитра (Юнона) для валидации условий и разрешения споров.
Ключевое отличие: Юнона понимает естественный язык и может оценить выполнимость условий, в то время как классические смарт-контракты слепо исполняют код.
Архитектура
┌─────────────────────────────────────────────────────────────┐
│ КОНТРАКТНАЯ КОМНАТА │
│ (Telegram группа) │
├─────────────────────────────────────────────────────────────┤
│ │
│ Сторона А ──────► КОНТРАКТ ◄────── Сторона Б │
│ (creator) │ │ (target) │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────┐ │
│ │ СВИДЕТЕЛИ │ │
│ │ (witnesses) │ │
│ │ голосуют >50% │ │
│ └────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ ЮНОНА │ │
│ │ (AI-арбитр) │ │
│ │ ПОСЛЕДНЕЕ СЛОВО │ │
│ └────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ ESCROW │ │
│ │ (заморозка Ɉ) │ │
│ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Жизненный цикл контракта
Статусы
| Статус | Описание |
|---|---|
DRAFT |
Черновик. Собирает голоса участников |
PENDING |
Одобрен Юноной. Ждёт подтверждения Стороны Б |
ACCEPTED |
Принят. Условия исполняются |
COMPLETION_VOTING |
Голосование за завершение. Свидетели подтверждают исполнение |
COMPLETED |
Исполнен. Escrow переведён Стороне Б |
CANCELLED |
Отменён. Escrow возвращён Стороне А |
REJECTED |
Отклонён Юноной или большинством |
Диаграмма переходов
создание
│
▼
┌─────────┐
│ DRAFT │◄──────────────┐
└────┬────┘ │
│ │
голосование │ >50% ЗА │ изменения
▼ │
┌───────────┐ │
│ ЮНОНА │──────────────┘
│ проверяет │ отклонение
└─────┬─────┘
│ одобрение
▼
┌───────────┐
│ PENDING │
└─────┬─────┘
│ Сторона Б принимает
▼
┌───────────┐
│ ACCEPTED │
└─────┬─────┘
│ /contract done
▼
┌───────────────────┐
│ COMPLETION_VOTING │
│ (Bitcoin Pizza) │
└─────┬─────────────┘
│ кворум + Юнона
┌───────────┴───────────┐
│ │
▼ ▼
┌───────────┐ ┌───────────┐
│ COMPLETED │ │ CANCELLED │
│ (escrow→Б)│ │ (escrow→А)│
└───────────┘ └───────────┘
Механизм консенсуса
Кворум
Контракт требует одобрения большинства участников комнаты (>50%).
def has_quorum(votes_approve, total_witnesses):
return len(votes_approve) > total_witnesses / 2
Пример:
- 5 участников → нужно 3+ голоса ЗА
- 12 участников → нужно 7+ голосов ЗА
Последнее слово Юноны
Даже при достижении кворума, Юнона может отклонить контракт если:
- Условия невыполнимы или размыты
- Нет объективных критериев исполнения
- Условия противоречат протоколу Montana
- Обнаружены признаки мошенничества
def junona_decision(contract, approve, reason=None):
"""
ПОСЛЕДНЕЕ СЛОВО: Юнона может отклонить даже с кворумом
"""
if not contract.has_quorum():
return False, "Нет кворума"
contract.junona_approved = approve
contract.junona_reason = reason
if approve:
contract.status = PENDING
else:
contract.status = REJECTED
release_escrow_to_creator(contract)
return True, "Решение принято"
Escrow механизм
Заморозка средств
При создании контракта средства Стороны А замораживаются на специальном escrow-адресе:
escrow:{contract_id}
Пример: escrow:PIZZA-001
Движение средств
СОЗДАНИЕ: Сторона А ──[amount]──► escrow:CONTRACT-ID
ИСПОЛНЕНИЕ: escrow:CONTRACT-ID ──[amount]──► Сторона Б
ОТМЕНА: escrow:CONTRACT-ID ──[amount]──► Сторона А
Безопасность
- Escrow-адрес не контролируется ни одной стороной
- Перевод возможен только при смене статуса контракта
- Все операции подписаны ML-DSA-65
Голосование за завершение (Bitcoin Pizza Style)
Концепция
Как в истории с Bitcoin Pizza — свидетели должны подтвердить что сделка выполнена. Не только стороны А и Б, но ВСЕ участники группы голосуют за валидность исполнения.
Веса голосов
| Участник | Вес голоса |
|---|---|
| Юнона | 2 голоса |
| Свидетель | 1 голос |
Процесс завершения
- Сторона А выполняет условия контракта
- Стороны предоставляют доказательства в группу (фото, видео, документы)
- Команда
/contract done IDзапускает голосование - Свидетели голосуют
/contract verify ID(за) или/contract reject ID(против) - Юнона анализирует и голосует (2 голоса)
- При кворуме (>50%) + одобрении Юноны → COMPLETED
Кворум для завершения
total_weight = len(witnesses) * 1 + 2 # Свидетели + Юнона
approve_weight = len(votes_approve) * 1 + (2 if junona_approved else 0)
has_quorum = approve_weight > total_weight / 2
ready_to_complete = has_quorum and junona_approved
Доказательства
Для подтверждения исполнения участники могут использовать:
- Фото чека/товара/результата
- Видео кружки (Telegram video circles)
- Документы (PDF, контракты)
- Скриншоты
- Любые другие медиа
Свидетели видят доказательства и голосуют исходя из увиденного.
API
# Запуск голосования за завершение
contract.start_completion_voting()
# Голосование свидетеля
contract.vote_completion(user_id="123", approve=True)
# Голос Юноны (2 голоса)
contract.vote_completion(user_id="JUNONA", approve=True, is_junona=True)
# Проверка кворума
quorum = contract.get_completion_quorum_status()
# {
# "total_weight": 7,
# "approve_weight": 5,
# "has_quorum": True,
# "junona_approved": True,
# "ready_to_complete": True
# }
Контрактная комната
Ограничения
| Параметр | Значение |
|---|---|
| Максимум участников | 12 |
| Минимум для контракта | 2 (стороны А и Б) |
| Минимум для голосования | 1 голос (при 2 участниках) |
Верификация участников
Только реальные участники Telegram-группы могут:
- Голосовать за/против контракта
- Быть стороной контракта
def validate_witnesses(group_members, claimed_witnesses):
"""
DISNEY-SAFE: Нельзя указать произвольные ID как свидетелей
"""
valid = []
for wid in claimed_witnesses:
if wid in group_members:
valid.append(wid)
return valid
Валидация условий
Юнона анализирует описание контракта по критериям:
Критерии выполнимости
- Конкретность — есть ли чёткие критерии?
- Измеримость — можно ли объективно проверить?
- Достижимость — реалистично ли условие?
- Временные рамки — указан ли срок?
ExecutabilityResult
@dataclass
class ExecutabilityResult:
executable: bool # Выполнимо ли условие
confidence: float # Уверенность (0.0-1.0)
concerns: List[str] # Проблемы
suggestions: List[str] # Рекомендации
Порог одобрения: confidence >= 0.6
API
Создание контракта
db.create_contract(
contract_id="PIZZA-001",
creator_id="123456789",
target_id="987654321",
amount=500,
description="Доставка пиццы до 18:00",
chat_id="-100123456789",
witnesses=["123456789", "987654321", "111222333"],
freeze_escrow=True
)
Голосование
contract.vote(user_id="111222333", approve=True)
# Returns: (True, "Голос принят")
Решение Юноны
contract.junona_decision(approve=True, reason=None)
# Returns: (True, "Контракт одобрен")
Завершение
db.complete_contract_escrow(contract_id="PIZZA-001")
# Returns: (True, "Контракт исполнен! 500 Ɉ переведено.")
База данных
Таблица contracts
CREATE TABLE IF NOT EXISTS contracts (
contract_id TEXT PRIMARY KEY,
creator_id TEXT NOT NULL,
target_id TEXT NOT NULL,
amount INTEGER NOT NULL,
description TEXT,
chat_id TEXT,
witnesses TEXT, -- JSON array
status TEXT DEFAULT 'draft',
created_at TEXT,
accepted_at TEXT,
completed_at TEXT,
cancelled_at TEXT,
escrow_tx_id TEXT,
votes_approve TEXT, -- JSON array
votes_reject TEXT, -- JSON array
junona_approved INTEGER, -- 0/1/NULL
junona_reason TEXT
);
Индексы
CREATE INDEX idx_contracts_creator ON contracts(creator_id);
CREATE INDEX idx_contracts_target ON contracts(target_id);
CREATE INDEX idx_contracts_status ON contracts(status);
Безопасность
Защита от атак
| Атака | Защита |
|---|---|
| Fake witnesses | Верификация через Telegram API |
| Double-spend escrow | Атомарные транзакции |
| Сговор большинства | Право вето Юноны |
| Размытые условия | Валидация ExecutabilityResult |
| Escrow theft | ML-DSA-65 подписи |
Криптография
- Все транзакции подписаны ML-DSA-65 (FIPS 204)
- Постквантовая устойчивость
- Размер подписи: 3309 байт
Команды бота
| Команда | Описание |
|---|---|
/contract |
Начать диалог о контракте |
/contract @user 100 условие |
Создать контракт |
/contract accept ID |
Принять (Сторона Б) |
/contract complete ID |
Завершить (Сторона А) |
/contract cancel ID |
Отменить |
/contract yes ID |
Голосовать ЗА |
/contract no ID |
Голосовать ПРОТИВ |
Примеры использования
Доставка еды
/contract @delivery 500 Доставка пиццы Маргарита до 18:00 по адресу ул. Ленина 15
Фриланс
/contract @designer 5000 Дизайн логотипа в 3 вариантах, исходники в Figma, срок 7 дней
Аренда
/contract @landlord 50000 Аренда квартиры на ул. Пушкина 10 на январь 2026
Roadmap
v1.0 (текущая)
- Создание контрактов в группах
- Голосование участников
- Escrow механизм
- Решение Юноны
v1.1 (планируется)
- Многоэтапные контракты
- Автоматические триггеры (время, события)
- Интеграция с внешними оракулами
v2.0 (будущее)
- Кросс-чейн escrow
- Шаблоны контрактов
- Репутационная система сторон
Montana Protocol — Time is the only real currency.