Перевод "Скрытый" майнер Monero

Тема в разделе "Статьи", создана пользователем TheFuzzStone, 26 авг 2017.

  1. TheFuzzStone

    TheFuzzStone Злой администратор
    Команда форума Администратор

    Регистрация:
    18 авг 2017
    Сообщения:
    68
    Симпатии:
    18
    blog-0181932001493026283.png
    Предисловие

    Как то на Биткойнтолке я увидел достаточно конструктивный спор между двумя юзерами об инстамайне одной криптовалюты. Один из участников спора упомянул о “специальной версии майнера Монеро”...

    Мне стало интересно, пошел гуглить. Но все что мне удалось нагуглить -- какие то “скрытые и оптимизированные майнеры” от школо-хацкеров.

    Решил обратится к dEBRUYNE, он любезно поделился ссылкой. Ниже перевод на русский язык.



    Эмиссия Monero... и вектор встроенных функций процессора


    Я проснулся 28 мая 2014, в отпуске с моей семьёй в середине пустыни, обнаружив копию моих приватных исходников на форуме bitcointalk.

    Объявленными "новой оптимизированной версией" майнера для криптовалюты Monero, которая была принята майнерами с энтузиазмом по всему миру. И в этом процессе, моя ежедневная выручка с майнинга упала более чем на 5000 долларов.

    Но давайте начнём с начала, когда я начал углубленное сотрудничество с тремя людьми, которых я никогда не встречал (а имя одного так и осталось для меня неизвестным) - на кону была новая криптовалюта суммой сотни тысяч долларов.
    Всё началось с загадочной заметки от кого-то, с кем я общался в сети, со ссылкой на форум bitcointalk на тему новой валюты под названием "bitmonero". В его заметке было написано лишь:

    Из прошлых сотрудничеств с ним я знал, что у него хорошая чуйка на возможности в криптовалютах. В течение часа или двух, он дополнил:
    AWS, конечно же, был рынком Amazon Web Services, который позволял дешево арендовать умопомрачительные вычислительные мощи на короткие (1 час) сроки. Выгодность AWS - ключевой фактор в майнинге криптовалюты из-за масштабируемости: ты можешь арендовать одну или 10,000 машин, и единственная вещь, о которой останется позаботиться - это цена, начинающая расти, если арендовать слишком много.

    Я был занят в конце семестра и не смог быстро ответить. На следующий день я получил от него email, где он предлагал 1 Биткоин (примерно $600) за разработку майнера, который был бы в 5 раз быстрее, и потом в чате мы обсудили разделение выручки 50/50. Я всё ещё чувствовал себя подавленным из-за объёма работы, но когда я бегло осмотрел код, мне почему-то показалось, что в дальнейшем мне будет весело. Настолько весело, что когда я вернулся домой, то не мог выкинуть из головы эти мысли, 6 часов провозился с кодом, и получил ускорение в 3 раза.

    На следующий день я оставил весточку моему контакту:
    Спустя день я добился ускорения в 5 раз, затем в 8, в течение недели до 11... Довольно примечательно, учитывая то, что разработчик уже начал внедрять некие оптимизации в код.

    Чем больше я смотрел в код, тем больше понимал, что оригинальные разработчики буквально изуродовали майнер. Он не был просто медленным, не был примитивным. Код был умышленно запутан и сделан медленным благодаря абсолютно ненужному копированию, вызовам функций, использованию 8-битных указателей и самой удивительно медленной реализацией алгоритма шифрования AES, которую можно только представить.

    Сейчас стоит ввести вас в краткую историю "Bitmonero" (сейчас называется Monero). В феврале 2014 анонимная группа разработчиков выпустила монету, называющуюся Bytecoin, основанную на полностью новой реализации биткоина как криптовалюты, названной Cryptonote, но с гораздо большей анонимностью, благодаря использованию умного механизма, подобного Диффи-Хеллману, для шифрования адресов назначения и кольцевых подписей Ривеста, для обеспечения использования сети на уровне транзакций, без нужды в миксинге в реальном времени. Это не было превосходным, но было умным, и самой важной вещью стало то, что это было новым, фундаментально отличающимся от Bitcoin решением. Оно привлекло мое внимание.

    Когда Bytecoin был выпущен, он был представлен как уже использовавшийся 2 года продукт в дарквебе (сайты Tor и т.д.), и в течение этого времени было намайнено 80% от всей криптовалюты. Приём в криптовалютном сообществе был сильно скептичен.

    Я глубоко убеждён в том, что скептицизм был оправдан: Вот оригинальный slow-hash из Bytecoin, который был скопирован в Bitmonero. У него есть некоторые неприятные моменты. Например, на строке 100 вы можете заметить, что для каждой итерации во внутреннем цикле, повторяющемся десятки тысяч раз, ключ AES реимпортируется в библиотеку. Цикл, начинающийся на строке 113, повторяется полмиллиона раз, и из-за тонны "memcpys" и манипуляций с указателями сложно сказать, что всё, что делает этот код - всего лишь один раунд шифрования AES. Разыменование указателя на случайный блокнот, 64-битное умножение, другое разыменования указателя. Фух. Этот оригинальный код был примерно в 50 раз медленнее моего финального оптимизированного кода, который мог легко использоваться для подделки двухлетних записей в блокчейне с использованием одного компьютера или небольшого кластера. Я вполне уверен в том, что это произошло.

    Bitmonero был форком Bytecoin, у которого не было бы 80% премайна. Но начальный разработчик то ли не знал, то ли не позаботился, то ли не захотел получить выгоду от деоптимизированного хеширования. Этот разработчик был прогнан сообществом, и на его место пришла соответствующая группа разработчиков, унаследовавшая его работу. А группа эта, насколько мне тогда показалось, вообще не знала о деоптимизации. Так всё и осталось на своих местах ещё на пару недель.

    Когда я этим всем занимался, разработчик "NoodleDoodle" (эй, это же крипта, люди могут выбирать любые имена, которые они хотят. Да, Сатоши Накамото?) уже распутал первую "деоптимизацию" с ключом шифрования AES. Но все остальные проблемы оставались на своих местах. Самое важное в том, что полное использование AES во внутреннем цикле было одной инструкцией на современных x86 процессорах.

    Это была великолепно созданная proof-of-work функция, нацеленная на использование мощи современных процессоров (нативного шифрования AES и быстрого 64-битного умножения), настроенная на использование блокнотов размером L3 кэша одного ядра процессора Intel (примерно 2 Мб), которую обернули в такую простыню дерьма до степени неузнаваемости, пока не начинаешь на неё прыгать, рвать её и собирать по кусочкам заново.

    1493026596.png


    Вот как это выглядит без всей этой дряни (диаграмма показывает один раунд): несколько начальных 128-битных значений определяются хешированием состояния блока алгоритмом Keccak (sha3) - назовём их A и B. Большая таблица подстановки также пополняется с использованием того же состояния и перемешивается с использованием AES. Затем 500,000 раз выполняются раунды перемешивания: А используется для определения псевдослучайного места в блокноте, добавляется туда, шифруется одним раундом AES, результат используется для определения второго места, выполняется 64-битное умножение, результат сохраняется, операция повторяется. Элегантно просто.

    У меня не было ни аккаунта AWS (и даже кредитной карты), чтобы всё сделать правильно, поэтому я отправил код моему контакту, и мы поехали в город.

    К 14 мая мы составляли 45% всей вычислительной мощи монеты. Ситуация приобретала немного захватывающий оборот:
    $1500 в день были очень привлекательной прибылью от инвестиций. На некоторое время я забросил сон и упрашивал разрешение у своей семьи продолжать проект пару часов в день, пока мы были в отпуске. Разрешение получено.

    Я понял, что мы сделали правильное решение, когда 21 мая мы получили 13 BTC (примерно $6500) и 17 BTC на следующий день. Думаю, в некоторых моментах наша вычислительная мощь составляла более чем 60% мощности всей сети. Этого было достаточно, чтобы начать играть в грязные игры, но мы не были заинтересованы в этом (да и чтобы это сделать, пришлось бы изучить код на ещё более глубоком уровне) и просто продавали монеты по мере их добычи.

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

    К 16 мая я выдавил примерно 90% всех оптимизаций, мы работали в 100 раз быстрее, чем оригинальный код при первоначальном релизе. Это не остановило меня от одержимости поиска твиков и на следующей неделе, но также дало небольшую передышку на то, чтобы обдумать следующий шаг.

    Натуральная эволюция криптовалют начинается с их майнинга на процессорах, ведь это же просто. Потом кто-нибудь пишет майнер, оптимизированный под видеокарты. Крупные шишки переходят на FPGA, затем на ASIC. Хотя, насколько нам всем известно, только монеты с алгоритмом SHA256d (Bitcoin и его семейство) и Scrypt (Litecoin, Dogecoin, и т.д.) получили реализацию майнинга на ASIC.

    Так почему бы не сделать очередной скачок? Нам нужен был GPU-майнер, чтобы быть впереди неизбежных оптимизаций, выпускаемых другими людьми. По факту, NoodleDoodle уже выпустил другое обновление, ускоряющее майнинг в 2 раза, и говорил о ещё более сильном ускорении на подходе. Это было лишь вопросом времени, пока некоторых из опасных криптоэкспертов не приняли своё участие, и yvg1900 уже говорил о разработке своего майнера для Monero. Мир майнинга альткоинов достаточно мал, и людей, которые смогли бы преодолеть мои оптимизации, было очень мало, и yvg1900 был одним из них. Я знал, что когда он войдёт в игру, все будут использовать его код.

    (И история показала, что я был прав - его последний релиз был на 10% быстрее моего, и он был достаточно добр, чтобы поделиться со мной несколькими микро оптимизациями x86/Haswell.)

    Я разработал GPU-майнер, о котором я писал в свой блог ранее, но он не был идеальным. К счастью, в процессе разработки я встретил самых лучших. Я разослал им сообщения, объяснил возможность, и они присоединились. Достаточно скоро, в нашем арсенале был не только супер-быстрый CPU-майнер, но и отличный небольшой GPU-майнер.

    Наличие обеих майнеров снизило наши ежедневные затраты в два раза. GPU-майнер не был сильно быстрее CPU-майнера, но из-за ценообразования на рынке было выгоднее взять машину с хорошей видеокартой, нежели чем с процессором. Так, в течение нескольких недель мы смогли заниматься майнингом одновременно на видеокартах и процессорах.

    Что было хорошо, так это то, что инцидент 28 мая произошёл быстрее, чем мы предполагали.

    Из того, что я могу вспомнить, мой контакт разговаривал с другим разработчиком насчёт произведения дальнейших оптимизаций кода по контракту. Я не знаю деталей этой беседы, и я не буду спекулировать, но что-то где-то пошло совсем не так, и другой разработчик оформил мои оптимизации в релиз с открытым исходным кодом. Ночью наша доля начала стремительно снижаться.

    Я снова не спал следующей ночью и добавил последнюю 5% оптимизацию в мой код, но сейчас мы реально зависели от быстрого GPU-кода и минимизации затрат на майнинг. Мы потратили немного времени на оценку производительности и анализ цен на машины, которые предлагал Amazon. Так нам удалось немного снизить затраты. Но когда нам удалось закончить GPU-майнер, мы снова вернулись в дело!

    Всё шло хорошо в течение недели-двух, пока 4 июля, другой GPU-разработчик, Claymore, не выпустил свой собственный GPU-майнер, но он был предназначен только для AMD видеокарт, а у Amazon были Nvidia. Майнер также был примерно в 2 раза медленнее нашего - троекратное "ура" быстрому коду. Мы задерживали наше дыхание в ожидании волны новых майнеров, но она никогда не пришла. Моя лучшая догадка состоит в том, что новизна ПО Cryptonote, а также проблемы с его запуском ввиду множества зависимостей от Boost и других библиотек, напугала много людей и держала порог вхождения на высоком уровне.

    В конце концов наша игра продолжилась в июле -- почти 2 месяца майнинга с достаточным преимуществом, чтобы получить прибыль на Amazon. Мы потратили более четверти миллиона долларов, арендуя облачную вычислительную мощность до такой степени, что один раз мы провели отличный телефонный разговор с менеджером Amazon, который пытался выяснить, как они могут улучшить сервис для чудаков типа нас.

    Был получен дикий опыт, и хотя слив кода доставил некоторые финансовыые неудобства, я всё же очень рад, что проделанные оптимизации оказались на публике (я бы всё равно постепенно их публиковал, но не планировал делать это так рано). Это информативно, что через все пути, которые я повидал, получать оплату за улучшение состояния криптовалютного программного обеспечения, самым выгодным оказался жадный подход, при котором модифицированное ПО остаётся приватным. Это то, над чем должны поразмышлять разработчики будущих валют - заплатить или нет кому-то за релиз оптимизированных CPU и GPU-майнеров для вашей монеты.

    25 строк С, одна инструкция встроенного ассемблера и немного внутренней структуры AVX создали один из самых забавных, радостных и выгодных проектов, в которые я когда-либо был вовлечен. Как и всё в криптовалюте, он двигался со скоростью света - это было похоже на запуск и сворачивание небольшого стартапа за 2 месяца. И вот почему теперь у меня в подвале стоят 6 high-end GPU-майнеров, которые согревают мой дом зимой, и есть забавные истории на тему важности защиты и уделения внимания низкоуровневому программированию.


    После перевода статьи я опять списался с dEBRUYNE, попросил его дать комментарий для РУ-сообщества (в спойлере скрин + перевод):
    1493026968.png
    Весьма прискорбно. Что касается изуродованного майнера, я в значительной степени согласен с тем, что было задокументировано в этом блогпосте.


    Большое спасибо xProphet за перевод h_1488743908_5282585_d7a89b1191.png
     
    #1 TheFuzzStone, 26 авг 2017
    Последнее редактирование: 26 авг 2017
    user1 нравится это.
  2. troggy

    Команда форума Редактор

    Регистрация:
    8 сен 2017
    Сообщения:
    5
    Симпатии:
    7
    > настроенная на использование блокнотов размером L3 кэша одного ядра процессора Intel (примерно 2 Мб)

    о нет, только не блокнот! уж лучше перевести scratchpad как «буфер»
     
  • О нас

    Наш сайт является одним из уникальных мест, где русскоязычное сообщество Monero может свободно общаться на темы, связанные с этой криптовалютой. Мы стараемся публиковать полезные мануалы и статьи (как собственные, так и переводы с английского) о криптовалюте Monero. Если вы хорошо владеете английским (или можете писать собственные статьи/мануалы) и хотите помочь в переводах и общем развитии Monero для русскоязычной аудитории - свяжитесь с одним из администраторов.