Краткое наглядное техническое руководство для новичков и не только

Постановка задачи

Сначала немного предыстории…

До появления Биткоина все виды и способы денежных платежей делились на две основных категории:

  1. Наличные платежи, которые производятся напрямую между двумя сторонами. Они удобны, поскольку осуществляются моментально и не требуют взаимного доверия сторон, к тому же исключают задержку оплаты и посредничество третьей стороны. Основной недостаток наличных платежей — необходимость встречи обеих сторон в одном месте в одно и то же время.
  2. Безналичные платежи, которые требуют участия доверенной третьей стороны и производятся с помощью чеков, кредитных или дебетовых карт, банковских переводов или систем вроде PayPal. Для таких платежей по определению требуется посредник, который осуществляет перевод средств между участниками сделки. Главное преимущество посреднического платежа — возможность совершать обмен без встречи сторон, кроме того, плательщику не нужно носить деньги при себе. Главные недостатки — проблема доверия (вам придется довериться посреднику, а он может не выполнить обязательств), дополнительные издержки и время, которое получателю придется ждать для окончательного зачисления средств, прежде чем он сможет ими распоряжаться.

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

Как видим, у обоих видов платежей есть свои ключевые недостатки:

  • операции с наличностью привязаны к месту и времени;
  • безналичные (электронные) платежи нуждаются в посредничестве.

Объединить достоинства обеих категорий платежей и при этом устранить их недостатки фактически означает следующее:

Необходимо создать сеть обмена электронными деньгами между удаленными сторонами, которая будет работать без посредника (доверенного центра).

При этом надо решить следующие задачи:

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

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

Цель этого руководства — объяснить простым и понятным языком, как работает Биткоин и как он решает вышеуказанные задачи.

В основу руководства лег курс «Научи меня Биткоину» (Learn me a bitcoin), который подготовил Greg aka inersha.


Сеть Bitcoin

Что такое сеть Bitcoin?
Сеть Bitcoin или Биткоин-сеть состоит из всех, кто работает с программным обеспечением Bitcoin (более известным как «биткоин-клиент»).

Фактически, Биткоин — это сеть людей (компьютеров), работающих с одной и той же компьютерной программой.

Что делает сеть Bitcoin?
Люди (точнее — биткоин-клиенты) в сети общаются друг с другом. Под «общением» подразумевается передача информации о том, что происходит в других частях сети. Это делается путем отправки друг другу сообщений.

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

Сеть Bitcoin описывается как «одноранговая» или peer-to-peer (p2p) сеть (пиринговая сеть), потому что:

  1. Все связаны друг с другом, так что это действительно сеть.
  2. Все в сети равноправны, т.е. все одного ранга (peerравный, одноранговый).

Кто является участником сети?
Как уже упоминалось, любой, у кого есть активное подключение к Интернету и работает биткоин-клиент.

Действительно, любой может присоединиться к сети Bitcoin. Все что нужно для этого — это подключение к интернету и биткоин-клиент, который является частью программного обеспечения, как и любая другая программа.

И как только вы начнете работать, ваш компьютер будут называть узлом (node) в сети Биткоин.

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

Поздравляю, вы создали полный узел (full node) в сети Биткоин.


Узлы

(компьютеры с запущенной программой биткоин-клиент)

Что такое узел (node)?

Узел (node) — это просто компьютер, на котором запущена программа Bitcoin (биткоин-клиент). Что еще более важно, узел подключен к другим компьютерам (под управлением той же программы) для создания сети Bitcoin. Другими словами, сеть Bitcoin состоит из узлов (node).

Что делает узел?
Узел имеет три назначения:

  1. Следовать правилам.
  2. Делиться информацией.
  3. Сохранять копию подтвержденных транзакций.

Рассмотрим все три задания узла подробнее.

  1. Следовать правилам

Каждый узел (биткоин-клиент) запрограммирован на выполнение набора правил. Следуя этим правилам, узел может проверять транзакции, которые он получает, и ретранслировать их, если с ними всё в порядке. При возникновении каких-либо проблем транзакция не передается далее в сеть Bitcoin.

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

2. Делиться информацией

Основная работа узла заключается в обмене информацией с другими узлами, и квинтэссенцией информации, которую узел передает, являются транзакции.

