Содержание

Bitcoin. Как это работает / Хабр

О Bitcoin я узнал относительно недавно, но он меня сразу подкупил своей идеей p2p. Чем глубже я зарывался в их Wiki, тем больше проникался этой идеей. Ее реализация красива и элегантна с технической точки зрения.

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

Настоящие деньги?

Первое место в списке главных заблуждений насчет Bitcoin занимает идея о том, что Bitcoin это очередные «бумажки», пускай и электронные, которые лишь представляют «настоящие» деньги, являются эдакими долговыми расписками. Отсюда берет начало большинство остальных заблуждений: раз это бумажки, то они ничего не стоят; их можно напечатать или уничтожить сколько угодно; их можно подделать; их можно скопировать.

Повторюсь — все это не более, чем заблуждения. В основе идеи Bitcoin лежало желание создать не очередные «бумажки», которые представляют реальные деньги, такие как золото, а аналог самого золота. Взять те свойства золота, благодаря которым оно является идеальными деньгами, и сделать электронную валюту на их основе.

Сложность добычи

Золото нельзя скопировать — его можно только добыть. Но это очень затратный процесс как по времени, так и по ресурсам. Частично из-за этого золото ценится так высоко. Чтобы было понятнее, рассмотрим на примере.

Допустим человек весь день усердно добывал золото и добыл в итоге 1 кг. Для него стоимость добытого золота равна одному дню усердной работы. После тяжелого рабочего дня он решил отдохнуть и сходить в кинотеатр. По счастливому совпаденью кассир отдавал билеты в обмен на золото. Почему? Потому что кассиру нравится золото, но не нравится весь день работать с киркой. Поэтому он готов оказать услугу — отдать билет — в обмен на 1 кг золота. Фактически же он обменивает свою услугу на один день тяжелой работы.

Теперь представим другую ситуацию. Изобрели копир, который работает с золотом. И любой человек может за минуту из одного 1 кг золота сделать 10 кг. В данной ситуации кассир уже не будет обменивать билеты на золото, так как теперь он сам легко сможет его напечатать столько, сколько захочется. Золото перестанет иметь какую-либо ценность и его уже нельзя будет использовать в качестве денег.

В Bitcoin процесс добычи монеток тоже требует ресурсов и времени. Но в данном случае это не человеческие ресурсы, а компьютерные.

Условно ограниченный ресурс

Чем дольше добывается золото, тем труднее (затратнее по ресурсам) становится его добывать. Это гарантирует, что инфляция будет под контролем.

В Bitcoin похожее поведение достигается путем введения функции скорости суммарно добываемых монеток от времени. Эта функция обратно пропорциональная, т. е. скорость со временем падает и стремится к нулю. Если взять интеграл этой функции по времени, то получится экспонента. Приблизительно такая:

Здесь видно, что общее число монеток стремится к 21 000 000. Подробности работы Bitcoin будут рассмотрены далее. А пока нужно знать две вещи: монетки появляются в системе пачками приблизительно каждые 10 минут, количество монеток в одной пачке — 50, и оно уменьшается вдвое каждые 4 года.

Материальность

Это уже свойство не столько золота, сколько любой не электронной валюты. Один слиток золота нельзя дважды обменять на услугу или товар. Т. е. в один момент времени он может быть либо у продавца, либо у покупателя.

Такое поведение естесственно для материальной валюты, но не для электронной. Чтобы добиться такого поведения виртуальных денег, нужно приложить немало смекалки. В Bitcoin это поведение обеспечено механизмом транзакций. Все транзакции объеденяются в цепочки. Каждая транзакция берет монетки из одной или нескольких существующих транзакций и указывает, кому они предназначаются. Поэтому всегда можно проверить всю цепочку на валидность.

Сложность добычи, ограниченный ресурс, материальность — эти свойства, плюс использование криптографии для обеспечения безопасности, позволяют использовать Bitcoin в качестве денег. На них основано ядро Bitcoin. Это не просто договоренности. Все они заложены в системе by design, и по-другому она работать не будет. Настало время рассмотреть этот самый дизайн.

Цепочка блоков

Любая электронная платежная система должна где-то и как-то хранить транзакции. В Bitcoin вся информация хранится в цепочке блоков. Блоки передаются в формате JSON. Каждый блок содержит заголовок и список транзакций. Заголовок состоит из нескольких свойств, среди которых есть хэш предыдущего блока. Таким образом вся цепочка блоков хранит все транзакции за все время работы Bitcoin.

В текущих версиях программы Bitcoin цепочка блоков скачивается целиком каждым клиентом, что делает систему полностью децентрализованной. Данные никак не шифруются и любой может вручную проследить все транзакции. Существует даже специальный сайт — Bitcoin Block Explorer, на котором можно легко посмотреть всю информацию о блоках и транзакциях.

На момент написания статьи количество блоков в цепочке было равно 110 968, и, как я уже говорил ранее, это количество приблизительно через каждые 10 минут увеличивается на 1. Это значит, что кто-то из участников смог создать новый блок.

Кстати говоря, все участники делятся на две группы: на тех, кто работает над новым блоком и кто не работает. По статистике эти группы соотносятся как 1 к 3. Зачем вообще создавать блоки, да еще каждые 10 минут? В блоках записываются транзакции. Каждый блок содержит все транзакции, которые проходили во время его создания, т. е. за 10 минут.

Работает это следующим образом. Один из клиентов создает новую транзакцию и рассылает ее другим клиентам, которые заняты генерацией блока. Они добавляют эту транзакцию к своему блоку и продолжают генерацию. Рано или поздно у кого-то получится сгенерировать блок. Такой блок запечатывается (к нему больше не добавляются транзакции) и рассылается по сети. Далее клиенты проверяют блок и транзакции внутри него на валидность. Если никаких проблем нет, то транзакции считаются одобренными. К этому моменту свежий блок уже доехал до каждого клиента и добавлен в цепочку. После этого процесс повторяется — клиенты начинают генерировать очередной блок и собирать в него новые транзакции.

Блок

Рассмотрим содержимое блока и процесс его генерации более подробно. Пример блока можно найти на все том же Bitcoin Block Explorer. Блок состоит из заголовка и списка транцакций. Заголовок состоит из следующих свойств:

hash — SHA-256 хэш заголовка блока. Такой хэш является достаточно случайным, а время его вычисления предсказуемо. Хочу заметить, что хэшируется только заголовок, без транзакций. Так что число транзакций не будет сильно влиять на время вычисления хэша.

ver — Версия схемы блока. На данный момент у всех блоков одна версия — 1.

prev_block — Хэш предыдущего блока в цепочке. Благодаря этому свойству цепочку нельзя подделать, заменив в ней один из блоков, так как хэш блока всегда зависит от хэша предыдущего блока в цепочке. Изменив один из блоков, придется пересоздавать все последующие.

mrkl_root — Merkle root — список хэшей транзакций. Хэш блока должен обязательно зависеть от транзакций, чтобы их нельзя было подделать. Но вычислять его напрямую будет долго, если количество транзакций велико. Поэтому сначала хэшируются сами транзакции, а затем их хэши используются для вычисления хэша всего блока.

Может показаться абсурдным — зачем дважды вычислять хэш одного и того же. Но дело в том, что хэш транзакций обновляется только при добавлении к блоку новой транзакции, а хэш заголовка блока пересчитывается несколько тысяч раз в секунду. К тому же, чем ближе размер заголовка в константе, тем точнее можно предсказать время вычисления его хэша.

time — uint32_t представляющее время создания блока. Максимально допустимый год — 2106.

bits — Одно из самых важных свойств. Является сокращенной формой целевого значения хэша. Блок считается сгенерированным (валидным), когда его хэш меньше этого целевого значения. Целевое значение определяет сложность создания блока. Чем оно меньше, тем меньше вероятность подобрать подходящий хэш за одну итерацию. Это свойство обновляется каждые две недели.

Происходит это следующим образом. Подсчитывается число сгенерированных блоков за последние две недели и сравнивается с эталоном (1 блок каждые 10 минут). Если блоков слишком много, то сложность увеличивается. Если блоков слишком мало — уменьшается. Таким образом система адаптируется к увеличению числа пользователей и, как следствие, суммарной мощности их компьютеров.

nonce — Число, которое, начиная с нуля, инкрементируется после каждой итерации вычисления хэша. Собственно, так и происходит перебор, пока хэш не будет меньше целевого значения. Чтобы каждый новый хэш отличался от предыдущего, должно отличаться хотя бы одно из свойств заголовка блока.

Например, версия никогда не меняется. Хэш предыдущего блока обновляется тогда, когда кто-нибудь нас опередит и сгенерирует новый блок. Merkle root обновляется при добавлении транзакции. Время — каждые несколько секунд. Bits (целевое значение, сложность) — каждые две недели. Все это слишком долго. Чтобы не ждать, пока обновится одно из свойств и существует nonce.

Рассмотрим гипотетическую ситуацию. Все значения nonce были проверены и ни одно из них не подходит. За это время ни одно другое свойство не изменилось. Происходит переполнение nonce и оно снова начинается с нуля. Получается, что далее хэши будут повторяться. Чтобы избежать подобных ситуаций, после переполнения nonce, меняется специальное свойство одной из транзакций. После этого обновляется Merkle root и хэши заголовка блока уже не будут повторяться.

n_tx — Количество транзакций в списке.

size — Размер блока в байтах.

Транзакции

Транзакции содержатся в блоках в виде списка. Они, также как и блоки, выстраиваются в цепочки. Каждая транзакция должна указать, откуда она берет деньги (из какой существующей транзакции), и куда направляет.

Для указания адресата используется его публичный ключ. Чтобы адресат мог использовать полученные деньги, он должен создать новую транзакцию, которая будет брать деньги с предыдущей и перенаправлять их по другому адресу. Чтобы доказать, что человек использует для перевода именно свои деньги, а не чужие, он должен оставить в своей транзакции свою цифровую подпись. Тогда в любой момент времени можно удостоверится, что все транзакции в системе являются валидными.

