Начиналось всё с простой мысли: тапалки в 2024 году собрали сотни миллионов пользователей, но монеты там по сути просто записи в базе данных. А что если под кнопкой будет настоящий proof-of-work, как в Bitcoin, только без очередной гонки за железо? И сделать майнинг настолько простым, буквально дать возможность майнить за чашкой кофе.

Но я решил пойти другим путем и еще сильнее снизить порог входа в майнинг, но уже популярной механикой, которую попробовали уже сотни миллионов человек.

Откуда вообще появилась идея

PoW все знают по Bitcoin. Потом были Chia и другие попытки снизить порог входа - мол, у всех есть диск, значит шанс будет у всех. На практике и Bitcoin, и Chia всё равно упираются в капитал: дешёвое электричество, фермы, оптимизация софта. Домашний CPU уже давно вышел из игры, была смена алгоритмов.

Параллельно многие помнят майнеры в телефонах через вирусы под Monero: процессор работает, пользователь об этом даже не знает.

Я смотрел на тапалки и думал: людей уже приучили нажимать кнопку, но полноценный POW туда никто нормально не встроил.

Первая проблема с которой я столкнулся. Если вычисление будет происходить на телефоне, то это 100% проигрышь любому ПК или ASIC майнер устройству. И если задача для решения будет известна изначально майнерам, то будет опять бесконечная гонка хэшрейта.

В итоге задача сформулировалась так: один тап = одна честная попытка PoW, а не бесконечный перебор.

Ниже расскажу, как это реализовано, зачем нужны commitment и challenge, и какие результаты получились в тестовой сети. Это не whitepaper, а скорее технические заметки по текущему прототипу.

1. Стейк вместо соревнования по количеству ядер

Для участия нужен MINER_STAKE - заморозка монет на 10 000 блоков (примерно двое суток). Это не декоративное ограничение, а фильтр намерения. Валидатор видит стейк on-chain и только после этого выдаёт попытки. Атака становится значительно дороже, для захвата сети нужны монеты.

Стейк даёт кредиты. Условно: заморозил 1000 MRS - получил право на 1000 хэшей в рамках правил сети. Есть окна refill и лимиты, поэтому бесконечного потока попыток нет. Refill block - это значение при котором выданные кредиты сбрасываются по циклу, сейчас стоит каждые 100 блоков.

Мощный сервер не может просто открыть миллион параллельных submit’ов. Без стейка и кредитов challenge нода не выдаст.

Полного равенства здесь нет. У кого больше стейка, у того больше попыток в окне. Но это уже не ситуация, когда владелец ASIC забирает всё только за счёт железа.

2.Нужен безопасный подход, чтобы майнер проверял собственный ответ локально.

Если взять всего 50 000 активных майнеров, которые отправляют каждый неудачный хэш на submit валидатору, получится фактически DDoS.

Поэтому схема устроена так:

  • проверка идёт на устройстве;

  • на ноду отправляется только результат, который прошёл сложность сети.

Но здесь появляется другая проблема. Пользователь получил challenge, потратил один кредит, а потом локально перебрал миллион nonce и нашёл удачный вариант. Именно этот сценарий закрывает commitment.

3. Commitment, challenge и submit - подход который решает все проблемы.

Nonce - случайное значение, которое клиент генерирует до получения задачи.

Commitment = SHA256(nonce). Его клиент отправляет заранее.

Challenge выдаётся только если:

  • стейк активен;

  • есть кредиты;

  • commitment уже сохранён;

  • за попытку списан один кредит.

Дальше вычисляется:

clientHash = SHA256(challenge + nonce)

Полученный хэш должен пройти target сложности сети, как в обычном PoW.

При submit нода заново проверяет:

  • SHA256(nonce) == commitment

  • SHA256(challenge + nonce) == clientHash

  • подпись кошелька

  • высоту блока и остальные правила консенсуса

  • отсутствие повторного использования hash (anti-replay)

Если любая проверка не проходит, попытка отклоняется.

Если объяснять совсем простыми словами: сначала вы кладёте ответ в конверт и запечатываете его, а уже потом получаете вопрос. После получения вопроса заменить ответ уже нельзя. Здесь commitment играет роль такого конверта.

В результате под кнопку “Тап” можно положить полноценный PoW-механизм.

Дополнительные ограничения:

  • commitment отправляется до challenge

  • один challenge = один кредит

  • кредиты выдаются через стейк и refill

  • не более двух активных challenge на адрес

  • TTL challenge - 5 секунд

  • rate limit на submit

  • anti-replay.

Поэтому победа зависит не только от скорости вычисления SHA256, а от количества легальных попыток, доступных через стейк и кредиты. GPU может ускорить локальный перебор внутри отдельной попытки, но не даст бесконечный поток попыток без ограничений протокола.

Что протокол не обещает.

Sybil

Commitment никак не мешает создать много адресов с отдельными стейками. Ограничение работает на уровне адресов, а не по принципу “один человек = один телефон”. Это допустимый компромисс модели.

Стейк всё равно имеет значение

Чем больше заморожено монет, тем больше кредитов доступно. Полностью уравнять всех участников такой подход не пытается.

Пока это тестовая сеть.

Сейчас работает один валидатор на VPS. В тестировании участвуют знакомые и их знакомые. Поэтому цифры ниже относятся именно к тестовой среде, а не к гипотетической сети с миллионом пользователей.

Частичное доверие к ноде.

На текущем этапе клиент частично доверяет ноде. Публикация исходников и появление независимых нод должны уменьшить этот фактор. (об этом в конце статьи)

Цифры из теста.

На момент написания:

  • в сети уже около 90 000 блоков;

  • участвуют 68 майнеров;

  • дополнительно работает ферма из трёх телефонов для стабильности сети.

Нода запущена на минимальном VPS (2 vCPU).

При примерно 50 майнерах загрузка CPU держится в районе 5-6% вместе со всей остальной нагрузкой ноды. Сами майнеры занимают менее одного процента.

Полноценные нагрузочные тесты через k6 пока не проводились. Сейчас я в основном смотрю на метрики системы, логи и поведение сети под реальной нагрузкой.

Основной трафик приходится на выдачу challenge и проверку стейка. Submit приходит относительно редко, потому что отправляются только успешные результаты PoW.

Стек:

  • fullnode на C++, который запущен на VPS Ubuntu 24.

  • Telegram Mini App

  • Android-клиент

Исходники:

https://github.com/evilmarsello/marsachain

Fullnode планирую выложить в июне. Код Telegram Mini App и Android-клиента уже опубликован.

Что дальше.

Планы на ближайшее время:

  • публикация исходников ноды

  • запуск дополнительных независимых нод

  • полноценные нагрузочные тесты

  • mining pools с прозрачным settlement

Год назад это была просто идея. Сейчас уже есть работающая тестовая сеть, реализованный протокол challenge/submit, мобильные майнеры и продолжающаяся генерация блоков.

Если будет интерес, могу отдельно расписать детали API (/mining/challenge, /mining/submit), формат сообщений для подписи и устройство MINER_STAKE на уровне блокчейна.

Если кто-то найдёт уязвимость или слабое место в схеме commitment, буду только рад. Такие вещи лучше находить на этапе тестовой сети, чем после запуска основной.

Disclaimer: сеть экспериментальная, это не призыв к каким-либо действиям. Монеты не продаются. Для тестирования раздаю их желающим.

Ссылка на TG Marsa chain.

База данных с высотой блоков не обнуляется, но во время оптимизаций возможны перезапуски нод и временные простои.