Есть два типа транзакций, которые передают узлы:

  1. Новые (свежие) транзакции — транзакции, которые недавно поступили в сеть.
  2. Подтвержденные транзакции — транзакции, которые были «подтверждены» и записаны в файл. Они совместно используются в блоках транзакций, а не по отдельности.

Не беспокойтесь сейчас о разнице между этими двумя типами транзакций. Все станет ясно в главах о Майнинге и Блоках.

3. Хранить копию подтвержденных транзакций

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

Каждый узел также хранит копию блокчейна.

Новые транзакции передаются по сети до тех пор, пока они не будут вставлены в цепочку блоков, которая является регистром (ledger) подтвержденных транзакций.

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

Процесс добавления новых транзакций в блокчейн называется Майнинг (Mining).

Следует упомянуть, что каждый узел является автономным.

Имеется ввиду, что когда вы запускаете биткоин-клиент, сеть не «говорит вам, что делать». Вместо этого ваш биткоин-клиент уже знает, что делать, и он сам принимает решения.

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

Даже если бы все остальные узлы были бы отключены, ваш единственный узел поддерживал бы всю Биткоин-сеть.

Нужно ли быть узлом, чтобы пользоваться биткоинами?

Нет! Вы можете отправлять и получать биткоины, не будучи узлом. Вам просто нужно отправить транзакцию в Биткоин-сеть, и всё готово.

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

Например, если вы используете веб-кошелек, он будет передавать ваши транзакции в Биткоин-сеть, не будучи узлом.


Майнинг (Mining)

(процесс добавления блоков в блокчейн)

Что такое майнинг?
Майнинг — это процесс добавления транзакций в блокчейн.

Как это работает?
Каждый узел в Биткоин-сети делится информацией о новых транзакциях. Узлы хранят эти транзакции в своем пуле памяти (memory pool или mempool).

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

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

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

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

Что это за сложная задача?

Эта строка (хэш) представляет образ всех транзакций в пуле памяти.

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

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

В большинстве случаев вы получите результат, который даже не близок к этому:

Но если вы продолжите поиски nonce, вы можете наткнуться на число, которое cработает и вы получите требуемый результат:

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

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

Вы также получите вознаграждение в биткоинах (на момент написания этой статьи — 12,5 BTC) за свои усилия, а также комиссионные за все транзакции, которые вы только что добавили в блокчейн.

«Определенное количество нулей» означает ,что хэш менее определенного заданного числа (target), которое зависит от сложности (difficulty). Она устанавливается сетью и изменяется в зависимости от количества майнеров (точнее — от суммарной майнинговой мощности ) — чем больше людей занимается майнингом, чем выше суммарная мощность их компьютеров, тем больше сложность и чем больше нулей требуется в начале хэша. Это затрудняет поиск необходимого результата (nonce).

Примечание: Это немного упрощенная версия того, как блоки транзакций добавляются в блокчейн. Более подробно описано в главе «Блоки».

Почему необходим майнинг?
Хороший вопрос. Почему бы просто не добавить транзакции из пула памяти в блокчейн?

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

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

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

Однако на самом деле можно сделать другую транзакцию, используя те же биткоины, и отправить эту транзакцию в сеть. Например, вы можете купить пиво за биткоины, а затем быстро попытаться купить кусок пиццы за те же биткоины.

Другими словами, это известное всем мошенничество или проблема «двойных трат».

Некоторые узлы сначала получают транзакцию с пиццей (и игнорируют транзакцию с пивом), тогда как другие сначала получают транзакцию с пивом (и игнорируют транзакцию с пиццей).

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

Так как же сеть решает, какую транзакцию добавить в блокчейн?
Посредством майнинга, разумеется!

Если какой-то узел в сети решает задачу, то все транзакции в его пуле памяти добавляются в блокчейн.

Если узел с транзакцией пиццы успешно добывает блок, то эта транзакция добавляется в блокчейн, а транзакция с пивом удаляется из сети.

Разумеется, это немного необычный способ выбора транзакций, но это именно то решение, которое Биткоин-сеть использует для достижения консенсуса при работе с противоречивой информацией.

