# TimeChain — Спецификация протокола Montana **Версия:** 10.0.0 (2026-03-30) ## Определение Децентрализованная сеть. Время — единственная реальная валюта. 1 секунда присутствия узла в сети = 1 Ɉ. Консенсус: **Proof of Time (PoT)** — последовательное SHA-256 хэширование (VDF) как доказательство прошедшего времени. Один криптографический примитив — SHA-256. Временные окна возникают из вычислений. Генезис: 09.01.2026 00:00:00 MSK. --- ## Криптография Единственный примитив — SHA-256. Подписи, адреса, консенсус, Merkle-деревья построены на SHA-256. Квантовая устойчивость обеспечивается природой хэш-функции: алгоритм Гровера сокращает безопасность с 256 до 128 бит. ### Подписи — WOTS+ (Winternitz One-Time Signature) Хэш-подпись на SHA-256. Каждый ключ используется однократно — одна подпись на один UTXO. Приватный ключ представляет собой начальные значения хэш-цепочек. Подпись содержит промежуточные точки цепочек, позиция которых кодирует подписываемое сообщение. Подпись математически привязана к конкретной транзакции. Параметр w=256: | Компонент | Размер | |-----------|--------| | Приватный ключ (seed) | 32B | | Публичный ключ (сжатый) | 32B | | Подпись | 1 120B | Деривация ключей: `secret_n = SHA-256("montana-tx" || seed || n)`. Один seed (32B) порождает цепочку одноразовых ключей через инкрементальный counter. ### Адреса Формат: `mt` + Base58(SHA-256(pubkey) + checksum). Деривация ключей и адресов описана в разделе «Ключи». --- ## Транзакции — UTXO модель Модель неизрасходованных выходов. Каждая транзакция потребляет существующие UTXO и создаёт новые. ### Формат транзакции | Компонент | Размер | |-----------|--------| | WOTS+ подпись | 1 120B | | UTXO reference (tx_hash + index) | 36B | | Выходы (2 × (address 49B + amount 8B)) | 114B | | Slot index | 4B | | **Итого** | **~1.3 KB** | Вход: WOTS+ подпись (привязана к данным транзакции) + ссылка на UTXO. Выход: адрес получателя + сумма. ### Верификация баланса sum(входы) = sum(выходы) + fee. Каждый узел проверяет баланс арифметическим сложением. Dust limit: каждый выход ≥ 1 Ɉ (MINIMUM_UTXO). ### Комиссия Комиссия = разница между суммой входов и суммой выходов. Минимум 1 mɈ (миллисекунда). Размер адаптивный — рассчитывается по формуле на основе заполненности окон τ₁. Пользователь знает комиссию до отправки. Победитель окна τ₂ получает сумму всех комиссий транзакций в окне. ### UTXO Формат: `{address, amount, tx_hash, output_index}`. UTXO существует до момента траты. Трата фиксируется использованием WOTS+ подписи. Повторная трата исключена конструкцией данных. ### Coinbase Победитель τ₂ создаёт coinbase-транзакцию. Входов нет. Выходы содержат эмиссию за τ₂ + сумму комиссий всех транзакций окна. Supply audit при финализации τ₂: суммарная эмиссия coinbase от генезиса сверяется с расчётной по формуле халвинга. --- ## Таймчейн Три логических двигателя с односторонним потоком зависимостей: Beacon → Service → Execution. ### Beacon — глобальные часы протокола Непрерывная последовательная SHA-256 цепочка. Общий источник случайности и ритм сети: ``` B_r = SHA-256^D(B_{r-1}) ``` D — количество последовательных хэшей за один слот τ₁. Beacon продвигается по расписанию финализированных слотов. Для фиксированного индекса r значение B_r совпадает у всех честных узлов. Каждый узел вычисляет Beacon независимо — результат детерминирован. Beacon не зависит от состояния, транзакций и поведения отдельных узлов. ### Service — персональный VDF узла Доказательство непрерывного присутствия конкретного node_id. Якорится в Beacon каждый слот: ``` S_{i,s,0} = SHA-256(S_{i,s-1,m} || B_s || node_id_i) S_{i,s,j+1} = SHA-256(S_{i,s,j}) для j = 0..m-1 ``` Три компонента seed: предыдущий endpoint (непрерывность службы), значение Beacon (протокольное время), node_id (идентичность). m последовательных хэшей за слот — доказательство работы. Service зависит от Beacon. Beacon не зависит от Service. ### Execution — содержимое блока Приём, верификация транзакций (WOTS+ подписи, баланс) и формирование канонического набора. Транзакция получает Inclusion Certificate (IC) когда её наличие подтверждено подписанными чекпоинтами суммарного веса >2/3 active set. Канонический набор τ₂ состоит из всех транзакций с валидным IC, полученным до cutoff последнего слота окна. Канонический порядок: (earliest_certified_slot, txid). Конфликты UTXO разрешаются правилом first valid in canonical order wins. Победитель лотереи собирает блок механически по этим правилам, добавляя coinbase. Отклонение от правил — невалидный блок, переход ко второму месту. Любой узел независимо вычисляет тот же набор и тот же порядок. Execution зависит от Beacon и Service. Обратных зависимостей нет. С ростом TPS сети дополнительные ядра подключаются для верификации транзакций. Минимум для валидатора: 3 логических ядра (Beacon + Service + Execution). ### Чекпоинт Каждый валидатор в каждом слоте τ₁ публикует подписанный чекпоинт: ``` CP_{i,s} = Sig_i(epoch, slot, B_s, S_{i,s,m}, tx_root_{i,s}) ``` Чекпоинт связывает протокольное время (B_s), доказательство службы (S_{i,s,m}) и локальную картину транзакций (tx_root) в одну подписанную аттестацию. ### Входной барьер — Adaptive Cooldown Допуск к консенсусу определяется Adaptive Cooldown — динамическим входным периодом, чувствительным к темпу роста сети. #### Формула Скользящее окно из 3 последних τ₃ (42 дня). Темп роста — процент новых регистраций от количества активных узлов. Медиана трёх последних значений определяет норму: ``` growth_rate = new_registrations_in_τ₃ / active_nodes_at_start × 100% median = median(growth_rate за 3 предыдущих τ₃) excess = ((current_growth - median) / median) × 100% excess ≤ 0%: cooldown = 7 дней 0% < excess ≤ 100%: cooldown = 7 + excess × 35 / 100 excess > 100%: cooldown = 42 дня ``` Минимум 7 дней. Максимум 42 дня (3 × τ₃). Bootstrap: `effective_median = max(median, 1%)`, `effective_active = max(active_nodes, 10)`. #### Асимметрия Повышение cooldown — немедленное, без ограничений. Снижение — не быстрее 20% за τ₃. Атака поднимает барьер мгновенно. Возврат к норме занимает месяцы. #### Реакция внутри τ₃ Cooldown пересчитывается в реальном времени по проекции темпа на конец окна: ``` projected_growth = current_registrations / elapsed_fraction elapsed_fraction = elapsed_slots / total_slots_in_τ₃ ``` Счётчик регистраций детерминирован: считаются только сертифицированные регистрации (с IC) в каноническом порядке (slot, txid). #### Фиксация Cooldown закрепляется за узлом в момент регистрации. Пересчёт не меняет cooldown уже зарегистрированным узлам. #### Во время cooldown Узел запускает Beacon + Service VDF сразу при регистрации. Валидирует транзакции, ретранслирует данные, публикует чекпоинты. Узел усиливает сетевой слой и несёт стоимость допуска к консенсусу. Стоимость каждого Sybil-узла: 1 service-core непрерывно на весь период cooldown. #### После cooldown Вес начинается с 0 и растёт линейно с каждым подписанным τ₂. Работа во время cooldown полезна сети, но не конвертируется в консенсусный вес. --- ## Потоковая модель транзакций Транзакции текут непрерывно. Узел получает транзакцию → проверяет подпись и баланс → передаёт в P2P gossip. Время подтверждения определяется скоростью интернета отправителя и P2P-распространением (~2-5 секунд). Транзакция включается в канонический набор τ₂ при получении Inclusion Certificate (>2/3 активного веса подтвердили через чекпоинты). Транзакции не ожидают появления τ₁ или τ₂ — окна являются чекпоинтами, а не условиями приёма. --- ## Временные слои (τ) ``` τ₁ (≈60с) → τ₂ (10 × τ₁) → τ₃ (2016 × τ₂) → τ₄ (~104 × τ₃) ``` ### τ₁ — Слот (≈60 секунд) - Beacon продвигается на D хэшей - Service VDF продвигается на m хэшей с якорем в текущем B_s - Валидаторы публикуют подписанные чекпоинты CP_{i,s} - Узлы обмениваются чекпоинтами и транзакциями по P2P - Транзакции набирают Inclusion Certificates ### τ₂ — Финализация и эмиссия (10 × τ₁ ≈ 10 минут) - Active set (состав и веса участников) фиксируется в начале τ₂ - Канонический набор: все транзакции с валидным IC до cutoff последнего слота - Лотерея: `ticket_i = S_{i,final,m} / weight_i`, победитель = min(ticket_i) среди допущенных - Победитель публикует proposal блока (канонический набор TX + coinbase) - Финальность: Quorum Certificate (QC) на заголовок блока от >2/3 активного веса - Seed следующей эпохи: `seed_i = SHA-256(B_r || active_set_root_r || node_id_i)` - Coinbase: вся эмиссия + все комиссии → победителю - Supply audit: суммарная эмиссия coinbase от генезиса сверяется с расчётной - Разрешение форков: приоритет ветки с наибольшим суммарным Beacon-доказательством Beacon safety: компрометация значения Beacon требует нарушения свойства последовательности SHA-256 VDF или подделки finality certificate порогом >2/3 активного веса. Beacon liveness: задержка продвижения Beacon требует блокировки finality порогом >1/3 активного веса. ### τ₃ — Адаптация (2016 × τ₂ ≈ 14 дней) - Калибровка D и m: медиана слотовых интервалов сверяется с целевыми, цель τ₁ ≈ 60 секунд - UTXO Merkle Root: включается в заголовок последнего τ₂, ратифицируется QC - Криптографическая амнезия: тела транзакций и WOTS+ подписи старше 8 × τ₃ удаляются. Цепочка заголовков τ₂ (Beacon, QC hash, UTXO root, tx root) сохраняется навсегда - Вызов архивных узлов: retention audit по случайному историческому блоку, архивный узел предоставляет данные + Merkle proof - Пересчёт параметров окна τ₁ ### τ₄ — Халвинг (~104 × τ₃ ≈ 4 года) - Коэффициент эмиссии делится на 2 --- ## Консенсус — Proof of Time (PoT) ### Три двигателя **Beacon** — глобальные часы. Чистая VDF-цепочка `B_r = SHA-256^D(B_{r-1})`. Источник случайности для лотереи. Продвигается по расписанию финализированных слотов. **Service** — персональный VDF. Якорится в Beacon каждый слот. Доказывает непрерывное присутствие node_id. Определяет вес и лотерейный билет. **Execution** — содержимое блока. Канонический набор TX определяется Inclusion Certificate (>2/3 активного веса). Порядок детерминирован. Победитель собирает блок механически. Зависимости односторонние: Beacon → Service → Execution. Отказ в Execution не заражает случайность. Отказ конкретного узла в Service не заражает общий ритм. ### Стаж и вес #### Определение Вес узла — длина его непрерывной Service цепочки, измеренная в подписанных τ₂: ``` weight_i = min(chain_length_i, MAX_WEIGHT) MAX_WEIGHT = количество τ₂ в одном τ₄ (~105 000) ``` Вес — единственная мера влияния узла в протоколе. Определяется только временем непрерывной службы. #### Как растёт Цепочка растёт на 1 за каждый τ₂ с засчитанным участием. Участие в τ₂ засчитывается при публикации не менее k валидных чекпоинтов из n слотов окна (k=8, n=10). Чекпоинт валиден при выполнении условий: подписан ключом node_id, содержит корректные epoch и slot, якорится в соответствующий Beacon slot, получен сетью до конца следующего слота. #### Обрыв Если узел за период τ₃ отработал менее 1613 из 2016 окон τ₂ — цепочка обрывается, weight = 0. Узел начинает копить длину заново. Adaptive Cooldown повторно не проходится (node_id уже зарегистрирован). #### Три зоны - **Cooldown (7-42 дня):** допуск закрыт, weight = 0, узел работает как валидатор и ретранслятор - **После cooldown — 4 года:** weight растёт линейно с каждым подписанным τ₂ - **4+ года (≥ τ₄):** weight = MAX_WEIGHT, потолок Потолок τ₄ предотвращает бесконечный рост преимущества ранних участников. Все цепочки старше 4 лет равны между собой. #### На что влияет вес Вес определяет три вещи: **1. Лотерея.** Вероятность победы в τ₂ пропорциональна весу: ``` ticket_i = S_{i,final,m} / weight_i winner = min(ticket_i) P(node_i) = weight_i / Σ weight(all_nodes) ``` Больше вес → меньше ticket → выше шанс. Узел с weight = 0 не участвует в лотерее. **2. Голосовая сила в консенсусе.** Inclusion Certificate и Quorum Certificate считаются по весу, а не по количеству узлов: ``` IC валиден: Σ weight(подтвердивших) > 2/3 × Σ weight(active_set) QC валиден: Σ weight(подписавших) > 2/3 × Σ weight(active_set) ``` Голос узла в IC и QC пропорционален его weight. Sybil-атака через 1000 свежих узлов (weight ≈ 0 каждый) не даёт голосовой силы. Для контроля консенсуса атакующий должен накопить >1/3 суммарного веса сети — это годы непрерывной службы. **3. Допуск.** weight = 0 означает: узел участвует в сети (валидация, ретрансляция), но не участвует в лотерее и не имеет голосовой силы в IC/QC. ### Победитель τ₂ Победитель определяется после закрытия окна τ₂. Каждый узел раскрывает свой Service VDF endpoint. Минимальный ticket среди допущенных — победитель (формула в разделе «На что влияет вес»). Победитель публикует proposal блока: канонический набор TX (определён IC) + coinbase. Содержимое блока детерминировано правилами IC и каноническим порядком. Свобода победителя в формировании блока: ноль. Финальность блока возникает после QC на заголовок от >2/3 активного веса. ### Верификация Победитель публикует: `{node_id, Service checkpoints[], proposal}`. Верификация Service VDF: пересчёт K сегментов параллельно. K ≈ 960. На C ядрах: ~(K/C) × t_segment секунд. 8 ядер → ~7.5 сек. 64 ядра → ~1 сек. Верификация proposal: независимый расчёт канонического набора по IC и сравнение с proposal. ### Устойчивость - **Proposer grinding** исключён: победитель не выбирает состав блока, канонический набор определяется IC (>2/3 активного веса) - **Committee grinding** исключён: Beacon не зависит от состояния и транзакций, seed лотереи строится из Beacon - **Node_id гриндинг** исключён: Adaptive Cooldown (7-42 дня), Beacon неизвестен при регистрации - **Предвычисление** исключено: seed содержит текущее значение Beacon - **Replay** исключён: Beacon уникален для каждого τ₂ - **Аппаратное преимущество** ограничено: последовательное хэширование масштабируется тактовой частотой и IPC, а не количеством ядер или бюджетом - **Sybil-барьер**: Adaptive Cooldown (7-42 дня, асимметричный) + Service VDF (физическое ядро) + линейный рост веса от нуля - **Аристократия** ограничена: потолок веса τ₄, после 4 лет все равны --- ## Адреса и переводы ### Полный флоу перевода ``` 1. Боб: кошелёк генерирует keypair_7 → address_7 2. Боб → Алисе: "отправь на mt4ZGfe..." (address_7) 3. Алиса формирует транзакцию: Вход: UTXO на 80 Ɉ (address_3) Выход: 50 Ɉ → address_7 (Бобу) Выход: 30 Ɉ → address_12 (сдача, новый адрес) 4. Алиса подписывает WOTS+ (привязано к выходам) 5. Алиса рассылает транзакцию узлам сети 6. Каждый узел проверяет: WOTS+ подпись валидна для pubkey address_3 ✓ 80 = 50 + 30 ✓ 7. Транзакция распространяется через P2P gossip 8. Транзакция получает IC (>2/3 валидаторов подтвердили в чекпоинтах) 9. При финализации τ₂: UTXO address_3 потрачен 10. Созданы UTXO: 50 Ɉ @ address_7, 30 Ɉ @ address_12 ``` ### Баланс Кошелёк деривирует все адреса из seed, сканирует UTXO set. Сумма непотраченных UTXO = баланс. Бэкап = seed (32 байта). --- ## Эмиссия ### Единица 1 секунда Montana = 1 $MONT = 1 Ɉ = 1 000 mɈ = 1 000 000 μɈ = 1 000 000 000 nɈ Точность: 9 знаков после запятой (наносекунда). `lim(t → ∞) 1 Ɉ → 1 секунда`. Халвинг делает Ɉ дефицитнее, секунды идут с постоянной скоростью. Чем дальше от генезиса, тем ценнее каждый Ɉ, тем ближе он к реальной секунде. | Параметр | Значение | |----------|----------| | Генезис | 09.01.2026 00:00:00 MSK | | Эмиссия за τ₂ | 50 минут (3 000 Ɉ) | | Халвинг | ÷2 каждые τ₄ | | TIME_BANK | 21 000 000 минут (~40 лет) | | После истощения | Oracle Mode (верификация) | | Эпоха | Годы | Эмиссия за τ₂ | |-------|------|--------------| | τ₄ #0 | 0-4 | 50 мин (3 000 Ɉ) | | τ₄ #1 | 4-8 | 25 мин (1 500 Ɉ) | | τ₄ #2 | 8-12 | 12.5 мин (750 Ɉ) | | τ₄ #3 | 12-16 | 6.25 мин (375 Ɉ) | ### Распределение Победитель τ₂ получает всю эмиссию + все комиссии окна. Один выход в coinbase. ### Якорь цены — Bitcoin ``` 1 BTC = block_interval ÷ block_reward 1 BTC = 600 ÷ 3.125 = 192 Ɉ (эпоха 2024-2028) ``` | Эпоха | Награда за блок | 1 BTC = Ɉ | |-------|----------------|-----------| | 2024-2028 | 3.125 BTC | 192 | | 2028-2032 | 1.5625 BTC | 384 | | 2032-2036 | 0.78125 BTC | 768 | Константа между халвингами. Справочная привязка, протокол функционирует автономно. --- ## Пропускная способность Размер транзакции: ~1.3 KB. | Канал узла | TPS | |-----------|-----| | 10 Mbps | ~960 | | 100 Mbps | ~9 600 | | 1 Gbps | ~96 000 | ### Адаптивный размер окна Пересчёт в τ₃: - Заполненность > 80% → увеличение размера окна - Заполненность < 20% → уменьшение размера окна - Шаг: ±20% за τ₃ - Диапазон: 1 MB — 100 MB --- ## Хранение | TPS | Архивный (20 лет) | Полный (112 дней) | Pruned | SPV | |-----|-------------------|-------------------|--------|-----| | 7 | ~6 TB | ~80 GB | ~15 GB | ~1 GB | | 100 | ~88 TB | ~1.1 TB | ~15 GB | ~1 GB | | 960 | ~850 TB | ~10.5 TB | ~15 GB | ~1 GB | | Тип узла | Содержимое | Лотерея | |----------|-----------|---------| | Полный | Скользящее окно 8 × τ₃ + UTXO set + заголовки | weight × 1 | | Архивный | Полная история от генезиса | weight × 1 + archive reward | | Pruned | UTXO set + заголовки + UTXO snapshots τ₃ | Наблюдатель | | SPV | Заголовки + собственные транзакции | Наблюдатель | Узел самостоятельно выбирает тип. Участие в лотерее: полный или архивный узел. Архивные узлы получают отдельную archive reward за прохождение retention audit. ### Fast Sync (новый узел) 1. Цепочка заголовков τ₂ от генезиса — проверка Beacon-цепочки и QC (мегабайты) 2. UTXO Merkle Root из последнего τ₃ 3. UTXO snapshot — проверка SHA-256(snapshot) == UTXO Merkle Root (гигабайты) 4. Транзакции с подписями за последние 112 дней (скользящее окно) 5. Узел синхронизирован и готов к участию --- ## Ключи ``` seed (32B) ├── Транзакции: SHA-256("montana-tx" || seed || counter) └── Идентификатор узла: SHA-256("montana-node" || seed) ``` Все деривации — SHA-256. --- ## Зависимости | Библиотека | Назначение | |------------|------------| | `hashlib` (stdlib) | SHA-256 | | `sqlite3` (stdlib) | Хранение | | `socket` (stdlib) | P2P сеть | Base58, Merkle-деревья, WOTS+, VDF — собственная реализация. Production: C/Rust. --- ## Архитектура ``` ┌─────────────────────────────────┐ │ Wallet │ │ Кошелёк, баланс, переводы │ └──────────────┬──────────────────┘ │ ┌──────────────┴──────────────────┐ │ TimeChain │ │ │ │ Beacon ──→ Service ──→ Execution │ (часы) (служба) (состояние) │ │ │ τ₁/τ₂/τ₃/τ₄, UTXO, IC, QC │ │ WOTS+, SHA-256, Base58 │ └─────────────────────────────────┘ ```