Меню

Как на самом деле работают Биткоин транзакции?

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

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

Разработчики узнают, как их Биткоин клиент осуществляет транзакции в сети (и что происходит, когда они получены).

Простые пользователи найдут ответ на вопрос: “Какие запускаются процессы, когда вы отправляете биткоины другу?”.

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

Биткоин транзакции и их роль в общей картине

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

Это простое, но точное описание может озадачить: так что же на самом деле представляет из себя транзакция?

⦁ Как понимание процесса переводов поможет стать хорошим разработчиком блокчейнов?

⦁ Каким образом транзакции позволяют переводить биткоины другому человеку?

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

Но начнём с азов и разберёмся с главным видом транзакции под названием pay-to-PK-hash. Сейчас этим типом переводов пользуются 99% владельцев биткоинов.

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

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

Каждая Биткоин транзакция состоит из “входов” (inputs) и “выходов” (outputs). Мы отобразили её структуру на изображении:


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

Когда вы отправляете подруге деньги, то в качестве адреса используется её “выход”. А ваши “входы” будут доказательством, что у отправителя есть достаточная сумма для осуществления операции. У вас может быть несколько “входов”, сумма которых и является балансом аккаунта. В этом простом случае в транзакции участвует только один вход и один вывод.

Подробно о биткоин транзакциях

Давайте разберёмся в механизме реальной Биткоин транзакции. Для наглядности взгляните ещё раз на изображение.

Если мы изучим типичную транзакцию в “разрезе”, то увидим, что она состоит из 3-х больших частей: заголовка, вход(ов) и выход(ов). Давайте кратко рассмотрим компоненты, входящие в эти секции, так как они будут важны для понимания процесса. Отметим, что все эти поля присущи так называемым row-транзакциям. Они осуществляются между одноранговыми узлами при создании перевода.

Заголовок

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

ver: номер версии, которая используется для верификации блока.

vin_sz: число входов транзакции. Vout_sz отображает число выходов.

lock_time: определяет самое раннее время, когда блок может быть добавлен в цепь. Это либо высота блока, либо метка unix-времени.

Вход

хэш предыдущего выхода: указывает на предыдущий неосуществленный выход транзакции (UTXO). По сути, это ваши деньги, которые вы собираетесь потратить на эту транзакцию.

n: индекс в списке выходов предыдущей транзакции. Показывает актуальный номер текущего выхода.

scriptSig: скрипт отправки, который подтверждает, что у создателя транзакции есть права пересылать деньги.

Выход

значение (value): количество потраченных сатоши (1 BTC = 100,000,000 Satoshi).

scriptPubKey: второй из двух скриптов, осуществляющих транзакцию. Нужен для определения хэша публичного ключа получателя.

Верификация транзакции

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

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

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

⦁ Нет UTXO, отправленных чаще, чем один раз за транзакцию. Обратите внимание на различия с первым пунктом.

⦁ Все значения выхода транзакции неотрицательны.

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

Базовая pay-to-PK-hash транзакция

Биткоин имеет свой собственный скриптовый язык. Он достаточно мощный, чтобы позволить разработчикам создавать сложные и настраиваемые виды транзакций. Существует около пяти стандартных видов переводов, которые поддерживаются классическими биткоин клиентами. Но есть и другие клиенты, которые работают с иными видами транзакций за определенную плату. Здесь мы просто рассмотрим механизм pay-to-PK-hash.

Для любой транзакции, чтобы она считалась действительной, пара скриптов scriptSig/scriptPubKey должна показать значение “true”. При отправлении транзакции включается scriptSig. Он собирает информацию от scriptPubKey и при его выполнении подтверждает выход транзакции. Оба скрипта находятся в одной и той же ячейке.

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

Во время выполнения операции вы увидите, что константы при встрече помещаются в стек. Система добавляет или удаляет элементы из стека по мере их обработки. Например, OP_HASH160 возьмёт верхний элемент из стека, и сделает это дважды, сначала с SHA-256, а затем с RIPEMD-160. Когда все элементы в нашем скрипте будут оценены, появится значение true при удачной операции или false в случае нахождения ошибок.

В целом, pay-to-PK-hash — довольно простой тип транзакции. Он гарантирует, что только пользователь с соответствующей парой открытого/закрытого ключей может получить и потратить биткоины. Когда все критерии из предыдущего абзаца выполнены, транзакция считается успешной и помещается в блок.

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

Оставить комментарий

ТОП 3 криптобиржи