С другой стороны, для добавления каждого нового блока транзакций в блокчейн требуется около 10 минут, поэтому вам нужно только подождать 10 минут для подтверждения того, что биткоины «пришли» на новый адрес (и не были отправлены на альтернативный адрес).

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

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

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

Таким образом Биткоин-сеть экономически защищена от манипуляций с транзакциями.


Блокчейн

(общий файл биткоин-транзакций)

Что такое блокчейн?
Блокчейн — это файл (база данных), который содержит список всех когда-либо совершенных транзакций в сети Bitcoin.

Каждый узел в Биткоин-сети делится копией этого файла, и он регулярно обновляется с последними транзакциями.

Почему блокчейн важен?

Блокчейн содержит информацию о том, сколько биткоинов принадлежит каждому участнику сети.

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

Блокчейн — это как журнал или регистр (ledger) .

Регистр (ledger) — это бухгалтерская книга, в которой денежные операции предприятия разносятся в виде дебетов и кредитов.

Почему он называется «блокчейн»?

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

Транзакции добавляются в блоки, и эти блоки объединяются в цепочки.

Кроме того, эти блоки транзакций связаны друг с другом таким образом, что любые изменения, внесенные в один блок, изменят все последующие за ним блоки транзакций.

Цепочка связанных блоков называется по-английски block chain или blockchain (блокчейн).

Группировка транзакций в блоки упрощает совместное использование копии блокчейна. Благодаря имеющейся у нас скорости подключения к Интернету гораздо проще делиться файлом, который обновляется каждые 10 минут, чем файлом, который обновляется несколько раз в секунду.

Цепочка блоков транзакций является функцией безопасности. Это мешает злоумышленнику незаметно подделать блокчейн, внеся изменения в какую-либо записанную транзакцию.

Как совместно используется блокчейн?

Блокчейн совместно используется узлами в Биткоин-сети, точно так же как в сети BitTorrent может быть предоставлен общий доступ к видеофайлам, не имеющим авторских прав.

Совместное использование файлов в пиринговых (P2P) сетях — это отдельная тема, но пока просто знайте, что блокчейн совместно используется как файл BitTorrent в Биткоин-сети.

На рисунке слева показан одноранговый обмен информацией блокчейна в Биткоин-сети. Если в моем блокчейне нет последнего блока транзакций, кто-то из других узлов поделится им со мной. Этот процесс запрограммирован и происходит автоматически.

Где можно получить копию блокчейна?

Вы можете получить собственную копию подлинного верифицированного блокчейна, загрузив оригинальный биткоин-клиент Bitcoin Core.

После установки и запуска клиент подключится к Биткоин-сети и начнет загрузку блокчейна. Это более 220 ГБ (на момент написания этой статьи), так что дайте ему немного времени.

Почему так много? Блокчейн содержит каждую известную биткоин-транзакцию начиная с 3 января 2009 г. (даты запуска Биткоин-сети)), поэтому его объем и составляет 220+ гигабайт. Кроме того, первоначальная загрузка полной версии блокчейна является однократной. После этого все идет гладко — ваш блокчейн обновляется до последних блоков, а их размер составляет в среднем около 1 МБ.

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

Важно! Сохраняя копию блокчейна и делясь ею с другими людьми в сети, вы делаете Биткоин сильнее.

Где хранится файл blockchain на моем компьютере?

Блокчейн хранится в файлах с такими именами: blk00000.dat. Есть также blk00001.dat, blk00002.dat и так далее. Она разбита на несколько файлов потому что это проще, чем работать с одним огромным файлом.

Расположение этих файлов на вашем компьютере зависит от используемой операционной системы:

  • Linux
    /home/[username]/.bitcoin/blocks/
  • Windows
    C:\Users\[username]\AppData\Roaming\Bitcoin\
  • Mac
    ~/Library/Application Support/Bitcoin/

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

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


Блоки (Blocks)

(сгруппированные биткоин-транзакции)

Что такое блок?
Блок — это набор транзакций, которые были добавлены в блокчейн.

Как формируются блоки?
Блоки формируются майнерами.

Когда вы делаете биткоин-транзакцию, она не сразу добавляется в блокчейн. Сначала она хранится в пуле транзакций (или пуле памяти — memory pool или mempool).


Задача майнеров — собрать транзакции из пула транзакций в «блок-кандидат» (candidate block) и попытаться добавить этот блок-кандидат в блокчейн.


