Хотите ли вы стать разработчиком блокчейн-приложений или просто интересуетесь, что происходит во время отправки биткоинов другу — вам нужно разбираться в процессе создания и осуществления транзакций. Почему?
Потому что переводы — это основная операция, являющаяся вершиной того фундамента, на котором построен блокчейн. Транзакции объединяют технологии криптографии, структур данных и скриптов. Эти составляющие достаточно просты, чтобы не перегружать процесс транзакции, но они гибкие и позволяют программистам настраивать систему под себя. Сегодня мы расскажем об этих механизмах подробнее.
Разработчики узнают, как их Биткоин клиент осуществляет транзакции в сети (и что происходит, когда они получены).
Простые пользователи найдут ответ на вопрос: “Какие запускаются процессы, когда вы отправляете биткоины другу?”.
Эта статья предполагает наличие у читателя базовых знаний об асимметричной криптографии, хэшировании и 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 и более человек смогут участвовать в переводах и как можно реализовать длительные типы транзакций.
Над статьями работает команда авторов, переводчиков и редактор. На сайте команда Privatefinance.biz публикует информационные статьи, обзоры, рейтинги, гайды о торговле на финансовых рынках и инвестировании, рекомендации по выбору брокера и инструментов инвестирования, актуальные новости из мира финансов.
Почта для связи с нами: [email protected]