Разбираемся с стейблкойном на TON или как ваши средства могут заблокировать
19 апреля на конференции Token2049 после выступления Павла Дурова было объявлено о появлении стейблкойна от Tether в сети TON — USDt. Так как это централизованный стейблкойн эмитент подобного токена должен иметь контроль над средствами пользователей для соответствия требований регулятора, например, блокировать средства пользователя. В данной небольшой статье я расскажу как устроены токены на TON и какие возможности есть у эмитента стейблкойна.
Если вы уже знакомы с блокчейном TON и концепцией работы жеттонов, можете сразу переходить к абзацу Блокировка ваших средств, где рассматриваются механики стейблкойна, так как начнем мы в этой статье с азов.
Как устроены смарт-контракты в сети TON
Блокчейн TON асинхронный, смарт-контракты передают данные друг другу сообщениями. Контракты пишут на языке TACT и FUNC, логика написанная на этих языках вполне понятна без детального изучения, этим мы воспользуемся при обзоре контрактов стейблкойна. Но если же вы хотите разобраться глубже здесь есть бесплатные опенсорсные уроки.
Смарт-контракты на TON не предполагают хранения внутри себя больших словарей, вместо этого предполагается создавать мастер контракт, который может «воссоздавать»(адрес представляет собой хэш из начальной информации смарт-контракта и его кода, что делает возможным подобную механику) внутри себя адреса связанных контрактов и таким образом отправлять им сообщения, меня информацию в их хранилищах.
Хэш из данных и кода позволяет получить адрес контракта
Такой механизм называется шардированием смарт-контрактов. Не переживайте, если это не очень понятно, ниже на примерах мы рассмотрим как это работает. Сейчас просто зафиксируйте, что мы почти всегда в TON имеем дело с группой смарт-контрактов передающих информацию друг от друга.
Механизм шардирования позволяет бизнес логике на смарт-контрактах быть масштабируемой, но это усложняет проектирование смарт-контрактов. Это стоит учесть если вы планируете, например, перенести логику какого-то EVM совместимого децентрализованного приложения в TON.
Для каждого смарт-контракта, есть зарезервированные методы, для внутренних и внешних сообщений. Обычно внутри подобных методов описывается логика, что должен сделать смарт-контракт, в зависимости от полезной нагрузки сообщения. Выглядит это примерно вот так:
если что это код простейшего кошелька на TON
Как и в других сетях в TON есть стандарты смарт-контрактов. Стандарт описывает необходимую сигнатуру методов смарт-контракта и обязательную логику. Стандарты позволяют децентрализованным приложениям, например, кошелькам отображать информацию, понимать, например, где контракт NFT, а где контракт токена.
Стейблкойн, это взаимозаменяемый токен привязанный к цене токена, поэтому прежде чем двигаться дальше, посмотрим на стандарт взаимозаменяемого токена в сети TON — Жеттон.
Жеттоны или как хранить данные без словаря
Жеттонами в сети TON называют взаимозаменяемые токены. Токен — это единица учета некоторого цифрового актива в некоторой блокчейн сети. Важно отметить, что под токеном обычно не подразумевают криптовалюту, а подразумевают запись, распределенную в блокчейне, которой управляют с помощью смарт-контрактов. В смарт-контракте записаны значения остатков на счетах держателей токенов (баланс некого адреса владельца), также смарт-контракт предоставляет возможность перевода токенов с одного счёта на другой.
Соответственно возникает техническая проблема как хранить балансы токенов разных адресов и эффективно обновлять эти балансы. Именно здесь нам поможет шардирование.
Мы разобьем логику хранения на несколько контрактов, для каждого владельца токена, будем выпущен отдельный контракт кошелек (именно кошелек этого токена, не кошелек для Toncoin), в котором будет храниться информация о балансе только этого кошелька , а также будет мастер контракт, который будет хранить информацию о самом токене, например, его название, символ, общее предложение и прочее.
Жеттон = 1 мастер контракт и n контрактов кошельков
Таким образом, если наш токен будет принадлежать 1 000 000 разных пользователей, будет задеплоен ровно 1 000 001 контракт. И различными сообщениями, можно выполнять те или иные функции.
Разберем простую передачу токенов. Итак, чтобы передать токены из кошелька один в кошелек два, нам надо будет отправить сообщение с флагом transfer в наш кошелек токенов, который в свою очередь, получив такой флаг, отправит средства в кошелек токенов 2 и тут интересный момент, так сообщения используют Toncoin как плату за сообщения и выполнение смарт-контрактов (как газ в EVM сетях), то в конце токен кошелек 2 вернет лишнее обратно на Toncoin кошелек 1.
упрощенная схема
Заметьте, что смарт-контракт мастер вообще не участвует в передаче токенов между кошельками. Но если бы мы хотели не передать токены, а например, просто сжечь, то нам пришлось бы отправлять отдельное сообщение в мастер контракт, ведь при сжигании мы изменим общее предложение токена.
Конечно, это немного упрощенные схемы, задача которых дать представление о архитектуре смарт-контрактов на TON. Если вы хотите углубиться в то, как работают токены стандарта Жетон у меня есть полноценный разбор стандарта здесь.
B еще небольшой нюанс, чаще всего именно мастер контракт деплоит контракты кошельки.
Блокировка ваших средств в стейблкойне
Как и у обычного жеттона у смарт-контракта стейблкойна есть мастер контракт и контракт кошелек. И первое, что отличает обычный жеттон от стейблкойна это хранилище. Обычный жеттон хранит баланс, адрес владельца, адрес мастер контракта и код кошелька (вместе с хранилищем контракта код позволяет получить код данного кошелька жеттона). Из jetton-wallet.fc (это код кошелька на языке FunC):
get_data ().begin_parsу () достает данные из регистра
А вот стейблкойн в дополнение к этой информации хранит еще Cтатус, и именно эта переменная позволяет блокировать ваши средства.
сообщение от админа поменяет флаг в вашем кошельке и все
Прежде чем расписать как это работает, сделаю небольшое уточнение для внимательных, если вы сравните хранилища смарт-контрактов, вы не увидите в стейблкойне ячейки с кодом, связано это с тем, что за время между созданием стандарта жеттона и жетона стейблкойна, были обновления виртуальной машины TVM и на данный момент можно не передавать ячейку с кодом, а просто получить текущий код смарт-контракта через примитив MYCODE:
Примитивы делают код чище и упрощают разработку
В предложенном стандарте переменная статус, если упростить логику с битами, может принимать три значения:
0 — unlocked, вы можете спокойно пользоваться своими средствами
1 — владелец кошелька не может отправлять стейблкойн
2 — владелец кошелька не может получать стейблкойн
Изменять данный статус, можно только с мастер контракта, такие условия в функции, которая обрабатывает внутренние сообщения:
Работает это довольно просто, владелец мастер-контракта отправляет сообщение с определённой полезная нагрузкой в мастер-контракт, а уже мастер-контракт меняет статус сообщения.
Таким образом эмитент стейблкойнов может заблокировать средства любого кошелька с данным стейблкойном. Как я и упоминал в начале статьи, необходимо это для соблюдения требований регуляторов эмитентом, которые обычно представляют собой фонды, обеспечивающие стейблкойн в определенном соотношении фиатом и конечно же подобные фонды не могут игнорировать требования государства.
Но блокировка ваших средства это не единственная возможность администратора мастер контракта — эмитента. Помимо этого ваши средства можно сжечь или просто осуществить перевод.
Сжигание и Переводы ваших средств
Если мы перейдем в мастер контракт jetton-minter.fc (это мастер-контракт) и посмотрим как реализована смена статуса, то в функции обработки внутренних сообщений мы увидим развилку call_to, в которой можно послать команду в любой кошелек со стейблкойнам, на передачу стейблкойна, сжигание или как раз смену статуса, который мы рассматривали в предыдущем блоке статьи.
Таким образом, админ мастер-контракта, вполне может управлять вашим средствами. Здесь важно отметить, если админ попробует украсть ваши средства без регуляторного давления, то это дискредитирует стейблкойн, так все транзакции в блокчейне видны и подобный прецедент растиражируют телеграмм каналы за пару дней на всех пользователей, которые не захотят использовать подобный стейблкойн. Подобная система стимулов сдерживает эмитента стейблкойна от злоупотребления техническими возможностями.
Но это не все.
Механизм замены кода и данным мастер контракта
В названии данного абзаца раскрыта вся его суть — да, подобное возможно, полная замена кода мастер-контракта. Выглядит это примерно так:
да, можно поменять вообще все
Из сообщения которое придет в контракт, просто возьмут новые данные для хранилища и новый код.
Таким образом создатели стейблкойна могут поменять в нем почти все. И это некоторая реальность с которой сталкиваются криптовалюты, вынужденные под давлением регуляторов создавать механики блокировок, а также оставлять возможность изменить все, если что-то пойдет не так.
Заключение
Мне нравится блокчейн TON своей технической изящностью, как минимум это не очередная копия Ethereum, которую разгоняют с помощью большого капитала без оглядки, а вообще зачем это нужно пользователю. Если вы хотите узнать больше о блокчейне TON, у меня есть опенсорсные уроки, благодаря которым вы научитесь создавать полноценные приложения на TON.
https://github.com/romanovichim/TonFunClessons_ru
Новые туториалы и дата аналитику я кидаю сюда: https://t.me/ton_learn
Код стандарта Стейблкойн на TON: https://github.com/ton-blockchain/stablecoin-contract/tree/main