Заголовок блока
Каждый блок-кандидат помимо набора отобранных транзакций имеет также заголовок блока (block header), который в основном представляет собой набор метаданных о блоке.

Майнеры используют эти метаданные при попытке добавить блок в блокчейн.

Метаданные — это данные, описывающие другие данные, и служащие информативной меткой.

Метаданные заголовка блока состоят из нескольких полей (меток).

Поля заголовка блока
Детали этих полей сейчас не столь важны, но, в любом случае, мы кратко рассмотрим их:

Version (Версия)
Описывает структуру данных внутри блока. Это используется для того, чтобы компьютеры могли правильно считывать содержимое каждого блока.

Last block (последний блок)
Идентификационный номер предыдущего блока. Мы пытаемся получить один из них для текущего блока-кандидата.

Merkle Root (Корень дерева Меркла)
Суммарный хэш (hash) всех транзакций в блоке, полученный на основе дерева Меркла (Merkle tree). Все транзакции внутри блока хэшируются вместе, образуя один итоговый хэш. Пожалуй, из всех полей метаданных это наиболее значимая часть заголовка блока.

Time (Время)
Текущее время. Временная метка формирования блока.

Target (Цель)
Значение, с которым работают майнеры, чтобы попытаться добавить блок-кандидат в блокчейн. Оно устанавливается Биткоин-сетью и будет пояснено ниже.

Как блоки добавляются в блокчейн?
Чтобы добавить блок-кандидат в блокчейн, майнеры хэшируют данные в заголовке блока и надеются, что полученный результат окажется меньше определенного значения target.

Значение target рассчитывается исходя из сложности (difficulty), которая является значением, установленным Биткоин-сетью, чтобы регулировать, насколько сложно добавить блок транзакций в блокчейн.


Чем больше сложность (difficulty), тем меньше значение target и тем сложнее найти хэш блока, который находится ниже этого значения.

Пока это несколько сложно для понимания, но со временем все прояснится. Читайте дальше!

Difficulty — это значение, устанавливаемое Биткоин-сетью, и предназначенное для регулирования скорости добавления блоков в блокчейн. Этот параметр корректируется каждые 2016 блоков, чтобы попытаться создать интервал в среднем 10 минут между добавлением очередного блока.

Nonce
Некоторое уточнение. На самом деле хэшируется не заголовок блока (block header), а block header с некоторым добавленным дополнительным числом, называемым nonce.

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


Nonce — это произвольное число, используемое только один раз в криптографическом сообщении.

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


Примечание: Хэш-значения кроме цифр содержат буквы (от A до F), но на самом деле это шестнадцатиричные числа, с которыми работают компьютеры.

Как только майнер найдет такой nonce, который удовлетворяет условиям (хэш блока меньше значения target), блок-кандидат считается «добытым», и он (со всеми входящими в него транзакциями) добавляется в блокчейн.

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


Difficulty (сложность майнинга)

(механизм регулирования времени, необходимого для «добычи» блока)

Что такое difficulty?

Difficulty — это число, которое регулирует время, необходимое майнерам для добавления новых блоков транзакций в блокчейн.

Значение difficulty (сложности) обновляется примерно каждые 2 недели (точнее — после каждых 2016 блоков) таким образом, чтобы обеспечить добавление нового блока в блокчейн в среднем за 10 минут.


Почему сложность майнинега (difficulty) важна?

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

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

Когда меняется сложность майнинга (difficulty)?
Значение difficulty настраивается через каждые 2016 блоков (примерно каждые 2 недели).

На этом интервале каждый узел принимает ожидаемое время для этих блоков 2016, которые будут добыты (2016 x 10 минут), и делит его на фактическое время, которое потребовалось:

ожидаемое время/ фактическое время
20160 минут / фактическое время

Если бы майнеры могли добавлять каждый блок быстрее, чем ожидалось, скажем, тратя 9 минут на блок, мы бы получили такое число:

20160 / (2016 х 9)
20160 / 18144 = 1,11

Теперь каждый майнер использует это число для настройки сложности для «добычи» следующих 2016 блоков:

