Stanislav V. просил реализацию алгоритма BLAKE для FPGA - она есть у меня.
Конечно, делал я не все сам, а использовал и адаптировал для платы Марсоход3 уже готовый проект https://github.com/kramble/FPGA-Blakecoin-Miner
Достаточно подробное описание алгоритма SHA-3/BLAKE показано вот в этом видео
Несмотря на то, что у меня был готовый проект от kramble, адаптация под нашу конкретную плату была не очень простым делом. В чем же сложность? Вот:
- У меня нет плат, для которых был сделан проект изначально. Я не могу с уверенность сказать, что исходный проект, который я собираюсь адаптировать для моей платы работает без ошибок. Нельзя его сразу взять и попробовать. Я должен сперва адаптировать, внести изменения и в процессе не добавить новых ошибок, потом пробовать и надеяться, что как-то заработает.
- Исходный проект реализован для плат с несколькими чипами FPGA - это довольно сильно усложняет и без того сложный проект.
- Исходный проект был для чипов Xilinx, у меня же Altera/Intel.
- Нужна программа для майнинга - cgminer. В проекте от kramble вроде бы есть патчи для cgminer-3.1.1 и cgminer-3.4.3 - обе версии достаточно старые да и патчи выглядят не убедительно. Как в итоге заставить cgminer работать именно с моей платой?
- Куда подключаться и что майнить?
В общем, вопросов больше, чем ответов.
Тем не менее, я сделал это. Вы можете взять готовый проект здесь: https://github.com/marsohod4you/blake-miner
После git clone вы получите папку в которой будет проект FPGA, папка с тестовыми скриптами на питоне и модифицированный cgminer.
Проект FPGA открывать нужно с помощью Intel Quartus Prime v17.0. Для платы Марсоход3 убедитесь, что выбрана ревизия проекта blake_max10. Компилируйте его:
В проекте установлен verilog параметр LOCAL_MINERS=1. Это число определяет сколько вычислителей мы собираемся впихнуть в FPGA. В мою MAX10 платы Марсоход3 с 50 тысячами логических элементов помещается только один майнер и занимает он 35,8 тысяч логических элементов. Я пробовал этот же проект в плате DE10-Standard с Cyclone V. Там там мне удалось вместить 3 майнера в FPGA.
Количество майнеров, втиснутое в FPGA напрямую определяет его производительность. Смысл майнинга заключается в следующем: нужно постоянно вычислять хэш блока в котором есть 32х битное переменное число nonce. Изменил nonce - вычислил хэш. В общем случае число вычислений хэша - это 2^32 = 4294967296. Цель перебора - если повезет, то получить красивый хэш с большим количеством ведущих нулей. Поэтому понятно, что если в ПЛИС будет, например, два локальных майнера, то задачу можно поделить пополам: первый майнер перебирает нонсе от 0 до 0x7FFFFFFF, а второй от 0x80000000 и до конца 0xFFFFFFFF. Ну это не наш случай - в Марсоход3 помещается только один майнер.
Есть еще одна проблема - тактовая частота. Несмотря на то, что компилятор Quartus показывает Fmax около 90МГц, невозможно запустить майнер даже на 75МГц - очень сильно разогревается чип - боюсь спалить его. Нужно активное охлаждение. Нужно сказать, что вообще чипы MAX10 абсолютно не подходят для майнинга, так как в них встроен регулятор питания ПЛИС. Но, тем не менее, на 50МГц работает.
Итак, 50МГц. Это значит, что производительность моего майнера на плате Марсоход3 всего 50Мегахэшей blake в секунду. Каждый такт рабочей частоты выдается результат по новому хэшу. Можно сравнить с видеокартой - моя NVidia GTX1050 на ноутбуке выдает на блейке примерно 1,25ГХэша, то есть в 25 раз больше..
Тем не менее, если сравнить FPGA майнер с вычислением с помощью процессора, хоть даже какого-то Xeon или Core-i7, я думаю тут FPGA майнер даже на 50МГц скорее всего обгоняет процессор (в одном потоке точно).
Мой FPGA проект отличается от исходного следующим:
- выбросил поддержку slave чипов FPGA, сейчас поддерживается только один чип
- убрал Xilinx зависимые части, в частности PLL и перезагрузку PLL. В оригинальном проекте частота PLL могла быть запрограммирована извне. Это сделано для автоматической регулировки - если число аппаратных ошибок росло вследствие перегрева, то программа на лету должна была снизить тактовую частоту проекта. Я это, извините, выбросил. Практически майнить я не собираюсь, это только исследовательский проект.
- добавил Altera PLL
- изменил индикацию активности платы, все отображаю на имеющиеся у меня 8 светодиодов платы Марсоход3
В проект cgminer так же внесены значительные изменения. В основном они касаются обнаружения платы, программирования ее нужными параметрами (скорость обмена, размер буферов, таймауты).
Проверить работоспособность платы можно питоновскими скриптами. Питоновский скрипт testblakeminer.py из папки blake-miner\PyTest\ считывает "эталонные задачи" из текстового файла test_data.txt. Там примерно вот такие строки:
0000007057711b0d70d8682bd9eace78d4d1b42f82da7d934fac0db4001124d600000000cfb48fb35e8c6798b32e0f08f1dc3b6819faf768e1b23cc4226b944113334cc45255cc1f1c085340967d6c0e000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000
Внимание! это не та строка, которая посылается в майнер! Эта строка вероятно похожа на ту, которую cgminer получает в качестве задания (но это не точно). Строка преобразуется, разворачивается с конца в начало. В плату уже посылается вот такое:
000007ff0e64dc764053081c1fcc5552c44c33134e94e7889601c1de46f746e751d100c832a569ef69ab9f4736b9db3e3e918f62
Первое слово 0х000007FF для моей платы вообще ничего не значит. В принципе это управляющее слово, которое может задавать частоту PLL или другие параметры. Второе слово 0х0e6c7d96 задает начальное нонсе с которого начинать считать хэш. Поскольку это тестовые данные, то здесь сразу передается "нужный и правильный нонсе" для начала вычисления. Плата начинает считать с этого 0х0e6c7d96 и тут же понимает, что это правильный nonce и выдает его в качестве результата назад в тестовую программу. Передача идет по последовательному порту на скорости 115200.
Вот результат исполнения тестовой программы на python:
Тестовая программа дает 10 заданий и получает 10 правильных ответов.
Пробовать cgminer проще всего из Linux Ubuntu.
Чтобы скомпилировать проект зайдите в папку cgminer и запустите:
#./configure --enable-icarus --without-curses
#make
Перед запуском майнера нужно выключить драйвер ядра FTDI:
#sudo rmmod ftdi_sio
Для майнинга нужно определиться с пулом и с монетой, которую хотите майнить. Для блейка как я понимаю есть два варианта:
- blakecoin merged mining;
- vcash.
Чтобы майнить blakecoin нужно зайти на сайт пула http://eu3.blakecoin.com/ и зарегистрироваться там. Создать так называеые "воркеры" - worker.
Потом запускать cgminer с параметрами своего воркера:
#./cgminer -o stratum+tcp://eu3.blakecoin.com:3334 -u nckma.worker1 -p worker-pwd --debug --hotplug 0
Второй вариант - это майнинг валюты VCASH, она использует тот же алгоритм Blake.
Нужно установить себе программу кошелька VCASH и создать кошелек. Его адрес будет выглядеть примерно вот так: VwM1AMGtGN4rTPGDBxTHpk8gQzFMuryAWp
Теперь можно запускать майнер в командной строке Linux:
#./cgminer -o stratum+tcp://pool.vchain.info:3032 -u VwM1AMGtGN4rTPGDBxTHpk8gQzFMuryAWp -p pwd --debug --hotplug 0
Пул для криптовалюты VCASH шорош тем, что у него есть разные TCP порты для майнеров разной производительности.
Если для криптовалюты blakecoin вы можете запустить майнер на неделю и ниразу не увидите никакого позитивного сообщения от cgminer - сложность алгоритма высока, очень мала вероятность, что вам выпадет счастливый билет.
В случае пула pool.vchain.info вы сразу говорите, что у вас слабый майнер и подключаете его к порту 3032. Это значит, что пул будет принимать ваши решения, даже когда они "слабы", то есть мало ведущих нулей в решении. По крайней мере вы можете увидеть, что пул принял ваш труд. Вот я сделал скриншот во время майнинга VCASH:
Здесь хотя бы я вижу SUCCESS/ACCEPTED и сообщение yay!!!...
Но даже и при таком радостном сообщении yay! не расчитывайте, что удастся что-то в действительности намайнить. Решение то принято пулом, но оно не достаточное для начисления вам монеток, все еще мало ведущих нулей в хэше решения.
Хочу сказать, что дело майнинга FPGA на блейке в настоящее время абсолютно бесперспективное, так как сложность алгоритма сильно выросла буквально в конце января, вот график для blakecoin:
Еще 15го января можно было надеяться на результат, сложность алгоритма была не велика, требовалось найти красивый хэш с 31м ведущим нулем. Но после 28го все изменилось кардинально. Сейчас уже сложность около 34х ведущих нулей. Думаю это связано с тем, что вероятно появились ASIC майнеры для блейка.
Для VCASH ситуация аналогична.. ASIC майнеры вытесняют майнеров с FPGA и видеокартами..
Тем не менее, я надеюсь, что эта статья будет полезной тем, кто исследует алгоритмы майнинга и криптовалюты.
Чтобы понять как именно FPGA вычисляет хэш можно использовать симуляцию Verilog проекта в icarus verilog или в ModelSim. Возможно я как нибудь напишу про это. Так же не раскрытой осталась тема внутреннего устройства программы cgminer. Возможно об этом в напишу в другой раз.
Подробнее...