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

info

Это вто­рая статья из цик­ла, пос­вящен­ного тех­ничес­ким осно­вам устрой­ства крип­товалют. Пер­вая носит наз­вание «Крип­та с нуля. Раз­бира­емся с алго­рит­мами в осно­ве крип­товалют».

3 янва­ря 2009 года, где‑то око­ло семи вечера по Грин­вичу, на ничем не при­меча­тель­ном компь­юте­ре запус­кает­ся прог­рамма. Через нес­коль­ко минут она генери­рует пер­вый блок дан­ных и записы­вает в него корот­кую фра­зу — заголо­вок из све­жей газеты The Times: «Кан­цлер на гра­ни вто­рого спа­сения бан­ков». Автор прог­раммы — человек, которо­го ник­то никог­да не видел, — под­писыва­ется псев­донимом Сатоси Накамо­то и вско­ре исче­зает из пуб­лично­го прос­транс­тва, оста­вив пос­ле себя тех­нологию, став­шую осно­вой круп­ней­шей крип­товалют­ной эко­сис­темы мира.

Это извес­тная исто­рия, затер­тая до дыр, ее перес­казыва­ют в каж­дой вто­рой статье про крип­товалю­ты. Я вспом­нил о ней не в качес­тве оче­ред­ного экскур­са в прош­лое, а ради одной детали — той самой газет­ной цитаты, вби­той в пер­вый блок, так называ­емый генезис‑блок блок­чей­на. Накамо­то помес­тил ее туда не из литера­тур­ных сооб­ражений — это была под­пись, доказа­тель­ство, что блок соз­дан не рань­ше 3 янва­ря 2009 года, потому что до ука­зан­ной даты это­го номера The Times прос­то не сущес­тво­вало. И одновре­мен­но — манифест: бан­ков­ская сис­тема тре­щит по швам, мы стро­им дру­гую. С этой фра­зы и начал­ся бит­коин.

Точ­нее, не сам бит­коин, а блок­чейн — тех­нология, которую Накамо­то под­робно опи­сал в сво­ей работе «Bitcoin: A Peer-to-Peer Electronic Cash System», опуб­ликован­ной в интерне­те 31 октября 2008 года. Если говорить крат­ко, то блок­чейн — это тех­нологи­чес­кая осно­ва, поверх которой могут быть запуще­ны раз­личные при­ложе­ния, а бит­коин все­го лишь одно из них. Фак­тичес­ки исто­рия тех­нологий сде­лала оче­ред­ной виток: ког­да‑то одним из пер­вых прик­ладных при­ложе­ний, работа­ющих поверх интерне­та, ста­ла элек­трон­ная поч­та, и толь­ко потом к ней под­тянулись бра­узе­ры, фай­лооб­менни­ки и про­чий полез­ный софт. Сей­час на блок­чей­не пос­тро­ено столь­ко все­го, что голова идет кру­гом: от крип­тобирж и NFT до сис­тем голосо­вания, земель­ных кадас­тров и цепочек пос­тавок фар­мацев­тики. Бит­коин прос­то был пер­вым при­ложе­нием, пос­тро­енным на этой тех­нологии.

Ге­незис‑блок зада­ет стар­товую точ­ку блок­чей­на и не ссы­лает­ся на пре­дыду­щий блок, потому что его поп­росту нет в при­роде. Имен­но поэто­му точ­ная дата соз­дания это­го самого пер­вого бло­ка кри­тичес­ки важ­на. Его парамет­ры жес­тко зашиты в исходный код бит­коин‑кли­ента, что­бы каж­дая нода начина­ла про­вер­ку цепоч­ки с одной и той же осно­вы.

 

Как устроен блокчейн

Ес­ли отбро­сить мар­кетин­говую шелуху — а ее вок­руг темы накопи­лось на пару товар­ных вагонов и малень­кую тележ­ку, — блок­чейн устро­ен доволь­но прос­то: это база дан­ных. Не самая быс­трая, не самая удоб­ная, с кучей огра­ниче­ний, но у нее есть одно клю­чевое свой­ство, которо­го нет ни у одной клас­сичес­кой СУБД: записи в ней невоз­можно отре­дак­тировать зад­ним чис­лом. Это матема­тичес­ки невоз­можно, даже если этим зай­мут­ся на досуге АНБ, ЦРУ и пароч­ка пра­витель­ств каких‑нибудь мировых свер­хдер­жав. При­чем реали­зова­но это не с помощью какой‑то древ­ней чер­ной магии, а пос­редс­твом трех дав­но извес­тных инже­нер­ных трю­ков, исполь­зован­ных в пра­виль­ном поряд­ке.

