Анализ трендов рынка криптовалют (на примере Bitcoin). Криптовалюта хабр


Bitcoin in a nutshell — Mining / Хабр

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

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

mining_meme

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?

nope

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

Одна из фундаментальных фишек, которой часто бравируют сторонники криптовалют — заложенная изначально дефляция. Это связано с тем, что еще на этапе проектировки системы, было указано суммарное ограничение в 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.

btc_curve

Остается только гадать, что тогда произойдет с 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

block

Если вы посмотрите на структуру любого блока, то самой первой всегда идет так называемая 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 в секунду. Вот ее график:

hashrate

Будем считать, что хэшрейт составляет 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. И примерно в одно и то же время он был найден двумя независимыми майнерами, один из которых живет в Австралии, а другой в США. Каждый из них начинает раскидывать свою версию блока по сети, и в результате получается, что у одной половины мира один блокчейн, а у другой — другой.

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

fork1

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

fork2

В этом случае те ноды, которые придерживаются "красной" версии, автоматически синхронизирует зеленую, потому что в мире 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.

hashrate

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

gpu

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% хэшрейта всей сети.

Pools

Conclusion

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

Obama out

Links

habr.com

Анализ трендов рынка криптовалют (на примере Bitcoin) / Хабр

На текущий момент имеется бесконечное множество публикаций, анализирующих рынок криптовалют от экспертов всех мастей и рангов. Тема является настолько востребованной, что не делал свой обзор только ленивый и не искушенный. Прогнозы аналитиков порой настолько разнятся, что не можешь решить, что же делать дальше: искать банк, которому можно заложить квартиру, и проинвестировать в очередной «-coin», или же тренировать перед зеркалом въедливое «А я говорил!» и с инфернальным смехом изображать призрака Лёни Голубкова. Данная статья не ставит перед собой цель склонить читателя в пользу инвестирования в крипторынок, или напротив откреститься от криптовалюты православным долларом. Настоящий очерк предлагает оценить сложившиеся закономерности с точки зрения цифр и формул, опуская перманентные флуктуации, вызванные фундаментальными факторами или силой привычки (да-да, психологический фактор и настроения рынка иногда могут существенно сдвинуть текущее положение вещей; в конце статьи мы узнаем, чем был вызван обвал цен валют в январе 2018 года).

Что ж, давайте вместе сделаем анализ основных показателей рынка криптовалют на примере мастодонта отрасли – Bitcoin. Однако смею заверить, что анализ поведения большинства топовых валют дает аналогичные результаты (Litecoin, Dash, Ethereum, Monero, Z-cash и др.). Бесспорно, важнейшими и при этом взаимозависимыми показателями рынка криптовалют являются собственно цена валюты (будем рассматривать долларовое выражение стоимости), а также степень вовлеченности вычислительных мощностей в процесс «добычи» монет – хешрейт сети.

В чем же проявляется взаимосвязь цены и хешрейта криптовалюты? Во-первых, абсолютно очевидно, что вовлекая собственное оборудование в процесс подтверждения транзакций в сети криптовалюты (“майнинг”), человек или компания предполагают не только вернуть стоимость инвестированного оборудования (а его замена необходима каждые 2-3 года ввиду физического износа и морального устаревания), но и покрыть при этом инфраструктурные издержки на его обслуживание, а также получить экономические выгоды в виде прибыли не меньшей, чем у альтернативных источников доходности; во-вторых, эмиссионное вознаграждение за участие в майнинге криптовалюты попадает на вторичный рынок исключительно опосредованно в момент продажи валюты майнером (собственником майнингового оборудования). Таким образом, на рынке создается искусственный дефицит актива, что приводит к росту его цены до того уровня, который бы удовлетворил владельцев оборудования.

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

Давайте перейдем непосредственно к анализу показателей. Все исторические данные параметров были загружены с ресурса bitinfocharts.com.

Анализ трендов цены Bitcoin

Рассмотрим график динамики цены Bitcoin за период с 17.07.2010 г. до 24.01.2018 г. (момент написания статьи)

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

Теперь график представляет кривую, линейно зависящую от времени со степенью достоверности в 84%.

