Изменение параметров
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Цель этого документа — предоставить базовое объяснение параметров конфигурации блокчейна TON и пошаговые инструкции по изменению этих параметров по консенсусу большинства валидаторов.
Мы предполагаем, что читатель уже знаком с Fift и Lite Client, как описано в статье "Полный узел" (низкоуровневая) и статье "Валидатор" (низкоуровневая) в разделах, где описывается голосование валидаторов за предложения по конфигурации.
1. Параметры конфигурации
Параметры конфигурации — это определенные значения, которые влияют на поведение валидаторов и/или фундаментальных смарт-контрактов блокчейна TON. Текущие значения всех параметров конфигурации хранятся как особая часть состояния мастерчейна и извлекаются из текущего состояния мастерчейна при необходимости. Поэтому имеет смысл говорить о значениях параметров конфигурации относительно определенного блока мастерчейна. Каждый блок шардчейна содержит ссылку на последний известный блок мастерчейна; значения из соответствующего состояния мастерчейна считаются активными для этого блока шардчейна и используются во время его генерации и проверки. Для блоков мастерчейна состояние предыдущего блока мастерчейна используется для извлечения активных параметров конфигурации. Поэтому, даже если кто-то попытается изменить некоторые параметры конфигурации внутри блока мастерчейна, изменения станут активными только для следующего блока мастерчейна.
Каждый параметр конфигурации идентифицируется подписанным 32-битным целочисленным индексом, называемым индексом параметра конфигурации или просто индексом. Значением параметра конфигурации всегда является ячейка. Некоторые параметры конфигурации могут отсутствовать; тогда иногда предполагается, что значение этого параметра равно Null
. Также существует список обязательных параметров конфигурации, которые должны присутствовать всегда; этот список хранится в параметре конфигурации #10
.
Все параметры конфигурации объединены в словарь конфигурации - хэш-карту с подписанными 32-битными ключами (индексами параметров конфигурации) и значениями, состоящими ровно из одной ссылки на ячейку. Другими словами, словарь конфигурации - это значение типа TL-B (HashmapE 32 ^Cell
). Фактически, коллекция всех параметров конфигурации хранится в состоянии мастерчейна как значение типа TL-B ConfigParams
:
_ config_addr:bits256 config:^(Hashmap 32 ^Cell) = ConfigParams;
Мы видим, что, помимо словаря конфигурации, ConfigParams
содержит config_addr
- 256-битный адрес смарт-контракта конфигурации в мастерчейне. Более подробная информация о смарт-контракте конфигурации будет предоставлена позже.
Словарь конфигурации, содержащий активные значения всех параметров конфигурации, доступен через специальный регистр TVM c7
для всех смарт-контрактов, когда их код выполняется в транзакции. Точнее, когда выполняется смарт-контракт, c7
инициализируется кортежем, единственным элементом которого является кортеж с несколькими "контекстными" значениями, полезными для выполнения смарт-контракта, такими как текущее в ремя в Unix (как указано в заголовке блока). Десятая запись этого кортежа (т.е. запись с нулевым индексом 9) содержит ячейку, представляющую словарь конфигурации. Следовательно, к нему можно получить доступ с помощью команд TVM PUSH c7; FIRST; INDEX 9
или эквивалентной команды CONFIGROOT
. Фактически, специальные инструкции TVM CONFIGPARAM
и CONFIGOPTPARAM
объединяют предыдущие действия с поиском по словарю, возвращая любой параметр конфигурации по его индексу. Мы обращаемся к документации TVM для получения более подробной информации об этих инструкциях. Здесь важно то, что все параметры конфигурации легко доступны из всех смарт-контрактов (мастерчейн или шардчейн), и смарт-контракты могут проверять их и использовать для выполнения определенных проверок. Например, смарт-контракт может извлекать цены на хранение данных воркчейна из параметра конфигурации, чтобы вычислить цену за хранение части предоставленных пользователем данных.
Значения параметров конфигурации не являются произвольными. Фактически, если индекс параметра конфигурации i
неотрицателен, то значение этого параметра должно быть допустимым значением типа TL-B (ConfigParam i
). Это ограничение вводится валидаторами, которые не будут принимать изменения параметров конфигурации с неотрицательными индексами, если только они не являются допустимыми значениями соответствующего типа TL-B.
Следовательно, структура таких параметров определяется в исходном файле crypto/block/block.tlb
, где (ConfigParam i
) определяется для разных значений i
. Например,
_ config_addr:bits256 = ConfigParam 0;
_ elector_addr:bits256 = ConfigParam 1;
_ dns_root_addr:bits256 = ConfigParam 4; // root TON DNS resolver
capabilities#c4 version:uint32 capabilities:uint64 = GlobalVersion;
_ GlobalVersion = ConfigParam 8; // all zero if absent