Перейти к основному содержимому

Расположение блоков

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

к сведению

Чтобы максимально полно понять эту страницу, настоятельно рекомендуется ознакомиться с языком TL-B.

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

Блоки в блокчейне TON обладают довольно сложной структурой из-за общей сложности системы. На этой странице описывается структура и схема этих блоков.

Блок

Исходная схема TL-B блока выглядит следующим образом:

block#11ef55aa global_id:int32
info:^BlockInfo value_flow:^ValueFlow
state_update:^(MERKLE_UPDATE ShardState)
extra:^BlockExtra = Block;

Давайте подробнее рассмотрим каждое поле.

global_id:int32

Идентификатор сети, в которой создан этот блок. -239 для основной сети и -3 для тестовой сети.

info:^BlockInfo

Это поле содержит информацию о блоке, такую ​​как его версия, порядковые номера, идентификаторы и другие флаги.

block_info#9bc7a987 version:uint32
not_master:(## 1)
after_merge:(## 1) before_split:(## 1)
after_split:(## 1)
want_split:Bool want_merge:Bool
key_block:Bool vert_seqno_incr:(## 1)
flags:(## 8) { flags <= 1 }
seq_no:# vert_seq_no:# { vert_seq_no >= vert_seqno_incr }
{ prev_seq_no:# } { ~prev_seq_no + 1 = seq_no }
shard:ShardIdent gen_utime:uint32
start_lt:uint64 end_lt:uint64
gen_validator_list_hash_short:uint32
gen_catchain_seqno:uint32
min_ref_mc_seqno:uint32
prev_key_block_seqno:uint32
gen_software:flags . 0?GlobalVersion
master_ref:not_master?^BlkMasterInfo
prev_ref:^(BlkPrevInfo after_merge)
prev_vert_ref:vert_seqno_incr?^(BlkPrevInfo 0)
= BlockInfo;
ПолеТипОписание
versionuint32Версия структуры блока.
not_master(## 1)Флаг, указывающий, является ли этот блок блоком мастерчейна.
after_merge(## 1)Флаг, указывающий, был ли этот блок создан сразу после слияния двух шардчейнов, поэтому у него два родительских блока
before_split(## 1)Флаг, указывающий, был ли этот блок создан сразу перед разделением его шардчейна
after_split(## 1)Флаг, указывающий, был ли этот блок создан сразу после разделения его шардчейна
want_splitBoolФлаг, указывающий, требуется ли разделение шардчейна.
want_mergeBoolФлаг, указывающий, требуется ли слияние шардчейна.
key_blockBoolФлаг, указывающий, является ли этот блок ключевым блоком.
vert_seqno_incr(## 1)Увеличение вертикального порядкового номера.
флаги(## 8)Дополнительные флаги для блока.
seq_no#Порядковый номер, связанный с блоком.
vert_seq_no#Вертикальный порядковый номер, связанный с блоком.
shardShardIdentИдентификатор шарда, к которому принадлежит этот блок.
gen_utimeuint32Время генерации блока.
start_ltuint64Начальное логическое время, связанное с блоком.
end_ltuint64Конечное логическое время, связанное с блоком.
gen_validator_list_hash_shortuint32Короткий хэш, связанный со списком валидаторов на момент генерации этого блока.
gen_catchain_seqnouint32Catchain порядковый номер, связанный с этим блоком.
min_ref_mc_seqnouint32Минимальный порядковый номер указанного блока мастерчейна.
prev_key_block_seqnouint32Порядковый номер предыдущего ключевого блока.
gen_softwareGlobalVersionВерсия программного обеспечения, сгенерировавшего блок. Представлено только в том случае, если первый бит version установлен в 1.
master_refBlkMasterInfoСсылка на главный блок, если блок не является главным. Сохраняется в ссылочном блоке.
prev_refBlkPrevInfo after_mergeСсылка на предыдущий блок. Сохраняется в ссылочном блоке.
prev_vert_refBlkPrevInfo 0Ссылка на предыдущий блок в вертикальной последовательности, если он существует. Сохраняется в ссылочном блоке.

value_flow:^ValueFlow

В этом поле отображается поток валюты внутри блока, включая собранные комиссии и другие транзакции с валютой.

value_flow#b8e48dfb ^[ from_prev_blk:CurrencyCollection
to_next_blk:CurrencyCollection
imported:CurrencyCollection
exported:CurrencyCollection ]
fees_collected:CurrencyCollection
^[
fees_imported:CurrencyCollection
recovered:CurrencyCollection
created:CurrencyCollection
minted:CurrencyCollection
] = ValueFlow;
ПолеТипОписание
from_prev_blkCurrencyCollectionПредставляет поток валют из предыдущего блока.
to_next_blkCurrencyCollectionПредставляет поток валют в следующий блок.
importedCurrencyCollectionПредставляет собой поток валют, импортируемых в блок.
exportedCurrencyCollectionПредставляет поток валют, экспортированных из блока.
fees_collectedCurrencyCollectionОбщая сумма сборов, собранных в блоке.
fees_importedCurrencyCollectionСумма сборов, импортированных в блок. Ненулевое значение только в мастерчейне.
recoveredCurrencyCollectionСумма валют, восстановленных в блоке. Ненулевое значение только в мастерчейне.
createdCurrencyCollectionСумма новых валют, созданных в блоке. Ненулевое значение только в мастерчейне.
mintedCurrencyCollectionСумма валют, отчеканенных в блоке. Ненулевое значение только в мастерчейне.

state_update:^(MERKLE_UPDATE ShardState)

Это поле представляет собой обновление состояния шарда.

!merkle_update#02 {X:Type} old_hash:bits256 new_hash:bits256
old:^X new:^X = MERKLE_UPDATE X;
ПолеТипОписание
old_hashbits256Старый хэш состояния шарда.
new_hashbits256Новый хэш состояния шарда.
oldShardStateСтарое состояние шарда. Сохранено в ссылке.
newShardStateНовое состояние шарда. Сохранено в ссылке.

ShardState

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

_ ShardStateUnsplit = ShardState;
split_state#5f327da5 left:^ShardStateUnsplit right:^ShardStateUnsplit = ShardState;

ShardState Unsplitted

shard_state#9023afe2 global_id:int32
shard_id:ShardIdent
seq_no:uint32 vert_seq_no:#
gen_utime:uint32 gen_lt:uint64
min_ref_mc_seqno:uint32
out_msg_queue_info:^OutMsgQueueInfo
before_split:(## 1)
accounts:^ShardAccounts
^[ overload_history:uint64 underload_history:uint64
total_balance:CurrencyCollection
total_validator_fees:CurrencyCollection
libraries:(HashmapE 256 LibDescr)
master_ref:(Maybe BlkMasterInfo) ]
custom:(Maybe ^McStateExtra)
= ShardStateUnsplit;
ПолеТипОбязательноеОписание
global_idint32ДаИдентификатор сети, к которой принадлежит этот шард. -239 для mainnet и -3 для testnet.
shard_idShardIdentДаИдентификатор шарда.
seq_nouint32ДаПоследний порядковый номер, связанный с этим шардом.
vert_seq_no#ДаПоследний вертикальный порядковый номер, связанный с этим шардом.
gen_utimeuint32ДаВремя генерации, связанное с созданием шарда.
gen_ltuint64ДаЛогическое время, связанное с созданием шарда.
min_ref_mc_seqnouint32ДаПорядковый номер последнего упомянутого блока мастерчейна.
out_msg_queue_infoOutMsgQueueInfoДаИнформация об очереди исходящих сообщений этого шарда. Хранится в ссылке.
before_split## 1ДаФлаг, указывающий, будет ли разделение в следующем блоке этого шарда.
accountsShardAccountsДаСостояние учетных записей в шарде. Хранится в ссылке.
overload_historyuint64ДаИстория событий перегрузки для шарда. Используется для балансировки нагрузки посредством шардинга.
underload_historyuint64ДаИстория событий недогрузки для шарда. Используется для балансировки нагрузки посредством шардинга.
total_balanceCurrencyCollectionДаОбщий баланс для шарда.
total_validator_feesCurrencyCollectionДаОбщая сумма сборов валидатора для шарда.
librariesHashmapE 256 LibDescrДаХэш-карта описаний библиотек в этом шарде. В настоящее время непустая только в мастерчейне.
master_refBlkMasterInfoНетСсылка на информацию о главном блоке.
customMcStateExtraНетДополнительные пользовательские данные для состояния шарда. Это поле присутствует только в мастерчейне и содержит все данные, специфичные для мастерчейна. Хранится в ссылке.

ShardState Splitted

ПолеТипОписание
leftShardStateUnsplitСостояние левого разделенного шарда. Сохранено в ссылке.
rightShardStateUnsplitСостояние правого разделенного шарда. Сохранено в ссылке.

extra:^BlockExtra

Это поле содержит дополнительную информацию о блоке.

block_extra in_msg_descr:^InMsgDescr
out_msg_descr:^OutMsgDescr
account_blocks:^ShardAccountBlocks
rand_seed:bits256
created_by:bits256
custom:(Maybe ^McBlockExtra) = BlockExtra;
ПолеТипОбязательноеОписание
in_msg_descrInMsgDescrДаДескриптор входящих сообщений в блоке. Хранится в ссылке.
out_msg_descrOutMsgDescrДаДескриптор исходящих сообщений в блоке. Хранится в ссылке.
account_blocksShardAccountBlocksДаКоллекция всех транзакций, обработанных в блоке, вместе со всеми обновлениями состояний учетных записей, назначенных шарду. Хранится в ссылке.
rand_seedbits256ДаСлучайное начальное число для блока.
created_bybits256ДаСущность (обычно открытый ключ валидатора), которая создала блок.
customMcBlockExtraНетЭто поле присутствует только в мастерчейне и содержит все данные, специфичные для мастерчейна. Пользовательские дополнительные данные для блока. Хранится в ссылке.

McBlockExtra

Это поле содержит дополнительную информацию о блоке мастерчейн.

masterchain_block_extra#cca5
key_block:(## 1)
shard_hashes:ShardHashes
shard_fees:ShardFees
^[ prev_blk_signatures:(HashmapE 16 CryptoSignaturePair)
recover_create_msg:(Maybe ^InMsg)
mint_msg:(Maybe ^InMsg) ]
config:key_block?ConfigParams
= McBlockExtra;
ПолеТипОбязательноеОписание
key_block## 1ДаФлаг, указывающий, является ли блок ключевым.
shard_hashesShardHashesДаХеши последних блоков соответствующих шардчейнов.
shard_feesShardFeesДаОбщая сумма сборов, собранных со всех шардов в этом блоке.
prev_blk_signaturesHashmapE 16 CryptoSignaturePairДаПодписи предыдущих блоков.
recover_create_msgInMsgНетСообщение, относящееся к восстановлению дополнительных валют, если таковые имеются. Хранится в ссылке.
mint_msgInMsgНетСообщение, относящееся к чеканке дополнительных валют, если таковые имеются. Хранится в ссылке.
configConfigParamsНетФактические параметры конфигурации для этого блока. Это поле присутствует только в том случае, если задано key_block.

См. также

  • Оригинальное описание разметки блока из ​​технического документа