Разберемся откуда взялась эта степень достоверности. Кривая линейно зависящая от времени значит, что график нашей функции должен стремиться к прямой линии (изображена пунктиром на графике). Данную линию можно получить, прибегнув к аппарату регрессионного анализа для нахождения коэффициентов линейной регрессии. Далее важно оценить насколько же наша исходная функция аппроксимируема полученной прямой (т.е насколько поведение исходной кривой, может быть предсказано полученной прямой). Помочь в этом может коэффициент детерминации R2 — статистическая характеристика, описывающая насколько дисперсия (разброс) исходных данных объяснена дисперсией модели. Проще говоря, чем ближе будет исходная кривая к моделируемой прямой, тем выше будет значение R2 (изменяется от 0 до 1), и тем выше вероятность того, что будущее поведение показателя будет соответствовать тренду полученной модели. В нашем случае значение коэффициента детерминации составило 0.8432.

Четко видно, что кривая зависимости логарифма цены от времени имеет локальные экстремумы и тренды, другими словами в разные моменты времени цена то опережала глобальный тренд, то несколько отставала от него, но с достоверностью 84% ему следовала. Глядя на график, логично было бы предположить, что, изменяя горизонт анализа, можно добиться более «точного» наложения кривой на линейный тренд. Ниже приведены графики со статистикой R2 за последние 2 года, 1 год и 6 месяцев соответственно.

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

Давайте мысленно вернемся на пол года назад и проверим гипотезу о возможности предсказания ценовых трендов криптовалюты. Так если бы мы делали оценку сегодняшнего значения цены (10 000 $) Bitcoin полгода назад (цена на 27.07.2017 г. составляла 2 500 $), то получили бы следующие ценовые уровни в зависимости от анализируемого горизонта исторических данных:

2-х летний тренд (28.07.2015 — 27.07.2017) – цена 4 400 $; годичный тренд (27.07.2016 — 27.07.2017) – цена 5 800 $; 9-и месячный тренд (26.10.2016 — 27.07.2017) – цена 6 900 $; 6-и месячный тренд (25.01.2017 — 27.07.2017) – цена 8 900 $.

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

Так, используя полученные ценовые тренды линейной регрессии имеем, что усредненный прогноз уровня цены через 3 месяца составляет 13 600 $, а через 6 месяцев — 16 700 $.

Анализ трендов хешрейта Bitcoin

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

Если же говорить о количественных оценках экстраполированных данных, то средний прогноз по трендам через 3 месяца составляет 26.3 EH/s (26.3 * 1018), а через 6 месяцев 34.6 EH/s при текущем уровне 20.5 EH/s.

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

И наконец, обещанная история про силу привычки и обвал крипторынка. Я, как полагаю и многие читатели, привык смотреть регулярные статистические и аналитические данные на одних и тех же информационных ресурсах, будь то прогноз погоды, результаты спортивных матчей или же динамика криптовалютного рынка. Так вот, есть некий весьма популярный ресурс, который анализирует цены различных криптовалют и капитализации их рынков (coinmarketcap.com), при этом представляет собой достаточно удобный источник оперативной рыночной статистики. Как известно цены на криптовалюты на различных биржах разнятся, а иногда существенно, и вот такие аналитические ресурсы эти цены усредняют и оперируют агрегированными данными в своих расчетах. В криптосообществе уже давно был подмечен и обсуждался факт того, что южнокорейские трейдеры искусственно завышают стоимость криптовалюты и котировки этих бирж искажают картину. Владелец и управляющий компанией CoinMarketCap некий Брэндон Чез решил исправить эту рыночную несправедливость и исключил котировки корейского рынка из расчета средних цен криптовалют, но забыл об этом сообщить клиентам, в следствие чего капитализация рынка резко упала. Мало кто за пределами CoinMarketCap понимал истинную причину этого «падения», что по сути было просто игрой цифр. Однако многие трейдеры пытаясь зафиксировать прибыль начали активно продавать криптовалюты, что существенно сказалось на их курсах подобно снежному кому. В результате капитализация рынка криптовалют в целом потеряла порядка 100 млрд. дол.

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

habr.com

Краткая история эволюции proof-of-work в криптовалютах. Часть 1 / Хабр

Предлагаю вашему вниманию перевод статьи «The Proof-of-Work in Cryptocurrencies: Brief History. Part 1» Рэя Паттерсона (Ray Patterson) с сайта Bytecoin.org.

До начала времен

