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

Выпуск дополнительных валют

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @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), выглядит следующим образом:

  1. Существует 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 не изменен, в следующем блоке минтер получит сожженную сумму на свой баланс.

Обзор процесса выпуска

Как выпустить свою собственную дополнительную валюту:

  1. Убедитесь, что в вашей сети есть контракт Minter и установлены ConfigParam 2, ConfigParam 6.
  2. Создайте контракт Currency Admin, который контролирует, как выпускается дополнительная валюта.
  3. Создайте предложение валидаторам добавить адрес вашего контракта Currency Admin в ExtraCurrencyAuthorizationConfig для некоторого currency_id и получите его принятие.
  4. Отправьте запрос mint из контракта Currency Admin в Minter. Подождите, пока Minter отправит обратно дополнительную валюту.