С недельку назад узнал про новую фармилку Memhash. Многие уже успели увидеть посты у "инфлов" с рефкой (я тоже дал, но я не инфл), в то время она реально давала существенный буст в виде энергии, которая тратится на майнинг. В общем, это и весь уникальный смысл аппки, псевдо майнинг, отдалённо напоминающий майнинг битка.
Логика майнинга не очень сложная. Серв по вебсокетам вам периодически присылает mainFator и shareFator, которые из себя представляют некое int значение. За отправку valid share вы делите награду за блок между всеми майнерами и получаете свою долю, за добычу блока вы получаете всю награду, выделенную под добычу блока. Что такое валидный хэш? Вам нужно сгенирировать sha256 hash из inputData, которая составляется как строка:
`${index}-${previousHash}-${data}-${nonce}-${timestamp}-${minerId}`
Самое важное из этого - это
previousHash
(предыдущий хеш добытого блока) и index
- номер добываемого блока, остальные значения статичны и их можно указывать самим, не обращаясь к серверу. Если ваш хеш будет < чем мейн или шейр фактор, то вы можете добыть их.Если купить доступ к turbo режиму, аппка создает X кол-во веб воркеров основываясь на ресурсах вашего проца, на которых и происходит параллельное вычисление хеша, что реально ускоряет фарминг.
В общем, сразу стало понятно, что генерация sha хэша на js не особо эффективная и я начал искать способы как ускорить это дело. Первым делом я начал поиск более быстрых библиотек для генерации хешей и нашел сторонние варианты. В результате оптимизации кода и подбора библиотек получилось ускорить генерацию хешей в 15-20 раз, но оказалось, что эти библиотеки синхронные, а сами воркеры работают асинхронно, что приводило к рассинхрону от акутальных блоков. Решается это костылями из генерации нонс бачтами. Этот вариант все еще оказался быстрее оригинального браузерного скрипта и ищет в 5-10 раз быстрее хеши валидных шейров и блоков.
Очевидно, что дальше я начал пытаться переложить генерацию хешей на видюху. Первой идеей было просто вынести подключение к вебсокету мемхеша и генерировать хеш на каком-нибудь более приятном языке для взаимодействия с cuda. Мне всего лишь нужно было получать хеш предыдущего блока и его номер, чтобы сгенерировать input для нового хеша. В этот момент вводят обнову на энергию, которая делает добычу блока немысленно дорогой. У меня падает мотивация и я решаю максимально халявно написать быструю добычу блока. В итоге я пишу генерацию sha256 на библиотеке cudaf на питоне. По синтетическим тестам получается, что валидный хеш для блока генерируется за 1-5 сек на RTX 4090 (в зависимости от сложности), что по сравнению с оригинальным скриптом в пару тысяч раз быстрее (генерация миллиона хешей на cuda 20 мсек, на ориг js библе около 20 сек, на оптимизированном коде и библе около 5 сек). Данные для одного потока и моего проца (I7-13700k).
Поднимаю локальный api и иду тестировать. Результатом всего деяния получается, что я на своей 4090 майню каждый 4й блок в пике сложности и онлайна. Думаю, при желании можно оптимизировать алгоритм и подключить несколько видюх и получить ебанутый результат, но мне оно уже не нужно. Довольный иду тратить всю энергию, майня блок за 8к энергии))
Открыл вам простор для энтузиазма (наверное). Вот оптимизированный пример js воркера.
Кто хочет начать майнить - @memhash_bot
Пост ради поста.