Вто­рая осо­бен­ность вытека­ет из пер­вой: раз ник­то не может под­делать записи, то и доверять одно­му кон­крет­ному хра­ните­лю базы боль­ше не нуж­но. Мож­но раз­дать копии всем жела­ющим, и, если кто‑то попыта­ется жуль­ничать, осталь­ные момен­таль­но это заметят. В блок­чей­не нет глав­ного сер­вера, нет адми­нис­тра­тора с пра­вами root, нет бан­ка, который однажды решит, что твой счет приш­ло вре­мя заб­локиро­вать. Это зву­чит как анар­хист­ская уто­пия, но тех­нология работа­ет — уже мно­го лет под­ряд, без еди­ного серь­езно­го сбоя сети (отдель­ные бир­жи и кошель­ки — это сов­сем дру­гой раз­говор, к самому блок­чей­ну отно­шения не име­ющий).

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

 

Что такое блок и из чего он состоит?

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

С телом, занима­ющим самый боль­шой объ­ем бло­ка, все прос­то: оно содер­жит спи­сок тран­закций. «Аня отпра­вила Диме 0,01 BTC», «Вася отпра­вил Маше 0,3 BTC» — и так далее, сколь­ко вле­зет. В один блок блок­чей­на в сети бит­коин помеща­ется две‑три тысячи тран­закций, иног­да боль­ше. К сло­ву, самая пер­вая поль­зователь­ская тран­закция с бит­коином про­изош­ла 12 янва­ря 2009 года: Сатоси Накамо­то отпра­вил 10 BTC аме­рикан­ско­му прог­раммис­ту и крип­тогра­фу Хэлу Фин­ни, и эта опе­рация была под­твержде­на в бло­ке № 170. Короче, если пред­ста­вить, что блок — это желез­нодорож­ный вагон, довер­ху напол­ненный зер­ном, то зер­но (сос­тавля­ющее основную мас­су и полез­ное содер­жимое вагона) — это как раз записи о тран­закци­ях.

А вот заголо­вок — шту­ка поин­терес­нее. Он малень­кий, все­го 80 байт, но имен­но в нем спря­тана вся механи­ка, на которой работа­ет блок­чейн. В сети бит­коин заголо­вок содер­жит шесть полей:

  • Вер­сия про­токо­ла — тех­ничес­кое поле, содер­жимое которо­го сооб­щает дру­гим узлам сети, по каким пра­вилам обра­баты­вать блок.
  • Хеш пре­дыду­щего бло­ка — а вот это самое важ­ное поле во всей конс­трук­ции. Имен­но оно прев­раща­ет набор раз­рознен­ных бло­ков в цепоч­ку. Каж­дый блок хра­нит в себе «отпе­чаток паль­ца» пре­дыду­щего — 256-бит­ный хеш, вычис­ленный по алго­рит­му SHA-256. Зачем — под­робно раз­берем в сле­дующем раз­деле, пока прос­то запом­ни: это поле и есть самое важ­ное зве­но в цепи.
  • Ко­рень Мер­кла (Merkle root) — это хеш всех тран­закций в теле бло­ка, свер­нутый в одно 256-бит­ное чис­ло. Работа­ет это так: тран­закции раз­бива­ются на пары, от каж­дой пары счи­тает­ся хеш, потом хеши сно­ва раз­бива­ются на пары, сно­ва хеширу­ются — и так до тех пор, пока не оста­нет­ся одно зна­чение. Получа­ется дерево, где корень — единс­твен­ное чис­ло, которое изме­нит­ся, если изме­нить хотя бы один бит хоть в одной тран­закции. Зачем такие слож­ности? Затем, что хра­нить в заголов­ке тысячи тран­закций целиком физичес­ки невоз­можно, а корень Мер­кла поз­воля­ет одним зна­чени­ем «запеча­тать» все тело бло­ка, сде­лав невоз­можным его незамет­ное изме­нение.
  • Вре­мен­ная мет­ка — Unix timestamp, показы­вает, сколь­ко секунд прош­ло с 1 янва­ря 1970 года. У генезис‑бло­ка, того самого, с цитатой из газеты, мет­ка име­ет зна­чение 1231006505 — 3 янва­ря 2009 года, 18:15:05 UTC. Мет­ка нуж­на для поряд­ка и для кор­ректи­ров­ки слож­ности май­нин­га: сеть сле­дит за тем, как быс­тро появ­ляют­ся новые бло­ки, и при необ­ходимос­ти кор­ректи­рует про­цесс.
  • Би­ты слож­ности (difficulty target) — ком­пак­тная запись зна­чения, ниже которо­го дол­жен ока­зать­ся хеш бло­ка, что­бы сеть его при­няла. Чем мень­ше это чис­ло, тем слож­нее най­ти под­ходящий хеш. Имен­но это поле регули­рует ско­рость май­нин­га и под­держи­вает сред­нее вре­мя появ­ления нового бло­ка. Биты слож­ности показы­вают, нас­коль­ко труд­но сей­час най­ти новый блок в сети бит­коин. Сеть нас­тро­ена таким обра­зом, что­бы новый кор­рек­тный блок в цепоч­ке появ­лялся при­мер­но раз в десять минут, над этой задачей тру­дят­ся май­неры. Если в какой‑то момент май­неров ста­новит­ся мно­го и общая вычис­литель­ная мощь сети воз­раста­ет, сеть авто­мати­чес­ки дела­ет задачу труд­нее, если мощ­ности ста­ло мень­ше, задача упро­щает­ся. Биты слож­ности как раз и поз­воля­ют управлять этим про­цес­сом.
  • Нонс (nonce, от number used once) — четырех­бай­товое чис­ло, которое май­нер переби­рает всле­пую, пыта­ясь подоб­рать такое зна­чение, что­бы хеш все­го заголов­ка ока­зал­ся мень­ше целево­го порога слож­ности. Этот про­цесс называ­ют «вычис­литель­ной работой», proof of work: ино­го три­виаль­ного спо­соба най­ти нонс не сущес­тву­ет, толь­ко перебор. Май­нер меня­ет нонс, счи­тает SHA-256 от заголов­ка, смот­рит резуль­тат — и, если он не подошел, меня­ет сно­ва, мил­лиар­ды раз под­ряд, пока не повезет.