difficulty x 1,11 = new difficulty

  • Если полученное число больше 1 (т. е. блоки были добыты быстрее, чем ожидалось), сложность майнинга (difficulty) возрастает.
  • Если число меньше 1 (т. е. блоки добывались медленнее, чем ожидалось) сложность майнинга уменьшается.

И это всё! Каждый майнер в Биткоин-сети теперь работает с этим новым значением difficulty для «добычи» следующих 2016 блоков.

Важно! Сложность майнинга (difficulty) может корректироваться не более чем в 4 раза (то есть увеличиваться не более чем в 4 или уменьшаться не менее чем в 0,25 раза). Это сделано для предотвращения резких изменений значения difficulty.


Как сложность (difficulty) изменяет время между блоками?

Начнем с простого примера…
Допустим, имеется диапазон чисел от 1 до 100:

Необходимо случайным образом генерировать случайное число от 1 до 100 каждую минуту. И наша цель — получить число, которое будет меньше некоторого заданного (target) числа.

Допустим, заданное число или target равно 50:

Поскольку мы можем генерировать число от 1 до 100 один раз в минуту, то это займет у нас в среднем 2 минуты — вероятность получить случайное число, которое меньше 50 равна 0,5 или 50%.

Но это слишком просто. Теперь уменьшим target до 20. Это означает, что вероятность сгенерировать выигрышное число (менее 20) составит только 1/5 или 20%. Поэтому мы получим результат в среднем за 5 минут. Разумеется, это не будет каждый раз длиться 5 минут, потому что может повезти и первое же сгенерированное число будет менее 20. Но в долгосрочной перспективе это будут 5-минутные интервалы.

Таким образом, чем меньше значение target, тем сложнее получить выигрышное число.

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

Введение сложности (difficulty)

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

Это новое число и есть difficulty (сложность), и оно используется как простой способ менять значение target.


Для расчета значения target используется простая формула:

target = targetmax / difficulty

Кроме того, можно использовать это значение difficulty, чтобы установить target на любой желаемый уровень:

Чем больше difficulty, тем меньше target.

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

Как это используется в Биткоине
Сложность (difficulty) в Биткоине работает точно так же — она используется для установки значения target, и майнеры, хэшируя свои блоки-кандидаты, перебирают числа (nonce), в надежде, что получат такое значения хэша, которое будет ниже этого target:

И поскольку майнеры могут генерировать тысячи чисел (хеш-значений) в секунду, Биткоин использует колоссальный диапазон для значений target:

В Биткоине диапазон чисел просто в гораздо большем масштабе.

В связи с тем, что сейчас тысячи майнеров пытаются найти выигрышные номера, чтобы гарантировать, что выигрышный номер будет найден каждые 10 минут (а не каждые несколько секунд), диапазон успешных чисел в конечном итоге будет совсем маленьким:

Несмотря на то, что это значение target выглядит очень большим, попасть в диапазон искомых чисел всё ещё чрезвычайно трудно. Это как лотерея.

Введение шестнадцатеричных чисел
Как видим, значения target очень велики, но компьютеры предпочитают работать с ними в шестнадцатеричном формате.

Вот почему значения хеш-функции для блоков выглядят так: 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

Это шестнадцатеричный код.

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

Вот почему вы обычно видите хэш и target как группы цифр и букв — они в шестнадцатеричном, а не в привычном нам десятичном виде.

Примечание:
Текущее установленное Биткоин-сетью значение difficulty можно узнать здесь: http://chainquery.com/bitcoin-api/getdifficulty


Транзакции

Что такое биткоин-транзакция?

Биткоин-транзакция — это набор данных.

Эти данные содержат информацию об отправляемой сумме (кол-ве биткоинов), учетной записи (биткоин-адреса), с которой она отправляется, и учетной записи, на которую она отправляется.

Это основная информация, поэтому ее можно легко представить в одной строке данных:

И когда кто-то совершает транзакцию, он просто отправляет эти данные транзакции в Биткоин-сеть.


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

И это все, что происходит с биткоин-транзакцией — отправка данных в Биткоин-сеть и ожидание её добавления в блокчейн.

Как работает биткоин-транзакция?

Биткоин-адрес похож на номер банковского счета, который содержит биткоины.

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

Вместо этого адрес отслеживает каждую отдельную транзакцию, которую он получил.

