Перейти к основному контенту

Блокчейн — ETH.BUILD

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

Date published: 14 января 2021 г.

Руководство от Остина Гриффита, демонстрирующее, как работает майнинг в блокчейне с использованием инструмента визуального программирования ETH.BUILD. Остин рассматривает консенсус доказательства выполнения работы (PoW), связывание блоков в цепь, сложность майнинга, вознаграждения за блок и неизменяемость цепи.

Эта стенограмма является доступной копией оригинальной стенограммы видео (opens in a new tab), опубликованной Остином Гриффитом. Она была слегка отредактирована для удобства чтения.

Проблема координации (0:00)

Доброе утро, счастливой пятницы с галстуком-бабочкой! Этот выпуск ETH.BUILD посвящен блокчейну — действительно крутой штуке. Мы в этой клоунской лодке, надели наш галстук-бабочку с Биткоином. Поехали.

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

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

Блоки и нонс (1:04)

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

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

Здесь мы выполняем некоторую работу — у нас есть случайный набор транзакций, и мы меняем нонс до тех пор, пока хеш не будет начинаться с нуля. Если вы смотрели дополнительное задание о византийских генералах, мы выбрали этот ведущий ноль как произвольный объем работы для доказательства. Таким образом, нонс просто перебирает каждое число — 1, 2, 3, 4 — и когда мы получаем ведущий ноль, мы говорим: это валидный блок.

Доказательство выполнения работы (PoW) в действии (3:00)

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

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

Связывание блоков в цепь (3:56)

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

Мы добавляем последние транзакции из пула транзакций и работаем над поиском нонса. Блок номер 2 добыт — нам понадобился нонс, равный 10, чтобы сделать эти транзакции валидными. Затем мы делаем то же самое: подключаем старый блок, берем новый, добавляем последние транзакции и снова работаем над ним. После достаточного количества попыток мы нашли нонс для блока 3. Блок 4 — тот же процесс, и мы продолжаем двигаться вперед.

Сложность майнинга (5:02)

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

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

Майнер (6:46)

Давайте посмотрим, что такое майнер. В задаче византийских генералов генералу, который хотел «атаковать на рассвете», нужны были солдаты. То, что происходит внутри каждого солдата, — это именно то, что мы делаем здесь с нашим майнером: мы берем сообщение и нонс и пропускаем их через хеш-функцию так быстро, как только можем, пытаясь получить эти ведущие нули. Ведущие нули — это некая произвольная вещь, о которой мы все договорились: это достаточный объем работы, чтобы доказать, что вы солдат или что вы можете вести войну.

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

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

Двойные траты и распространение в сети (10:00)

Теперь мы поговорили о проблеме двойных трат и даже о проблеме распространения в сети. Когда у нас есть реестр и распределенная сеть, и кто-то отправляет транзакцию, она доходит до разных людей в разное время. Следовательно, в сети могут быть 2 майнера, которые одновременно добывают блок, и в них содержатся разные транзакции.

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

Несколько майнеров и консенсус (12:27)

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

Итак, Мэллори нашла блок первой! Отлично. Что происходит дальше — поскольку мы находимся в распределенной сети, Майк может еще даже не знать о блоке Мэллори. Он может все еще работать над своей собственной версией. И вот Майк тоже нашел блок. Таким образом, у нас есть 2 валидных пути.

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

Coinbase и вознаграждения за блок (15:33)

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

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

Вознаграждения за блок и стимулы (16:52)

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

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

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

Запросы к блокчейну (18:30)

Мы можем обращаться к любой самой длинной цепи. Майк еще не дошел до 7, поэтому мы видим, что высота здесь все еще 6. И мы можем делать такие вещи, как запрашивать балансы людей. Итак, мы нажимаем на баланс — что мы получаем? 524. Значит, у Хайди было 524 или любой другой нативный токен для этой цепи. Мы можем видеть ее нонс, мы можем делать все, что могли делать с реестром, но теперь мы складываем блоки, и эти блоки содержат транзакции.

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

Неизменяемость цепи (19:51)

По мере добычи блоков они становятся все более и более безопасными. Позвольте мне показать, что я имею в виду. Итак, Майк добыл блок, Мэллори была здесь, проводила демонстрацию и не смогла добыть блок. Так что теперь цепь Майка будет самой длинной, и она распространится по сети. Все увидят ее и скажут: хорошо, в этой цепи 7 блоков, все они валидны — это та цепь, за которой мы будем следовать. Вы можете получить хард-форки, спорные форки, где правила, по которым мы играем, изменятся, и разные группы людей захотят следовать разным цепям. Крутая штука.

Ладно, наконец, если мы вернемся к блоку 3 и что-то изменим — изменим любую мелкую деталь — я зайду сюда. Здесь есть какая-то транзакция Фрэнку. Допустим, вместо Фрэнка мы меняем ее на Ив. Теперь смотрите, что произойдет, когда я нажму «ОК»: посмотрите на это. Я изменил крошечную часть блока 3, и внезапно вся цепь разваливается. Она больше не валидна. Если бы я транслировал это по сети, люди бы просто подняли меня на смех.

Вы не можете ничего изменить после того, как блок добыт, если только вы не вернетесь назад и не передобудете все по мере изменения. Мне, по сути, пришлось бы снова подключить майнера сюда и попытаться получить достаточно мощности, чтобы догнать Майка аж здесь с 7 блоками. Это было бы очень, очень сложно. Чем глубже находится блок, тем сложнее его изменить. Тот факт, что в этом блоке 3 Карлос отправил 84 Бобу — Боб может быть вполне уверен, зная, что на глубине нескольких блоков эти деньги точно там. Нет никаких шансов, что здесь произойдет какой-то спорный форк — я в безопасности. Это то, что мы называем финальностью.

Итоги (22:00)

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

Что ж, счастливой пятницы с галстуком-бабочкой! Это был блокчейн на ETH.BUILD. Я сохраню это и выложу туда, чтобы вы могли просто нажать «загрузить» и получить цепь для экспериментов. Счастливой пятницы!

Была ли эта страница полезной?