Вот, собс­твен­но, и весь блок: тело с тран­закци­ями и заголо­вок с шестью полями.

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

 

Скованные одной цепью

Ког­да май­нер собира­ет новый блок, он вклю­чает в его заголо­вок хеш пре­дыду­щего бло­ка, который добав­ляет­ся в поле prev_block_hash. Всё, связь уста­нов­лена. Блок № 638 201 содер­жит хеш бло­ка № 638 200, тот — хеш бло­ка № 638 199, и так далее вниз, до самого генезис‑бло­ка с газет­ным заголов­ком из The Times. Получа­ется что‑то вро­де бусин на нит­ке — с той раз­ницей, что нит­ка здесь не физичес­кая, а матема­тичес­кая. Каж­дая бусина «пом­нит» зна­чение пре­дыду­щей, при­чем абсо­лют­но точ­но, до пос­ледне­го бита.

А теперь давай на минуточ­ку пред­ста­вим, что кто‑то вдруг захотел под­пра­вить ста­рую тран­закцию. Нап­ример, в бло­ке № 638 100 записа­но, что Вася отпра­вил Пете 2 BTC. Зло­умыш­ленник хочет эту запись сте­реть — сде­лать вид, что перево­да не было, и пот­ратить те же монеты еще раз.

Зло­умыш­ленник откры­вает блок № 638 100 и меня­ет тран­закцию. В тот же момент меня­ется корень Мер­кла — потому что дерево хешей перес­читыва­ется сни­зу вверх и любое изме­нение в любом мес­те бло­ка меня­ет это зна­чение. Изме­нил­ся корень Мер­кла — изме­нил­ся заголо­вок. Изме­нил­ся заголо­вок — изме­нил­ся хеш бло­ка. А этот хеш записан в заголов­ке сле­дующе­го бло­ка № 638 101. Зна­чит, блок № 638 101 теперь содер­жит неп­равиль­ную ссыл­ку: любая нода сети про­верит хеш, и, если он не сой­дет­ся, блок будет отвер­гнут.

Лад­но, дума­ет зло­умыш­ленник. Я перес­читаю и блок № 638 101 тоже, под­став­лю новый хеш, под­беру новый нонс, что­бы блок сно­ва удов­летво­рял порогу слож­ности. Но тог­да изме­нит­ся хеш бло­ка № 638 101 — а он записан в бло­ке № 638 102. Зна­чит, перес­читывать нуж­но и его, и сле­дующий, и сле­дующий за ним — все бло­ки от точ­ки под­делки до кон­ца цепоч­ки.

И вот тут всту­пает в игру эко­номи­ка. На момент написа­ния этой статьи (апрель 2026 года) в цепоч­ке бит­коина содер­жится 945 339 бло­ков. Каж­дый из них был най­ден май­нерами путем перебо­ра нон­сов, и это пот­ребова­ло колос­саль­ной вычис­литель­ной работы — собс­твен­но, в этом и кро­ется суть май­нин­га: он защища­ет сеть от зло­деев, жела­ющих что‑то поменять в блок­чей­не.

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии