Как проверяются блоки?

Я вижу в биткойн-вики есть что-то под названием «скрипт», который компилируется в некоторый байт-код для запуска очень простой виртуальной машиной. Означает ли это, что каждый блок на самом деле представляет собой просто строку/массив байтов, когда он поступает и обрабатывается узлом? поэтому блок в его «истинном» формате будет выглядеть примерно так [0x01, 0x04, 0x0f, 0xa1.... и т. д.?

а затем узел, который получает блок, просто помещает байты в интерпретатор для запуска виртуальной машиной биткойна?

что правильно? блок - это чистый байт-код или JSON? что поймет узел bitcoincore при получении нового блока?

... и вики дает подробное представление о происходящих проверках: en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

Ответы (2)

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

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

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

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

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

Означает ли это, что каждый блок на самом деле представляет собой просто строку/массив байтов, когда он поступает и обрабатывается узлом?

Биткойн-узлы проверяют транзакции, биткойн-майнеры вычисляют блоки в соответствии с моделью Proof-of-Work, определенной в биткойн-протоколе. При этом да, технически необработанные данные блока представляют собой массив шестнадцатеричных байтов. Когда майнеры начинают майнить блок, они хешируют только заголовок блока (первые 80 байт), который включает следующую информацию:

nVersion|hashPrevBlock|hashMerkleRoot|Time|Bits|Nonce

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

В Bitcoin-core вы можете указать сериализацию вторым параметром в getblockкоманде. По умолчанию он будет хорошо отображать данные в формате JSON, хотя на самом деле это длинный шестнадцатеричный вывод.


Пример:

getblock 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 0

Вывод:010000007de867cc8adc5cc8fb6b898ca4462cf9fd66...