Bitcoin in a nutshell — Mining / Habr
Даже люди, бесконечно далекие от темы криптовалют, скорее всего слышали про майнинг. Наверное и ты, дорогой читатель, задумывался о том, чтобы включить свой игровой Pentium 4 на ночь, а утром проснуться уже богатым.
Но, как это часто случается в мире блокчейна, тех кто слышал — много, а вот тех, кто реально понимает процесс от начала до конца, — единицы. Поэтому в последней главе я пострался максимально подробно охватить все тонкости, начиная от технической реализации PoW, заканчивая рентабельностью майнинга на видеокартах.
Book
Table of content
- Explain me like I’m five
- Sky is the limit?
- Reward
- Hard challenge
- Technical side
- 2 Blocks 1 Chain
- Hardware
- Conclusion
- 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 минуты, суть заключается именно в том, что среднее время заранее установлено.
- Более того, это время не зависит от числа участников сети. Даже если однажды майнеров станет в сто раз больше, то алгоритм должен так изменить свои параметры, чтобы блок стало находить сложнее, и
- Помним, что сеть распределенная и одноранговая, а значит, она должна сама понимать, в какой момент и как нужно подкрутить эти параметры. Никаких управляющих нод, все полностью автономно.
- Если решение задачи по созданию нового блока — это сложная задача, требующая времени и ресурсов, то проверка блока на «корректность» должна быть простой и практически мгновенной.
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
Если вы посмотрите на структуру любого блока, то самой первой всегда идет так называемая 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 вставляют так называемый
Процесс создания новой транзакции подробно описан в главе Bitcoin in a nutshell — Protocol, поэтому здесь я просто приведу уже полученную
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
Хеширование биткоина: основа функционирования блокчейна. Что такое хеширование биткоина
Хеширование биткоина
Если вы интересуетесь технической стороной криптовалют и тем, как работает блокчейн, то хеширование биткоина — это одна из основных тем, которая даст вам ключ к пониманию того, как устроены эти новые peer-to-peer технологии.
Что же такое хеширование биткоина?
Говоря простым языком, хеширование — это преобразование массива данных любого объема в исходную строку фиксированной длины. Для более легкого понимания назовем их Input (входящий массив данных) и Output (полученный хеш, т.е. уже упомянутая выше строка фиксированной длины). В отношении криптовалют, таких как, например, Bitcoin.
Транзакции биткоина, которые являются основным массивом данных, проходят через алгоритм хеширования (в основу работы Bitcoin положен алгоритм SHA-256), который в результате дает исходную строку фиксированной длины.
Давайте на небольшом примере посмотрим, как устроен процесс хеширования биткоина. Для преобразования массива информации в хеш мы применим уже упомянутый выше алгоритм SHA-256 (Secure Hashing Algorithm):
Пример хеширование
Как видите, вне зависимости от длины и объема Input на выходе всегда получается одинаковый Output, который имеет фиксированную длину в 256 бит. Это имеет решающее значение, особенно когда нужно преобразовать в хеш большие и очень большие массивы информации, как например, множество транзакций в сети Bitcoin или Ethereum.
Успешное применение хеширования в блокчейне и криптовалютах объясняется уникальными свойствами криптографической хеш-функции, о которой мы и поговорим в следующем разделе.
Криптографическая хеш-функция и ее свойства
Криптографические хеш-функции — это особый вид хеш-функций, которые обладают свойствами, позволяющими сделать использование хеш-функций в криптовалютах безопасным и надежным. Ниже мы подробно рассмотрим все эти свойства.
Свойство 1: Детерминированность
Это означает, что независимо от того, сколько раз вы будете преобразовывать Input в Output, на выходе всегда получится один и тот же хеш. Данное свойство хеш-функции играет очень важную роль, поскольку в противном случае было бы невозможно отслеживать исходные данные.
Свойство 2: Быстрое вычисление
Хеш-функция должна быстро возвращать исходные данные. В противном случае система просто не будет эффективной. Особенно это актуально для популярных криптовалют, в блок которых входит большое количество транзакций.
Свойство 3: Стойкость к атаке поиска прообраза
Суть свойства стойкости к атаке поиска прообраза состоит в следующем: если мы знаем значение H (A), в котором A — Input, а H (A) — Output, т.е. хеш, то нахождение значения A является практически неосуществимой задачей. Здесь стоит сделать акцент именно на слове «неосуществимо», а не на «невозможно». Ведь работа майнеров доказывает, что при определенных обстоятельствах эта задача становится выполнимой. Давайте рассмотрим небольшой пример.
Вы используете телефон, который отображает не номера, а их хеши, созданные в системе алгоритма SHA-256. Вы знаете, что ваш номер известен только 7 людям, номера которых вы также знаете. Чтобы узнать, от какого абонента вы пропустили звонок, вам нужно просто узнать хеши этих семи номеров, а потом каждый из них сравнить с хешем номера, который отобразился в списке пропущенных звонков.
Однако такой метод поиска Input актуален лишь при работе с небольшими массивами данных, но когда у нас просто огромный объем информации, получить Input путем применения данного метода (он называется «brute force» — метод «грубой силы») становится очень сложной задачей. Данный математический метод заключается в переборе всех допустимых вариантов Input, их преобразование в Output и сравнение с имеющимся хешем. Сложность нахождения правильного решения напрямую зависит от объема исходной информации.
В случае применения метода brute force есть три варианта развития событий:
- Самый оптимистичный — вам повезло и вы получите правильный результат с первого раза, однако, это практически нереально, если смотреть на ситуацию с точки зрения математики.
- Реалистичный — Input будет найден примерно после перебора половины всех существующих вариантов.
- Самый негативный — исходные данные вы найдете только, преобразовав последний из имеющихся вариантов в хеш.
- Однако в случае с криптовалютами даже реализация самого реалистичного варианта очень маловероятна, поскольку здесь речь идет об очень большом количестве возможных вариантов Input.
Свойство 4: Стойкость к коллизии
Вероятность нахождения двух Input, которые бы имели один и тот же Output после прохождения процесса хеширования, должна быть максимально приближенной к нулю. Теоретически это может быть возможным, однако время, которое было бы затрачено на поиск двух одинаковых прообразов должно измеряться десятками лет. Данное свойство имеет очень важное значение, когда мы говорим о вопросе цифровой безопасности в криптовалютах. В криптографии способность противостоять возможности поиска второго прообраза называется стойкостью к коллизии.
В этом контексте, чтобы понять как работает хеширование биткоина, стоит упомянуть такое явление как «парадокс дня рождения». В чем его суть?
Прежде всего, нужно сказать, что шанс встретить двух незнакомых людей, которые бы родились в один и тот же день, равен 0,27%. Однако если в одном помещении одновременно находятся 366 людей, то шанс, что как минимум двое из них родились в один и тот же день, возрастают до 100%. Очевидно, что чем большее количество людей находится в одной группе, тем более высока вероятность того, что два человека будут иметь день рождения в один день.
«Парадокс дня рождения» используется в криптографической атаке, которая называется атакой «дней рождения» и в которой метод brute force применяется для поиска двух Input с одинаковым Output. «Парадокс дня рождения» помогает создать коллизию, потому что метод «грубой силы» при применении «парадокса дня рождения» становится более эффективным, чем без него. Однако несмотря на это в системе хеширования Bitcoin данный вид атаки малоприменим, поскольку шанс создать коллизию — примерно один к триллиону.
Свойство 5: Лавинный эффект
Данное свойство означает, что внесение даже незначительных изменений в Input приводит кардинальному изменению Output, т.е. хеша. Посмотрим на простой пример:
Пример хеширования
Как видите, хеши одной и той же фразы кардинально отличаются. И при этом все, что мы сделали — просто изменили регистр двух символов.
Данное свойство криптографических хеш-функций играет одну из самых главных (если не самую главную) ролей в обеспечении безопасности и надежности блокчейна. Каждый блок содержит в себе хеш предыдущего блока, и чтобы изменить данные одного блока, придется изменить данные предыдущего — и так по цепочке вплоть до самого первого genesis-блока. Как можно догадаться, это практически нереализуемо.
Свойство 6: Высокий показатель энтропии
Данное свойство означает, что хеши массивов данных должны быть максимально распределены в системе, т.е. обладать высоким показателем энтропии (энтропия — в информатике это мера неопределенности ситуации).
Рассмотрим небольшой пример. Так, у нас есть уравнение Y = H (k | x). Так, если Y является Output, а значение k обладает высоким показателем энтропии, то найти такое значение x (Input), которое бы удовлетворяло уравнению, будет практически невозможно.
«Высокая энтропия» означает состояние, при котором значение выбрано из такого широкого круга всевозможных вариантов, что попытки угадывания методом рандомного подбора не имеет никаких шансов на успех. Например, число, которое находится в рамках от 1 до 10, обладает низким показателем энтропии, в то время как число, которое находится между 1 и 2^256 имеет высокий показатель энтропии.
Если принять во внимание описанное выше, то можно сказать, что криптографическая хеш-функция превращает процесс подбора исходных данных для злоумышленников в игру в рулетку, т.е. шанс найти правильный Input должен быть очень низким, однако при этом каждый Input должен всегда иметь неизменный Output.
Хеширование биткоина: структура данных
Структура данных — это способ хранения данных. В блокчейне структура данных, задействованных в процессе хеширования, представлена двумя видами элементов: указателями и связанными списками.
Указатели
Указатели в программировании — это переменные, которые ссылаются на другие переменные, вне зависимости от вида языка программирования. Вместо того чтобы хранить числовые значения переменных, указатели содержать лишь своего рода «ссылку» на них. Как можно понять из названия, указатели «показывают путь» к расположению других переменных.
Например, выражение int b = 100 означает, что есть некая переменная b, которая содержит в себе целое числовое значение 100.
Связанные списки
Связанные списки имеют общие черты со структурой блокчейна, в которой каждый блок включает в себя данные предыдущего блока. В блокчейне связанные списки функционируют по такой схеме:
Связанные списки
Указатели — это часть структуры данных, они знают адрес следующего блока, входящего в общую цепочку. Стоит сказать, что последний блок имеет нулевой указатель, которому не присваивается никакой значение до того момента, пока не будет создан следующий блок в цепочке.
Блокчейн состоит из связанных между собой блоков, каждый из которых имеет хещ-указатель — это особый вид указателей, которые содержат ссылку на предыдущий блок. Хеш-указатели добавляют адрес предыдущего блока только после прохождения исходного массива данных через алгоритм хеширования — это позволяет сделать связь между двумя блоками надежной и защищенной.
Однако genesis-блок не содержит этот указатель. В его состав входит только указатель, который связывает его со вторым блоком цепи. Этот особый хеш-указатель содержит хеш-данные genesis-блока.
Такая система неуязвима перед атаками злоумышленников, которые могут попытаться изменить данные в блокчейне, потому что любое изменение в Input неизбежно приводит к изменениям в Output. Если была совершена попытка атаки на конкретный блок, участники сети (ноды) сразу же получают оповещение об этом и отклоняют запрос на внесение изменений. Это гарантирует неизменность блоков в блокчейне и безопасность системы. Однако если бы каждый блок не имел свой уникальный хеш, его отслеживание было бы невозможным.
Информация, которая содержится в заголовке каждого блока, отвечает за его идентификацию. Каждый заголовок блока включает в себя следующие элементы:
- Номер версии блокчейна (необходимо для отслеживания обновлений и изменений в протоколе).
- Временную метку блока UNIX.
- Сложность сети (определяется количеством нулей, которые соответствуют текущему уровню протокола Proof of Work).
- Хеш-указатель.
- Nonce (значение, которое ищут майнеры для того, чтобы создать блок и присвоить ему правильный хеш).
- Хеш корня Меркла, который состоит из хешей транзакций, входящих в конкретный блок.
Каждый из этих элементов играет очень важную роль в создании блока. Например, nonce очень важен, потому что майнеры перебирают множество вариантов, прежде чем один из участников сети найдет правильное значение и создаст правильную строку блока. В частности, факт нахождения nonce раньше других гарантирует майнеру получение вознаграждения в виде криптовалюты.
Дерево Меркла отвечает за упорядочивание и хранение транзакций внутри блока. Дерево Меркла выглядит так:
Дерево Меркла
В самом низу древовидной структуры дерева Меркла находятся листовые узла (на приведенной выше картинке это L1, L2, L3 и L4). Выше них расположены несколько уровней дочерних узлов — это все узлы, которые находятся ниже корневого узла. На картинке это узлы Hash 0-0, Hash 0-1, Hash 1-0, Hash 1-1 и Hash 0, Hash 1. В самом верху находится корневой хеш дерева Меркла (в нашем случае он называется Top Hash).
Древовидная структура корня Меркла помогает отследить расположение определенной транзакции и получить доступ к ее данным, как, например, время создания, объём, адрес отправителя и получателя и т.д.
Биткоин: Криптографические хэш-функции
Хеширование в сети Биткоин
Говоря простым языком, майнинг биткоина — это поиск новых блоков, которые после нахождения добавляются в блокчейн. Этим и занимаются майнеры — они обеспечивают беспрерывный рост блокчейна. Для этого используются огромные вычислительные мощности — каждый майнер делает свой вклад в увеличение общего хешрейта (вычислительной мощности) сети биткоин. От показателя общего хешрейта зависит скорость проведения операции хеширования биткоина каждым майнером — чем выше общий хешрейт сети, тем больший объем вычислительной работы за меньшее количество времени должен сделать майнер.
Майнеры используют вычислительные ресурсы для решения загадки, зашифрованной в строке, которая представляет собой набор цифр, который всегда начинается с множества нулей (чем больше нулей, тем выше сложность сети). Они должны найти правильное число nonce, добавление которого сформирует правильную строку блока. Процесс подстановки nonce в строку длится до тех пор, пока не будет найдено верное решение. Иногда количество попыток может доходить до миллионов раз. Тот майнер, который первым найдет верное решение, добавляет блок в блокчейн и получает за это вознаграждение.
С математической точки зрения данный процесс описывается следующей формулой: H (k | x) = Y, в которой K — это nonce, x — хеш блока, а Y — текущая сложность сети. Процесс подбора nonce рандомный и основан на применении метода brute force. Поэтому майнинговое оборудование непрерывно генерирует рандомные сроки до тех пор, пока не будет найдено верное значение nonce. На данный момент майнеры имеют 10 минут на добавление каждого нового блока, что обеспечивает низкую вероятность возникновения коллизий и создания блоков-орфанов (потерянных блоков, которые не были добавлены в блокчейн, например, в том случае, когда nonce был найден почти одновременно несколькими майнерами или при попытке хакеров внести изменения в транзакции).
Хеширование биткоина играет решающую роль в майнинге, поскольку оно лежит в основе работы алгоритма Proof-of-Work, который используется в сети Bitcoin, Ethereum и многих других криптовалют. Хеширование биткоина обеспечивает безопасность и надежность системы, предохраняет ее от создания коллизий и возможного взлома. Без хеширования не существовало бы блокчейна, по крайней мере, в том виде, в котором мы его имеем сегодня.
Статьи по теме:
Как работает блокчейн: объясняем простыми словами
Как работают алгоритмы криптовалют
Сложность сети биткоин: что показывает и как рассчитывается
© Coin Post, 2017-2019. Все материалы данного сайта являются объектами авторского права. Запрещается копирование, распространение (в том числе, путем копирования на другие сайты и ресурсы в Интернете с указанием источника) или любое иное использование информации без предварительного согласия правообладателя.
coinpost.ru
Чтобы понять блокчейн, нужно понять, что такое хеш |
Для меня ключ к познанию блокчейна – это понимание криптографических хешей. Мне кажется, многие из нас, обычных людей, делают ошибку, представляя себе блокчейн как, в первую очередь, списки анонимных транзакций, распределённых по децентрализованным сетям. Хотя отдельный блокчейн действительно таков, иногда упускается из виду, что основой блокчейновой технологии является не децентрализация, анонимность или даже распредёленные реестры, а собственно криптография. Хотя это, наверное, очевидно для человека с базовым пониманием компьютерных наук, для большинства из нас это нечто совершенно новое.
Очень краткая история цифровых денег
Биткойн – новый подход к предыдущим экспериментам с цифровыми деньгами. В 1990-х это была горячая, но спекулятивная тема. Даже Алан Гринспен в своей речи в 1996 г. сказал:
Мы предвидим в близком будущем предложения эмитентам электронных платёжных обязательств, таких как карты с хранимой стоимостью или «цифровые деньги», создать специализированные эмиссионные корпорации с сильными балансовыми отчетами и публичными кредитными рейтингами
Таким образом, использование цифровой валюты истеблишментом было на повестке дня задолго до Биткойна. Для того чтобы освободить цифровую валюту от истеблишмента, требовалось ещё одно новшество. Этим новшеством стала криптография.
Когда Гринспен произносил свою речь, шифропанки уже экспериментировали с цифровыми валютами с явным намерением дестабилизировать банки. В числе их экспериментов, существовавших до Биткойна, были Hashcash Адама Бэка, BitGold Ника Сабо, B-Money Вэй Дая и RPOW Хэла Финни. Все они использовали возможности криптографических хеш-функций, и вместе они образуют гигантские плечи, на которых сегодня стоит Биткойн.
Что такое криптографические хеш-функции?
Криптографическая хеш-функция берёт данные и, по сути, переводит их в строку букв и цифр. Вы когда-нибудь пользовались URL-сокращалками типа Bitly или TinyURL? Это нечто похожее. Вы вводите что-то длинное, а на выходе получается что-то короткое, олицетворяющее то длинное. Только в случае криптографических хеш-функций ввод не обязательно должен быть длинным. Это может быть что-то очень короткое (например, слово «пёс») или почти бесконечно длинное (например, весь текст «Повести о двух городах»), и на выходе вы получите уникальную строку установленной длины. Кроме того, в отличие от сокращателей ссылок, хеш-функции, применяемые в Биткойне, действуют только в одном направлении. Хотя одни и те же данные всегда дадут один и тот же хеш, воспроизвести изначальные данные по полученному из них хешу невозможно.
Итак, данные вводятся в хеш-функцию, функция выполняется и получается строка букв и цифр (можете попробовать самостоятельно здесь). Эта строка называется хешем. В блокчейне Биткойна хеши состоят из 256 бит или 64 символов.
Может показаться невозможным, чтобы почти бесконечное количество данных могло последовательно переводиться в уникальную строку всего из 64 символов, но именно таким чудесным образом действуют криптографические функции. С помощью этой невероятной технологии целые книги, заполненные текстом, могут быть переведены в одну строку из 64 цифр и букв. И каждый раз, когда вы вводите одни и те же данные, вы получите не только один и тот же хеш, но уникальный и отличный от любого другого хеша.
Пример
Хеш фразы:
Это было самое прекрасное время, это было самое злосчастное время, – век мудрости, век безумия, дни веры, дни безверия, пора света, пора тьмы, весна надежд, стужа отчаяния, у нас было всё впереди, у нас впереди ничего не было, мы то витали в небесах, то вдруг обрушивались в преисподнюю, – словом, время это было очень похоже на нынешнее, и самые горластые его представители уже и тогда требовали, чтобы о нём – будь то в хорошем или в дурном смысле – говорили не иначе, как в превосходной степени:
df0a199c7fef0a53d9a4144bc9122441b94510c13faf424ca26b65aa5035048f
Тогда как хеш слова «пёс»:
cd6357efdd966de8c0cb2f876cc89ec74ce35f0968e11743987084bd42fb8944
Как работают криптографические хеш-функции
Существуют разные виды криптографических хеш-функций, и каждая из них работает по-разному. Использовавшаяся выше хеш-функция – SHA-256, хеш-функция, применяемая в Биткойне, – работает на основе безумно сложной формулы, связанной с отражением света от эллипсов. Вам не стоит слишком из-за этого переживать. Суть в том, что криптографические хеш-функции – это чертова магия, и вы никогда их до конца не поймете, если только вы не математик.
Как хеш-функции применяются в блокчейне
Чтобы блокчейн работал, он должен обновляться. Подобно банку, он должен вести актуальные записи всех транзакций и активов (например, биткойнов), имеющихся у каждого участника сети. Именно при обновлении транзакционной информации любая аутентифицирующая система уязвима для атаки. Банк сглаживает этот риск благодаря наличию строгой централизованной иерархии, гарантирующей подлинность на свой собственный риск. Так как блокчейну удаётся обновляться, оставаясь децентрализованным? Он использует криптографическую вероятностную хеш-игру, называемую «доказательство выполнения работы» (Proof of Work).
Криптография обеспечивает консенсус
Чтобы продолжать функционировать, блокчейн должен создавать новые блоки. Так как блокчейны – это децентрализованные системы, новые блоки должны создаваться не единственным аутентифицирующим субъектом, а сетью в целом. Чтобы решить, каким будет новый блок, сеть должна достичь консенсуса. Чтобы достичь консенсуса, майнеры предлагают определённые блоки, блоки верифицируются, и, наконец, сеть выбирает единственный блок, который будет следующей частью реестра. Однако очень много майнеров предлагают идентичные блоки, проходящие верификацию. Так каким образом конкретный блок выбирается, чтобы стать следующим в цепи?
Компьютеры соревнуются в хеш-игре. Всё очень просто. По сути, чтобы выиграть игру, майнящий компьютер должен угадать число, называемое «нонс» (nonce), которое в комбинации со всеми предыдущими данными блокчейна даёт при вводе в хеш-функцию SHA-256 определённый хеш.
Помните хакеров из фильмов, использующих программу, угадывающую миллион паролей в минуту, чтобы взломать компьютер? Это что-то вроде этого. Все майнеры мира одновременно используют похожую программу-угадайку, ищущую правильный нонс, который при добавлении к данным блокчейна и вводе в хеш-функцию SHA-256 даст рандомный хеш, который сам блокчейн «определил» как «решение» задачи. Компьютеры, в каком-то смысле, работают совместно, так как каждый предложенный хеш не может быть предложен снова. Компьютер, первым отгадавший правильное число, выигрывает право на создание следующего блока и получает 12,5 биткойна, что сейчас равно примерно $50 000.
Так обеспечивается консенсус, а также предотвращаются атаки, нацеленные на манипулирование системой. Так как результатом каждого ввода является совершенно уникальный хеш, только определенный нонс в комбинации с верными ранее верифицированными блокчейновыми данными даст хеш, решающий уравнение. При вводе неточных или мошеннических предшествующих записей не может быть угадан верный хеш. Таким образом, криптография делает блокчейны более безопасными, чем любой банк с человеческой верификацией.
Тем не менее, поскольку постепенно всё больше людей выделяли всё больше компьютерной мощности на майнинг биткойнов, возникла новая проблема. Новаторы разработали мощные компьютеры, предназначенные исключительно для майнинга биткойнов. Эти компьютеры способны предлагать хеши намного чаще, чем средний компьютер, что позволяет им прийти к верной догадке намного быстрее и, как следствие, намайнить больше биткойнов.
Проблема заключается в том, что когда всё меньше людей могут позволить себе майнинговые технологии, риск централизации возрастает. Блоки создаются и биткойны майнятся, как только находится решение следующего блока. Таким образом, имеющий ресурсы может просто собрать более мощную майнинговую машину, чем у всех других, и майнить огромный процент остающихся биткойнов быстрее всех других, просто предлагая больше догадок в более короткий срок.
10-минутное решение
Сатоши предусмотрел механизм, сглаживающий эту проблему, и он также полагается на возможности хеш-функций. Вот как я предпочитаю смотреть на его решение:
Представьте, что ваша хеш-функция на выходе вместо цифр и букв даёт животных. Существует равная вероятность, что при вводе рандомных данных хеш-функция выдаст слона или обезьяну. Ваши случайно выбираемые данные могут быть переведены либо в одно, либо в другое животное с одинаковой вероятностью.
Но теперь представьте, что вы задаёте определённые критерии того, в какое животное должна перевести ваши данные хеш-функция, чтобы работать. Это влияет на вероятность хеширования тех или иных данных в животное, удовлетворяющее вашим критериям. Например, данные «abc123» с большей вероятностью выдадут любое животное (на самом деле в данном примере вероятность 100%), чем любое двуногое, потому что существует намного больше потенциальных догадок, подходящих под любое животное, чем под любое двуногое. Ещё меньше вероятность получить любую обезьяну.
Блокчейн Биткойна работает так, что игра на отгадывание самокорректируется, чтобы всегда быть достаточно сложной, чтобы все компьютеры сети могли угадывать только каждые 10 минут, независимо от мощности отгадывающих компьютеров. Это значит, что угадывание хеша и майнинг блока сегодня теоретически намного сложнее, чем при запуске Биткойна в 2009 г., потому что в сети очень много сверхмощных компьютеров. И в самом деле, сегодня невозможно майнить биткойны с помощью обычного ноутбука, тогда как в ранние дни Биткойна все участники сети использовали стандартные компьютеры.
Так как же протокол Биткойна гарантирует, что игра на отгадывание будет становиться достаточно сложной, чтобы даже чрезвычайно мощным майнинговым компьютерам на отгадывание требовалось примерно 10 минут? Вспомните пример с обезьяной. Чем более конкретные критерии заданы для выхода хеш-функции, тем больше догадок нужно сделать, чтобы получить этот более конкретный выход. Вместо того чтобы «правильным» ответом было животное (легко), двуногое (сложно) или обезьяна (сложнее), для «правильной» строки хеша, выигрывающей игру, задаются всё более конкретные критерии. В частности, игра усложняется посредством требования наличия у правильного хеша в начале определённого количества нулей.
Представьте себе это следующим образом. Если я попрошу вас отгадать рандомное трёхзначное число, чтобы получить шоколадку, у вас больше шансов угадать, если правильное число – любое трёхзначное число, чем если это любое трёхзначное число, начинающееся с 0. Это сложно понять, но в основе лежит математический закон, говорящий, что достаточно квадратного корня N рандомных событий, чтобы вероятность их совпадения составляла 50%. Та же самая математика поддерживает парадокс дней рождения – если в комнате всего 23 человека, существует 50% вероятность, что у двух из них день рождения в один и тот же день.
К сожалению, делая угадывание числа всё сложнее и сложнее, блокчейн Биткойна неизбежно пришел к исключению из майнинга обычных людей. Но это справедливая цена децентрализации. Без этого одна богатая компания могла бы теоретически создать чрезвычайно мощный компьютер, способный мгновенно добыть все оставшиеся биткойны.
Должен заметить, что я лишь (с трудом) понимаю, как работает блокчейн Биткойна.
Другие блокчейны могут использовать криптографию совершенно иначе, чем я здесь описал. Например, я не знаю, использует ли ту же систему доказательство доли владения (proof of stake) – как утверждается, более эффективное усовершенствование доказательства выполнения работы.
Но так как блокчейн Биткойна является моделью для всех других блокчейнов, его понимание – это важнейший шаг к постижению мира криптовалют. Хотя существенно также понимание многих других аспектов блокчейна, осмысление того, как он использует криптографию, – наверное, важнейшая часть пазла.
Источник
Поделиться ссылкой:
Related
bitnovosti.com
Что такое майнинг биткоин | Биткоин в России
Это статья на доступном языке для неспециалистов. Если вы мните себя хотя бы «айтишником», можете смело читать PDF’ку от Сатоши.
Откуда эти биткоины вообще добываются?
Добыча («майнинг») биткоинов — фраза, которая несколько сбивает с толку. Биткоины выдаются за успешное решение математической задачи. Чем больше таких решений, тем более устойчивой будет сеть, потому что для того, чтобы обрушить сеть, хакерам понадобится потратить столько же времени, сколько потратили его совокупно все «майнеры». Для этого понадобятся невероятные вычислительные мощности, потому что даже мощнейший суперкомпьютер мира в 14 раз слабее, чем все компьютеры сети bitcoin в совокупности.
Чтобы понять, что именно происходит при генерации биткоинов, нужно разобраться с некоторыми понятиями.
Хеш
Это такая функция, которая берет на вход какую-то последовательность и выводит другую последовательность фиксированные длины, которая призвана быть уникальной для каждой входной последовательности.
Вот так, например, вычисляется md5-хеш слова «хеш»:
$ echo ‘хеш’ | md5sum
6962fab449d4a713c8189dba4025d405 —
А вот это — хеш песни «Fly Into The Night» группы «Darkseed»:
$ md5sum ‘music/Darkseed/2003 — Astral Adventures/02 — Fly Into The Night.mp3’
aad61cd8736c953c5fe617f3c780cc2f music/Darkseed/2003 — Astral Adventures/02 — Fly Into The Night.mp3
Подбор хеша
А вот взять хеш aad61cd8736c953c5fe617f3c780cc2f и получить из него обратно песню не получится. Все дело в том, что хеш-функции специально спроектированы таким образом, чтобы можно было быстро посчитать хеш исходной последовательности, а вот обратно — никак. В худшем случае придется просто перебирать все возможные варианты. Выглядит это, например, вот так:
$ echo ‘aaaaaaaaaaaaaaaaaa’ | md5sum
34446078bc933d4300dca0057e7193ae —
$ echo ‘aaaaaaaaaaaaaaaaab’ | md5sum
ced1e1638b956a382166aa1dae4e7dc0 —
$ echo ‘aaaaaaaaaaaaaaaabb’ | md5sum
82baf37d76cc893286c061eb71084c72 —
$ echo ‘aaaaaaaaaaaaaaabbb’ | md5sum
459c7a87cde5df2b808c42a316bca959 —
И так пока мы не встретим нужный нам хеш. Очень долго и утомительно.
Подбор bitcoin-блоков
Слово «блок» вы можете увидеть в программе-клиенте. Блок — это набор данных, который включает в себя:
- хеш предыдущего блока;
- некоторое количество новых транзакций;
- «соль» (nonce) — последовательность битов, которую можно свободно менять.
И главное условие: хеш блока должен содержать должен содержать заданное число нулей в начале.
Само собой, не каждый блок будет содержать заданное число нулей в начале хеша. А так как изменяемая часть блока только одна — это «соль» — мы будем перебирать все возможные варианты «соли», пока не получим нужный хеш. По правилам сети, за нахождение нового блока клиенту дается 50 биткоинов (дальше меньше, каждые 4 года, вознаграждение за посчитаный блок уменьшается в 2 раза).
Вот этот перебор и называется «майнингом» — генерацией биткоинов.
А от числа необходимых нулей в хеше зависит сложность генерации биткоинов. Со временем нулей нужно все больше, и сложность майнинга возрастает.
Как нагенерировать много биткоинов. Сколько это займет времени.
Для начала запустите программу-клиент и разрешите ей генерировать биткоины. Через некоторое время она покажет вам скорость подбора в хешах в секунду. Вот эту скорость введите в специальный калькулятор. Не забудьте про то, что вводить нужно мега-хеши в секунду, то есть введенная единица означает миллион хешей в секунду.
Если калькулятор выдал приемлемый для вас промежуток времени, то поздравляю — вам не о чем беспокоиться. Просто генерируйте биткионы как раньше. Но скорее всего вы просто забыли перевести килохеши в мегахеши.
Если же вы не можете ждать столько лет, читайте дальше.
Экономическая целесообразность
Вообще, курс биткоина в каждый момент времени курс примерно равен расходу электроэнергии, затраченной для его генерации на обычном процессоре. Кому нужно покупать биткоины, если их можно нагенерировать на компьютере, в которых недостатка в современном мире нет?
Существует три способа сделать генерацию биткоинов экономически целесообразной:
- использовать более эффективные процессоры для расчетов;
- генерировать в надежде, что курс поднимется и генерация биткоинов окупится;
- использовать время простоя компьютеров и воспринимать биткоины как небольшие дармовые деньги.
Первое нынешние майнеры усвоили хорошо и генерируют биткоины в основном на графических процессоров видеокарт, в частности видеокарт ATI. Их «калькуляторы» позволяют вычислять хеши быстрее, чем центральные процессоры компьютера.
Генерация биткоинов также может представлять чисто спекулятивную ценность. Вдруг завтра за каждый будут давать миллион долларов? Вообще, генерировать их в таком случае не обязательно — можно просто купить.
Третий вариант мне кажется наиболее разумным. Вы используете простаивающие мощности своего компьютера для поддержания стабильности сети, в награду получаете немного биткоинов. Генерация по этой схеме будет всегда приносить прибыль, так как затраты на генерацию будут равны нулю. Ну а если они выше, то это уже не «использование простаивающих мощностей».
Мне придется генерировать биткоины пять лет и получить сразу пачку на 50 штук?
В общем случае — да.
Чтобы не остаться совсем ни с чем, люди объединяются в пулы, например, deepbit.net. Пул — это множество клиентов, каждый из которых подбирает блоки. Но как только блок будет найден, «призовые» 50 биткоинов делятся на всех, кто участвовал в его подборе.
Откуда мы можем знать, что программа не подбирает пароли пентагона вместо блоков?
Ну, все алгоритмы работы программы описаны в ее исходном коде. Прежде чем программа станет исполняемым файлом, который вы можете запустить кликом мышки, программист должен написать ее на каком-нибудь языке программирования. Затем этот код пропускается через специальную программу-компилятор и только потом может быть запущена.
Биткоин-клиент написан на языке C++, исходные коды вы можете скачать с bitcoin.org. Вы можете показать исходники знакомому программисту и попросить его выяснить, что программа делает. Даже если вы боитесь, что исполняемый файл может быть заражен вирусом или чем-нибудь еще, вы можете скомпилировать программу самостоятельно и быть уверенным в том, что она делает только то, что описано в ее исходном коде.
Примечания
На июнь 2011 года мощнейший суперкомпьютер мира — K computer — «выжимает» 8 162 терафлопа. Вычислительная же мощность сети bitcoin — 114 445 терафлоп (см. «Network Hashrate, TeraFLOP/s» на bitcoinwatch.com).
http://komar.bitcheese.net/ru/tech/генерация-биткоинов
cryptorussia.ru
Майниг — основные понятия, термины и определения. Разбираемся, что такое биткоин nonce и хеши
Proof of work, хеш, nonce — разбираем процесс майнинга на простых примерах
Я слышал, что майнинг связан с блокчейном, так?
Блокчейн — это формат хранения информации, при котором каждый новый блок добавляется в конец цепочки, и содержит связь с предыдущим блоком.
Коротко говоря, создание таких блоков и есть майнинг.
Какая информация содержится в блоках?
Говоря о биткоине, информация — это транзакции, платежи пользователей друг другу.
Майнер собирает информацию о неподтверждённых транзакциях, проверяет каждую транзакцию на отсутствие двойных трат и правильность подписи отправителя и упаковывает все эти транзакции в один блок.
Помимо этих платежей каждый блок содержит важную техническую информацию:
- Ссылку на предыдущий блок
- Хеш блока
- Хеш всех транзакций этого блока
- Nonce
Постойте, а что такое хеш и nonce?
Чтобы понять, что такое хеш, для начала расскажем о хешировании.
Хеширование — это такой математический алгоритм. Он используется в криптографии и кодирует любую информацию. При этом, вне зависимости от размера исходной информации, в результате всегда будет получаться текст одного размера. Вот этот результат хеширования и называется хешем.
Первое свойство этой операции таково, что если ей скормить один и тот же текст, на выходе каждый раз будет получаться одинаковый хеш. Однако, стоит изменить хотя бы один символ в тексте, и хеш изменится полностью (лавинный эффект).
Другое свойство хеширования состоит в том, что из полученного хеша нельзя получить исходную информацию. Как в мясорубке, фарш обратно не провернуть.
Важно заметить, что предугадать результат хеширования невозможно!
Существует множество различных алгоритмов хеширования. В биткоине используется криптографический алгоритм, который называется SHA-256. Вы сами можете проверить, как он работает, например, на этом сайте www.movable-type.co.uk
Зачем нужно криптографическое шифрование?
В первую очередь — для защиты от злоумышленников. Если злоумышленник захочет даже незначительно изменить информацию в блоке, хеш этого блока изменится и этот блок не примут другие майнеры. Злоумышленник может самостоятельно майнить новые блоки и присоединять их к своему блоку с исправленными транзакциями, но для этого его компьютер должен обладать очень и очень большой вычислительной мощностью, составляющей более половины мощностей всех компьютеров в сети, что практически нереально. Поэтому данный тип подтверждения называется proof of work — доказательство сделанной работой.
Proof of work
Чтобы остальные участники сети биткоин признали блок подходящим для добавления в цепочку, он должен отвечать условиям. Хеш этого блока должен начинаться с большого количества нулей (То есть, хеш должен быть меньше определённого значения). На момент написания статьи это 18 нулей.
Чтобы найти такой хеш требуется громадное количество проб и ошибок.
Как же получить удовлетворяющий требованиям хеш, если мы уже знаем, что для одного и того же входного текста всегда будет получаться одинаковый хеш? Тут на сцене появляется специальное число, которое называется nonce. Майнер вписывает в поле nonce цифру “1” и хеширует блок. Если полученный хеш не удовлетворяет условиям, nonce меняется на “2” и блок ещё раз хешируется. И так до тех пор, пока мы не получим хеш, отвечающий требованиям. Тут нет какого-либо алгоритма, используется обычный перебор.
Этот подход называется proof of work — доказательство работы. И полученный хеш как раз и служит доказательством затраченных усилий майнера на нахождение хеша.
Proof of work используется как метод для достижения согласия между участниками сети Биткоин по поводу признания блока соответствующим требованиям. Майнер предъявляет рассчитанный им хеш, на нахождение которого было затрачено большое количество ресурсов, остальные участники с лёгкостью проверяют этот результат проведя повторное хеширование с указанным числом nonce. После прохождения проверки, блок добавляется в цепочку блокчейн.
Этим перебором и занимаются все майнеры (точнее, их оборудование). Работа требует больших вычислительных мощностей и громадных энергетических затрат. На текущий момент вся сеть майнеров биткоина тратит объём электроэнергии, сравнимый с потребностями среднего города.
Почему блоки должны появляться раз в 10 минут?
Период в 10 минут выбран как компромисс между надёжностью и удобством.
При меньшем времени, затрачиваемом на нахождение хеша, блоки будут собираться быстрее, транзакции будут подтверждаться быстрее и количество транзакций, которые сеть может обработать за час вырастет. Однако, в этом случае придётся пожертвовать надёжностью, так как при упрощении задачи блоков станет слишком много, увеличится время на проверку этих блоков, появится большое количество развилок в блокчейне и брошенных блоков, а это значит, что транзакциям станут меньше доверять.
Если же увеличить время, необходимое для нахождения блока (то есть, усложнить задачу), то повысится надёжность сети, однако, резко вырастет количество транзакций, требующих подтверждения, пользователи будут долго ждать совершения перевода и увеличатся комиссии за перевод.
Что такое “Двойная трата”?
Двойная трата (double spending) это попытка потратить одни и те же монетки два раза. В сети биткоин у каждой монеты есть история — можно проследить откуда взялась монета, какой путь она прошла за время существования и какому кошельку принадлежит в данный момент. Когда злоумышленник пытается провести атаку “двойной траты” он создаёт две (или несколько) транзакций для одной и той же монеты и платит разным получателям. Пока транзакции не подтверждены, они обладают равной силой, но после записи транзакции в блок (это может быть любая из этих транзакций) корректной станет только подтверждённая транзакция, остальные будут отклоняться майнерами как “двойные траты”.
Зачем майнерам заниматься этой работой?
Все просто. За каждый смайненный блок майнер получает плату, в 2017 году это 12.5 BTC за блок.
В следующей статье мы поговорим о том, как зарабатывают майнеры.
coin.radio
лучшее руководство для непрограммистов, часть II
В первой части мы разобрали, что такое ключи, как подписываются и подтверждаются транзакции. В этой мы разберём, как происходят переводы, создаются блоки и в каком виде существует сам биткоин.
Как происходят переводы биткоинов?
Теперь вы понимаете, что для платежей и хранения виртуального золота достаточно помнить 12 слов. Чтобы получать биткоины, вы отправляете свой адрес в сети биткоина другому человеку. Когда человек отправляет вам биткоины, то это похоже на обычное сообщение. Он указывает в транзакции ваш адрес, указывает количество передаваемых монет, сумму комиссии и подписывает своим секретным ключом. Подпись генерируется от частного ключа отправителя и клиент транслирует транзакцию в сеть биткоина.
В блокчейн биткоина заложен собственный учёт монет: откуда пришло и куда ушло. Биткоины существуют только в виде записей в транзакциях. У каждого биткоин-адреса есть входы и выходы, куда приходят и откуда уходят. Баланса у отдельного адреса нет. Сумма баланса считается по всем входным значениям, связанным с адресом:
Входы и выходы транзакций
Баланс третьего адреса состоит из транзакций с первого и второго. Выходы первого и второго адреса становятся входами для третьего. Значения выходов предыдущих транзакций суммируются и общая сумма биткоинов в дальнейшем используется в выходе Адреса 3.
При создании транзакции происходит её хэширование — хэш-функция преобразует информацию о количестве передаваемых монет, хэше предыдущей транзакции и другую в строку символов установленной длины. Хэш нужен, чтобы отслеживать целостность информации. Транзакции, как и блоки в сети, связаны друг с другом. Если попытаться изменить одну транзакцию, то хэши всех транзакций изменятся и клиенты отвергнут её.
У биткоина есть условие — каждый выход используется только один раз. Поэтому при отправке на другой адрес все биткоины должны быть потрачены на выходе. Иначе сумма будет потеряна. Эту работу делает клиент. Если у адреса 100 биткоинов, а отправляется с него 50, то клиент создаст 2 выхода: 50 биткоинов на Адрес 4 и 50 биткоинов на Адрес 3, т.е. обратно:
“Сдача” по биткоину
Перед тем как транзакция будет транслироваться в сеть биткоина, её подписывают личным ключом, который связан с адресом. При подписании формируется публичный ключ, клиент объединяет всю информацию и преобразует их в строку шестнадцатеричного формата:
Транзакция в шестнадцатеричном формате
Этот набор знаков можно раскодировать. После трансляции узлы вокруг проверяют перевод и транслируют дальше, пока майнеры его не обработают. Транзакции обрабатывают и проверяют майнеры с «полными» клиентами. За свою работу они получают сгенерированные биткоины в каждом блоке, а также комиссии с транзакций. Чем выше комиссию вы предложите, тем быстрее майнеры её проверят и добавят в блокчейн. Им выгоднее более высокие комиссии. Их сумма считается за килобайт информации и не зависит от отправленной суммы монет. Так как блоки формируются каждые 10 минут, то транзакция будет добавлена не раньше этого времени.
Каждый узел хранит список необработанных транзакций — пул памяти. Когда пул памяти заполняется, увеличивается тариф комиссии за килобайт.
Как создаются новые блоки биткоина?
Самая главная работа лежит на майнерах — они проверяют, добавляют новые транзакции в блок и поддерживают работу сети биткоина. Чем больше майнеров, тем безопаснее сеть. Каждый майнер соревнуется с другими за награду в биткоинах. Тот, кто находит новый блок, получает 12,5 биткоинов и комиссии за транзакции. Соревнуются майнеры своими вычислительными мощностями. Чем выше вычислительные мощности, тем вероятнее получить награду.
Вычисления нужны для поддержания времени создания блока каждые 10 минут, что создаёт равномерную эмиссию монет. Если мощности майнеров растут, то сложность пропорционально возрастает, а если мощности уменьшаются, то падает.
Используя свои мощности, каждый майнер ищет хэш нового блока, который становится идентификатором блока. В этот хэш входит номер блока, хэши транзакций, хэш предыдущего блока и др. Сам хэш вычисляется за доли секунды, но с добавлением сложности новый блок находят примерно за 10 минут. Для блока нужен определённый хэш — он должен начинаться с нулей. Чтобы вычислить такой хэш, в набор данных добавляется случайное число “nonce”:
Хэш чувствителен к любым изменениям информации и он изменится, если добавится даже один пробел. Для нахождения этого блока в демоверсии блокчейн хэш-функция выполнилась 69242 раза. Начиная с 0, счётчик “nonce” увеличивался на один, добавлялся к набору данных и вычислялся хэш. Так происходило до тех пор, пока у хэша в начале не появилось 4 нуля. Когда сложность добычи растёт, то растёт и количество нулей. У настоящего хэша блока биткоина уже стоит 19 нулей в начале хэша. Поэтому, чем выше сложность, тем менее вероятна атака 51% — завладеть большими мощностями в сети и подписывать транзакции с двойными расходами.
Майнеры давно уже объединяются в пулы, чтобы гарантированно зарабатывать на своих вычислениях. Общая мощность пула соревнуется с другими пулами и майнинг-фермами, и каждый с вероятностью получает награду. В пулах награда делится на всех майнеров, участвующих в добыче, в зависимости от их вычислительных ресурсов.
Итог
- Для получения, хранения и передачи биткоинов создают адрес. Для доступа используют секретный ключ из 12 слов.
blockchain.ru
Магия, обман или супер-технология? Часть 2
В первой части статьи были представлены некоторые из проблем, с которыми сталкиваются обычные люди в стремлении понять, что же на самом деле такое биткоин и как он работает. Кроме того мы в обобщенном виде рассмотрели стратегическую роль модели программного обеспечения с открытым исходным кодом, p2p сети и цифровых подписей.
Во второй части рассматривается процесс хеширования и то, какую существенную роль он играет в технической структуре биткоина. Также обсудим, как вся система была задумана и создана таким образом, чтобы стать самофинансируемой с самого своего начала и на неограниченное время.
Создание хеша
Хеширование играет совершенно отличную роль от цифровых подписей. Этот процесс доказывает, что сообщение не было изменено. Выполнение процедуры создания хеша от одного и того же сообщения всегда дает один и тот же результат. Если хеш не соответствует предыдущему, это является предупреждением, что нынешняя версия сообщения не соответствует оригиналу. Для иллюстрации приведем сообщение от Мюррея Ротбарда. Он написал:
«It must be reiterated here that value scales do not exist in a void apart from the concrete choices of action». —Murray Rothbard, 1962 (перевод: «Необходимо повторить, что не существует никакой ценностной шкалы в пустоте, кроме конкретных вариантов действий» — Мюррей Ротбанд, 1962 год)
Полученный по алгоритму SHA256 (такой же используется и в биткоин) хеш будет выглядеть так:
68ea16d5ddbbd5c9129710e4c816bebe83c8cf7d52647416302d590290ce2ba8
Любое сообщение любого размера может пройти через хеш-функцию. Алгоритм разбивает его, смешивает части и делает это до тех пор, пока итоговый результат не станет фиксированной длины, который в соответствии с алгоритмом SHA256 принимает форму, показанную выше. Для каждого другого сообщения будет свой собственный хеш.
Есть некоторые критические свойства хорошего хеш-алгоритма. Во-первых, одно и то же сообщение производит один и тот же цифровой вид, который был изначально. Во-вторых, он работает только в одном направлении. Даже мельчайшие изменения в оригинальном сообщении кардинально изменят хеш, без какой-либо взаимосвязи между входным сообщением и результатом на выходе. Это называется «лавинный эффект». В-третьих, шансы получения такого цифрового вида от измененного сообщения являются ничтожными. Это называется «устойчивость к коллизиям». Невозможно создать измененное сообщение, которое бы создавало в точности такой же цифровой вид, как и оригинальное.
Чтобы продемонстрировать эти эффекты, ниже приведен хеш того же самого сообщения, в котором всего лишь убраны кавычки.
It must be reiterated here that value scales do not exist in a void apart from the concrete choices of action. —Murray Rothbard, 1962
Измененное сообщение выдает такую хеш-функцию:
0a7a163d989cf1987e1025d859ce797e060f939e2c9505b54b33fe25a9e860ff
Сравните ее с предыдущим результатом:
68ea16d5ddbbd5c9129710e4c816bebe83c8cf7d52647416302d590290ce2ba8
Минимальное изменение в оригинальном сообщении – удаление всего двух кавычек – привело к совершенно другому результату, который не имеет никакого отношения к «правильному» хешу. В итоге, хеш дает быстрый ответ «да» или «нет» на один ключевой вопрос: является ли сообщение по-прежнему оригинальным и не менялось ли оно? Если сообщение отличается, хеш не сможет отобразить, насколько оно было изменено, он лишь констатирует, изменялось ли оно вообще или нет.
Казалось бы, в чем польза от этого? Биткоин является приложением, в котором хеширование оказалось действительно крайне полезным. В биткоин хеширование является краеугольным камнем и делает невозможным изменение транзакций и записей о них. Как только хеши сгенерированы внутри блокчейна, далее их подделка невозможна.
Транзакции и как майнеры конкурируют за поиск новых блоков
Биткоин-кошельки используются для создания транзакций. Они включают в себя сумму, которая будет отправлена, адреса отправителя и получателя, и некоторую служебную информацию. Все это хешируется вместе. Итоговый хеш подписывается любым ключом, чтобы создать уникальную цифровую подпись, действительную только для этой сделки, и ни для какой другой. Далее эта информация транслируется по сети в незашифрованном открытом виде. Возможным это становится только благодаря тому, что подпись и проверочный ключ не раскрывают секретного ключа.
Чтобы предотвратить попытки провести один блок дважды и совершить своего рода мошенничество под названием «двойная трата», когда одни те же биткоины расходуются дважды, узлы проверяют новые транзакции, сопоставляя их с блокчейном и другими новыми сделками. Такой подход позволяет убедиться, что одни и те же блоки транзакций не проводятся более одного раза.
Каждый майнер собирает действительные новые транзакции и включает их в качестве кандидата на публикацию очередного одобренного блока цепи. Каждый майнер хеширует все новые сделки вместе. Это производит один единственный хеш («mrkl_root»), который делает записи каждой другой транзакции в блоке независимыми.
Каждый хеш для любого блока-кандидата отличается от любого другого блока-кандидата, не в последнюю очередь потому, что майнер включает свой собственный уникальный майнинг-адрес, чтобы он мог получить награду за проделанную работу, если его блок-кандидат действительно будет одобрен в качестве следующего блока цепочки (блокчейна).
Блок-кандидат какого майнера становится в итоге «победителем»? Для того, чтобы конкурирующие друг с другом майнеры признали блок в качестве следующего одобренного для блокчейна, выигравший майнер должен сгенерировать хеш заголовка своего блока-кандидата, который должен отвечать жестокому условию. Все другие майнеры могут сразу же проверить этот ответ и признать его как правильный или нет.
Тем не менее, даже при том, что это правильное решение, оно иметь значение только для того майнера, который нашел его для своего собственного блока. Никто другой не сможет просто взять чужой правильный ответ и использовать его для продвижения своего блока-кандидата в качестве реального победителя. Поэтому правильный ответ можно свободно распространять по сети без опаски, что его присвоит кто-то другой. Этот уникальный «отборочный» хеш называется «доказательством проделанной работы».
Природа и применение хешей, на первый взгляд, являются противоестественными, но они являются необходимыми элементами в том, что делает бикткойн возможным.
Пример добытого блока
Ниже приведен пример некоторых ключевых данных из фактического блока.
“hash”:”0000000000000000163440df04bc24eccb48a9d46c64dce3be979e2e6a35aa13″,
“prev_block”:”00000000000000001b84f85fca41040c558f26f5c225b430eaad05b7cc72668d”,
“mrkl_root”:”83d3359adae0a0e7d211d983ab3805dd05883353a1d84957823389f0cbbba1ad”,
“nonce”:3013750715,
Верхняя строка (“hash”) была фактически успешным хешем заголовка для этого блока. Она начинается с большого количества нулей, потому что победный хеш должен быть ниже значения, установленного при текущем уровне сложности. Единственный способ найти победителя является продолжение попыток снова и снова.
Этот процесс часто описывается в популярной прессе как «решение сложной математической задачи», но это только вводит в заблуждение. Это скорее чрезвычайно простая и прямолинейная задача, которую могут «вынести» только компьютеры. Просто нужно запускать и запускать хеш-функцию миллионы и миллиарды раз, пока где-то в сети не найдется под нее подходящий ответ. Шансы конкретного майнера найти такой хеш для собственного блока-кандидата являются ничтожными и это при том, что в сети в среднем каждые 10 минут находится по одному новому блоку. Победитель получает награду в размере 25 новых биткоинов и все сборы с включенных в него транзакций.
Как собирается награда?
Блоки-кандидаты преопределены заранее так, что вознаграждения контролируются собственным уникальным адресом майнера. Это так потому, что майнер уже включил этот адрес в свой собственный уникальный блок-кандидат до того, как он стал победителем. Адрес для вознаграждения также уже включен в данные блока в самом начале. Изменение адреса вознаграждения может привести к аннулированию победы хеша и с ним всего этого блока.
Кроме того, майнер может только потратить вознаграждения от блоков, которые на самом деле стали частью основной цепи, потому что только те блоки могут стать референсными для будущих сделок. Такая конструкция полностью определяет первоначальный контроль всех новых биткоинов. Точнее, кто победит является случайностью. Чтобы поднять вероятность выигрыша, майнер может лишь попытаться внести большую долю в текущую общую мощность хеширования в конкуренции с другими майнерами, которые пытаются сделать то же самое.
Как показано выше, на примере цитаты Ротбарда, совершенно разный хеш выходит даже после малейшего изменения первоначального сообщения. Вот почему протокол включает в себя место для номера, который стартует с нуля и изменяется на единицу для каждой новой попытки хеша (“nonce”). Только это крошечное изменение, даже если остальная часть данных останется неизменной, генерирует совершенно другой хеш каждый раз в поисках победителя. В приведенном выше примере это выглядит как будто майнер нашел выигрышный хеш для этого блока в определенный момент после трех миллиардов попыток (“nonce”:3013750715). Заметьте, такое количество попыток совершил только один майнер или майнинг-пул. Представьте параллельные безуспешные попытки всех других майнеров. И все это только для участия в соревновании за данный конкретный блок.
Ключевым моментом для понимания является то, что поиск хеша при текущем уровне сложности является чрезвычайно конкурентным и трудным делом, а дальнейшая его верификация – вопрос тривиальный. Остальные майнеры делают это и двигаются вперед. Они используют недавно обнаруженный хеш предыдущего заголовка блока (“prev_block”) в качестве одного из входов для своего следующего урожая блоков-кандидатов (что обеспечивает вертикальную целостность единой цепи блоков) и гонка продолжается на основе оставшегося пула из неподтвержденных транзакций.
Мощная, самофинансируемая, проверяемая сеть.
Майнинговая сеть Биткоин имеет мощность, по состоянию на конец сентября 2014 года, около 250 петахешей в секунду и растет логарифмическими темпами так, что скоро текущий показатель покажется детской загадкой. Это означает, что около 250 квадриллионов хешей проверятся в сети каждую секунду. Это, безусловно, самая мощная сеть распределенных вычислений в мире, которая при этом только продолжает наращивать свои обороты.
Вознаграждение за блоки и операционные издержки помогают производству и поддержанию всей этой сети в децентрализованном порядке. Поскольку генерирование блоков является случайным и распределяется в среднем пропорционально мощности хеширования, это помогает стимулировать всех участников все время. Многие майнеры участвуют в совместной добыче и становятся членами майнинг-пулов, для того чтобы получать хоть какую-то стабильную прибыль.
Сеть разработана для полного самофинансирования участниками с самого начала на неопределенный срок в будущем. Вначале, вознаграждение за новые монеты гораздо больше и доход от платы за транзакции ниже. В конце концов останется только доход от сборов за подтверждение транзакций.
Если биткоин останется успешным в долгосрочной перспективе, к тому времени, преобладающим будет доход от транзакций и, вероятно, в одном блоке будет на много больше порядков транзакций с помощью чего можно приумножить среднее вознаграждение за транзакцию.
Это был краткий обзор некоторых из ключевых технических элементов биткоина. Алгоритмы хеширования и цифровые подписи – относительно новые изобретения, но понимание их работы и предназначения является важным для усвоения принципов работы сети Биткоин. Каждый из основных элементов Биткоин вносит вклад в центральные функции проверки, учета и предотвращения мошенничества. Эти технические опоры и функции, которые они поддерживают, очень далеки от мошеннических схем по типу «схем Понци», насколько это возможно.
coinspot.io