Я вижу в биткойн-вики есть что-то под названием «скрипт», который компилируется в некоторый байт-код для запуска очень простой виртуальной машиной. Означает ли это, что каждый блок на самом деле представляет собой просто строку/массив байтов, когда он поступает и обрабатывается узлом? поэтому блок в его «истинном» формате будет выглядеть примерно так [0x01, 0x04, 0x0f, 0xa1.... и т. д.?
а затем узел, который получает блок, просто помещает байты в интерпретатор для запуска виртуальной машиной биткойна?
что правильно? блок - это чистый байт-код или JSON? что поймет узел bitcoincore при получении нового блока?
Блок состоит из заголовка, а затем ряда сериализованных транзакций. Заголовок блока не содержит сценария, он содержит только такие данные, как корень меркла транзакций в блоке (поэтому заголовок фиксирует список транзакций), одноразовый номер, номер версии и т. д. Обратите внимание, что блок не кодируется с помощью 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...
пебвиндкрафт