Понятие Proof-of-work – «доказательство (проделанной) работы» – впервые появилось в работе “Pricing via Processing or Combatting Junk Mail” в 16 г. до рождества Bitcoin в 1993 г. И хотя в данной статье такого термина еще нет (появится через 6 лет), мы будем называть его именно так (PoW для краткости). Какую же идею предложили Cynthia Dwork и Moni Naor в своей работе?

«Чтобы получить доступ к общему ресурсу, пользователь должен вычислить некоторую функцию: достаточно сложную, но посильную; так можно защитить ресурс от злоупотребления»

Если провести аналогию, Рыбнадзор обязывает Джереми Уэйда немного потрудиться, чтобы получить доступ к местному пруду – например, посадить несколько деревьев и прислать фото саженцев. При этом Джереми должен быть в состоянии с ней справиться за разумное время: до того, как все рыбы будут отравлены выбрасываемыми в окружающую среду веществами. Но, с другой стороны, работа не должна быть элементарной, иначе толпы рыбаков быстро опустошат весь пруд.

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

Следующая попытка: сервер придумывает два длинных простых числа, умножает их и сообщает результат пользователю. Последний должен выполнить разложение на множители, это уже посложнее. Здесь есть нюансы, но в целом схема стала лучше: коэффициент «время работы / время проверки» сильно вырос. Это и есть основное требование, сформулированное в статье:

«Вычисление функции на заданном входе должно быть гораздо сложнее, чем проверка результата»

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

В качестве примера таких функций было (среди прочих) предложено вычисление квадратного корня по модулю простого числа P: здесь мы имеем log(P) умножений на решение и лишь одно умножение для проверки). Входное значение может выдаваться как сервером (сгенерировать x, выдать x^2), так и выбираться автономно: выбрать x, найти sqrt(hash(x)). В последнем случае нужен небольшой напильник: не всякий элемент в Z_p является квадратом. Но это уже мелочи.

В течение следующих лет появлялись и другие работы с ключевыми словами proof-of-work. Среди них следует отметить две:

  1. Проект Hashcash от Адама Бэка, посвященный той же защите от спама. Задача формулировалась так: «Найти такое значение x, что хэш SHA(x) содержал бы N старших нулевых бит». То есть фактически работа сводилась к хэшированию одних и тех же данных (письма) с перебираемой частью. Поскольку используется стойкая необратимая хэш-функция, то ничего лучше перебора нет; и средний объем работы экспоненциально зависит от N. Очень простая схема, да?
  2. “Moderately hard, memory-bound functions”. Ключевое слово здесь – memory-bound («ограниченные памятью»). К началу нулевых стало заметно, что разница между low-end и high-end процессорами слишком велика для PoW-задач, чтобы стричь всех под одну гребенку. Предложенный в статье алгоритм был первым, который задействовал в вычислениях относительно большие (мегабайты) объемы памяти. Узким местом в таких схемах становилась не скорость процессора, а задержка при обмене данных с RAM или сам объем требуемой памяти, которые варьировались в компьютерах в более узких пределах. Одним из таких алгоритмов и был scrypt, но об этом позже.

Одноклеточные

Неверным было бы сказать, что Сатоши был первым, кто придумал использовать PoW для электронных денег. Идея под названием “reusable proof-of-work” витала в криптоанархических кругах (и даже была частично реализована), но в своем изначальном виде популярности не приобрела.

Концепция RPoW от Хэла Финни предполагала, что сами «токены-доказательства» являлись бы самостоятельной ценностью (монетами), в то время как в Bitcoin механизм PoW был использован как средство достижения распределенного консенсуса (единого мнения о том, какую версию блокчейна считать верной). И в этом была ключевая идея Bitcoin, которая «выстрелила».

В качестве proof-of-work схемы была выбрана идея Hashcash, а вычисляемой функцией стала SHA-256 – самая популярная хэш-функция в тот момент (2008 г). Скорее всего, именно простота Hashcash и «стандартность» SHA-256 оказались решающими факторами. Сатоши добавил к Hashcash механизм изменяющейся сложности (уменьшать-увеличивать N – требуемое число нулей – в зависимости от суммарной мощности участников) и этим, казалось бы, обеспечил всем безоблачное д ецентрализованное будущее. Но потом случилось то, что случилось: GPU, FPGA, ASIC и даже облачный дентрализованный майнинг. Подробную историю (в трех томах) развития майнинга в Bitcoin вы можете найти здесь.