На практике все это реализовано с помощью следующих свойств:

hash — Хэш всей транзакции. Получается, что транзакции хешируются дважды. Первый раз во время вычисления хэша транзакции. Второй раз во время вычисления хэша блока. Кроме того каждый блок ссылается на хэш предыдущего блока, а каждая транзакция — на хэш предыдущей транзакции (или транзакций). Если изменить транзакцию и каким-то чудом ее хэш не поломается, то поломаются все остальные хэши и измененная цепочка блоков будет отвергнута всеми клиентами.

ver — Версия схемы транзакции. Пока она ни разу не менялась, так что везде равна 1.

vin_sz — Количество предыдущих транзакций, из которых деньги переводятся на новые адреса. Одна или более.

vout_sz — Количество адресов, на которые переводятся деньги. Один или более.

lock_time — Пока не используется и везде равно 0. Идея в том, чтобы создавать отложенные транзакции, чтобы они добавлялись не в текущий генерируемый блок, а, например, в слещующий. Подразумевается, что в этом свойстве указано количество блоков, которые должна пропустить транзакция перед добавлением. Это дает возможность в течении некоторого времени изменить транзакцию и переподписать ее.

size — Размер транзакции в байтах. Подразумевается размер транзакции в формате JSON.

in — Содержит список входов (источников) транзакции. В качестве входов используются выходы предыдущих транзакций (prev_out). У каждого выхода есть следующие свойства:

hash — Хэш предыдущей транзакции.

n — Так как у транзакции может быть несколько выходов, то нужно указывать, из какого из них берутся деньги. Для этого и существует данное свойство. В нем содержится порядковый номер выхода предыдущей транзакции, начиная с 0.

scriptSig — В этом свойстве отправитель должен доказать, что он переводит именно свои деньги, а не чужие. Для этого он указавает публичный ключ получателя предыдущей транзакции, т. е. свой ключ, так как он должен быть получателем. Кроме того он добавляет ECDSA подпись этой же транзакции, которая сделана его приватным ключем. Это доказывает, что он распоряжается своими деньгами, а не чужими.

После списка входов транзакции (in) указывается список выходов (out), т. е. адресатов. Каждый выход имеет следующие свойства:

value — Содержит количество денег, которые будут переведены по новому адресу. Они берутся из предыдущих транзакций. Поэтому данное число не должно превышать их сумму. Например, мы хотим взять 10 монеток из одной транзакции и 20 из другой и направить 25 по новому адресу. Чтобы оставшися 5 монеток не пропали, мы посылаем их самим себе, как сдачу. Таким образом в нашей транзакции будет два адресата, одним из которых являемся мы сами. Value всегда указывается в наномонетах, чтобы избежать дробных чисел.

scriptPubKey — Это свойство, вместе с scriptSig составляют сценарий на модифицированном Forth-like языке. ScriptPubKey содержит операторы языка и хэш публичного ключа получателя транзакции. Сценарий проверяет транзакцию на валидность. Использование подобного сценария дает богатые возможности для описания условий получения денег адресатом. Например, можно заставить получателя указывать пароль вместо ECDSA.

Суммарное количество денег на входе транзакции всегда равно суммарному количеству на выходе. В противном случае деньги либо возникали из воздуха, либо исчезали из оборота. Но в самом начале был график, по которому видно, что число денег экспоненциально растет. Так откуда берутся новые деньги в системе?

На мой вкус, эмиссия денег реализовано просто и элегантно. В каждом блоке первая транзакция в списке является особой транзакцией. У нее всегда один вход, у которого вместо свойства scriptSig есть свойство coinbase. Это свойство может содержать что угодно.

Выход у транзакции также всегда один. Он перенаправляет 50 монеток тому, кто сгенерировал блок, в котором расположена эта транзакция. Это своего рода награда за потраченное время и ресурсы на генерацию блока. Создавая новый блок в цепочке, клиент вносит вклад в работу Bitcoin.

Каждые четыре года эта награда уменьшается вдвое, таким образом суммарное количество монеток в обороте стабилизируется. После этого даже если злоумышленник создаст блок с помощью модифицированной версии программы и припишет себе 50 монеток, этот блок не будет добавлен в цепочку, так как его отвергнут другие честные клиенты, которых должно быть большинство.

Стабильность работы системы основана на количестве пользователей, у которых запущен официальный клиент. Пока их большинство, Bitcoin ничего не угрожает.

Заключение

Proof of work (доказательство работы) — результат работы, которого трудно добиться, но легко проверить. Работа сети Bitcoin основана на этом принципе. Проверить хэш (результат работы) можно за доли секунды. А для того, чтобы его подобрать, требуется много работы.

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

Цена в долларах — это немного другое. Она никак не заложена в Bitcoin и определяется исключительно рынком. Ведь золото само по себе тоже не гарантирует вам определенную цену в долларах. Ее гарантирует лишь человек, который хочет обменять золото на доллары.

Изначальная стоимость золота определялась исключительно тем, кто его добывал. За добытое золото он просил столько, чтобы можно было компенсировать усилия на его добычу. А уже после этого на цену золота начинает влиять рынок.

Как только Bitcoin попал на рынок, его ценность определяется исключительно уровнем доверия к системе. Чем больше человек будут доверять, тем больше купят Bitcoin, тем больше долларов в него вложат и, как следствие, тем дороже будет Bitcoin.

Прежде чем люди смогут доверять Bitcoin, они должны узнать, обладает ли эта система достаточной степенью безопасности, а также можно ли ее использовать в качестве денег, т. е. обладает ли она свойствами денег, которые я перечислил в начале. Узнать это наверняка можно только разобравшить в принципах работы Bitcoin.

Надеюсь, что после этой статьи уровень доверия к Bitcoin хотя бы немного вырастет.

habr.com

Bitcoin in a nutshell — Mining / Хабр

Даже люди, бесконечно далекие от темы криптовалют, скорее всего слышали про майнинг. Наверное и ты, дорогой читатель, задумывался о том, чтобы включить свой игровой Pentium 4 на ночь, а утром проснуться уже богатым.

Но, как это часто случается в мире блокчейна, тех кто слышал — много, а вот тех, кто реально понимает процесс от начала до конца, — единицы. Поэтому в последней главе я пострался максимально подробно охватить все тонкости, начиная от технической реализации PoW, заканчивая рентабельностью майнинга на видеокартах.


Book



Table of content


  1. Explain me like I’m five
  2. Sky is the limit?
  3. Reward
  4. Hard challenge
  5. Technical side
  6. 2 Blocks 1 Chain
  7. Hardware
  8. Conclusion
  9. Links

Explain me like I’m five


Майнинг, также добыча (от англ. mining — добыча полезных ископаемых) — деятельность по поддержанию распределенной платформы и созданию новых блоков с возможностью получить вознаграждение в форме эмитированной валюты и комиссионных сборов в различных криптовалютах, в частности в Биткойн. Производимые вычисления требуются для обеспечения защиты от повторного расходования одних и тех же единиц валюты, а связь майнинга с эмиссией стимулирует людей расходовать свои вычислительные мощности и поддерживать работу сетей — Wikipedia

Если на пальцах, то майнинг — это критически важный для Bitcoin процесс, состоящий в создании новых блоков и преследующий сразу две цели. Первая — производство денежной массы. Каждый раз, когда майнер создает новый блок, ему за это полагается награда в N-ое число монет, которые он потом где-нибудь тратит, тем самым запуская в сеть новые средства.

Вторая, и куда более важная цель, — обеспечение работы всей сети. Наверняка, читая предыдущие статьи, вы уже задавали себе вопросы «Кто тот человек, который проверяет скрипты транзакций?» или «Если в качестве входа я укажу уже использованный выход, в какой момент это заметят?».

Так вот, все эти действия выполняют в первую очередь майнеры. Ну, на самом деле каждый участник сети в той или иной степени обеспечивает ее безопасность. Синхронизировать Bitcoin так долго не потому что приходится качать 100 ГБ, а потому что надо проверить каждый байт, посчитать каждый хэш, запустить каждый скрипт и так далее.

Но если нарисовать весь процесс, начиная с нажатия кнопки «Send» в кошельке и заканчивая просмотром блока с вашей транзакцией где-нибудь на blockchain.info, то именно майнеры будут решать, окажется ваша транзакция в блоке или нет.


Sky is the limit?

Для начала давайте еще раз пройдемся по первому пункту и обсудим понятие денежной массы.

Одна из фундаментальных фишек, которой часто бравируют сторонники криптовалют — заложенная изначально дефляция. Это связано с тем, что еще на этапе проектировки системы, было указано суммарное ограничение в 21 миллион монет (примерно), и даже если очень сильно захотеть, поднять этот порог не получится. В отличие от рубля или доллара, которые по желанию казначейства могут быть напечатаны в любом количестве, что иногда приводит к печальным последствиям, как в Зимбабве.

BTW не все считают дефляцию таким уж однозначным плюсом.


Reward

Следующий хороший вопрос — откуда взялась цифра в 21 миллион?

Я думаю вы понимаете, что сумма выпущенных монет в конкретный момент времени равна сумме вознаграждений за блоки, созданные к этому моменту. Довольно очевидный факт, учитывая что существует только один путь, по которому новые монеты попадают в сеть.

Но вознаграждение не фиксировано, и более того, каждые 210.000 блоков (примерно раз в 4 года) оно уменьшается в два раза.

consensus.nSubsidyHalvingInterval = 210000;
// https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L73

Так, например, когда все начиналось в январе 2009, награда за блок составляла 50 BTC. Спустя 210.000 блоков, в ноябре 2012 она упала до 25 BTC, и совсем недавно, 9 июля 2016, снизилась до 12.5 BTC.

Несложно посчитать точное число Сатоши, которые будут произведены на свет, если предположить, что Bitcoin не заглохнет в ближайшие 200 лет:

start_block_reward = 50
reward_interval = 210000

def max_money():
    # 50 BTC = 50 0000 0000 Satoshis
    current_reward = 50 * 10**8
    total = 0
    while current_reward > 0:
        total += reward_interval * current_reward
        current_reward /= 2
    return total

print "Total BTC to ever be created:", max_money(), "Satoshis"
# Total BTC to ever be created: 2099999997690000 Satoshis

На картинке ниже изображена кривая добычи, которая будет все более плавно подходить к отметке в 21 миллион BTC, достигнув пика примерно в 2140 году. В это время награда за блок станет 0 BTC.

Остается только гадать, что тогда произойдет с Bitcoin, но одно мы можем знать точно — совсем без денег майнеры не останутся. Как минимум у них еще есть transaction fee, другое дело, что эта самая комиссия может на порядок увеличиться.

Возьмем для наглядности какой-нибудь свежий блок, например #447119. Сумма комиссий со всех транзакций в блоке составляет примерно 0.78 BTC, при том что вознаграждение за него — 12.5 BTC. То есть если завтра reward исчезнет, то в нашем случае комиссия должна вырасти более чем в 16 раз, чтобы нивелировать это неприятное событие. Понятно, что никакими микроплатежами тут уже и не пахнет.


Mining for dummies

Давайте постараемся еще раз представить процесс майнинга на нашем, пока что примитивном уровне.


Существует сеть с кучей участников. Некоторые из участников называют себя майнерами — они готовы собирать на своем ПК новые транзакции, проверять их на валидность, потом каким-то образом майнить из них новый блок, раскидывать этот блок по сети и получать за это денежку. Логичный вопрос — если все так просто, то почему этим не занимается каждый участник сети?

Понятно, что если все было бы так, как я сейчас описал, то блоки выходили бы по сто раз в секунду, валюты было бы столько, что за нее никто не дал бы и цента, и так далее.

Поэтому Сатоши был вынужден придумать алгоритм, со следующими свойствами:


  • Создание нового блока — вычислительно сложная задача. Нельзя вот так просто включить мощный ПК и за минуту намайнить сто блоков.
  • На вычисление нового блока у всей сети уходит 10 минут (в среднем). Если посмотреть на Litecoin, то там блоки выходят раз в 2-3 минуты, суть заключается именно в том, что среднее время заранее установлено.
  • Более того, это время не зависит от числа участников сети. Даже если однажды майнеров станет в сто раз больше, то алгоритм должен так изменить свои параметры, чтобы блок стало находить сложнее, и block time опустился обратно в окрестность десяти минут.
  • Помним, что сеть распределенная и одноранговая, а значит, она должна сама понимать, в какой момент и как нужно подкрутить эти параметры. Никаких управляющих нод, все полностью автономно.
  • Если решение задачи по созданию нового блока — это сложная задача, требующая времени и ресурсов, то проверка блока на «корректность» должна быть простой и практически мгновенной.

Proof-of-Work (PoW)

Скорее всего вы сейчас прибываете в полной прострации и не очень понимаете, как такое вообще возможно. Но Сатоши не растерялся и смог придумать решение для всех этих проблем — алгоритм получил название Proof-of-Work, вот так он выглядит (советую сначала прочитать Bitcoin in a nutshell — Blockchain):


Пусть вы — майнер. У вас есть 10 транзакций, которые вы хотите замайнить в блок. Вы проверяете эти транзакции на валидность, формируете из них блок, в поле nonce указываете 0 и считаете хэш блока. Потом меняете nonce на 1, снова считаете хэш. И так до бесконечности.

Ваша задача — найти такой nonce, при котором хэш блока (256 битное число) меньше заранее заданного числа N. Поиск такого хэша возможен только тупым перебором nonce, никаких красивых алгоритмов здесь нет. Поэтому чем быстрее вы хотите найти nonce, тем больше мощностей вам понадобится.

Число N — именно тот параметр (его еще называют target), который сеть настраивает в зависимости от суммарной мощности майнеров. Если завтра блоки начнут выходить, условно говоря, раз в три минуты, то N будет как-то уменьшено, времени на поиск nonce потребуется больше и block time снова вырастет до 10 минут. И наоборот.


Technical side

Самое время перейти от слов к делу и продемонстрировать, как работает Proof-of-Work и майнинг в целом. А по моему скромному мнению, нет ничего лучше, чем показать вообще весь процесс прямо в боевых условиях. Для этого мы сейчас с ходу напишем свою майнинг ноду и даже попробуем сделать новый блок раньше всех, хотя шансы на успех невелики.


Receive transactions

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

Я предлагаю пойти упрощенным путем. Открываем blockchain.info и выбираем несколько транзакций из списка «Последние транзакции». Они только-только попали в сеть и пока что не входят ни в один из блоков. Далее открываем другой block explorer — chainquery.com. Он умеет выдавать транзакции в сыром формате и по хэшам получаем транзакции в уже знакомом нам виде. Я ограничился двумя (раз, два):

txn_pool = []
txn_pool.append("0100000001440d795fa6267cbae00ae18e921a7b287eaa37d7f41b96ccbc61ef9a323a003d010000006a47304402204137ef9ca79bcd8a953c0def89578838bbe882fe7814d6a7144eaa25ed156f66022043a4ab91a7ee3bf58155d08e5f3f221a783f645daf9ac54fed519e18ca434aea012102965a03e05b2e2983c031b870c9f4afef1141bf30dc5bb993197ee4a52f1443e0feffffff0200a3e111000000001976a914f1cfa585d096ea3c759940d7bacd8c7259bbd4d488ac4e513208000000001976a9146701f2540186d4135eec14dad6cb25bf757fc43088accbd50600")
txn_pool.append("0100000001517063b3d932693635999b8daaed9ebf020c66c43abf504f3043850bca5a936d010000006a47304402207473cda71b68a414a53e01dc340615958d0d79dd67196c4193a0ebcf0d9f70530220387934e7317b60297f5c6e0ca4bf527faaad830aff45f1f5522e842595939e460121031d53a2c228aedcde79b6ccd2e8f5bcfb56e2046b4681c4ea2173e3c3d7ffc686ffffffff0220bcbe00000000001976a9148cc3704cbb6af566598fea13a3352b46f859581188acba2cfb09000000001976a914b59b9df3700adae0ea819738c89db3c2af4e47d188ac00000000")

Check

Следующим шагом нужно проверить полученные транзакции. Я этого делать не буду, просто перечислю основные пункты:


  • Верно соблюдены структура и синтаксис транзакции
  • Список входов / выходов не может быть пустым
  • Транзакции на входе должны существовать либо в UTXO pool, либо в пуле неподтвержденных транзакций
  • Сумма входов не меньше суммы выходов
  • Полный список можете найти здесь

Некоторые майнеры отвергают транзакции с нулевой или слишком маленькой комиссией, но это каждый решает сам.


Sort

На всякий случай поясню, что ничто не мешает вам включать транзакции в блок в каком угодно порядке, главное, чтобы они прошли все проверки. В моем случае транзакций всего две, поэтому сортировать их тем более нет никакого смысла. Но не стоит забывать, что размер блока ограничен 1 МБ, поэтому если у вас в пуле 10.000 транзакций, то будет разумно отсортировать их по комисии и записать в блок только самые «дорогие».

BTW Часто попадаются статьи / книги, в которых сказано, что перед майнингом нового блока, Bitcoin Core сортирует транзакции по специальному параметру priority, который считается как

Priority = Sum (Value of input * Input Age) / Transaction Size

Это было верно вплоть до версии 0.12.0, потом сортировку по priority отключили.


Get reward

Если вы посмотрите на структуру любого блока, то самой первой всегда идет так называемая coinbase транзакция — именно она отправляет вознаграждение на адрес майнера. В отличии от обычных транзакций, coinbase transaction не тратит в качестве входов выходы из UTXO pool. Вместо этого у нее указан только один вход, называемый coinbase, который «создает» монеты из ничего. Выход у такой транзакции тоже только один. Он отправляет на адрес майнера награду за блок плюс сумму комиссий со всех транзакций в блоке. В моем случае это 12.5 + 0.00018939 + 0.0001469 = 12.50033629.

Давайте подробнее рассмотрим структуру coinbase транзакции, а если конкретнее — ее вход. На всякий случай напомню, как выглядит вход у «обычной» транзакции:

Вот три отличия входа coinbase транзакции:


  • Вместо настоящего transaction hash указывается 32 нулевых байта
  • Вместо output index указывается 0xFFFFFFFF.
  • В поле unlocking script можно указать что угодно размером от 2 до 100 байт, поэтому это поле еще называют coinbase data. Например в genesis block там спрятана фраза "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks". Как правило, майнеры вставляют в coinbase data свое имя / имя майнинг пула / еще что-нибудь.

Часто в coinbase data вставляют так называемый extra nonce, подробнее здесь. Суть в том, что может не найтись нужного nonce, при котором хэш блока меньше target (на самом деле это будет происходить в большинстве случаев). Тогда остается что-нибудь менять в транзакции, чтобы получились другие хэши, например — UNIX timestamp. Но если вы читали Bitcoin in a nutshell — Blockchain, то знаете, что timestamp тоже сильно не изменишь, иначе другие ноды отвергнут ваш блок. Решение оказалось довольно простым: достаточно добавить какое-нибудь число в coinbase data и менять его, если для текущего header не нашлось нужного nonce.

Процесс создания новой транзакции подробно описан в главе Bitcoin in a nutshell — Protocol, поэтому здесь я просто приведу уже полученную coinbase transaction, весь код, как обычно, доступен на [Github]():

coinbase_txn = "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff8a47304402207e8495986ec27ed4556fee9dcd897ea028d4eb2023959c2299eb573e0771dee702201489e40115ccc45d4c23f1109cb56b513543517f3efc0031965ad94d94d3d2d901410497e922cac2c9065a0cac998c0735d9995ff42fb6641d29300e8c0071277eb5b4e770fcc086f322339bdefef4d5b51a23d88755969d28e965dacaaa5d0d2a0e09ffffffff01ddff814a000000001976a91478e10cf8e4bd38266d8fd4ed5c8b430d30a3cde888ac00000000"

Осталось только посчитать для этих трех транзакций merkle root. Для этого воспользуемся фрагментом кода из Bitcoin in a nutshell — Blockchain:

txn_pool.insert(0, coinbase_txn)
txn_hashes = map(getTxnHash, txn_pool)

print "Merkle root: ", merkle(txn_hashes)
# Merkle root:  4b9ff9ab901df82050f858accde99b9169067acafaeade25598ea5505fb53836

Target

Как я уже написал выше, весь майнинг сводится к тому, чтобы найти хэш блока меньше числа, называемого target. В структуре блока это число записывается в поле bits, например для блока #277,316, target равнялся 1903a30c.

$ bitcoin-cli getblock 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
{
    "hash" : "0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4",
    "confirmations" : 35561,
    "size" : 218629,
    "height" : 277316,
    "version" : 2,
    "merkleroot" : "c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e",
    "tx" : ["d5ada064c6417ca25c4308bd158c34b77e1c0eca2a73cda16c737e7424afba2f", 418 more transactions],
    "time" : 1388185914,
    "nonce" : 924591752,
    "bits" : "1903a30c", // Here it's
    "difficulty" : 1180923195.25802612,
    "chainwork" : "000000000000000000000000000000000000000000000934695e92aaf53afa1a",
    "previousblockhash" : "0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569",
    "nextblockhash" : "000000000000000010236c269dd6ed714dd5db39d36b33959079d78dfd431ba7"
}

В bits на самом деле записаны сразу два числа: первый байт 0x19 — экспонента, оставшиеся три байта 0x03a30c — мантисса. Для того, чтобы получить target из bits, нужно воспользоваться следующей формулой: target = mantissa * 2^(8 * exponent - 3)). В случае блока #277.316 получается:

>>> bits = 0x1903a30c
>>> exp = bits >> 24
>>> mant = bits & 0xffffff
>>> target_hexstr = '%064x' % (mant * (1 << (8 * (exp - 3))))
>>> target_hexstr
'0000000000000003a30c00000000000000000000000000000000000000000000'

Другой термин, отражающий сложность майнинга, — difficulty. Например для блока #449.584 он равнялся 392,963,262,344.37. Этот параметр представляет из себя отношение max_target / current_target, где max_target — максимально возможный target, а именно 0x00000000FFFF0000000000000000000000000000000000000000000000000000 (0x1d00ffff в формате bits). Именно bits как правило указывается во все block explorer.

BTW чем меньше target, тем больше difficulty и наоборот.


PoW

Теперь, когда вы разобрались со всеми нюансами, можно запускать майнер:

import hashlib
import struct
import sys

# ======= Header =======
ver = 2
prev_block = "000000000000000000e5fb3654e0ae9a2b7d7390e37ee0a7c818ca09fde435f0"
merkle_root = "6f3ef687979a1f4866cd8842dcbcebd2e47171e54d1cc76c540faecafe133c39"
bits = 0x10004379 # Not the actual bits, I don't have synced blockchain
timestamp = 0x58777e25
# Calculate current time with this code:
# hex(int(time.mktime(time.strptime('2017-01-12 13:01:25', '%Y-%m-%d %H:%M:%S'))) - time.timezone)

exp = bits >> 24
mant = bits & 0xffffff
target_hexstr = '%064x' % (mant * (1 << (8 * (exp - 3))))
# '0000000000000000000000000000000000437900000000000000000000000000'
target_str = target_hexstr.decode('hex')
# ======== Header =========

nonce = 0
while nonce < 0x100000000: # 2**32
    header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] +
          merkle_root.decode('hex')[::-1] + struct.pack("<LLL", timestamp, bits, nonce))
    hash = hashlib.sha256(hashlib.sha256(header).digest()).digest()

    sys.stdout.write("\rNonce: {}, hash: {}".format(nonce, hash[::-1].encode('hex')))
    sys.stdout.flush()

    if hash[::-1] < target_str:
        print 'Success!'
        break
    nonce += 1

Hash rate

Если вы дождались заветной строчки Success!, то у вас либо Intel Core i7, либо очень много свободного времени. Я понятия не имею, когда этот код закончит свою работу и найдет ли он nonce вообще, потому что текущая сложность просто чудовищно велика. Даже если предположить, что наша программа способна обсчитать 100.000 хэшей в секунду (а это не так), то она все равно в миллионы раз медленней любого настоящего майнера, поэтому на поиск nonce у нее может уйти несколько дней.

Чтобы вы осознали масштаб проблемы: существует метрика hashrate. Она отражает суммарную мощность майнеров в сети Bitcoin, единица измерения — хэши SHA256 в секунду. Вот ее график:

Будем считать, что хэшрейт составляет 2.000 PH/s = 2.000.000 TH/s = 2.000.000.000 GH/s = 2.000.000.000.000 MH/s = 2.000.000.000.000.000 KH/s. А наша программа даже 100 KH/s не может осилить, поэтому соревноваться со всей сетью нет никакого смысла.


2 Blocks 1 Chain


Fork

Давайте на минуту представим, что майнеры ищут блок #123456. И примерно в одно и то же время он был найден двумя независимыми майнерами, один из которых живет в Австралии, а другой в США. Каждый из них начинает раскидывать свою версию блока по сети, и в результате получается, что у одной половины мира один блокчейн, а у другой — другой.

Возможно ли такое и что произойдет в этом случае?

Да, возможно. Более того, такое происходит довольно часто. В этом случае каждая нода продолжает придерживаться своей версии блокчейна до тех пор, пока кто-нибудь не найдет следующий блок. Предположим, что новый блок продолжает «зеленую» ветку, как на картинке ниже.

В этом случае те ноды, которые придерживаются «красной» версии, автоматически синхронизирует зеленую, потому что в мире Bitcoin работает правило: «истинна» самая длинная версия блокчейна. «Красная» версия блокчейна будет попросту забыта, вместе с наградами для тех, кто ее нашел.

Вы можете спросить: а что если форк пойдет дальше? То есть одновременно с «фиолетовым» блоком найдут еще один, который будет продолжать «красную» версию блокчейна?

Скорее всего, эту книгу будут читать не только люди с хорошим математическим образованием, поэтому дам самый общий ответ — такое безусловно возможно. Но вероятность даже первого форка довольно мала, второго — еще меньше и так далее. Чтобы вы понимали, самый длинный форк за всю историю Bitcoin составил всего 4 блока. Так что в какой-то момент одна из веток все таки вырвется вперед, и вся сеть перейдет на нее.

Если вам интересна эта проблема именно с ракурса теории вероятностей, то можете прочесть «What is the probability of forking in blockchain?» Еще этот вопрос неплохо расписан в знаменитой «Bitcoin: A Peer-to-Peer Electronic Cash System» by Satoshi Nakamoto.


51% attack

На том простом факте, что в блокчейне самая длинная цепочка — доминирующая, основана целая атака:


Представьте, что вы мошенник и покупаете товар на 1000 BTC в каком-нибудь магазине. Вы договариваетесь с продавцом и отправляете ему деньги. Продавец проверяет блокчейн, видит, что такая транзакция действительно была, прошла все проверки и даже попала в какой-нибудь блок, например #123. После этого продавец идет на почту и отправляет вам товар.

В это время вы включаете свою майнинг-ферму и начинаете майнить, начиная с блока #122. Если у вас достаточно мощностей, то вы можете обогнать всю остальную сеть и быстрее всех досчитать до блока #124, после чего весь мир перейдет на вашу версию блокчейна. При этом свою транзакцию на 1000 BTC, вы не будете включать ни в один из блоков, а значит она будет навсегда забыта, как будто ее никогда и не было. В результате продавец лишится товара и не получит своих денег.

Не буду вдаваться в теорию вероятностей, но осуществить такую атаку невозможно, если только у вас нет как минимум половины хэшрейта всей сети. Подробнее можете прочитать в bitcoin.pdf.

Тем не менее некоторые майнинг пулы обладают очень значительными мощностями. Так например BTC Guild в 2013 году почти преодолел порог в 51% хэшрейта. В какой-то момент они замайнили сразу 6 блоков подряд, так что при желании смогли бы осуществить данную атаку. Поэтому рекомендуется считать транзакцию подтвержденной только после того, как было создано 6 блоков сверху.


Hardware

Можете сразу забыть про майнинг на CPU или GPU. Чтобы вы понимали, ниже изображен хэшрэйт на начало 2017 года. Будем считать, что он в среднем составляет 2.300.000 TH/S, то есть 2.300.000.000.000 MH/s. Для сравнения, самые зверские видеокарты, такие как ATI Radeon HD 5870 Eyefinity или AMD Radeon HD 7970 (x3), выдают в лучшем случае 2000 MH/S. Среди процессоров первое место занимает Xeon Phi 5100 со смешными 140 MH/s.

Так что даже исходя из курса в 1000 $/BTC и имея на руках 10.000 MH/s, вы в среднем будете зарабатывать 20 центов в месяц.

CPU майнинг перестал быть рентабельным еще в 2011 году, GPU держался примерно до 2013 года, но тоже прогорел, когда широкое распространение получили так называемые application-specific integrated circuit — ASIC. Это специальные чипы, заточенные под майнинг на уровне железа. Самые простые стоят в районе 100$, что сильно дешевле топовой видеокарты, но при этом способны выдавать от 1 TH/s.

То есть при прочих равных, имея два Antminer S9 по 3.000$ за штуку, вы будете зарабатывать почти 700 долларов в месяц (без учета счетов за электричество)

Но и на этом еще не все. Вы можете объединиться с другими майнерами в mining pool и начать майнить вместе, а заработанные деньги делить пропорционально вложенным мощностям. Это, очевидно, намного выгодней, чем пытаться заработать хоть что-нибудь в одиночку, поэтому именно пулы на сегодняшний день составляют главную движущую силу в мире майнинга. На начало 2017 года основными игроками на рынке пулов являются AntPool, F2Pool и Bitfury, обеспечивающие более 40% хэшрейта всей сети.


Conclusion