Поэтому, когда вы хотите отправить биткоины кому-то другому, вы складываете целиком суммы, которые вы уже получили, и используете их для отправки новой суммы на новый адрес:

И когда кто-то еще хочет отправить биткоины другому человеку, он также будет использовать все суммы, которые получил таким же образом:

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

Вот как работают транзакции.

Но есть нюанс!

«Что, если сумма пакета биткоинов составляет больше, чем надо отправить?»

Хороший вопрос! В этом случае (что часто бывает) вы просто добавляете еще один выход (output) в транзакцию и отправляете разницу (сдачу) обратно себе.

Пакет из 5 биткоинов (3+2) разделяется в транзакции на собственно платеж (4 биткоина) и сдачу (1 биткоин)

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

Кстати, аналогично происходит при оплате наличными. Например, у вас есть банкноты в $50 и $100, а цена товара, который вы хотите купить равна $120. В этом случае вы отдаете продавцу $150 ($50+$100) и получаете вместе с товаром сдачу в размере $30.

Резюме:

  1. Имеется биткоин-адрес. Биткоины поступают на этот адрес с других адресов партиями, называемыми выходами (outputs).
  2. Биткоин-транзакция — это процесс использования этих выходов для создания новых выходов (и отправки их на новые адреса).
  3. Всё это может быть представлено одной строкой данных.

Что мешает кому-то другому тратить мои биткоины?
Или другими словами…

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

Ответ: Потому что каждый из выходов транзакции имеет блокировку…

И если кто-то создаст транзакцию без предварительного разблокирования этих выходов, узлы в Биткоин-сети будут отклонять эту транзакцию.

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

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

После разблокировки всех выходов, которые надо использовать, транзакция будет принята и распространена узлами в Биткоин-сети.

Вот так работают транзакции в Биткоин-сети.


Выходы (Outputs)

Система транзакций биткоинов включает в себя отправку и получение пакетов биткоинов, называемых выходами (outputs).

Это так, но единственный способ действительно понять, как это работает, это посмотреть на несколько примеров транзакций.

Пример 1: Простая транзакция

Давайте начнем эту историю транзакций с рождения новой партии биткоинов…

Допустим, вы сами майните биткоины. Каким-то чудом вам удалось добыть блок транзакций и заработать себе новую партию из 12,5 биткоинов.

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

Итак, это текущее состояние вашего биткоин-адреса:

Разумеется, теперь вы можете что-то купить, используя ваши биткоины. Например, вы хотите купить товар на сумму 1 биткоин.

Как в Биткоин-сети будет выглядеть эта транзакция? Просто вычесть из ваших 12,5 биткоинов 1 биткоин и отправить его на адрес продавца товара нельзя.

Такая транзакция недопустима.

Вместо этого мы должны отправить весь пакет из 12,5 биткоинов в одной транзакции.

Но, чтобы потратить на покупку 1 биткоин из наших 12,5 биткоинов, необходимо разделить пакет и отправить его в два адреса:

  1. Один биткоин отправить на адрес продавца в уплату за товар.
  2. Оставшиеся 11,5 биткоина вернуть на свой адрес (получить сдачу).
Вновь созданные пакеты называются выходами (output).

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

После проведения этой транзакции балансы биткоин-адресов будут выглядеть так (предполагается, что на адресе получателя первоначально не было биткоинов):

Первоначальный пакет из 12,5 биткоинов перераспределился между двумя адресами — 11,5 на адресе 1 и 1 биткоин на адресе 2. Ничего не пропало и ничего не добавилось. Суммарный баланс остался прежним — 12,5 биткоинов.

Резюме
Система транзакций биткоинов работает так:

  1. Берется имеющийся выход (пакет биткоинов).
  2. На базе него создаются новые выходы (пакеты).
  3. Эти новые выходы отправляются на разные адреса.

Разумеется, все эти операции реализуются программно. Пользователю не надо самому всё высчитывать и распределять. Он лишь указывает адрес получателя и сумму в биткоинах, которую хочет перевести на этот адрес. Программа-кошелек проверяет, достаточно ли на биткоин-адресе отправителя средств и формирует транзакцию исходя из алгоритма, описанного выше.

Напомним, что это был простой пример транзакции. Теперь перейдем к более сложному случаю…