Нет единого мнения о том, «предвидел ли Сатоши» все это безобразие или нет, но факт такой: уже в сентябре 2011 появилась первая криптовалюта с принципиально другой функцией PoW: Tenebrix использовал scrypt вместо SHA-256 .

Мутация

Итак, зачем же вместо таких полезных и важных изменений в коде Bitcoin, как, например, общее число монет, стали менять критически важный элемент – алгоритм консенсуса? Повод очевидный: в 2011 г уже вовсю работали GPU-фермы, собирались предзаказы на FPGA и потенциально маячили ASIC’и – т.е. вклад обычного CPU-юзера был практически нулевой. Но в чем причина?

Можно объяснить, конечно, все обычной обидой или желанием «срубить бабла»: до Tenebrix уже были и форки, и премайны, и pump’n’dump. Но аргументы сторонников “ASIC-resistance” функций вполне разумны:

  1. Популяризация. Поскольку каждый компьютер (в теории) дает примерно одинаковый хэшрейт, то большее число людей будет участвовать в майнинге, пусть даже и в фоновом режиме. Сотни миллионов офисных машин, слегка нагрузив свой CPU, будут вносить вклад в защиту сети, получать за это монетки, которые потом пойдут в оборот.
  2. Децентрализация. Здесь даже два аспекта: во-первых, производители железа. Большинство ASIC’ов производится на нескольких заводах в Китае, а компетенцией в производстве тоже обладают единицы. Другое дело – ПК общего назначения. Во-вторых, географическое расположение майнеров. Если не принимать в расчет пулы, то универсальный CPU-friendly алгоритм имеет больший ареал распространения: кто угодно может позволить себе запустить майнер.
  3. Дороговизна атаки 51%. Конечно, всегда можно спроектировать специальный девайс, решающий определенную задачу эффективнее (по времени или по энергозатратам), чем обычный ПК. Другой вопрос: а сколько будет стоить reseach+development такого устройства, какие масштабы производства должны быть, чтобы весь проект был экономически выгоден и т.д.? Считается, что в любом случае это будет дороже, чем в текущих реалиях Bitcoin. (Имеется в виду не абсолютная оценка стоимости атаки: а относительно, грубо говоря, уровня зрелости всей сети. Так, скажем, сеть даже с самым супер-крутым ASIC-proof алгоритмом можно дешево атаковать, если в ней пока майнит только два десятка машин.)
Конечно, на каждый пункт всегда можно что-то возразить, но я лишь хочу показать, что при выборе PoW-функции есть смысл думать над ее «ASIC-защищенностью». На самом деле, об этом аспекте неявно было сказано в самой первой статье! Именно неамортизируемость функции можно с натяжкой считать ASIC-защищенностью.

Теперь немного технических подробностей о том, как работает алгоритм scrypt, легший в основу Tenebrix, а в дальнейшем и Litecoin (который, как вы, возможно, знаете, стал второй по популярности криптовалютой).

Строго говоря, scrypt – не криптографическая хэш-функция, а функция формирования ключа (key derivation function, KDF). Такие алгоритмы используются для ровно там, где вы и подумали: для получения секретного ключа из каких-то данных (парольной фразы, случайных бит и т.д.). Среди примеров можно также назвать PBKDF2 и bcrypt.

Основная задача KDF – затруднить генерацию конечного ключа: несильно, чтобы можно было использовать в прикладных задачах, но настолько, чтобы предотвратить случаи злоумышленного использования (например, массовый перебор паролей). Формулировка очень напоминает кое-что, не так ли? Неудивительно, что они встретились – как Зита и Гита – PoW и KDF.

Схема работы scryptПервый слой:
  1. Входные данные пропускаются через PBKDF2
  2. Hазбиваются на p блоков, каждый обрабатывается функцией SMix,
  3. Результат снова склеивается и пропускается через PBKDF2.

Заметьте, что здесь каждый из p блоков может обрабатываться отдельно. Т.е. scrypt в теории допускает возможность распараллеливания (но по умолчанию p=1)

Второй слой:

  1. Входной блок последовательным применением псевдослучайной функции BlockMix расширяется до массива из N блоков.
  2. Блок X, полученный из последнего элемента, интерпретируется как целое число j, и из массива читается элемент Vj
  3. X = BlockMix(X xor Vj)
  4. Шаги 2-3 повторяются N раз
  5. Результатом является текущее значение блока X