На этой высокой ноте я заканчиваю свой рассказ про техническое устройство Bitcoin. Исходники текста плюс примеры кода здесь, там же pdf версия. Pull requests welcome, задавайте свои вопросы в Issues или в комментариях.


Links


habr.com

основные принципы майнинга / Блог компании Intel / Хабр


(источник)

Про Bitcoin (BTC) на Хабре писали много (в последнее время даже чересчур много). Как он работает, об интересе к нему со стороны правительства и спецслужб. Биткойн не раз пытались похоронить и затем откопать назад. Даже проводили экскурсии на страусиную ферму. Но как-то, глядя на это, не складывалось целостной картины.

Я постараюсь отчасти восполнить этот пробел и изложить в нескольких постах основные принципы и историю того, как добывались и добываются биткойны. Преимущественно внимание будет уделяться технологической стороне вопроса, а не громким скандалам в мире медиа и политики. Также, я постараюсь избежать повторения того, о чем уже писалось не раз.
В этот раз речь пойдет об общих принципах майнинга.

UPD: с матчастью как работает сам биткоин можно ознакомиться тут.

Bitcoin mining: «кто все эти люди?»

Для начала попробуем ответить на вопрос, а кто, собственно, занимается добычей биткоинов. Ниже перечислены основные категории людей, добывавших или добывающих биткоины, с учетом хронологии их появления на сцене.
1) Школьники и студенты, имеющие доступ к дешевому (или вовсе бесплатному) электричеству и hardware, за счет своих родителей и университетов.
2) Геймеры, использующие свои игровые ПК для добычи биткоинов в перерывах между компьютерными баталиями.
3) Гики, покупающие несколько ПК для майнинга, и которых обычно останавливает только исчерпание ресурсов электроснабжения/охлаждения/свободного места (ну или терпения родных и соседей)
4) Хакеры, развертывающие ботнеты и использующие для майнинга украденные вычислительные мощности.
5) Сообщества, организующиеся для совместной покупки оборудования и добычи биткоинов, с последующим разделением полученной выгоды.
6) Компании, которым удалось получить финансирование от энтузиастов, через аналог IPO на онлайн-биржах, ведущих торги за bitcoin. Такие компании разрабатывают специализированное hardware (ASIC) для последующей добычи bitcoin и распределяют дивиденды.
Как видно, довольно разношерстная компания.
Добыча Bitcoin

Суть добычи биткоинов сводится к решению некой сложной криптозадачи, для которой неизвестно лучшего подхода чем брутфорс.
Биткоины добываются не по одному, а «пачками», или блоками. Первоначально размер блока равнялся 50 BTC, но он уменьшается вдвое после каждых 210 тыс. добытых блоков. Сейчас добыто уже больше 250 тыс. блоков, а значит, один блок приносит 25 BTC. Новый блок добывается примерно каждые 10 минут. Из-за периодического уменьшения награды за блок вдвое, общее количество BTC никогда не превысит 21млн, ~55% всех BTC уже добыто и, по прогнозам, эта цифра достигнет 99% к 2032 году.
Периодически, через каждые 2016 добытых блоков, происходит корректировка сложности их добычи. Корректировка основывается на скорости добычи в последний период и нужна для сохранения среднего интервала добычи блоков у отметки в 10 минут.
Если количество компьютеров, занятых одновременной добычей биткоинов, в целом растет, то ежедневная награда (равная 24*6*25 = 3600 BTC) остается неизменной. А значит, на каждый компьютер приходится всё меньшая доля общего «пирога».
Добыча биткоинов имеет смысл только до тех пор, пока стоимость добытых BTC превосходит затраты на оборудование и электроэнергию. Т.к. сложность добычи BTC неуклонно увеличивается, да и курс USD/BTC подвержен колебаниям, наименее энергоэффективные средства добычи BTC постепенно исключаются из процесса. Хотя, резкий рост курса USD/BTC может сделать рентабельным их возвращение в строй.
(В этот раз совсем) немного истории

Bitcoin стал результатом развития идей, заложенных в существовавшие ранее криптовалюты. А впервые он появляется на сцене в ноябре 2008го, когда пользователь под псевдонимом Сатоши Накамото (Satoshi Nakamoto) публикует статью, описывающую систему новой валюты. Уже в январе 2009го система начинает функционировать, а её популярность сначала растет медленно, но вскоре переходит в экспоненциальный рост. Известен случай, когда один человек заплатил за пиццу 10тыс. BTC (несколько миллионов $ по нынешнему курсу). Накамото исчезает в апреле 2011, и его личность до сих пор остается загадкой.
Курс USD/BTC


Рисунок 1. Динамика курса USD/BTC и сложности майнинга (источник данных)

На рисунке 1 показана динамика курса обмена USD/BTC с течением времени. Начиная с 2010го года курс резко пошел вверх. Если в июле 2010 1 BTC стоил $0.05, то к августу 2013 уже преодолел отметку $105. В этом интервале наблюдается два скачка – один в июне 2011го, когда биткоин стоил $31.5 и в апреле 2013го, когда курс подскочил до $266 (а сейчас и до $1000). Резкие скачки и обвалы курса чаще всего связаны с периодами пристального внимания СМИ и расцвета страхов/слухов об уязвимостях протокола или взломах организаций, отвечающих за обмен BTC на другие валюты. Подобные слухи каждый раз сопровождаются волной желающих продать биткоины и обвалом курса.
Основная причина, делающая BTC столь привлекательным для спекуляций – верхний предел на количество BTC, равный 21млн. Если когда-нибудь BTC всё-таки заменит золото как эталон для хранения сбережений, то, приравняв стоимость мирового золотого запаса к общей стоимости биткоинов, можно сказать что один BTC будет стоить $71000 – гораздо больше, чем сейчас (практически, на два порядка, даже с учетом последних спекуляций).

Сложность майнинга BTC

На рисунке 1 также показано как менялась сложность майнинга биткоинов с течением времени. За неполные 4 года сложность возросла в 50млн. раз. Если в начале сложность соответствовала 4-8 процессорным ядрам общего назначения, способным перебрать примерно 7 млн. хэшей в секунду (MH/s), то сейчас скорость совместных усилий по брутфорсу превосходит 7 петахэшей в секунду (PH/s).Такому росту способствовали 2 фактора. Первое – рост курса USD/BTC позволяет покрыть расходы на эксплуатацию большего количества оборудования для майнинга. Второе – за это время произошли значительные изменения как в программном, так и в аппаратном обеспечении для майнинга биткоинов. Опять-таки, точки падения сложности добычи BTC соответствуют местам обвала курса USD/BTC.
Инновации в hardware и software для майнинга

Прогресс шел невероятно быстро, изменения следовали одно за другим.
В сентябре 2010 появляется первый общедоступный CUDA miner. Уже в октябре 2010 за ним последовал первый майнер для OpenCL.
Практически сразу после этого, в ноябре 2010, возникло такое явление как pooled mining, когда группа компьютеров выполняет распределенный перебор хэшей, а, при добыче блока биткоинов, делит награду между участниками пропорционально их вкладу в общее дело. Подобные пулы очень быстро выросли до размера тысяч участников, позволив последним получать небольшие суммы каждый день, а не большие (50 или 25 BTC) каждые несколько месяцев.
На тот момент сложность добычи блока биткоинов равнялась примерно месяцу работы одного Hi-End GPU. Одной из ключевых инноваций, сделавшей возможным существование mining pool’ов, стала возможность убедиться, что компьютер действительно провел работу по перебору хэшей, которую он заявил как выполненную, и исключение возможности того, что пользователь «сбежит», когда его компьютеру в ходе перебора посчастливится наткнуться на ответ.
К сожалению, mining pools служат своего рода «концентраторами», что противоречит распределенной природе bitcoin и потенциально ставит под угрозу процесс подтверждения транзакций.
В июне 2011 появился первый open source miner для FPGA. А затем в январе 2013 появляется первый ASIC майнер и множество улучшений последовавших за этим. На графике сложности добычи BTC показаны даты появления этих технологий.
производительность и энергоэффективность

Hi-End CPU (вроде Core i7 990x), подвергнутые оверклокингу, достигли производительности 33 MH/s, а Hi-End GPU от NVidia (вроде GTX 570) 155 MH/s. В то же время GPU от AMD (вроде 7970 за $450) выступали гораздо убедительнее, на уровне 675 MH/s.
Следующий шаг эволюции связан с появлением FPGA майнеров, которые хоть и немного проигрывали видеокартам от AMD в стоимости железа на единицу производительности ($/MH/s), но зато потребляли 60W вместо 200W. Компания под названием Butterfly Labs (BFL) начала продавать FPGA майнеры, которые в итоге могли бы постепенно вытеснить GPU за счет меньшего энергопотребления.
Но тут на сцену выходят ASIC майнеры, дающие выигрыш на порядки, по сравнению с FPGA. За счет их использования суммарная производительност взлетает до небес, а вместе с ней и сложность добычи блоков, что неизбежно оставляет не у дел и GPU и FPGA.


Рисунок 2. Установка для майнинга биткоинов на основе FPGA (источник)

Стратегия майнинга

Важным вопросом для тех, кто занимается добычей биткоинов, является: когда инвестирование денег в «железо» для добычи биткоинов принесет больше прибыли, чем просто их покупка через биржу. Многая специализированная аппаратура для майнинга BTC (или доли в компаниях, эксплуатирующих такую аппаратуру за вас) имеет цену, указанную в BTC. Согласитесь, было бы глупо купить такую аппаратуру и так никогда и не вернуть свои вложения, особенно с учетом обслуживания и счетов за электричество.

