Scrypt
![Scrypt - скрипт - алгоритм для майнинга криптовалюты](http://bitcoinwiki.org/wp-content/uploads/2023/12/400px-Scrypt.png)
Scrypt (Скрипт) – это метод криптошифрования, который использует большой объем памяти и требует много времени для подбора. Алгоритм Scrypt применяется при майнинге криптовалют, что позволяет делать его более сложным для специализированных ASIC-майнеров.
Scrypt монеты отличаются от биткоина тем, что последний использует алгоритм SHA-256. В отличие от скрипт криптовалют биткоин и другие валюты на этом алгоритме легко майнятся на ASIC (устройствах, которые специально разрабатываются только для решения задач майнинга). Это часто вызывает негативную реакцию у создателей скрипт криптовалют, так как дает преимущество майнерам с большими ресурсами и нарушает децентрализацию.
Не использующий скрипт биткоин только один пример. Поэтому scrypt монеты пользуются популярностью среди майнеров, который используют для майнинга процессоры (CPU) или видеокарты (GPU). Рассмотрим scrypt алгоритм, его особенности и преимущества.
Содержание
Описание алгоритма
Scrypt (Скрипт) — адаптивная криптографическая функция формирования ключа на основе пароля, созданная офицером безопасности FreeBSD Colin Percival для системы хранения резервных копий Tarsnap. Функция создана таким образом, чтобы усложнить атаку перебором при помощи ПЛИС. Для ее вычисления требуется значительный объем оперативной памяти. 17 сентября 2012 года алгоритм scrypt был опубликован IETF в виде Internet Draft, планируется его внесение в RFC. Используется, например, в качестве proof-of-work в криптовалютах Litecoin, Worldcoin и подобных.
Основанные на пароле функции формирования ключа (password-based key derivation function, PBKDF) обычно разрабатываются таким образом, чтобы требовать относительно большого времени вычисления (по порядку величины — сотни миллисекунд). При использовании легальным пользователем требуется вычислить подобную функцию один раз (например при аутентификации) и такое время допустимо. Но при проведении атаки полного перебора (brute force) атакующему требуется произвести миллиарды вычислений функции и ее вычислительная сложность делает атаку более медленной и дорогой.
Алгоритм scrypt был придуман Колином Персивалем как криптозащита онлайн-сервиса для хранения резервных копий UNIX-подобных ОС. Принцип работы алгоритма скрипт заключается в том, что он искусственно усложняет подбор вариантов для решения криптографической задачи, наполняя его «шумом». Этот шум — случайно сгенерированные числа, к которым Scrypt алгоритм обращается, увеличивая время работы.
Если скрипт проверяет ключ пользователя, то такое замедление будет практически незаметным. Но когда код пытается взломать злоумышленник методом перебора, скрипт это усложняет: в сумме все операции занимают очень много времени.
Для любой Scrypt монеты это означает, что ее майнинг потребует большого количества участников в сети, каждый из которых будет выполнять часть работы.
Майнинг на Scrypt
При выборе криптовалюты, использующей scrypt алгоритм, на чем майнить тоже немаловажно.
Майнинг на алгоритме Scrypt в отличие от SHA-256 требует меньше ресурсов, благодаря чему использующие scrypt алгоритм валюты могут успешно майниться разными инструментами. Это и scrypt pool, и scrypt miner cpu и gpu, и даже scrypt asic miner: производители асик-оборудования тоже ищут способы «вскрыть» майнинг скрипт алгоритма и реализовывать script function.
Когда новичок начинает изучать алгоритм Scrypt, чем майнить становится главным вопросом. Основным параметром при выборе становится scrypt хэшрейт, то есть требуемая от оборудования производительность, которая позволит майнить криптовалюту.
Чтобы вычислить scrypt hash, то есть найти то самое решение, которое позволит создать новый блок в блокчейне, опытные майнеры советуют использовать GPU. Видеокарты более производительны, чем процессоры, к тому же лучше справляются с выполнением одной операции. Лучше всего подойдут Scrypt miner AMD: эти видеокарты обладают большей производительностью, чем Nvidia, и собрать ферму из них дешевле. Также Scrypt mining требует больших объемов памяти.
К слову, производители ASIC-майнеров тоже не стоят на месте. Сегодня с алгоритмом Script асик может справиться, но разработчики продолжают эту технологическую войну, чтобы выбравший scrypt алгоритм майнер с менее производительным оборудованием тоже имел возможность для майнинга.
Но для старта одиночного майнинга на Scrypt требуются достаточно большие ресурсы. Альтернативный вариант — script пулы. Это сообщества, в которых вы предоставляете мощность своего оборудования для объединения усилий. Такой подход дает лучший результат, чем сольный майнинг, однако вознаграждение получается ниже.
Чтобы найти лучшие пулы для майнинга scrypt криптовалют, надо обратить внимание на их направленность. Существуют пулы, заточенные только под одну монету, а есть мультивалютные, в которых можно переключаться с одной криптовалюты на другую. С точки зрения стабильности дохода лучшие пулы Scrypt монет относятся к первой категории.
Реализация алгоритма Scrypt
scrypt (P, S, N, r, p, dkLen) = MFcryptHMAC SHA256,SMixr (P, S, N, p, dkLen)
-
- где N, r, p — параметры, задающие сложность вычисления функции.
MFcrypt определена так: DK = MFcrypt PRF,MF (P, S, N, p, dkLen)
где
-
- PRF — псевдослучайная функция (в scrypt — HMAC-SHA256)
- hLen — длина выхода PRF в байтах
- MF (Mixing Function) — последовательная функция, требующая память со случайным доступом (отображение из Z_{256}^{MFLen} * N в Z_{256}^{MFLen} (в scrypt — SMix на базе Salsa20/8)
- MFLen — длина блока, перемешиваемого в MF (в байтах). MFLen =128 * r.
Входные параметры scrypt и MFcrypt:
- P — пароль (passphrase) — байтовая строка.
- S — соль (salt) — байтовая строка.
- N — параметр, задающий сложность (количество итераций для MF).
- r — параметр, задающий размер блока.
- p — степень параллельности, целое число, меньшее чем (232 − 1)*hLen/MFLen
- dkLen — требуемая длина выходного ключа в байтах, не более чем (232 − 1)*hLen.
- DK — выходной ключ
Функция MFcrypt работает по алгоритму:
- (B0 … Bp−1) = PBKDF2 PRF (P, S, 1, p * MFLen)
- Для всех i от 0 до p−1 применить функцию MF:
- Bi = MF(Bi, N)
- DK = PBKDF2 PRF (P, B0 || B1 || … || Bp−1,1, dkLen)
Потребление памяти оценивается в 128*r*N байт. Соотношение количества чтений и записей в эту память оценивается в 100% и 63%.
Function scrypt Inputs: Passphrase: Bytes string of characters to be hashed Salt: Bytes random salt CostFactor (N): Integer CPU/memory cost parameter BlockSizeFactor (r): Integer blocksize parameter (8 is commonly used) ParallelizationFactor (p): Integer Parallelization parameter. (1..232-1 * hLen/MFlen) DesiredKeyLen: Integer Desired key length in bytes Output: DerivedKey: Bytes array of bytes, DesiredKeyLen long Step 1. Generate expensive salt blockSize ← 128*BlockSizeFactor //Length (in bytes) of the SMix mixing function output (e.g. 128*8 = 1024 bytes) Use PBKDF2 to generate initial 128*BlockSizeFactor*p bytes of data (e.g. 128*8*3 = 3072 bytes) Treat the result as an array of p elements, each entry being blocksize bytes (e.g. 3 elements, each 1024 bytes) [B0...Bp−1] ← PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor) Mix each block in B 2CostFactor times using ROMix function (each block can be mixed in parallel) for i ← 0 to p-1 do Bi ← ROMix(Bi, 2CostFactor) All the elements of B is our new "expensive" salt expensiveSalt ← B0∥B1∥B2∥ ... ∥Bp-1//where ∥ is concatenation Step 2. Use PBKDF2 to generate the desired number of bytes, but using the expensive salt we just generated return PBKDF2HMAC-SHA256(Passphrase, expensiveSalt, 1, DesiredKeyLen);
Function ROMix(Block, Iterations) Create Iterations copies of X X ← Block for i ← 0 to Iterations−1 do Vi ← X X ← BlockMix(X) for i ← 0 to Iterations−1 do //Convert first 8-bytes of the last 64-byte block of X to a UInt64, assuming little endian (Intel) format j ← Integerify(X) mod N X ← BlockMix(X xor Vj) return X
Где Integerify – это биективная функция из промежутка от {0, 1}k до {0,…,2k− 1}.
Function BlockMix(B): The block B is r 128-byte chunks (which is equivalent of 2r 64-byte chunks) r ← Length(B) / 128; Treat B as an array of 2r 64-byte chucks [B0...B2r-1] ← B X ← B2r−1for i ← 0 to 2r−1 do X ← Salsa20/8(X xor Bi) //Salsa20/8 hashes from 64-bytes to 64-bytes Yi ← X return ← Y0∥Y2∥...∥Y2r−2 ∥ Y1∥Y3∥...∥Y2r−1
Примеры криптовалют на алгоритме Scrypt
Главный вопрос после того, как вы поняли, что такое алгоритм Scrypt — что майнить на нем. Первая использующая алгоритм scrypt криптовалюта — это Litecoin. Также на нем работают все форки лайткоина. Например, чуть меньше популярность на алгоритме scrypt монеты Dogecoin.
Среди других криптовалют, использующих алгоритм scrypt — монеты ProsperCoin, CashCoin, MonaCoin, Mooncoin и многие другие. Криптовалюта Litecoin использует такие параметры Scrypt: N = 1024, r = 1, p = 1, размер входного параметра и соли — 80 байт, размер DK — 256 бит (32 байта). Потребление оперативной памяти для Scrypt майнинга монет- около 128 КБ. Вычисление такого Scrypt на видеокартах приблизительно в 10 раз быстрее чем на процессорах общего назначения, что является признаком выбора недостаточно сильных параметров.
Рекомендуемые параметры scrypt: N = 16384, r = 8, p = 1 (потребление памяти около 16 МБ) Скорость вычисления одной операции Scrypt на процессоре общего назначения составляет около 100 миллисекунд при настройке на использование 32 МБ памяти. При настройке на длительность операции в 1 миллисекунду, используется слишком мало памяти и алгоритм становится слабее алгоритма bcrypt, настроенного на сравнимую скорость.
Ссылки
См. также на BitcoinWiki
Источники
https://en.wikipedia.org/wiki/Scrypt
https://www.coinchoose.com/mining/scrypt-miner/
https://prostocoin.com/blog/algorithm
https://www.cryptocompare.com/coins/guides/what-is-scrypt/