Тут происходит самое интересное. Чем большее значение N мы выбираем, тем больше памяти требует алгоритм. И хотя на каждом шаге 2-3 нам требуется лишь один элемент из всего массива, мы не можем освободить память до шага 5: ведь этот элемент выбирается псевдослучайно, в зависимости от последнего результата! Таким образом, если сама функция BlockMix (см. ниже) выполняется быстро, узким местом становятся задержки (latency).

Третий слой.

  1. Вход разбивается на 2r блоков
  2. Каждый блок xor-ится с предыдущим и хэшируется функцией H
  3. Результат выдается в переставленном порядке

В качестве функции H используется Salsa20/8. Да, это не хэш-функция, а потоковый шифр. Но для целей scrypt не требуется устойчивость к коллизиям, а только быстрый и псевдослучайный результат, поэтому Salsa очень даже подходила. По умолчанию scrypt предлагает r=8, однако в криптовалюте выбрали r=1 (скорее всего, для скорости). О последствиях мы напишем позже.

Подробности касательно выбра тех или иных параметров в алгоритме можно найти тут.

Параметры scrypt для Tenebrix были выбраны так, чтобы общий объем требуемой памяти укладывался в 128 КБ: так можно поместиться в L2 кэш процессора. А по умолчанию использовалось 16 МБ! Эксперимент оказался более чем удачным: позабытые было на обочине прогресса CPU-майнеры быстро включились в игру. Подавляющее большинство новых форков уже отпочковывалось от Litecoin, унаследуя scrypt вместо SHA256.

Как ни странно, пользователей не смутил тот факт, что 128 КБ параметры оказались вполне по зубам и видеокартам. Оптимизированный GPU-майнер появился спустя несколько месяцев и давал в среднем десятикратный прирост эффективности. «Зато не в 100 раз, как в Bitcoin!» — говорили они, — «Зато не в 1000 раз!» Увеличение соотношения GPU/CPU-мощностей (вытесняемых из Bitcoin новыми ASIC’ами) было не таким резким, наверное, потому, что компенсировалось бумов форков: новая scrypt-криптовалюта появлялась едва ли не раз в неделю, отягивая на себя новые мощности.

И все же понимание того, что scrypt далеко не идеальная PoW функция, появилось даже раньше, чем анонс scrypt-ASIC. Головокружение от успехов прошло, культ Сатоши немного пошел на убыль, и идеи для новых PoW-кандидатов стали появляться как после дождя.

«Скрещивайтесь и размножайтесь: алгоритмы X11 и Ко!» «Атавизмы против рудиментов: SHA3 или scrypt-jane?» «Парадоксы истории: Momentum и birthday paradox» «Где вершина эволюции: в теоретической информатике или практической? CuckooCycle и CryptoNight»

habr.com

насколько многогранны криптовалюты? / Хабр

Публикую перевод статьи «Sidechains: How Many Sides Does a Cryptocurrency Have?» Рэя Паттерсона (Ray Patterson) с сайта Bytecoin.org.

Не существует «самой лучшей» криптовалюты

Bitcoin прекрасен, Bytecoin прекрасен, Doge прекрасен. Все криптовалюты прекрасны (ну, или давайте на секундочку представим, что это так).

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

Естественно, вы можете просто собрать другую криптовалюту, которая будет сочитать в себе все лучшие «фичи». Что-то вроде стандрата для криптовалют. Погодите… Это мне что-то напоминает.

Конечно, такой подход возможен… теоретически. Но на практике это становится невыполнимым. Во-первых, идея «самого лучшего» крайне субъективна. Не всем кажется, что функция «demurrage»(плата за простой монетки в кошельке) у Freicoin – довольно полезная функция. Выбор стандарта из всевозможных вариаций Proof of Work также стало было колоссальным испытанием.

Во-вторых, некоторые вещи просто не могут сочетаться в принципе: представьте себя на месте сервиса, который должен принимать во внимание миллион функций всего-навсего ОДНОЙ криптовалюты. Стали бы вы ее принимать? В конце концов, это просто крайне сложно с технической точки зрения — содержать все внедрённые инновации и обновления разных проектов.

Преумножая альткойны

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

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

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

