Выпус к дополнительных валют
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Дополнительные валюты
Согласно Whitepaper блокчейна TON 3.1.6, блокчейн TON позволяет своим пользователям определять произвольные криптовалюты или токены, помимо Toncoin, при соблюдении некоторых условий. Такие дополнительные криптовалюты идентифицируются 32-битными _currency*ids*. Список определенных дополнительных криптовалют является частью конфигурации блокче йна,
хранящейся в мастерчейне. Каждое внутреннее сообщение, а также баланс аккаунта содержит специальное поле для ExtraCurrencyCollection
(набор дополнительных валют, прикрепленных к сообщению или хранящихся на балансе):
extra_currencies$_ dict:(HashmapE 32 (VarUInteger 32)) = ExtraCurrencyCollection;
currencies$_ grams:Grams other:ExtraCurrencyCollection = CurrencyCollection;
Конфигурация дополнительной валюты
Словарь, или, точнее, ExtraCurrencyCollection
всех валют, которые должны быть выпущены, хранится в ConfigParam7
:
_ to_mint:ExtraCurrencyCollection = ConfigParam 7;
ConfigParam 6
содержит данные, связанные с выпуском:
_ mint_new_price:Grams mint_add_price:Grams = ConfigParam 6;
ConfigParam2
содержит адрес Минтера.
Низкоуровневый процесс выпуска
В каждом блоке коллатор сравнивает старый глобальный баланс (глобальный баланс всех валют в конце предыдущего блока) с ConfigParam7
. Если какая-либо сумма для любой валюты в ConfigParam7
меньше, чем она есть в глобальном балансе - конфигурация недействительна. Если какая-либо сумма для любой валюты в ConfigParam7
больше, чем она есть в глобальном балансе, будет создано сообщение о выпуске.
Это сообщение о выпуске имеет источник -1:00000000000000000000000000000000000000000000000000000000000000000000000
и _Минтер_ из ConfigParam2
в качестве назначения и содержит излишки дополнительных валют в ConfigParam7
по сравнению со старым глобальным балансом.
Проблема здесь в том, что сообщение о выпуске содержит только дополнительные валюты и не содержит монет TON. Это означает, что даже если Минтер установлен как фундаментальный смарт-контракт (представленный в ConfigParam31
), сообщение о чеканке вызовет прерванную транзакцию: compute_ph:(tr_phase_compute_skipped reason:cskip_no_gas)
.
Высокоуровневый процесс выпуска
Один из возможных высокоуровневых процессов выпуска, реализованный здесь (проверьте файлы *.tolk
), выглядит следующим образом:
- Существует
ExtraCurrencyAuthorizationConfig
: это конфигурация, которая содержит информацию о том, какие контракты (адреса) имеют право запрашивать у минтера выпуск новых дополнительных валют. Эта конфигурация имеет следующую схему:
_ (Hashmap 32 std_addr) = ExtraCurrencyAuthorizationConfig;
где key - currency_id
, а std_addr
- админгистратор этой валюты (может быть в любом воркчейне).
2. Минтер принимает запросы на выпуск от администратора, пересылает запрос на выпуск в Config, Config обновляет ConfigParam 7
и отвечает в Минтер. Поскольку дополнительные валюты будут выпускаться в Минтере только на следующем блоке мастерчейна, вывод дополнительных валют в администраторе должен быть отложен. Это делается через смарт-контракт Эхо, а не в мастерчейне. Когда ответ от Эхо приходит в Минтер, он отправляет дополнительные валюты администратору. Итак, схема выглядит следующим образом: Администратор -> Минтер -> Конфигурация -> Минтер -> Эхо (в другом воркчейне ждать следующего блока мастерчейна) -> Минтер -> Администратор
.
Пример такого процесса: выпуск 200 000 000 единиц currency_id=100
Каждый выпуск новой дополнительной валюты или увеличение предложения существующей требует изменения ConfigParam 7, тем самым изменяя конфигурацию и создавая новый ключевой блок. Слишком частое создание ключевого блока замедляет шарды (каждый ключевой блок приводит к ротации групп валидаторов) и синхронизации лайтклиента. Таким образом, контракты типа swap.tolk не должны использоваться в производстве. Вместо этого необходимо использовать схемы с резервами, которые минимизируют события выпуска.
Отправка дополнительной валюты в blackhole приводит к следующему результату: сумма дополнительной валюты расходуется, но, поскольку ConfigParam 7 не изменен, в следующем блоке минтер получит сожженную сумму на свой баланс.
Обзор процесса выпуска
Как выпустить свою собственную дополнительную валюту:
- Убедитесь, что в вашей сети есть контракт Minter и установлены ConfigParam 2, ConfigParam 6.
- Создайте контракт Currency Admin, который контролирует, как выпускается дополнительна я валюта.
- Создайте предложение валидаторам добавить адрес вашего контракта Currency Admin в ExtraCurrencyAuthorizationConfig для некоторого
currency_id
и получите его принятие. - Отправьте запрос
mint
из контракта Currency Admin в Minter. Подождите, пока Minter отправит обратно дополнительную валюту.