Чтобы ответить на этот вопрос, необходимо оценить возврат средств за счет майнинга в биткоинах. В условиях экспоненциального роста сложности добычи новых биткоинов, способность железа к добыче биткоинов падает также экспоненциально. При росте сложности примерно в 1.2 раза каждые две недели, 66% биткоинов, которые «железо» способно добыть за время своей эксплуатации, приходится на первый квартал работы. 22% на второй квартал, 7% на третий, а на всё оставшееся время приходится лишь 4%. При этом в первый день работы будет добыто ~1/80 всех биткоинов, что можно добыть на этом девайсе за время его эксплуатации.
Прибыль от использования аппаратуры для майнинга биткоинов получается суммированием экспоненциально убывающих сумм добываемых биткоинов в единицу времени, минус расходы на эксплуатацию и приобретение, плюс цена, по которой аппаратура может быть продана после завершения её жизненного цикла в качестве майнера биткоинов.

Некоторые из этих параметров известны в момент покупки; например, цена аппаратуры, курс USD/BTC на этот момент и расходы на эксплуатацию. Также легко оценить количество биткоинов, добываемых за первый день работы, т.к. сроки поставки аппаратуры легко оценить (только не надо тут вспоминать про Почту России), а производительность тех же GPU в GH/s – первое, чем пользователи начинают меряться на соответствующих форумах. Расходы на обслуживание напрямую вытекают из спецификации оборудования и счетов за электричество. Оценка того, за какую сумму в будущем удастся продать железо, делается (хоть и приблизительно) изучая сайты вроде e-bay.

Основной риск кроется в динамике курса USD/BTC. Если курс растет – растет и прибыль от добываемых биткоинов, а также имеет смысл оставить оборудование в строю на больший срок. Если курс перестает расти или обваливается, добыча биткоинов становится менее привлекательной, а также для максимизации прибыли имеет смысл отключить оборудование и попытаться продать его раньше.

Изменение цены оборудования со временем ведет себя различным образом для разных типов устройств. Цена на GPU от AMD за год эксплуатации снижается весьма незначительно. В то время, как ситуация со специализированным оборудованием прямо противоположная, т.к. единственное его назначение – майнинг. Специализированные решения на основе FPGA или ASIC имеют гораздо более высокие риски, связанные с датой поставок оборудования – цена, за которую их готовы купить, и то, сколько на них можно заработать, напрямую зависит о даты их ввода в процесс майнинга. Управление этим риском – важная часть майнинга биткоинов.

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

Отключение оборудования


Рисунок 3. Дневная прибыль от добычи биткоинов и соответствующие расходы на электроэнергию. (источник данных)

Рисунок 3 показывает дневную прибыль на 1 GH/s, которую приносил майнинг биткоинов с 2010го года. Данный график комбинирует исторические данные о сложности майнинга и курсе USD/BTC. Резкий обвал в районе ноября 2012 года соответствует уменьшению награды за блок с 50 BTC до 25 BTC. Горизонтальные линии показывают расходы на электроэнергию на 1 GH/s за день для: CPU (Core i5), GPU (AMD 7970), FPGA (Bitforce SHA256) и 110nm ASIC (AvalonBatch 1). Когда прибыль на 1 GH/s опускается ниже этой линии, майнинг становится убыточным и соответствующее оборудование выключается.

Продолжение следует.

habr.com

Биткойн изнутри для непонимающих / Хабр

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

Электронная цифровая подпись (ЭЦП)

К сожалению, я не нашел подходящих простых образов, чтобы показать как изнутри работает криптография на эллиптических кривых. Возьмем этот инструмент «на веру». Те же алгоритмы используются в банковском секторе (и не только), поэтому крах ЭЦП приведет к кризису многих отраслей. Итак, закрытым ключом мы подписываем «письма передачи прав собственности» (транзакции), и тем самым отдаем свои монеты кому-то другому. Открытым ключом мы проверяем подлинность чужих транзакций.
Хеширование

Если Вам понятен процесс хеширования, пропустите этот раздел. Показать хеширование довольно просто. Возьмем некоторое число… например номер телефона +7 (495) 606-36-02. Сложим все цифры вместе, несколько раз:
7+4+9+5+6+0+6+3+6+0+2=48 => 4+8=12 => 1+2=3
Так можно однозначно сопоставить любому номеру телефона некоторое число. Процесс суммирования называется хешированием, сам способ — хеш функцией, полученное число — хеш-суммой или просто хешем.
Обычно добиваются следующий свойств от хеширования:
— Зная хеш-сумму (в нашем случае 3) нельзя определить исходный номер телефона.
— Нельзя подогнать номер телефона под заранее известную сумму (в нашем примере неприменимо, обязательно для bitcoin).
— Малое изменение номера телефона приведет к кардинальному изменению хеша (в нашем примере неприменимо, но обязательно для bitcoin).
Также много других понятных бытовых примеров хеширования в wiki статье.
Передача прав собственности. Хеш-сумма публичного ключа

Bitcoin оперирует хеш-суммой публичного ключа, как адрес для передачи монет. Объявить чей-либо bitcoin адрес во всеуслышание — ничего не стоит. Узнать исходный ключ по его хешу не предоставится возможным даже участникам «битвы экстрасенсов». А сама пара ключей будет использована лишь однажды — при передаче прав собственности. На этом жизнь пары ключей заканчивается.

PUB1 — публичный ключ
PRIV1 — секретный ключ
HASh2 или HASH(PUB1) — хеш-сумма публичного ключа (биткойн-адрес).
HASh3 или HASH(PUB2) — хеш публичного ключа следующего владельца.

Отвлечемся на некоторое время от монет. Возьмем, к примеру, владельца автомобиля, собственность которого не вызывает сомнений.
— Собственник на публичном собрании (ярмарке, телевизионном шоу) показывает всем хеш своего публичного ключа HASH(PUB1), заводской номер автомобиля, и все соглашаются с этим — никто не предъявляет претензий.
— До момента продажи оба ключа PUB1, PRIV1 продавца остаются в секрете. Известен только HASH(PUB1) и соответсвующий ему заводской номер автомобиля.
— Как только собственник хочет продать автомобиль какому-либо покупателю — он пишет открытое письмо, в котором указывает заводской номер и хеш-сумму публичного ключа второго владельца HASH(PUB2). И конечно же подписывает письмо своим секретным ключом PRIV1, прилагая публичный ключ PUB1.
— После передачи собственности секретный ключ перестает быть актуальным — второго такого письма быть не может (см. «Единая история»). Публичным ключом можно проверить само письмо, удостоверить второго собственника.
— О втором собственнике ничего неизвестно кроме HASH(PUB2), до тех пор пока он не передаст права третьему владельцу. И эта цепочка может быть бесконечной.
— Подписывая передачу прав с использованием ЭЦП, собственник не только удостоверяет себя, но и накладывает на себя обязательство передачи. Как говорится: «слово — не воробей, вылетит — не поймаешь».
— Благодаря HASH(PUB) получается двойная защита. Первая загадка — узнать публичный ключ по его хешу. Вторая загадка — подписаться чужим секретным ключом.

Если заменить автомобиль на bitcoin, то вместо заводского номера выступает хеш предыдущей транзакции. А вся цепочка собственников хранится публично у каждого пользователя.

«А сдачу!?»

Сдачу надо оставить себе. Но так задумано, что секретный ключ используется только один раз, а часть своих монет пересылается на свой же новый, не засвеченный адрес. Из-за этого трудно понять сколько монет принадлежит какому-либо адресу, и тяжело судить об объеме переданных монет за сутки/месяц/год.
Единая история. Что же копают майнеры.

Чтобы не было возможности дважды потратить монеты, должна быть единая история всех сделок. Тогда в журнал будет попадать только первая транзакция (письмо передачи прав на монеты), или в крайнем случае одна из нескольких. Для этого транзакции объединяются в блоки и признаются только «красивые» блоки. «Красивый блок» трудно найти, это подобно тому как из тонн золотой руды попадается лишь один стоящий самородок. В нашем случае хеш-сумма блока должна содержать определенное количество нулей.
Блок состоит из предыдущего блока (хеш-суммы), хеш-суммы всех включенных транзакций, и случайно перебираемого числа (англ: nonce).
Пример bitcoin-блока с сайта blockexplorer.com:
* Hash: 00000000000001c21dbf4715d5da1a288061faa21e950dd8df6ae25c8b55d868
* Previous block?: 000000000000056a7dcf283f627c2a17c55ffe1937a6ed2bc467d9c524311da2
* Difficulty: 1 690 895.803052 ("Bits": 1a09ec04)
* Transactions: 184
* Total BTC: 4251.63216933
* Size: 58.913 kilobytes
* Merkle root: 98c5d975bf556f0344770eee7ab31688a1c108223c14cea908ff99b0ab8fe947
* Nonce: 3723473450

Видите сколько нулей в начале хеш-суммы блока? Вот поэтому его так трудно было найти. Но каждый легко может проверить подлинность «красоты» блока. Количество нулей в хеше выбирается таким образом, чтобы каждый блок появлялся на свет приблизительно раз в 6 10 минут. За нахождение блока выдается поощрение, сейчас это 50 монет. Также нашедшему выдаются все сборы от платежей (transactions fees), за те транзакции которые включены в его блок.
Единая история достигается за счет того, что всегда побеждает наиболее длинная цепочка блоков. Не проблема, если от биткойн-сети будет отколот изолированый кусочек пользователей — впоследствии все отколотые транзакции войдут в более длинную цепочку (с учетом сложности).
Тонкости работы

— Под хешированием обычно понимается двойной sha256, т.е. sha256(sha256(x)).
— Удивительно, но bitcoin ничего не шифрует. Весь журнал транзакций — полностью открытая информация. Любой может проверить целостность всех транзакций, посчитать количество монет в обороте. Нет никаких шансов для фальшивомонетничества. Единственная возможность для злодейств — лишь приостановить работу биткойн на некоторое время.
— При первом старте bitcoin-приложение создает пару ключей. Точнее он создает их сразу 100 пар заранее, тем самым можно сделать резервирование кошелька (backup) не более чем на 100 операций вперед.
— На самом деле в транзакции указывается алгоритм проверки, помимо самого биткойн-адреса. Внутри биткойн встроен собственный примитивный, намеренно обрезанный язык программирования, который позволяет сделать сложные транзакции. Например можно запрограммировать, чтобы деньги отправлены нескольким адресатам (как сейфовая ячейка с несколькими ключами). Или включить ограничения по времени на трату денег (не раньше 2013 года) и т.д.
— Транзакции в блок укладываются в виде дерева хешей. Таким образом в дальнейшем можно будет выкидывать завершенные транзакции для экономии места на диске, не нарушая целостности блоков.
— Биткойн-адрес содержит в себе контрольную сумму. Поэтому в адресе нельзя ошибиться пропустив или заменив одну или несколько символов.
В заключение