Альтернатива 2 была описана личностью вам (надеюсь) известной, Адамом Бэком, два года назад: так называемый 2-way pegging (в своей работе автор заявляет, что концепция принадлежит Грегори Максвеллу). Идея состоит в том, что можно начать параллельный блокчейн с экспериментальной фичей, в котором при этом не будет никаких монет (пока что). Пользователь может «блокировать» монеты в основном блокчейне (посылая их по специальному адрес-скрипту), и то же самое количество монет появится в параллельной цепочке. Естественно, мы говорим о тех же самых монетах, доступных пользователю. Элегантность данной концепции состоит в том, что второй блокчейн не должен содержать в себе основного: для выпуска N-альткоинов пользователь должен лишь предоставить сжатое доказательство того факта, что N-альткоины были заблокированы в основной цепочке. После этого он может использовать их внутри второго блокчейна со всеми доступными функциями.

Как вернуть монету назад? Таким же образом! Отсюда и «2-way pegging». Пользователь должен заблокировать монеты в тестовой цепочке, и они будут разблокированы в основной. Соотношение для таких переходов всегда 1:1, поэтому общее количество монет в двух цепочках будет постоянным. Таким образом, курс обмена и другие покупательские критерии не изменятся. Технически, это те же самые монеты, только теперь у них есть филиалы во втором блокчейне. Если что-то случается с ними, в связи с их экспериментальной натурой, монеты просто попадут обратно в основную цепочку. А если вы решите внедрить тестируемую функцию в основную цепь, в альтернативной цепи уже просто не будет необходимости (до тех пор, пока вам вновь не приспичит тестировать другую революционную функцию).

Давайте поговорим о Биткойне (вновь)

Как должны выглядеть эти «блокирующие» адрес-скрипты? Если хотите знать детали, то нет ничего проще — давайте рассмотрим их на примере Биткойна. Как вам известно, транзакции включают в себя входы (inputs) и выходы (outputs), которые, формально, являются набором команд-скриптов. Что они описывают?

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

image

Самый распространенный выход (упрощенно) это «ПУБЛИЧНЫЙ КЛЮЧ ‘A’ + ПОДПИСЬ КОМАНДЫ ПОДТВЕРЖДЕНИЯ» и вход “ПОДПИСАТЬСЯ ДАННЫМ КЛЮЧОМ». Если подпись успешно подтверждена ключом, данная часть транзакции признается валидной и все в порядке.

В этом случае, скрипты для нашего кейса с 2-way pegging будут включать в себя следующих действующих лиц:

  • Транзакция TX1, которая блокирует деньги в основной цепочке, чтобы перевести их в альтернативную.
  • ТX2, которая реализует эти монеты в альтернативной цепи и переводит их дальше внтури этой цепи.
  • ТХ3, которая блокирует деньги в альтернативной цепи и возвращает их обратно, в основную
  • ТХ4, которая разблокирует деньги в основном блокчейне.
Итак, действия следующие:
  • Выход ТХ1. OUT: «ПУБЛИЧНЫЙ КЛЮЧ ‘А’ + БЛОКИРУЮЩАЯ КОМАНДА ДЛЯ ЦЕПИ 2 + ПУБЛИЧНЫЙ КЛЮЧ ‘В’ + КОМАНДА ПОДТВЕРЖДЕНИЯ ПОДПИСИ». Теперь деньги заблокированы, и не могут быть потрачены без данных блокировки.
  • Вход ТХ2. IN реализует ТХ1: «SPV-PROOF OUT1 + ПОДПИСЬ КЛЮЧОМ ‘А’». Внутри альтернативной цепи данный скрипт проводится не как обычный вход, который тратит монеты той же цепочки, а именно как перевод из основной цепи.
