Исходный_код(("Bitcoin"), (_2));
Привет!
Биткоин, криптовалюты, блокчейн, будущее, ура-ура. А еще - холдим till the end of time, не правда ли?
Ведь:
Один. Год назад биткоин стоит 4к, а сегодня на +1100% дороже.
Два. Капитализация криптовалютного рынка выросла с 200 млн. до 1,6 трлн. долларов:
Три. Рост битка на 1100% - это не предел. Так, за период с декабря 2016 года по декабрь 2017 года, в т.н. "год криптохайпа", биток вырос на 2300%:
Я часто спрашиваю знакомых с криптовалютами товарищей - коль скоро они имеют дело с этим активом, понимают ли они, что такое "биткоин"? Понимаешь ли ты, что такое биткоин? Является ли биткойн "криптовалютой"? Является ли биткоин невзламываемым?
В 99% случаев ответ положительный - "биткоин не просто криптовалюта, а отец всея криптовалютной религии, и хрен его взломаешь". И такой ответ, один из распространенных мифов.
И давай я покажу, почему.
Данная статья является вторым материалом серии статей "Исходный код". В рамках этой серии мы разбираемся с блокчейном битка, Bitcoin Core и людьми, стоящими за всем этим. Проект этой статьи пылился у меня с 2019 года, но теперь настало время ее расчехлять, дописывать, обновлять и рассказывать.
В первой части (читай Исходный_код(("Базис"), (_1));) мы разобрались, что такое Криптология, Криптография и Криптоанализ; мы узнали об основных концепциях, стоящих в фундаменте битка; оценили историю развития криптографии от военных до гражданских технологий. А еще мы узнали про дерево Меркля (hash-функция) и Trapdoor-криптосистемы.
Сегодня мы строим второй фундаментальный блок BTC-блокчейна, мы переходим к анализу самого алгоритма от Сатоши Накамото.
Эта статья не претендует быть простой, однако я приложу все усилия для максимально понятного изложения.
Итак, сегодня мы разберемся в следующем:
- Как майнятся блоки, и что при этом происходит?
- Как создаются кошельки и транзакции?
- Почему не существует такого понятия, как 1 ВТС? Что же такое "биткоин" на самом деле?
- Почему нерушимость алгоритмов шифрования, на которых строится блокчеин битка не является аксиомой?
- А точно ли ВТС децентрализован?
- Почему не нужно хранить свои битки на горячих кошельках?
Как оно работает?
Понимание работы блокчейна Биткоина и его Proof of Work алгоритма начинается с простого вопроса: "Как мне получить биток?".
Способов получения битка - два. Первый - купить/подарили/своровать. Второй - намайнить.
Дабы выстроить полное понимание технологии блокчейна битка, нужно разобраться в обоих способах.
И параллельно с этим мы закроем кучу сопутствующих (и более интересных) вопросов.
Майнинг.
Майнинг - это, без преувеличения, участие в математической лотерее, в которой толпа майнеров считает hash-функцию нового блока, и у кого hash-функция будет "самой кошерной", того блок и запишется в сеть. А внутри записанного блока - список транзакций из мемпула, и первая транза - "перечислить, мне, Васе, 6,25 ВТС из ниоткуда". Это называется Coinbase-транзакция. Если блок Васи "победит" в лотерее, то его транза 6,25 ВТС из ниоткуда попадет в блокчейн, и будет считаться, что он "намайнил 6,25 ВТС".
Любой "блок" имеет одну и ту же структуру:
- Ссылка на предыдущий блок (Hash-функция предыдущего блока).
- Метка о времени, номер блока.
- Транзакция майнера ("перечислить, мне, Васе, 6,25 ВТС из ниоткуда").
- Список транзакций из Мемпула (облака неподтвержденных транзакций).
- Поле случайного числа, или Nonce (Number only used once).
Например, Блок №602434, намайненный 5 ноября 2019 года конторой Antpool содержит в себе 2 986 транзакций + 1 награда 12,5 ВТС (блок намайнен до прошлого халвинга, о халвингах позже). Блок получился при Nonce = 2 578 542 935. Общий доход Antpool с этого блока составил 12,5 BTC (награда) + 0,19 BTC (общая комиссия со всех транзакций).
Как победить в лотерее, и что же такое Nonce и "нули"?
В вышеприведенном Блоке №602434 есть 2 параметра:
- Nonce, или случайное число победителя лотереи, которое равно 2 578 542 935;
- Hash-функция блока содержит 19 нулей: 0000000000000000000d252a3d7510124a6f26eef57328309c390290b5542424.
Чтобы победить в лотерее, майнер должен создать прототип нового блока, взять hash-функцию предыдущего блока, которая захеширована в алгоритме SHA-256 (подробнее об этом алгоритме мы поговорим позже), в случае с Блоком №602434 - нам нужно взять hash-функцию Блока №602433, значение которой - 000000000000000000056f305d5305ebabf487bfec07b0505aaeb56b5e000dc7. И далее:
- Вписать в прототип хеш прошлого блока: 000000000000000000056f305d5305ebabf487bfec07b0505aaeb56b5e000dc7.
- Вписать в прототип блока метку о времени.
- Вписать транзакции из мемпула.
- Вписать в поле Nonce цифру 0.
- Захешировать все данные из пунктов 1-4 в том же алгоритме, и получить результат - hash-функцию нового блока.
- Если hash-функция нового блока не содержит 19 нулей вначале, мы меняем Nonce с 0 на 1, меняем метку о времени, и повторяем. И так до усрачки, пока мы не станем первыми, кто нашел новый блок с 19 нулями на основании хеша предыдущего блока, который не меняется. Кто быстрее всех досчитает с 0 до числа n, перехеширует блок, и получит сокровенное число нулей в hash-функции своего блока, тот и намайнил. И все майнеры планеты решают одну и ту же задачу.
- Если кто-то успел найти новый блок до нас, то мы меняем прототип блока - берем новый хеш, новые транзакции, ставим Nonce=1 и все по новой.
- Опционально с 2012 года: майнеры могут не только перебирать поле Nonce но и записывать любые данные в поле "Coinbase", т.к. от них меняется итоговый hash блока, а значит есть вероятность, что будет найден "кошерный". Эта тема получила название "Extra nonce Solution".
Наглядно оно так (использован Online-генератор SHA-256 hash-функций):
И так далее.
Таким образом, перебирать nonce нужно, пока в Hash-функции итогового блока не появится 19 нулей, или 20, или 8. От чего собственно зависит количество нулей в "годной" итоговой hash-функции? Так, Блок №1 (самый первый), он же Genesis-блок содержал 8 нулей в своей итоговой hash-функции.
Количество нулей зависит от "сложности сети".
Сложность сети.
В одноранговую Р2Р-сеть битка подключены тонны специализированного железа, и каждый из них майнит - перебирает Nonce чтобы "было 19 нулей".
В настоящий момент, по данным сети, общая вычислительная мощность ребят, участвующих в лотерее под названием "майнинг" составляет 163 072 000 Tera-hash/сек (в 2019 году было 98 007 432 Tera-hash/сек).
То есть, на нашей планете каждую секунду перебирается 163 072 000 000 000 000 000 циферок в поле Nonce, чтобы найти нужный блок. Я не знаю как назвать эту цифру - что-то вроде 163 миллиардов миллиардов в секунду.
Каждые 2016 блоков, алгоритм блокчейна битка выдает всем майнерам новые условия лотереи. Речь идет о таком параметре, как "сложность сети". Задача сети поддерживать такую сложность, чтобы новый блок генерировался не быстрее, чем раз в 10 минут (600 секунд). А значит, "кошерный" hash нового блока должен появляться 1 раз на 600 * 163 072 000 000 000 000 000 хешей.
Получается, что 2016 блоков добываются в среднем за 10 * 2016 = 20160 минут, или 336 часов, или 14 дней. То есть, "сложность" майнинга пересчитывается сетью каждые 2 недели.
Как конкретно это происходит?
Каждая подключенная к сети нода (нода - это холодный кошелек, если ты скачаешь Bitcoin Core, запустишь у себя на компе, загрузишь весь блокчейн из сети и оставишь кошелек работать - он станет нодой) считает за сколько времени было намайнено 2016 блоков после прошлого обновления. Если новые 2016 блоков была намайнены не за 2 недели, а за 2 недели + 2 дня, то "сложность" будет понижена на (14-16)/14 = -14,3%, а если быстрее, чем за 2 недели, скажем за 10 дней, то сложность будет повышена на (14-10)/14 = +28,6%.
На дату 25.03.2021, параметр "сложность" составляет 22 780 895 376 364. Что это означает?
Если не вдаваться в программирование и computer science (а если хочется вдаться - то тебе сюда), то сложность - это одна из переменных сети, которая включается в блок. Данная переменная показывает - какие блоки "хороши" в своей итоговой hash-функции, а какие "нет".
Например, между Генезис блоком и Блоком №58000, сложность выросла с 1 до 11,85, но все первые 58 000 блоков в своей итоговой hash-функции имели восемь нулей. А вот Блок №58001 уже получил девять нулей в своей hash-функции.
Математически, сложность подстраивается под общие вычислительные мощности всех майнеров, все усложняя задачу, и, в итоге, добавляя новые нули в hash-функцию нового блока (сегодня уже 19 нулей).
Адаптация сложности в зависимости от общей вычислительной способности сети проходит по формуле:
Если попытаться по этой формуле рассчитать сложность добычи "правильного блока" при вычислительной мощности сети сегодня, то получится:
Короче говоря, сложность определяет баланс между мощностью сети битка и вероятностью определения блока с нужными нулями в hash-функции таким образом, чтобы блок был найден 1 раз в 600 секунд (или 10 минут). Чем больше сложность - тем больше нулей нужно в кошерную hash-функцию и тем сложнее "лотерея".
Самый сложный и последний возможный блок битка будет иметь hash-функцию такого значения:
0x00000000FFFF0000000000000000000000000000000000000000000000000000
Халвинги.
Почти все криптаны слышали о двух вещах: 1) битка не может быть больше 21 млн. экземпляров; 2) случаются "халвинги". Обе эти вещи взаимосвязаны.
Дело в том, что майнер не может сам записать в блоке "передай из ниоткуда мне, Васе, счастливому майнеру, X битков" - эта запись делается сетью автоматически.
У любой транзакции (включая особенную-майнерскую Coinbase-транзу) есть блок под названием "входные данные", или Input, чуть позже мы разберем, что этот блок означает для обыкновенных (не-майнерских) транзакций, но когда речь идет "майнерской награде за выигрыш в лотерее", то в блок Input менятся на блок Coinbase , в честь него и названа одна известная криптобиржа. В данный блок можно написать любую фразу (типа "Vasya rules the Galaxy"). Coinbase-транзакция всегда имеет фиксированное значение, которое равно текущей награде за блок.
Если примитивно, coinbase-транза имеет вид:
Input:
scriptSig: 56617379612072756c6573207468652047616c617879 (закодированная при помощи HEX фраза "Vasya rules the Galaxy") <<< это и есть Coinbase
Output:
Value: 6250000000 (6,25 битка в пересчете на Сатошики)
scriptPubKey: ___адрес Васи-майнера___
Любопытно, что в Генезис блоке в поле Coinbase Сатоши Накамото написал 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
, что означает после декодирования из HEX в человеческий следующее:
Это отсылка на статью в Таймс, в которой говорилось о второй волне спасения банков в ипотечном кризисе.
Так или иначе, Вася может написать что угодно в Coinbase-поле (оно же специальное scriptSig-поле только для первой транзакции Битка), но стоимость этой транзакции из ниоткуда фиксирует сеть.
Каждые 210 000 намайненных блоков значение coinbase-транзакции уменьшается пополам, это и называется халвингом (halving - ополовинивание прим.Надмозг). В результате халвингов, случающихся каждые 210 000 блоков, общее количество биточков математически не может превышать 21 млн. экземпляров.
Таким образом, в 2032 году награда за блок будет меньше 1 битка, в 2036 - меньше 0,4 битка, в 2040 году - меньше 0,2 битка и так до нуля:
Первый главный парадокс Биткоина.
Многие из нас искренне (и вполне наивно) считают, что биток - это такая цифровая монета/банкнота/валюта. Сейчас, мы будем ломать таким товарищам стереотипы.
Если ты считаешь, что 1 BTC - это некоторая оцифрованная и отдельная сущность - то ты люто ошибаешься.
Если представить, что национальная валютная система РФ - это "система", то "объект", или частичка этой системы - 1 рубль, который в свою очередь делится на 100 копеек. Такое понимание "валютной системы" вполне привычно для нас. И мы, по аналогии считаем, что если "BTC-Блокчейн" - это "система", то "1 ВТС" - это "объект" системы, т.н. "цифровая валюта/монета/токен".
Вот тут и кроется подвох. Дело в том, что 1 битка, как единичного объекта - не существует.
Единичным объектом BTC-Блокчейна является транзакция.
Ты не владеешь биткоином, ты владеешь правом тратить входящие на твой кошелек транзакции, и то при определенных условиях, до которых мы еще в этой статье доберемся. Размер трат, на которые ты получил право, оценивается битками из этих входящих транзакций.
Биткоинов, как отдельных "монет" - не существует. Существуют только TXID (хеши транзакций), и все. А сама по себе транзакция - это процесс передачи права владения n-количеством биткоинов от отправителя транзакции к получателю. Если сравнивать с золотом (веть биток эта цифровое золото), то транзакция - это не передача золота, а передача бумажульки, о том, что теперь адрес владеет некоторой порцией золота. При этом, в придуманной нами "системе" золота, как такового, не существует, существуют лишь бумажки. Точнее "акции на предъявителя".
Заинтригован? Все ниже расскажу, но сначала тебя надо напичкать всей этой криптотехнологией, потерпи немного, уважаемый читатель.
В итоге, биткоин по своим технологическим принципам, не совсем "цифровая валюта", а скорее "дериватив к цифровой валюте".
Однако, во-первых, спутать одно с другим очень легко, а во-вторых, какая нам разница что к нам пришло на кошелек 1.2 BTC или право использоваться 1.2 ВТС? И наше "во-вторых" вполне себе риторический вопрос, но ведь задача этой статьи расставить все по своим местам, вот я и расставляю, а как относиться в итоге к битку - "наивно" (биток - единица ВТС-блокчейна) или "занудно" (транзакция - единица ВТС-блокчейна), пусть каждый читатель решает сам.
А мы начнем разбираться, почему вообще существует заявленный мной "Первый парадокс" сети биткоина. Вот здесь я тебе советую собрать все внимание в кучу или взять перерыв, т.к. статья и так нелегкая для восприятия получается, а дальше все только сложнее.
Так сказать, следи за движением пальцев.
Транзакции.
Если лютый майнер Вася - майнит. То есть Олег и Петя, которые не майнят, но пользуются блокчейном битка. И вот Олег решил перевести 0.0001 BTC Пете, получается, что Олег - отправитель, а Петя - получатель.
Но чтобы Олег с Петей вообще начали пользоваться ВТС-блокчейном, им нужны кошельки. Но они даже и не догадываются, каким образом создаются кошельки.
А создаются они так:
- Оба типа скачивают себе полную ноду (они не верят всяким блокчен-инфо, которые за них это сделают).
- Оба типа (уже посредством Bitcoin core) создают приватный ключ, это 256-битная цифробуквенная билибирда, так скажем.
- Далее, на основании элиптической кривой Secp256k1 (оно же односторонняя функция, надеюсь ты помнишь первую часть Исходного кода, описание функции: y^2=x^3+7) из приватного ключа создается полный публичный ключ. Алгоритм Secp256k1 является частным случаем стандарта криптографии EDCSA, который, в свою очередь, является частным случаем стандарта RSA.
- Далее, полный публичный ключ два раза хешируется при помощи стандарта SHA-256, и таким образом генерится то, что мы и называем BTC-кошельком. Таких кошельков одним приватным ключем можно много насоздавать.
Пока мы не пошли в дальнейшие дебри, сразу тебя спрошу, а когда ты на blockchain.com регаешься, ты получаешь свой приватный ключ? Ты вообще его знаешь? А сколько у тебя активов на этом или ином "горячем кошельке"? А ты уверен, что приватный ключ чиста-случайна не был продублирован в кое-какую базу данных? А ты вообще к этим моим вопросам серьезно относишься? Невермайнд, пойдем дальше, там я тебя уж точно серьезно настрою.
Теперь, Олег и Петя создали себе кошельки, и Олег получил откуда-то (почку продал, допустим) 0.0001 ВТС и решил их перевести Пете. Он попросил у Пети адрес, создал транзакцию, жмяк-клик и ушло на подтверждение в сеть. А что же происходит за кадром (читай - в программном коде блокчейна)?
А начинать надо издалека. Сотней слов ранее я писал, что главным элементом блокчейна битка является не биток, а транзакция. Простыми словами, весь блокчейн битка это сотни-тысячи гигабайтов записей о всех подтвержденных транзакциях, которые вообще когда-либо существовали. Именно поэтому большинству из нас лень ноду (оно же "холодный кошелек") поднимать у себя на компах - все эти гигабайты ведь скачать придется.
Каждая транзакция содержит в себе 4 блока данных:
- Версия (version) - цифра версии алгоритма валидации. Алгоритм валидации проверяет, действительно ли владелец BTC-кошелька включил свой приватный ключ для подписания транзакции.
- Входные данные (input) - ссылки на транзакции, против которых на кошелек зашли битки.
- Выходные данные (output) - данные о том, куда отправляются битки по данной транзакции.
- Временная отметка (locktime) - отметка о времени создании транзакции.
При этом, все битки, которые находятся в данный момент вне мемпула (о транзакциях в мемпуле поговорим позже) являются непотраченными битками, и называются UTXO - Unspent TX Output (Unspent transaction output).
А все цепочки транзакций имеют вид:
- В транзакции 1, которая включена в намайненый блок создается 6,25 ВТС "из ниоткуда", в качестве награды майнеру. Input поле данной транзакции это и есть вышеупомянутое поле Coinbase.
- В транзакции 2 майнер переводит с одного кошелька на другой все 6,25 ВТС, далее второй кошелек закидывает Пете его 0,0001 ВТС и 3 ВТС куда-то еще, поэтому в этой транзакции два блока выходных данных (output 0 и output 1).
- Транзакция 3 - это транзакция Олега, о ней подробнее ниже, по этой транзакции 0,0001 ВТС будут переведены Пете.
- Транзакция N - это любая другая транзакция в сети, как ты понимаешь.
Очень важно обратить внимание на 2 принципа работы транзакций в сети блокчейна ВТС:
- Все входные данные - это всегда выходные данные предыдущих транзакций, иными словами их hash-функция, это еще мы называем txid-транзакции. То есть любой биткоин можно отследить по его цепочке транзакций от самой первой Coinbase-транзы.
- Если по входным данным ты получил 6,25 ВТС, то ты не можешь их дробить, тебе нужно отправить все 6,25 ВТС, и получить "сдачу" в виде разницы 6,25 ВТС - n BTC (где n - это то, сколько ты хотел реально отправить). Это все потому, что нет в блокчейне объекта в виде битка или сатоши, главный объект блокчейна - это транзакция. Все входные данные должны ссылаться на hash-функцию предыдущей транзакции, даже "сдача", при которой получается, что ты сам себе отправляешь битки.
А теперь о том, что будет происходить, если Олег решит отправить свои 0,0001 ВТС Пете (Транзакция 3 в нашей схемке). И тут все придется разделить алгоритм на 2 блока:
Блок 1 "Олег получает 0,0001 ВТС":
- Олег переслал отправителю (назовем его Почечный доктор) свой BTC-адрес. Почечный доктор отправил на него 0,0001 ВТС. При этом, входящая транзакция на кошелек Олега как-бы говорит: "Я, Почечный доктор, использовав свой приватный ключ, заявляю, что 0,0001 ВТС по данной транзакции принадлежат Олегу, при условии, что Олег докажет, что ВТС-кошелек действительно ему принадлежит".
- 0,0001 ВТС на кошельке Олега получат статус UTXO, пока Олег их не засунет в новую транзакцию в адрес Пети и не отправит подтверждаться в сеть (иными словами, пока не отправит в мемпул).
В пункте 1 я не прикалываюсь - именно так работает блокчейн битка. Именно поэтому можно отправить битки на адрес 1svoboduProletariatuVsehSovetov12, но они будут считаться утерянными/соженными, пока кто-то не придумает такой приватный ключ, по которому получится захешировать именно такой адрес BTC-кошелька.
Блок 2 "Олег отправляет 0,0001 ВТС":
- Олег создает транзакцию, в которой указывает сумму 0,0001 ВТС и ссылается на входящую транзакцию, по которой он эти богатства получил. Также он вписывает адрес Пети в блок выходных данных (output).
- Олег создает сценарий под названием ScriptSig, в котором подтверждает выполнение условий Почечного доктора ("Я, Олег, действительно владею приватным ключом от заявленного в прошлой транзакции ВТС-кошелька"). Для выполнения сценария ScriptSig используется сценарий P2PKH, который подтверждает, что Олег действительно владеет соответствующим приватным ключом.
Сценарий P2PKH (или "алгоритм валидации") работает так:
- Олег передает в сценарий (иными словами в обработку программой) свой нехэшированный публичный ключ. Этот ключ хешируется алгоритмом SHA-256, оно же HASH160.
- Сценарий берет хэш публичного ключа Олега из предыдущей входящей транзакции от Почечного доктора (input).
- Сценарий сравнивает два хэша из п.1 и п.2. В итоге у исходящей транзакции от Олег к Пете появляется запись OP_EQUAL, которая бинарна (true/false или "правда"/"ложь"). Если false - то сценарий перестает работать, если true - то появляется вторая запись - OP_VERIFY (по умолчанию она true).
- Олег транслирует в сеть приватный ключ (очень упрощенно напишу, дабы не путать, понятно, что тут речь идет о "подписи" приватным ключом, и там свой отдельный алгоритм, о котором подробно мы поговорим в следующей статье цикла).
- Сценарий сравнивает подпись на основе приватного ключа на соответствие с публичным ключом (п.1), если все совпадает, то появляется запись OP_CHECKSIG (по умолчанию она тоже true). Исходящая транзакция с этого момента считается подписанной или валидированной.
- Исходящая транзакция уходит в сеть и получает статус неподтвержденной. Далее программа проверяет транзакцию на ее соответствие стандартам. Если она им соответствует, то транзакция получает запись IsStandart = true и уходит в облако неподтвержденных транзакций, которое одним словом называется мемпул (mempool).
- Олег и Петя дружно ждут "подтверждения транзакций". Подтверждение транзакций - это уже майнерская работа, и вот так это выглядит:
Если кратко описать схему подтверждения, то:
- Транзы, после P2PKH и IsStandart летят в мемпул и там болтаются.
- Транзы из мемпула разбираются майнерами в свои проекты блоков, по которым они начинаются подбирать Nonce и ExtraNoncе (экстранонс - это ввод случайных данных в поле Coinbase, что также влияет на итоговый hash блока) дабы получить 19 нулей в хеше (или больше/меньше 19, в зависимости от колебаний сложности сети). Приоритет майнеров отдается транзакциям с наибольшей комиссией, коммерция жеж.
- Майнеры находят блоки с нужными нулями в хеше, и включают их в сеть. Другие майнеры ищут блоки уже по их блокам.
- Тот майнер, после которого было найдено наиболее количество блоков утверждается сетью, остальные удаляются, их транзакции возвращаются в мемпул, как неподтвержденные.
- Олег тем временем видит определенное количество подтверждений, и, как правило, после четырех подтверждений уже уверен, что уж точно перевел право владения 0,0001 ВТС в адрес Пети "при условии, что Петя имеет приватный ключ, чтобы управлять этими битками".
Из всего вышеописанного хочу обратить твое внимание на критерий "IsStandart". Напомню, что проверка на соответствие транзакции "стандартам" - это финальная проверка транзакции перед ее отправкой в мемпул. При этом, критерии проверки, а также сами стандарты, задаются группой разработчиков Bitcoin Core. Ты точно уверен, что блокчейн битка децентрализован?
А как ты ответишь, если я добавлю, что один из критериев IsStandart это проверка блока транзакции под названием Версия (version), который, свою очередь, указывает какая версия у сценария P2PKH (и еще пары тройки сценариев, т.к. P2PKH самый распространённый сценарий валидации транзакции, но не единственный - есть еще P2SH и Multisig). То есть, гипотетически может случиться так, что транзакции просто перестанут проходить в мемпул, т.к. ни для одной из них не будет выполняться проверка IsStandart. Think 'bout it.
Подытожу эту часть материала все теми же вопросами: что же, в итоге, является объектом сети ВТС? Биток или транзакция? А горячие кошельки безопасны? А блокчейн битка децентрализован? Проверь свои знания.
Криптография, стоящая за битком.
Если перечислить тезисно все криптографические технологии, на которых работает блокчейн битка, то получается вот такой список:
- Secp256k1 - это функция эллиптической кривой (ECDSA).
- SHA-256 - это алгоритм хеширования по принципу "дерева Меркля".
- Сопутствующие шифрующие алгоритмы: RIPEMD-160, DER (X.690), Base58, HEX.
Может я чего не упомянул в перечне выше (хотя врятли), но все вышеприведенное, так или иначе, основано на главной "библейской заповеди" криптографии - односторонних функциях.
Второй главный парадокс Биткоина.
Второй главный парадокс Биткоина (и, собственно, всех криптовалют) в том, что их невозможно взломать.
Данный парадокс основан на уже неоднократно упомянутых мной односторонних функциях. Так, алгоритм генерации публичного ключа на основании приватного строится на Sep256k1. Sep256k1 это односторонняя функция:
Вывести y от х в этой функции несложно. Решить обратную функцию - восстановить x от y тоже не представляет особой трудности:
Только вот алгоритм создания публичного ключа строится на графическом сложении значений X путем построения касательных к графику эллиптической кривой y^2 = x^3 + 7, а следовательно, восстановление приватного ключа из публичного требует сверхусилий вычислительного характера.
Тем не менее это возможно, только очень ресурсозатратно при текущем уровне вычислительных мощностей.
Теперь, когда ты понимаешь как формируются транзакции, так сказать "изнутри", то должен догадаться, что все биткоины, не входящие в текущий момент в мемпул, являются UTXO (unspent tx outs или непотраченные входящие транзакции). Все UTXO в независимости от публичного ключа или BTC-адреса являются своего рода акциями на предъявителя.
Предположим, что ты можешь восстановить любой приватный ключ из любого публичного. Это будет означать, что ты можешь взять под контроль любую UTXO транзакцию из сети ВТС-блокчейна. А данные по всем этим транзакциям находятся в холодном кошельке. Это значит, что если ты скачаешь и отсинхронизируешь Bitcoin Core у себя на компе, то все UTXO будут храниться у тебя на жестком диске. Остается лишь подобрать к ним ключ.
На момент написания статьи общая капитализация BTC равна 971 млн. долларов, или 18 664 262 BTC. В сети 75,1 млн. транзакций с неизрасходованным output, то есть те самые UTXO - и их все ты потенциально можешь взломать, если найдешь обратное решение алгоритма Sep256k1.
Попытки взлома уже существуют, например уже найдены коллизии в хэш-функции битка. Подбераются, да? Правда указанная коллизия была обнародована, и дыру залатали. Впрочем с хэш функцией SHA-256, разработанной в АНБ США, отдельный разговор.
Тема трапдоров и гипотетического брутфорс-взлома битка будет мной освещена в следующей статье этой цикла.
Выводы.
Я считаю свою задачу на данном этапе выполненной. Теперь ты, как минимум, имеешь достаточное представление об активе, который тебе, раз ты меня читаешь, интересен.
Ты понимаешь, как появляются блоки в сети, что в эти блоки записывается, как появляются ВТС-адреса и так далее.
А главное (первое главное):
- Ты знаешь, что объектом сети битка является транзакция. Сам биткоин - это лишь метрика транзакции, и оторванных от цепочки транзакций битков нет в природе. Сами по себе транзакции - это своего рода акции на предъявителя, и предъявителем станет любой, что получит приватный ключ от ВТС-адреса по соответствующей транзакции. Биткоин это цифровая валюта - миф.
- Ты знаешь, что сеть битка, да и любой криптовалюты не является "невзламываемой" - все строится на вере в односторонние функции. Как только найдется способ их обратного решения - криптомир ждет коллапс. Криптовалюты нельзя подделать/взломать/украсть - миф.
- Ты с некоторой вероятностью задумался в целесообразности использования горячих кошельков для хранения своих криптоактивов. Горячие онлайн-кошельки не могут скопировать себе твой приватный ключ при его генерации - миф.
- Наличие проверки IsStandart недвусмысленно намекает на централизацию блокчейна, ну, или как минимум на возможность влияния на работу блокчейна.
Второе главное:
Теперь ты имеешь достаточную базу знаний, и мы можем еще глубже погрузиться в Криптонарнию - начать разбираться, а так ли нерушимы криптографические алгоритмы, как нам рассказывают? Всегда ли они будут нерушимы? Это будет темой следующей статьи цикла, к работе над которой я приступлю на днях.
Сегодня я ставлю (по различным причинам, большинство которых я еще тебе не рассказал) перед собой цель - излечить HODL головного мозга у некоторых из моих читателей. Криптоактивами можно и нужно спекулировать, но безопасно ли ходлить - вопрос спорный.
Бывай.
Если набрел на это в Интернете, то присоединяйся к каналу Kitoboy 2.0, который о криптовалютах, манипуляторах, расследованиях и неожиданных выводах:
Если ищешь випы, то и у нас такой есть. Торговые сигналы, обсуждения, заработки, постоянная отчетность. Доступен демо-доступ. Подробности тут:
👉 Информация и форма вступления в KTB Premium.
👉Если ты хочешь помочь мне развиваться, то вот сюда ты можешь свои криптоспасибы кидать:
👉 BTC: 1PL5RhQJ72dpCZiBFUpf6GMEEBYCkttoty