Введение в технологию Блокчейн
Шрифт:
Здесь есть еще одна сложность: что, если Боб никогда не подпишет последнюю транзакцию?
Он может просто сказать: «Я хочу, чтобы монеты находились на депонировании навсегда», и в этом случае, монеты не будут расходоваться, но при этом Алиса может потерять сдачу или остаток монет, который она расчитывала получить обратно.
Существует очень умный способ избежать этой проблемы, используя функцию, о которой мы упоминали ранее.
Чтобы
Поэтому после того, как Алиса подпишет, но прежде чем она транслирует первую транзакцию MULTISIG, которая вложит ее средства в депонирование, она получит эту возвратную транзакцию от Боба и будет удерживать ее.
Это гарантирует, что, если до определенного момента времени Боб не подпишет ни одной из небольших транзакций, которые отправила Алиса, Алиса может опубликовать эту транзакцию, которая вернет все деньги непосредственно ей.
Что это значит, что транзакция заблокирована до определенного момента времени?
Вспомните, когда мы смотрели на метаданные в транзакциях биткойнов, там был параметр lock_time, который мы оставили без рассмотрения.
Он работает следующим образом.
Если вы укажете любое значение, отличное от нуля, представляющее время блокировки, это значение сообщает майнерам не публиковать транзакцию до указанного момента времени, или пока определенное количество блоков не будет внесено в блокчейн.
Locktime представляет собой четырехзначное целое число без знака, которое можно обработать двумя способами:
Если это число меньше 500 миллионов, Locktime интерпретируется как высота блока, то есть количество блоков в блокчейне от нулевого до последнего блока.
Транзакция может быть добавлена в любой блок с этой высотой или выше.
Если значение больше или равно 500 миллионам, Locktime интерпретируется с использованием формата времени эпохи Unix (количество секунд, прошедших с 1970-01-01T00: 00 UTC, в настоящее время превышает 1.395 миллиардов).
Транзакция может быть добавлена в любой блок по прошествии этого времени.
Также есть много других примеров использования биткойн скриптов, которые были предложены.
Одно из применений – это многопользовательские лотереи с очень сложным многоступенчатым протоколом с множеством транзакций, имеющих депонирование и разные времена блокировки.
Существуют также некоторые протоколы, в которых используется язык скриптов, позволяющие разным людям объединять свои монеты и смешивать их, так что сложнее проследить, кому принадлежит монеты. Мы рассмотрим это подробнее позже.
Общий термин для протоколов, подобных тем, которые мы рассмотрели, является умные контракты или смарт контракты.
Это контракты, которые традиционно обеспечиваются с помощью законов или арбитражных судов, но для реализации которых у нас есть определенная степень технического обеспечения в Биткойне.
Это замечательная функция Bitcoin, где мы можем использовать скрипты, майнеров и проверку транзакций для реализации,
например, протокола депонирования или протокола микроплатежей, не требующих централизованного управления.Также существует много типов смарт контрактов, которые люди хотели бы использовать, но которые на сегодняшний день не поддерживаются языком скриптов Bitcoin.
Или, по крайней мере, никто не придумал способ их реализации.
Блоки Bitcoin
До сих пор мы рассматривали, как создаются и потребляются отдельные транзакции.
Но, как мы видели раньше, транзакции сгруппированы в блоки.
Зачем это нужно?
В принципе, это ничто иное как оптимизация.
Если бы майнеры должны были бы приходить к консенсусу по каждой транзакции отдельно, скорость, с которой новые транзакции принимались бы системой, была бы намного ниже.
Кроме того, хеш-цепочка блоков намного короче, чем хеш-цепочка транзакций, поскольку в каждый блок может быть помещено большое количество транзакций.
Это позволяет повысить эффективность проверки структуры цепочки блоков.
Каждый блок должен включать одну или несколько транзакций.
Первая из этих транзакций должна быть транзакцией coinbase или транзакцией генерации, которая собирает и тратит вознаграждение за блок, состоящее из вознаграждения за сам блок и любых транзакционных сборов, оплаченных транзакциями, включенными в этот блок.
Цепочка блоков – это умная комбинация двух разных структур данных на основе хэшей.
Первая структура – это хеш-цепочка блоков.
Каждый блок имеет заголовок блока с хэш-указателем на транзакции и хэш-указателем на предыдущий блок в последовательности.
Вторая структура данных – это дерево всех транзакций для каждого блока, которые включены в этот блок.
Все транзакции, включая транзакцию coinbase, кодируются в блоке в бинарном формате.
Этот формат хэшируется для создания идентификатора транзакции.
Из этих идентификаторов строится дерево merkle путем спаривания каждого идентификатора с одним другим идентификатором и последующим их объединением.
Если существует нечетное число идентификаторов, идентификатор без партнера хешируется с копией самого себя.
Затем результирующие хеши объединяются по парам и хэшируются вместе.
Любой хеш без партнера хэшируется сам с собой.
Процесс повторяется до тех пор, пока не останется только один хеш, или корень merkle.
Таким образом, это дерево Merkle позволяет нам иметь дайджест всех транзакций в блоке эффективным образом.
Как мы видели ранее, чтобы доказать, что транзакция включена в конкретный блок, мы можем предоставить путь через дерево, длина которого – это логарифм числа транзакций в блоке.
Для повторения, блок состоит из заголовка с данными, за которыми следует список транзакций, расположенных в древовидной структуре.
Заголовок блока содержит информацию, связанную с майнингом.