Вне зависимости от курса монеты (обижаться на систему могут только спекулянты) я считаю что bitcoin стал очень успешным в техническом отношении. Здесь есть чему поучиться и использовать полученый опыт в дальнейшем.

habr.com

Bitcoin на пределе? Почему криптовалюту ждут тяжелые времена / Хабр

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

В теории игр, помимо всего прочего, исследуется феномен под названием «трагедия общинного поля». Если кратко, это неспособность сдерживать свои личные аппетиты (или выполнять персональные обязательства) в ситуациях, когда личной выгоде противопоставлена коллективная ответственность. Что лежит в корне этого феномена вопрос больше к философам и психологам, остановимся на том что он просто есть, и проявлялся на протяжении всей истории человечества.

В IT феномен выливается в неспособность обеспечивать качество сервиса, когда система зависит от согласованного поведение независимых игроков. Например, если попросить посетителей сайта добровольно посещать сайт по расписанию, чтоб не создавать перегрузок, то это просто не будет работать.

И несколько инцидентов последнего времени говорят о том, что биткоин не является здесь исключением.

Форк цепочки 04-07-2015


Форк цепочки блоков bitcoin — состояние, когда в сети существуют и продолжают рассчитываться одновременно две версии цепочки блоков. Такое возможно, когда в сети есть майнеры, которые рассчитывают новые блоки, но оформляют их не правильно, и есть значительное количество участников сети (около 50%), которые считают такие неправильные блоки правильными, включают их в свою локальную копию цепочки, анонсируют своим сосядем и продолжают рассчитывать следующий за неправильным блок. А остальные 50%, которые отвергают неправильный блок, продолжают рассчитывать уже свою версию цепочки по новым правилам.

Собственно, это и произошло. 10 января был анонсирован бюллетень обновлений, в котором немного изменялся формат подписи в блоках. Предполагалось, что к июлю, когда измененные правила вступит в силу, обновление будет установлено на большинстве (значительно больше 50%) участников сети. Но реальность оказалась иной, и это имело последствия:

  1. потеря денег продавцов — потеря транзакций обработанных в неправильных блоках
  2. потеря денег майнеров — по приблизительным рассчетам, майнеры потратили около 50 000$ на расчет блоков, которые потом были отклонены
  3. падение скорости транзакций — рекомендовалось ожидать 30(!) подтверждений (это количество блоков в цепочке, после блока в котором обработана рассматриваемая транзакция, т.е. по ~10 минут каждый) для сохранения доверия.

Флуд ничтожными транзакциями 07-07-15


Кто-то начал эксплуатировать «общее поле», создавая большое (десятки тысяч) количество транзакций с минимальной суммой перевода. Эти транзакции начали «размывать» очередь полезных транзакций (в среднем, где-то около 2 тысяч), которые ожидали своего проведения (включения в блок). Атака длилась до 15 июля, атакующий потратил около 30 BTC (7500$), и не смотря на попытки майнеров фильтровать мусорные транзакции, атакующий смог добиться:
  1. Потеря скорости проведения платежей
  2. Проблемы со связностью сети — транзакции создавали трафик который не все участники сети могли себе позволить
  3. Проблемы с майнингом — некоторые майнеры оказались технически не готовы работать очередью таких размеров
  4. Напряжение в bitcoin-сообществе — появились подозрения, что таким образом кто-то решил продемонстрировать необходимость изменения размеров блока.

The End Is Nigh?


«Сегодня в завтрашний день не все могут смотреть. Вернее, смотреть могут не только лишь все, мало кто может это делать.»(с)

Но мы попробуем, не смотря на предостережение мудрецов. Вспомним основные качества bitcoin, за которые мы его так любим:

  1. Нет единого центра доверия или управления. Клиентское ПО управляется только пользователем, цепочку можно проверить локально.
  2. Система распределена, нет какой-то единого арбитра, который может взять и её всю, например, остановить или почистить.
  3. Сложность майнинга зависит от вычислительных возможностей сети, грубо говоря, чем больше майнеров, тем сложнее провести две конфликтующие транзакции (doublespending attack).

Описанная проблема с клиентским ПО является прямым следствием пункта 1: мы не можем форсировать централизованный апдейт, так как у нас нет центра управления, а если мы накатываем его добровольно, то получается форк и участники сети несут коллективную ответственность(привет, общинное поле). Во что, в такой обстановке, будут выливаться апдейты протокола если сеть вырастет в 2 раза, а в 3?

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

Но самым тревожным является третий пункт, аналитически доказано, что для того, чтоб начать всей сети диктовать свою версию цепочки (начать это делать с вероятностью 1), необходимо иметь 51% вычислительных мощностей сети. Если взглянуть на текущее распределение мощностей, то получается, что 90% всей вычислительной мощности контролируется 10 субъектами:

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

Итого, с одной стороны есть проблемы с качеством сервиса, которые решать в обозримые сроки возможно только через диктат решения, а с другой мы имеем 10 игроков, которые заинтересованы в работе системы. Следовательно, созданы условия для формирования картеля, узкого круга, который является основным бенефициаром изменений инфраструктуры, и который будет вынужден найти способ диктовать эти решения всем участниками системы, чтоб она развивалась без сбоев и приносила прибыль. (По поводу картелей в условия общинного поля, интересным для изучения примером может быть ОПЕК, а точнее их безуспешные попытки договориться повлиять на цену нефти. )

А теперь, главный вопрос: когда 10 субъектов, которые вынуждены договариваться (согласованно вносить изменения так что работа системы не была нарушена) и контролируют всю систему с помощью своих огромных вычислительных мощностей, о какой распределенности и независимости может идти речь, и чем такая система лучше, чем система которую контролируют 10 субъектов, но без огромных фабрик для майнинга, а каким-нибудь более дешевым способом?

habr.com

Техническая сторона Bitcoin / Хабр

В последние месяцы, пир-ту-пир валюта Bitcoin серьёзно выросла в популярности, в основном благодаря упоминаниям в прессе и вовлечению массовой аудитории. В то же время, среди эспертов, насколько я могу судить, распространены скептические оценки, вплоть до «Bitcoin is a scam». Я в прошлом разрабатывал и платежные системы и P2P-системы, и с криптографией приходилось работать. Поэтому я прочитал доступные источники и постарался рассмотреть технологию Bitcoin с технической точки зрения, по возможности взвешенно. Предлагаю вам краткий русский перевод материала.

Итак, утверждается что Bitcoin — это (1) peer-to-peer (2) анонимная (3) безопасная цифровая валюта. На мой взгляд, все три утверждения спорны и могут быть приняты только если несколько расширить определения.

Bitcoin — не peer-to-peer, поскольку для осуществления операций участнику нужна информация по всем операциям в системе. Соответственно, не имея полной информации по каждой транзакции (в мире!), производить транзакции самостоятельно невозможно. Если система будет обслуживать сколько-нибудь серьёзный поток транзакций, она неизбежно расколется на «пэров» (peers) и «простолюдинов» (commoners).
Простолюдины будут платить пэрам за право совершения транзакций, а пэрам необходимо будет располагать нетривиальными матфондами для осуществления своих функций.

С анонимностью в Bitcoin всё тоже слегка неопределённо. Да, для каждой транзакции каждый участник создаёт одноразовый кошелёк. Однако, в принципе, сложные транзакции (с участием нескольких монет) потенциально позволяют выявить одноразовые кошельки, принадлежащие одному и тому же владельцу. Также, учитывая возможность отслеживать все транзакции, нельзя исключить и возможности тотальной слежки за такой сетью. Такая слежка будет совершенно незаметна участникам; в отличие от классических спецслужб, тут шпики не оставят ни бумаг, ни улик.

С безопасностью всё тоже слегка сомнительно. Криптографическая безопасность базируется на асимметриях затрат: если я что-то шифрую сильным крипто, злоумышленнику нужно сжечь два Солнца, чтобы сбрутфорсить шифр. Увы, в Bitcoin сильно закриптованы только отдельные транзакции. Вся же конструкция в целом держится на очень сомнительных болтиках — цепочках proof-of-work. Если у злоумышленника есть вычислительные ресурсы, сопоставимые с мощностью сети (пэров), он может вытворять разные фокусы (см. оригинальный текст). Плохая асимметрия заключется в том, что пэрам нужно жечь электричество круглые сутки, чтобы поддерживать сеть. Злоумышленник же может мобилизовать свои ресурсы лишь на краткий период. Другая плохая асимметрия: чтобы попытаться провернуть double spending, злоумышленник можеть лишь предложить монетку нескольким жертвам одновременно. Жертвам же нужно либо быть в курсе всех транзакций (в мире), либо ждать от 10 минут до 1 часа, пока транзакция надёжно отложится в истории у «пэров».

Таким образом, главный пункт программы Bitcoin — предотвращение double spending без привлечения trusted third parties, не выдерживает критики. Третьи стороны (пэры) будут всё равно, а насколько на практике возможно избежать мошенничества — ясно не вполне.

Что также бросается в глаза: за исключением «политической» программы и маркетинговой упаковки, непонятно чем Bitcoin лучше современной европейской банковской системы. Более того, он во многом хуже: в моём интернет-банке нулевые комиссии и моментальное проведение платежей в пределах страны. В Bitcoin комиссии неизбежны, плюс проведение операции требует от 10 минут.

Общий вывод: Bitcoin — грамотно раскрученный проект 🙂

habr.com

Майним Bitcoin с помощью бумаги и ручки / Хабр