Что такое SPV-PROOF OUT1? Это транзакция ТХ1 (содержащая OUT1) и хэши других транзакций из того же блока, в котором содержится ТХ1. То есть, мы можем восстановить древо хэшей для всех транзакций и проверить, действительно ли они исходят из цепи 1(да, мы должны знать хэши блоков из цепи 1, но это – не так уж и много). Этот вид схемы подходит для «легких» кошельков в том числе, когда мы должны проверить, существует ли транзакция, не проверяя весь блокчкейн. Это называется Упрощенным Методом Проверки (Simplified Payment Verification), и данный способ может быть даже найден в статье Сатоши Накамото. image
  • Теперь у нас есть валидный вход для N-монет которые мы получили из цепи 1 в ТХ2. Они могут быть использованы в цепи 2 до тех пор, пока не придет время вернуть их назад. Таким образом, движение монет до транзакции ТХ3 нас не интересует: они могут сменить владельца, или нет.
  • Выход ТХ3. OUT в альтернативной цепи: «КОМАНДА БЛОКИРОВКИ В ЦЕПИ 2». Как выглядит команда блокировки? К примеру, деньги могут быть просто посланы на публичный ключ вида «000000», или хэш чего-либо. Никто не должен знать правильный приватный ключ. С этого момента, ТХ3. OUT во вторичной цепи становится практически невосстановимым. Технически, мы совершили нечто, что является аналогом Proof of Burn.
  • Вход ТХ4.IN в основной цепи: «ССЫЛКА НА ТХ1.OUT + SPV-BLOCK-PROOF + ПОДПИСЬ КЛЮЧОМ ‘В’»
Мы обращаемся к ТХ1.OUT, поскольку основная цепь понятия не имеет о существовании альтернативной. Это должно выглядеть так, как будто деньги никогда не исчезали: они были отправлены на выход ТХ1.OUT, а теперь они были потрачены на входе TX4.IN. Цепь сравнивает команды подтверждения из скрипта ТХ1.OUT с содержимым в ТХ4.IN, и они сходятся! Мы только должны обучить скрипт парочке новых команд, и это всё.

Красота Sidechains

Теперь мы готовы разобраться со всеми альткойнами. Вы уже должны были догадаться, что мы должны сделать: реализовать 2-way pegging в каждом альткойне и обновить скрипт в основной цепи. Затем мы сможем переводить биткойны в альткойны и наоборот.

Для этого нам необходимо назвать эту идею Sidechains, собрать команду Биткойн-разработчиков и других волонтеров, создать компанию Blockstream и получить $21 миллион средств от инвесторов. Звучит просто.

image

Компания сосредоточена на внедрении описанного механизма и создании некоторого количества sidechains для тестирования экспериментальных идей. Вы можете ознакомиться с этими идеями на данном сайте.

  1. Confidential Transactions: транзакции, в которых скрывается сумма платежей. Для каждой транзакции можно лишь удостовериться, что сумма выходов не превышает сумму входов (то есть что деньги не берутся из воздуха)
  2. Segregated Witness: реструктуризация транзакций для того, чтобы можно было «выкинуть» из старых них ненужные данные: такие, как например, подписи. Ведь если транзакция уже давно в блокчейне – она определенно валидна. Зачем нам тогда ее подпись, верно?
  3. Relative Lock Time: новые способы датировки транзакций. Позволит, например, отправлять деньги, которые «можно потратить через N блоков после включения в блок».
  4. Schnorr Signature Validation: другой алгоритм подписи, более эффективный, чем текущий Bitcoin ECDSA. Кстати, именно подписи Шнорра лежат в основе CryptoNote.
  5. New opcodes: тестирование in the wild новых команд скриптового языка – вещь опасная, ее нужно делать с особой осторожностью. Теперь это можно будет делать «в песочнице».
Основное, что нужно понять о Sidechains — это то, что на практике используются монеты из основной цепи, а не вновь выпущенные.

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

Достижения Blockstream

Весной 2014, через год после описания 2-way pegging Blockstream выпустили статью. Ещё годом позже, недавно, ребята анонсировали свой первый Sidechain, названный «Liquid». Цель его состоит в том, чтобы убедиться в возможности быстрых транзакций между большими финансовыми узлами (биржами и онлайн-кошельками).

Вместо того, чтобы снимать средства с Kraken и переводить их на счет BTCC, пользователь просто нажимает на кнопку в своем профиле. Его биткойны посылаются на адрес Kraken в Liquid-блокчейне, который мгновенно переводит их на адрес BTCC, а BTCC уже отсылает их обратно в блокчейн Биткойна, на собственный Биткойн-кошелек. Технически, это живой аналог банковского клиринга.

Почему данная последовательность действий быстрее, чем просто прямая транзакция с Биткойн-адреса Kraken на Биткойн-адрес BTCC?

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

Очевидно, нечто более простое могло бы быть придумано для подобных целей, но в нашем случае, Liquid – более важная сущность.

Реально существующий функционирующий Sidechain. Первый, но, надеюсь, не последний.

habr.com


Смотрите также