Smart ASA v2 от Algorand переносит заморозку токена туда, откуда держатель не может её снять
ARC-20 переносит правила токена Algorand в смарт-контракт. Эталонная реализация v2.0.0, выпущенная 23 октября, хранит заморозки счетов в боксах, принадлежащих контракту, сокращая заблокированный баланс держателя до 0,1 ALGO. В релизе указано, что код не прошёл аудит и не подлежит обновлению.

Токен теперь можно заморозить ещё до того, как его держатель получит хотя бы одну единицу, и заморозка сохраняется после того, как держатель уйдёт. Именно это изменилось в Smart ASA v2 — переработанной эталонной реализации стандарта ARC-20 от Algorand, опубликованной 23 октября.
Токен с контрактом посередине
[ASA](/glossary/algorand-standard-asset "A built-in mechanism that allows anyone to create and issue new tokens (like stablecoins, utility tokens, or NFTs) — это нативный токен Algorand. Он создаётся одной транзакцией и хранится у держателя после опт-ина. Его название, единица, десятичные знаки и максимальная эмиссия фиксируются при создании. Четыре роли закреплены за адресами, и нет хука, позволяющего выполнить собственное правило эмитента при переводе между двумя держателями.
Раньше для применения правила приходилось замораживать актив и проводить единицы через clawback, что для держателя выглядит как изъятие там, где ожидался перевод. ARC-20 сохраняет нативный токен и передаёт четыре роли контракту. Актив создаётся замороженным по умолчанию, поэтому единицы попадают к держателю только через контракт, и каждое перемещение предварительно проверяется.
Это делает ARC-20 зеркальным отражением ARC-2001 — другого стандарта контрактных токенов Algorand, где токен и есть контракт и ведёт себя как токен Ethereum с балансами и одобрениями. ARC-20 сохраняет актив нативным, так что кошельки и биржи хранят его как любой другой токен, а свод правил помещается сверху.
Что меняет версия 2
Заморозки счетов переезжают из хранилища самого держателя в пустые боксы, принадлежащие контракту. В прежней архитектуре флаг хранился в локальном состоянии счёта, и держатель мог его снять. Теперь спецификация2 отмечает, что состояние в боксах не может быть удалено держателем и что держателям вообще не нужно делать опт-ин к контракту. Их заблокированный баланс снижается с 0,2285 до 0,13 ALGO.
Некоторые ограничения остаются. Заморозку можно наложить на адрес до того, как на нём что-либо появится, — именно это нужно для санкционного списка, — и она сохраняется, даже если держатель уйдёт и вернётся. Первая заморозка на счёте создаёт бокс. Он финансируется депозитом в 0,01574 ALGO, который вносится контракту непосредственно перед вызовом заморозки и возвращается, когда счёт возвращается в состояние по умолчанию.
Что это даёт — узко и реально: эмитент может удерживать правило против держателя, который не сотрудничает, при этом лимит эмиссии и логика выплат находятся в публичном состоянии, доступном для чтения любому. Является ли это преимуществом, зависит от того, по какую сторону заморозки вы находитесь.
Остальное — техническая рутина, но с последствиями. Предыдущая версия, опубликованная тремя днями ранее, кодировала аргументы актива и счёта как простые целые числа и адреса, поэтому «её селекторы методов не соответствовали интерфейсу ARC-205». Версия 2 использует собственные типы стандарта и требует от клиентов перегенерировать код. Неудачные вызовы теперь записывают коды ошибок ARC-65, так что кошелёк может назвать причину вместо показа сообщения об ошибке. Две точки расширения позволяют эмитенту добавлять проверки к обычным переводам и определять циркулирующее предложение; в репозитории есть пример с ограничением сверху.
Заморозки многоуровневые. Глобальная заморозка останавливает переводы, а заморозка счёта блокирует одного держателя; в примечаниях к релизу сказано, что clawback не блокируется ни одной из них, а роли, закреплённые за одним адресом каждая, действуют по своим правилам.
Что нужно для использования
Развёртывание означает развернуть контракт и создать актив, а затем платить комиссию за каждое действие. В контрольном списке миграции из релиза выпуск, погашение, clawback, обычный перевод и сброс заморозки оценены в двойную минимальную комиссию. Уничтожение токена стоит втрое дороже. Каждый замороженный счёт также блокирует депозит в 0,01576 ALGO в контракте, возвращаемый при сбросе.
Путь разработки — AlgoKit, Poetry и локальная сеть в Docker, всё из репозитория7. Хостингового сервиса нет, регистрация не требуется.
Нет и ничего, что мог бы открыть обычный пользователь. Раздел релиза о TestNet описывает демонстрацию пяти стандартов, но не называет ни приложения, ни актива — в отличие от примечаний к предыдущей версии трёхдневной давности. Разработчик может прочитать код и развернуть его локально; читателю, который ищет работающий токен версии 2, идти некуда.
Более полный вариант опирается на ARC-89 — реестр метаданных, который, согласно его собственному реестру внедрения, развёрнут в TestNet и ожидает развёртывания в MainNet. Последний релиз этого реестра называет себя первым кандидатом на развёртывание в MainNet. Пока это не произойдёт, более полный вариант остаётся работой для TestNet.
Кто это строит
Спецификацию ARC-20 написал Козимо Басси, публикующийся под ником cusma8. Он поддерживает эту реализацию и написал реестр метаданных, на который она опирается. Репозиторий находится под эгидой Algorand Foundation, и в списке его релизов предыдущая версия датирована 20 октября, а эта — 23 октября. В день релиза он обратился к эмитентам, кошелькам и обозревателям с просьбой оставить отзыв.
Более ранняя реализация в algorandlabs/smart-asa9 выполняла ту же задачу с 2022 года. Она привязывала токен к контракту, записывая номер контракта в поле URL токена, и хранила флаг заморозки каждого держателя в локальном состоянии. Версия 2 заменяет эту схему, и именно ей до сих пор следуют работающие токены.
Единственный работающий пользователь
В файле внедрения ARC-20 указан ровно один проект — enel-ebitts, с низкой степенью готовности и пустыми разделами кошельков, обозревателей и инструментов. ebitts — это сервис Enel и Conio, который продаёт итальянским домохозяйствам токены, привязанные к выработке двух возобновляемых электростанций, и зачитывает эту выработку в счёт за электроэнергию; PXke освещал его запуск в октябре.
У каждой электростанции есть собственный токен, названный в её честь: ebitts Barile Venosa с тикером EBT-BVEN и ebitts Piani della Marina с тикером EBT-PDM.10 Оба находятся в основной сети Algorand с мая 2026 года.11 Четыре роли ветрового токена закреплены за счётом, которым владеет его собственный контракт, а не за ключом человека, поэтому каждое перемещение проходит через этот контракт. Внутри контракта эти четыре роли назначены одному кошельку. Токены несут старую привязку в своих полях URL. Их контракты также указывают на приложение выплат, токен вознаграждения и приложение идентификации, чего контракт этого релиза не делает. Они отвечают тому же интерфейсу, что и кастомная сборка, а не копия версии 2.
Они живут. Контракт ветрового токена с 4 мая отправил около 183012 переводов примерно на 37013 кошельков, из них 47514 за тридцать дней до 26 октября, все с одного адреса, так что это распределения из контракта, а не сделки между держателями. Ни один из токенов вообще не торгуется.
Почти весь объём обоих выпусков по-прежнему находится в одном кошельке. Он создал оба контракта. В хранимом состоянии каждого контракта он указан как менеджер, резерв, заморозка и clawback. Ему принадлежит около 97,715% ветрового токена и около 99,816% солнечного.
Ссылка на доказательства в файле внедрения открывает другой токен из того же семейства — тот, чей контракт называется REWARD и хранит два десятичных знака, а не какой-либо из токенов электростанций. Запись показывает, что семейство существует; сама по себе она не доказывает, что единицы, которыми владеют домохозяйства, соответствуют требованиям.
Что может пойти не так
В релизе о самом себе сказано две вещи. Развёртывающим рекомендуется запускать новый контракт, поскольку приложения предыдущей версии нельзя обновить на месте. И код не проходил аудит.
Всё остальное лежит на эмитенте, и спецификация это признаёт. Правила действуют только пока токен остаётся замороженным по умолчанию, его адрес clawback остаётся у контракта, а сам контракт нельзя обновить, удалить или переключить ключ. В пересмотренном тексте спецификации указаны два способа обойти это. Адрес заморозки актива может разморозить holdings, а адрес менеджера может изменить clawback, если только один из них не установлен на контракт или не оставлен пустым.
Держателя может ввести в заблуждение его собственный кошелёк. Базовый актив всегда сообщает ноль десятичных знаков и фиктивную максимальную эмиссию, какой бы ни была конфигурация эмитента, и кошельки, не понимающие ARC-20, показывают именно это вместо реальной конфигурации.
Документация тоже расходится. В день релиза репозиторий изменил своё правило метаданных с «должны быть неизменяемыми» на «следует быть неизменяемыми», а копия на портале разработчика по-прежнему говорит «должны» и всё ещё описывает состояние заморозки как хранящееся в локальном хранилище держателя. Тот, кто проверяет портал, читает версию, которую этот релиз заменил.
В одном из ответов на анонс прямо спросили, каким мог бы быть вариант использования смарт-ASA. Единственный работающий пример в записях — счёт за электроэнергию в Италии, и он работает на более ранней сборке.
Источники
- Release v2.0.0 · algorandfoundation/arc20 · GitHub17
- ARCs/ARCs/arc-0020.md at main · algorandfoundation/ARCs · GitHub2
- github.com7
- Releases · algorandfoundation/arc2018
- Algorand Smart Contract Token Specification | Algorand Developer Portal1
- GitHub - algorandlabs/smart-asa: Smart ASA reference implementation · GitHub9
- raw.githubusercontent.com19
11 цифр в этом материале проверено. 3 прочитано напрямую из блокчейна.Все проверки
Источники
- 1ARC-200 dev.algorand.co↩
- 2спецификация github.com↩
- 7репозитория github.com↩
- 8cusma github.com↩
- 9algorandlabs/smart-asa github.com↩
- 17Release v2.0.0 · algorandfoundation/arc20 · GitHub github.com↩
- 18Releases · algorandfoundation/arc20 github.com↩
- 19raw.githubusercontent.com/algorandfoundation/arc20/main/README.md raw.githubusercontent.com↩