Архитектура блокчейна TON

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

Мастерчейн

Главным узлом TON является Мастерчейн, который состоит из множества Воркчейнов, которые в свою очередь разделяются на Шардчейны.

Для обозначения мастерчейна используется ID = -1.

Воркчейны

На данный момент в сети запущен один воркчейн, называемый basechain. В нём происходит основная часть пользовательских транзакций. Транзакции здесь гораздо дешевле и его использует основная часть сервисов.

Первый воркчейн имеет ID = 0

Шардчейны

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

Шардчейн работает как маленький блокчейн, внутри него группы транзакций формируются в блоки, после принятия они добавляются в общую цепочку, потом берутся новые транзакции и так далее.

Шардчейны всегда относятся к конкретному Воркчейну и имеют единое устройство и формат, в зависимости от воркчейна в котором они созданы.

Блоки

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

В TON всё происходит точно также, но с учётом древовидной структуры блокчейна. Как уже было сказано ранее, транзакции всегда происходят в конкретных шардчейнах, либо в мастерчейне. Воркчейны в нашем случае являются просто виртуальными "группировщиками" шардчейнов.

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


За время создания 1 блока в мастерчейне, в шардчейне может быть создано несколько блоков, поэтому в блок мастерчейна попадает только ссылка на последний из них.

Идентификация блоков

Для пример разберём любой блок из мастерчейна.

Например этот: (-1,8000000000000000,18118440)

Мастерчейн обозначается как воркчейн с ID = -1 это первое значение в строке. После неё идёт ShardID, который в случае с мастерчейном равен константе 8000000000000000. Блоки в мастерчейне идут последовательно, и последнее значение это порядковый номер исследуемого блока 18118440.

Помимо прочего, в этот блок включён один из блоков шардчейнов, разберём его таким же образом: (0,8000000000000000,23125864)

Блок создан в первом воркчейне (basechain), где происходит основная часть пользовательских транзакций, для этого воркчейна ID = 0

shardID равен 8000000000000000, так как на момент написания статьи в сети есть только один шардчейн, но в любой момент при росте нагрузки он может разделиться на несколько, как описывалось выше.

И наконец, номер этого блока 23125864 – стоит отметить, что номера блоков в шардчейне и в матерчейне различаются, потому что они работают независимо друг от друга.

Таким образом, мы приходим к стандарту, по которому идентифицируются любые блоки в сети TON.

workchain + shardId + blockNumber

Транзакции

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

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

В Bitcoin, отправка монет с одного адреса на другой – это и есть транзакция, она запишется в блок и после этого навсегда останется высечена в камне. В Ethereum при отправке транзакции на адрес контракта могут произойти различные события, в частности могут вызваться другие контракты и образовываться дочерние транзакции. Совокупность этих событий является одной транзакцией, т.е. происходит в рамках одного события. Результат можно увидеть сразу, монеты либо перешли со счёта А на счёт Б, либо нет.

В блокчейне TON всё устроено немного иначе. Каждый кошелёк в TON является смарт-контрактом и когда вы отправляете транзакцию, по-сути вы посылаете сообщение. Для контракта у него нет отправителя, это сообщение не несет денег, за его обработку заплатит сам контракт. В результате обработки контракт может послать новые сообщения. Транзакцией в данном случае называется совокупность 3х вещей: входное сообщение, список выходных сообщений, изменение стейта контракта.
Когда вы посылается сообщение своему контракту-кошельку пошли денег со своего адреса А на адрес В, после финализации транзакции вы еще не знаете дойдут ли деньги до В.

Транзакцией в данном случае будет (входное сообщение, [сообщение А->В несущее в себе граммы], изменение памяти и баланса контракта А). Когда-нибудь потом сообщение посланное к В тоже обработается. Образуется новая транзакция. Возможно адрес В захочет все вернуть (например он неинициализирован, а сообщение в bounce режиме), тогда В пошлет сообщение обратно на А. И при его обработке образуется опять транзакция.

Таким образом, если в биткоине и эфире транзакция описывает все эффекты от "применения сообщения к блокчейну", то в TON это только начало разговора. И чтобы понять, что вы добились желаемого эффекта нужно не только проанализировать первую транзакцию, но и дождаться когда оборвутся расходящиеся от неё цепочки сообщений.