Под капотом Bitfury Clarke — как устроен наш новый чип для майнинга +9


В конце сентября мы представили новый ASIC-чип, разработанный специально для SHA256-майнинга в сети биткоин. Сегодня расскажем, что у него внутри.


Изображение: Bitfury Group

Пара слов о биткоин-майнинге


Цель майнинга — защита блокчейн-сети. Майнеры используют свое железо для решения сложных вычислительных задач, которые гарантируют целостность транзакций в сети и исключают атаки типа double spending. Параллельно майнинг выступает механизмом генерации криптовалюты, которую майнеры получают в качестве вознаграждения (сейчас — 12,5 биткоинов за один блок).

Вычислительные задачи, о которых идет речь, связаны с подбором хеша, который совпадет с транзакциями в блоке. Искомое значение формируется на основании хеша предыдущего блока, случайного числа (называемого nonce) и суммы хешей транзакций за последние десять минут. При этом должны выполняться два условия: хеш обязан соответствовать заявленной сложности майнинга и иметь строго определенное количество нулевых битов в начале. Для оценки сложности используют разложение в модифицированный ряд Тейлора.

Хеши в биткоин-блокчейне вычисляются по алгоритму SHA256. Он включает 64 итерации, во время которых происходит «перемешивание» битов транзакций в блоке с помощью операций сдвига и «сложения по модулю 2». Результат применения функции SHA256 считается необратимым, именно по этой причине целевой хеш находится путем грубого перебора. Подробнее о майнинге и майнинговых пулах, в которые объединяются участники блокчейн-сетей с целью ускорить решение блоков, мы писали в нашем блоге.

Раньше для перебора значения nonce и подбора хеша использовали CPU и GPU, но со временем из-за постоянно увеличивающейся сложности майнинга (она меняется в зависимости от совокупной вычислительной мощности всех участников биткоин-сети) были спроектированы специализированные интегральные схемы ASIC.
Мы в Bitfury тоже занимаемся разработкой таких решений. Всего мы создали пять поколений майнинговых чипов, а в сентябре представили шестое — речь об ASIC Clarke, заточенном специально под решение хешей SHA256.

Как устроен Clarke


Clarke изготовлен по 14-нм техпроцессу и реализован в форм-факторе FC-LGA 35L размером 6x6 мм. Второй корпус имеет более эффективную разводку цепей питания на плате. Чип за секунду решает 120 гигахешей, но дает возможность регулировать производительность в зависимости от того, что сейчас нужно майнеру — больший хешрейт или низкое энергопотребление. В частности, можно добиться коэффициента энергоэффективности в 55 мДж/гигахеш, так как для питания чипа достаточно 0,3 вольта. Структура Clarke выглядит так:


Генератор тактовых сигналов. Он задает синхроимпульсы для работы чипа. Уровни напряжения: VSS = 0, VDD = 1.

Последовательный управляющий интерфейс, соединенный с внешним контроллером последовательной шиной. Он похож на шину SPI с контактами передачи данных MOSI и MISO (служат для передачи данных от ведущего устройства к ведомому и наоборот), объединенными линией SDATA.

Интерфейс отвечает за передачу команд. Вот некоторые из них: task write для записи нового задания, force task switch для принудительного переключения буфера, read nonces для чтения значения nonce и др. Все команды имеют один шаблон и содержат код, длину, поле данных, байт состояния чипа, данные из буфера nonce и контрольные суммы.


Контрольные суммы представляют собой арифметическую сумму байтов, начиная с нулевого. Например, checksum команды 04 03 03 8c 18 00 будет равняться AE.

Система управления nonce. Управляет процессом вычисления хеша с учетом маски. Маска «лежит» в буфере задач и используется для установки диапазона вычислений. Она определяет биты в nonce, которые останутся неизменными при поиске нового значения.

Буферы задач. Нужны для вычисления хешей (их длина 20 двойных слов). Всего буферов два, что позволяет быстро переключаться между задачами. Пока первый буфер занят решением хеша, во второй пишутся данные для следующих вычислений.

8154 ядра кольцевого хеша. Они используют двойной алгоритм SHA256.

Буфер nonce. Это кольцевой буфер длиной в 12 двойных слов, куда пишутся решения хешей. Для примера мы привели процесс обмена данными в чипе, происходящий во время вычисления хешей (в спойлере ниже):

Обмен данными в чипе (на англ)
// Program clock generator to value 0x20 and prescaler=1 (disabled) Send: 0803038c1800
Recv: f0b200b2
// Set nonce mask to 0x00000000
Send: 200300000000 Recv: f0230023
// Force task switch Send: 020000
Recv: f0020002
// Send task
Wi 0=CD3F992C 1=037F8197 2=A58E091A
MS0 A=0CAD7CD1 B=CBE38FD9 C=D14DC164 D=F90EB10B E=819621CF F=358D45CD G=8C14CAE3 H=538EF887 MS3 A=5FF18CDD B=8CDA24A4 C=180266F9 D=0CAD7CD1 E=B0CA39FA F=DD30B962 G=36D2CBC6 H=819621CF NONCE=D5D0E8B9
Send:_014fa607d67b614925737be76bce53a41ba12b3c8b659f27ef6726be6049f924522d2b3c8b659c78616c779 a13c81a609
35067953386a9d52b3d0f24a3b0a607d67bb2a8cc5326708e0ef55b267700000000 Recv: 0fb200b2
// Force task switch
Send: 020000
Recv: 0f020002
// Read nonce buffer
Send: 040000 Recv:_0f04000000000000000000000000000000000000000000000000000000003ffffffc7f7a42132ffffffc 1ffffffc0001ffbf8c
FIFO[0] = aaaaaaaa
FIFO[1] = aaaaaaaa
FIFO[2] = aaaaaaaa
FIFO[3] = aaaaaaaa
FIFO[4] = aaaaaaaa
FIFO[5] = aaaaaaaa
FIFO[6] = aaaaaaaa
FIFO[7] = 3ffffffc
FIFO[8] = d5d0e8b9 < — nonce value
FIFO[9] = 2ffffffc < — task switch marker
FIFO[A] = 1ffffffc < — task switch marker
FIFO[B] = aaab5515



Где будет использоваться чип


Сейчас мы устанавливаем новые устройства в собственные майнинговые серверы и мобильные дата-центры BlockBox. Мы также модифицируем биткоин-фермы в Канаде, Исландии, Грузии и Норвегии (запустили в начале года).

Чипы Clarke будут доступны и как коммерческий продукт. В частности, они поставляются вместе с майнерами Bitfury Tardis, разработанными для крупных организаций. В Tardis влезают 5–8 плат, способные вычислять до 80 терахешей за секунду. Этот майнер можно будет модернизировать — в будущем установленные в нем ASIC Clarke получится заменить новыми чипами.



Это — наш небольшой видеоролик, представляющий концепцию нового чипа:




К сожалению, не доступен сервер mySQL