В один прекрасный момент мне захотелось прикинуть, насколько быстро можно майнить биткойны вручную. Оказалось, что для майнинга используется хеширование SHA-256, а оно достаточно простое и может быть вычислено даже без компьютера. Само собой, процесс очень небыстрый и совершенно непрактичный. Но, пройдя все шаги на бумажке, можно хорошо разобраться в деталях работы алгоритма.


Один криптографический раунд

Майнинг


Ключевая часть всей системы безопасности биткойна — майнинг. Основная идея заключается в том, что майнеры группируют биткойн-транзакции в один блок, который уже подвергают хэшированию неисчислимое число для нахождения очень редкого значения хэша, подпадающего под специальные условия. Когда такое значение находится, блок считается смайненным и попадает в цепочку блоков. Само по себе хэширование не несёт никакой полезной цели кроме увеличения сложности поиска правильного блока. Таким образом, это одна из гарантий того, что никто в одиночку с любым существующим набором ресурсов не сможет взять под контроль всю систему. Подробнее про майнинг можно почитать в моей прошлой статье.

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

В биткойне критерием валидности хэша является достаточное число нулей в его начале. [1] Найти такой хэш так же сложно, как, к примеру, найти номер машины или телефона, заканчивающийся на несколько нулей. Но, конечно, для хэша это экспоненциально сложнее. На текущий момент, правильный хэш должен содержать примерно 17 стартовых нулей, чему удовлетворяет только 1 из 1.4×1020. Если провести аналогию, то найти такое значение сложнее, чем обнаружить конкретную частичку среди всего песка на Земле.

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


Структура биткойн-блока

SHA-256


Алгоритм работает с данными, разбитыми на куски по 512 бит (64 байт), криптографически их смешивает и выдаёт 256-битный (32 байта) хэш. SHA-256 состоит из относительно простого раунда, повторяющегося 64 раза. Снизу, как раз, и показан такой раунд, принимающий на вход 8 4-байтовых слов — от A до H.


Один раунд SHA-256 для восьми входных слов A-H. Схема нарисована kockmeyer, CC BY-SA 3.0.

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

Функция большинства (Ma блок) побитово работает со словами A, B и C. Для каждой битовой позиции она возвращает 0, если большинство входных битов в этой позиции — нули, иначе вернёт 1.

Блок Σ0 циклически сдвигает A на 2 бита, затем исходное слово A циклически сдвигается на 13 бит, и, аналогично, на 22 бита. Получившиеся три сдвинутые версии A побитово складываются по модулю 2 (обычный xor, (A ror 2) xor (A ror 13) xor (A ror 22)).

Ch реализует функцию выбора. На каждой битовой позиции проверяется бит из E, если он равен единице, то на выход идёт бит из F с этой позиции, иначе бит из G. Таким образом, биты из F и G перемешиваются, исходя из значения E.

Σ1 по структуре аналогичен Σ0, но работает со словом E, а соответствующие сдвиговые константы — 6, 11 и 25.

Красные блоки выполняют 32-битное сложение, формируя новые значения для выходных слов A и E. Значение Wt генерируется на основе входных данных (это происходит в том участке алгоритма, который получает и обрабатывает хэшируемые данные. Он вне нашего рассмотрения). Kt — своя константа для каждого раунда. [2]

На схеме сверху заметно, что только A и E меняются за один криптографический раунд. Остальные слова не меняются, но сдвигаются на выходе — старое A превращается в выходное B, старое B — в новое C, и так далее. Хотя отдельный раунд алгоритма не сильно изменяет данные, но после 64 раундов, входная информация будет полностью зашифрованной. [3]

Майним вручную


На видео я показываю как можно пройти все описанные шаги с помощью ручки и бумаги. Я выполнил первый раунд хэширования для майнинга блока. Заняло это у меня 16 минут, 45 секунд.


Немного поясню что происходит: я записал слова от A до H в шестнадцатеричной форме, и под каждым сделал перевод в двоичный вид. Результат выполнения блока Ma находится под словом C, а значения A после сдвигов и сам выход Σ0 располагаются над строкой с A. Функция выбора появляется под G, и, наконец, соответствующие сдвинутые версии E и значение после блока Σ1 идут над строкой с E. В нижнем правом углу произвёл сложение, результат которого участвует в вычислении и нового A, и нового E (первые три красных блока суммирования). Справа сверху я рассчитал новое значение A, а посерёдке располагается уже расчет нового значения E. Все эти шаги обсуждались выше и легко могут быть отслежены на схеме.

Кроме того раунда, что показан в видео, я провёл еще один — последний 64-ый хэшируюший раунд для конкретного биткойн-блока. На фотографии значение хэша выделено желтым. Количество нулей подтверждает, что это валидный биткойн-хэш. Заметьте, что нули располагаются в конце хэша, а не в начале, как я писал ранее. Причина заключается в том, что биткойн, просто-напросто, переворачивает байты полученные SHA-256. [4]


Последний раунд SHA-256, в результате которого виден успешно смайненный биткойн-блок

Что всё это значит для проектирования «железных» майнеров?


Каждый шаг в SHA-256 очень просто выглядит в цифровой логике — простые битовые операции и 32-битные суммирования (если вы когда-либо изучали схемотехнику, то, скорее всего, уже представили себе как это может выглядеть в железе). Поэтому ASIC-микросхемы реализуют SHA-256 очень эффективно, размещая параллельно сотни блоков исполнения SHA-256 раундов. Фотография ниже показывает микросхему для майнинга, которая может вычислять 2-3 миллиарда хэшей в секунду. На Zeptobars можно поглядеть больше фото.


Снимок кремниевого кристалла ASIC-микросхемы Bitfury, которая может майнить биткойны со скоростью в 2-3 гигахэшей в секунду. Картинка с Zeptobars. (CC BY 3.0)

В противоположность биткойну, Litecoin, Dogecoin и другие похожие альтернативные -coin системы используют алгоритм хэширования scrypt, в котором изначально заложена сложность реализации в железе. Этот алгоритм во время выполнения хранит в памяти 1024 разных значений хэша, а уже на выходе комбинирует их для получения конечного результата. Поэтому требуется куда больше памяти и схематики для вычисления scrypt-хэшей по сравнению с SHA-256-хэшами. Влияние изменения алгоритма хэширования наглядно видно при сравнении соответствующего аппаратного обеспечения для майнинга — версии под scrypt (Litecoin и прочие) в тысячи раз медленнее, чем версии под SHA-256 (биткойн).

Заключение


SHA-256 неожиданно оказался настолько простым, что может быть вычислен даже вручную (алгоритм на эллиптических кривых, который используется для подписи биткойн-транзакции, был бы куда более мучительным, так как содержит кучу перемножений 32-байтных чисел). Расчет одного раунда SHA-256 занял у меня 16 минут, 45 секунд. С такой производительностью хэширование всего биткойн-блока (128 раундов [3]) займёт 1,49 суток, то есть получаем скорость хэширования в 0,67 хэшей в день (на самом деле, конечно же, с практикой процесс бы ускорился). Для сравнения, текущее поколение биткойн-майнеров производит несколько терахэшей в секунду, что примерно в квинтиллион раз быстрее меня. Думаю, очевидно, что ручной майнинг биткойнов не очень практичен. [5]

Читатель с reddit’a спросил о моих затратах энергии. Так как я не прилагаю каких-то серьезных физических усилий, то можно предположить что скорость метаболизма будет 1500 килокалорий в день, тогда получаем, что ручное хэширование требует почти 10 мегаджоулей за хэш. Типичное потребление энергии для железного майнера — 1000 магехэшей за джоуль. Таким образом, я менее энергоэффективен чем специализированная железка в 10^16 раз (10 квадриллионов). Другой вопрос в стоимости энергии. Дешевым источником питания являются пончики по 23 цента за 200 килокалорий. Электроэнергия у меня стоит 15 центов за киловатт-час, что дешевле пончиков в 6.7 раз. В итоге, стоимость энергии в пересчете на хэш для меня, как человека-майнера, в 67 квадриллионов раз выше. Да-а-а, понятно, что я не ухвачу удачу за хвост ручным майнингом биткойнов, и это еще не учитывая стоимость бумаги и ручек!

Примечания и ссылки



1. На самом деле, важно не число лидирующих нулей в хэше, а то, что он должен быть меньше какого-то конкретного значения, которое зависит от текущего уровня сложности системы. ↑

2. Довольно занятно то, откуда пошли эти константы для SHA-256. Так как АНБ разрабатывало этот алгоритм и выбирало константы, то откуда нам знать, что они не подобрали специальные значения, чтобы быстрее ломать хэши? Дабы пресечь подобные спекуляции, начальные инициализирующие значения хэша взяты как квадратные корни из восьми первых простых чисел (первые 32 бита дробной части). А Kt получены из кубических корней первых 64 простых чисел. Как видите, константы сгенерированы с помощью простых формул, поэтому можно доверять тому, что АНБ не придумало ничего хитрого (по крайней мере, в отношении констант). ↑

3. К моему сожалению, SHA-256 работает с блоками из 512 бит, а заголовок биткойн-блока больше. Поэтому необходим второй проход из 64 раундов хэширования. Кроме того, в биткойне используется двойной SHA-256. Таким образом, хэширование одного блока требует 192 раунда. Тем не менее, мы можем сократить это число, потому что процесс майнинга заключается в повторном хэшировании одного и того же блока, с небольшими изменениями поля «nonce» во второй половине блока. И тут возникает оптимизация за счет того, что мы можем использовать результат вычисления первых 512 бит блока повторно. В итоге, нам требуется только 128 раундов хэширования. ↑

4. Само собой, я не настолько невероятно удачлив, что нашёл сразу валидный хэш. Я начал хэширование блока, уже ранее смайнененного. Конкретно того, который уже упоминался в статье — #286819. ↑

5. Еще одна проблема с ручным майнингом заключается в том, что новые блоки майнятся примерно каждые 10 минут, поэтому даже если я успешно намайню блок, то он будет безнадежно устаревшим (сиротой, в терминах биткойна). ↑

habr.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *