биткойн-протокол: кодировка транзакций

Я пишу программу (на голанге) для майнинга биткойнов. Предположим, у меня есть эта фиктивная транзакция , как я могу ее закодировать, чтобы ее можно было использовать в блоке, который я пытаюсь добыть?

Кроме того, предположим, что у меня есть заголовок блока, как показано ниже:

// двоичные данные заголовка, закодированные как шестнадцатеричная строка:

000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba01000030cd0594ebccfe15b205125165cc3b66986ed5b2a311cd8805000000000000000037022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb5827f476357a09b0518ae5ae1c1

// исходные данные заголовка, которые были закодированы для построения приведенного выше заголовка:

Версия : 01000030

предыдущий_блок : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd880500000000000000000

Корень Меркла : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Отметка времени : 7f476357

биты : a09b0518

Одноразовый номер: ae5ae1c1

Block header : 01000030cd0594ebccfe15b205125165cc3b66986ed5b2a311cd8805000000000000000037022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb5827f476357a09b0518ae5ae1c1

вычисленный_хэш : 000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba

Как я могу добавить нашу фиктивную транзакцию в данный заголовок (предположим, что в заголовке уже есть корень Меркла)? Что, если я хочу добавить несколько транзакций, таких как данные фиктивной транзакции, в заголовок нашего блока?

Ответы (1)

Февраль 2018: Это очень общий вопрос старого запроса, я все равно отвечу на него, может быть, кто-то будет искать эту информацию, как это делал я :-)

Суть в том, что транзакция не является частью заголовка блока. Блок начинается с размера блока в 4 байта, заголовка блока в 80 байт и счетчика транзакций (var_int, 1-9 байт). Затем следуют все транзакции в блоке. Заголовок блока начинается с поля версии размером 4 байта, за которым следует хэш предыдущего блока (32 байта) и дерево Меркла (32 байта). Далее следуют три поля по 4 байта каждое: сложность, отметка времени и одноразовый номер.

В вашем примере блок должен быть составлен следующим образом:

Размер блока : 00000264 (612 байт)

Версия : 01000030

предыдущий_блок : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd880500000000000000000

Корень Меркла : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Отметка времени : 7f476357

биты : a09b0518

Одноразовый номер: ae5ae1c1

счетчик транзакций : 2

transaction : 010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Без первого поля это длина 612 байт, которую необходимо преобразовать в 4 байта, которые помещаются в начало блока. Таким образом, полный блок будет:

<block size>

01000030

cd0594ebccfe15b205125165cc3b66986ed5b2a311cd880500000000000000000

<merkle tree>

7f476357

а09б0518

ae5ae1c1

2

<coinbase ... >

010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Затем нужно пересчитать дерево Меркла и дважды заштриховать. Длину нужно вычислить и поставить в самом начале, а "coinbase tx" отсутствует (расчет средств!).

Подробности структуры можно найти здесь, на этих двух справочных страницах: https://bitcoin.org/en/developer-guide#block-chain-overview https://bitcoin.org/en/developer-reference#block- цепь