Пример 2: Использование выходов (outputs) в качестве входов (inputs)

Мы будем использовать слово «выход» (output) вместо «пакет».

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

Суммарно на этом адресе находится 7,5 биткоина (1+3+0,5+2+1).

Владелец адреса хочет купить товар, который стоит 4,2 биткоина. Но, как мы видим, в наличии нет выхода с такой или большей суммой. Как же поступить?

Из имеющихся выходов мы выбираем несколько, которые в сумме дадут более 4,2 биткоина, а затем из них сформируем транзакцию, используя выходы (outputs), как входы (inputs):

Построение транзакции с использованием входов (inputs) и выходов (outputs).

Поэтому, когда создается подобная транзакция, выходы (outputs), которые суммируются для расходования, называются транзакционными «входами» (inputs).

Когда вы используете выход в транзакции, он временно называется «вход» (input).

В показанном выше примере четыре выхода первого адреса (отправителя) собрали в сумме 4,5 биткоина (1+0,5+2+1) и стали входами транзакции в результате которой полученная сумма (4,5) перераспределилась между двумя адресами — на второй адрес (получателя) поступил платеж в размере 4,2 биткоина, а на адрес отправителя вернулся неизрасходованный остаток («сдача») в размере 0,3 биткоина.

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

Эти «непотраченные» выходы можно использовать для расходов в будущем, поэтому они называются UTXO (unspent transaction outputs) — неизрасходованные (непотраченные) выходы транзакций.

Общее количество биткоинов на биткоин-адресе — это сумма всех UTXO этого адреса.

Примечание:
Мы выбрали выходы [1] + [0.5] + [2] + [1] в качестве входов для транзакции. Но если общая сумма больше, чем сумма, которую мы хотим отправить, то можно использовать любую комбинацию выходов (ну, входов), которая возможна:

[1] + [3] + [0.5]             = 4.5
[3] + [2] = 5
[1] + [3] + [0.5] + [2] + [1] = 7

Пример 3: Комиссия за транзакцию

Упс! Мы не включили плату за транзакцию ни в одну из последних двух транзакций.

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

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

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

Но где же выход для комиссии за транзакцию? А его и нет. Но посмотрите на размер выходов.

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

Вместо 0,3 биткоина на адрес отправителя (адрес 1) возвращается только 0,2999 биткоина. А остаток транзакции — 0,0001 биткоина — это и есть транзакционные сборы (комиссия) майнера.

Наглядно это можно представить так:

Как вы заметили, комиссию за транзакцию оплачивает отправитель.


Блокировка выходов (Output Locks)

(механизмы блокировки для пакетов биткоинов)

Что такое блокировка выхода?
Блокировка выхода — это набор требований, предъявляемых к выходу. Эти требования должны быть выполнены, чтобы иметь возможность использовать выход в транзакции.

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

Именно эти блокировки мешают нам тратить выходы друг друга в транзакции, так как каждый выход защищен блокировкой.

Откуда берутся блокировки выходов?
Как мы уже знаем, транзакция — это процесс получения существующих выходных данных и создания из них новых:

Транзакция.

И именно во время создания этих новых выходов мы «навешиваем» на каждый из них «замок», т.е. блокируем:

Создание новых выходов и установление на каждый из них блокировки.

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

Все это хранится в данных транзакции.

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

Как вы, возможно, заметили, вы никогда не «отправляете» собственно биткоины в транзакции.

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

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

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

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

Каждый новый блок транзакций добавляет множество новых выходов в блокчейн.

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


to be continued

Эта статья обновляется! Ждите в ближайшее время объяснения механизма блокировки и разблокирования выходов. А также раздел о ключах (приватных и публичных) и адресах.


Если вам понравился этот пост, вы можете:
нажать на «ладошки» (под статьей или слева);
подписаться на обновления Bitcoin Review;
поделиться ссылкой в Twitter и/или Facebook;
оставить комментарий;
поддержать автора финансово.

Спасибо за внимание!


Bitcoin Review

Всё, что вы хотели знать о Биткоине, но стеснялись спросить…

Сергей Базанов

Written by

Автор книги «Биткоин для всех»

Bitcoin Review

Всё, что вы хотели знать о Биткоине, но стеснялись спросить…

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade