Skip to main contentA-REX Foundation

Whitepaper · 06

Стандарт ядра

Обоснование каждого элемента A-REX Core: почему запись партии содержит именно эти поля, почему родословная — это операция, а не отображение, почему принудительное исполнение берётся из ERC-7943, почему коды заменяют перечисления и какие уроки сформировали проект.

Цель проектирования: наименьший интерфейс, который реализует третья сторона

Стандарт принимается тогда, когда его реализация стоит меньше, чем отсутствие интероперабельности. Каждое поле, функция и правило A-REX Core должны были пройти один тест: согласилась бы независимая команда, создающая платформу для зерновых элеваторов в Аргентине или систему экспортёра кофе в Колумбии, принять это ограничение в обмен на интероперабельность? Перечни культур, американские названия классов качества, обязательный реестр ферм, предписанный стек идентичности и формула оценки стоимости этот тест не прошли. Идентичность партии, родословная, принудительное исполнение и точка расширения его прошли.

Запись партии, поле за полем

ПолеПочему оно находится ончейнПочему оно устроено именно так
commodity: bytes32хуки, торговые площадки и регуляторы должны фильтровать по продукту без разбора метаданныхkeccak256("HS:100199") принимает любую схему (HS, FAO/CPC, GTIN, национальные коды) без таблицы в стандарте; перечисление зафиксировало бы мировой перечень культур в момент развёртывания
unit: bytes32количества бессмысленны без единицы измерения; перевод 1000 означает 1000 кг или 1000 ящиковРекомендация UN/CEFACT 20 — перечень кодов, используемый в EDI, EPCIS и таможне
producedAt: uint64скоропортящесть, сезонность и форвардные контракты опираются на время производства0 означает «ещё не произведено»: дебиторская задолженность по урожаю, форварды и варранты на будущий урожай — основные инструменты сельскохозяйственного финансирования в Латинской Америке, и они должны быть представимы
expiresAt: uint64самое распространённое правило перевода в сельском хозяйстве — «не позднее этой даты»0 означает отсутствие срока; что влечёт истечение срока, решают хуки
originRef: bytes32происхождение должно быть доказуемо (EUDR, органическая продукция, географические указания)хеш или ссылка, но не координаты: геолокация участка производителя — персональные данные (руководящие принципы EDPB 02/2025 v2.0, июль 2026 г.), а неизменяемая публичная сеть не может исполнить требование об удалении данных
metadataHash: bytes32 + uriвсё остальное находится офчейн, но токен должен фиксировать на это коммитментхеш канонического JSON-документа, соответствующего опубликованной схеме; uri может быть IPFS, HTTPS или GS1 Digital Link
status: uint8лот проходит жизненный цикл, и некоторые состояния должны блокировать перемещениеоткрытые значения с двумя фиксированными точками (0 — активна, 255 — погашена); прежнее перечисление из девяти состояний кодировало лексику одной цепочки поставок и могло изменяться любым держателем
issuer, createdAtподотчётность и аудитустанавливаются контрактом, но не вызывающей стороной

Намеренно отсутствуют: широта и долгота, идентификатор фермы, перечисление классов качества, влажность и белок, флаг верификации и адрес верификатора, поле quantity (авторитетным является учёт предложения ERC-1155) и любое понятие стоимости.

Родословная как операция

Жизненный цикл с состоянием PROCESSED, но без способа произвести переработанный товар — распространённая ошибка. Режимы прослеживаемости прямо определяют преобразование как событие, связывающее входы с выходами: критическое событие отслеживания преобразование по FSMA 204, TransformationEvent из EPCIS 2.0 с inputQuantityList и outputQuantityList. Отображение родителей, записанное администратором, не несло бы ни количеств, ни атомарности.

transform(from, to, inputIds, inputAmounts, outputs, outputAmounts, processRef) сжигает и эмитирует в одной транзакции, фиксирует родителей для каждого выхода, генерирует одно событие со всеми количествами и ссылкой на процесс и запускает конвейер хуков на каждом звене. Разделение (1→n), объединение (n→1) и переработка (n→m) — одна и та же функция. Эталонная реализация позволяет любому держателю переформировать партии (тот же товар и единица измерения, количество сохраняется), но требует TRANSFORMER_ROLE для изменения природы или количества товара: мельница может превратить пшеницу в муку, а фермер не может превратить пшеницу в золото.

Принудительное исполнение из ERC-7943, а не изобретённое заново

Сельскохозяйственные лоты регулярно подпадают под обременения, варранты, эмбарго, процедуры несостоятельности и отзывы. Токен, который не может быть заморожен или перемещён уполномоченной стороной против воли держателя, не способен представлять такой лот перед банком, судом или регулятором. ERC-3643 решил эту задачу для ценных бумаг в 2021 году; ERC-7943 обобщил её на любой реальный актив и в мае 2026 г. получил статус Final с вариантом для ERC-1155. A-REX принимает этот интерфейс дословно, а не определяет собственный, чтобы движки комплаенса с поддержкой ERC-7943 (Chainlink ACE, инструментарий ERC-3643) распознавали токен A-REX без адаптации.

Мультитокенный вариант естественно подходит для ERC-1155: заморозка выполняется по аккаунту и по идентификатору партии, принудительные переводы указывают партию, допуск определяется по аккаунту.

Один хук, упорядоченный, с кодами

Система модулей, построенная на пяти интерфейсах возможностей, каждый из которых опрашивался через supportsInterface при каждом переводе, не масштабируется: при восьми модулях и пяти идентификаторах в пакетном переводе это составляло восемьдесят статических вызовов ещё до выполнения какого-либо правила. Отказы выражались свободными строками, которые не мог интерпретировать ни один индексатор и надёжно сравнить ни один тест.

A-REX Core определяет один интерфейс хука с константной битовой маской флагов, кэшируемой при регистрации. Токен вычисляет хуки в фиксированном порядке и останавливается на первом ненулевом коде bytes32, откатываясь с ARexHookRejected(hook, code). Порядок поддаётся аудиту (getHooks), удаление его сохраняет, а хук узнаёт вызывающий токен из msg.sender, поэтому одно развёртывание обслуживает много токенов. Допуск (canSend/canReceive) включён в тот же интерфейс, так что view-функции ERC-7943 токена представляют собой конъюнкцию его хуков.

Почему коды, а не пользовательские ошибки хука? Потому что check — это view-функция, которая должна компоноваться: токену нужно опросить каждый хук, сравнить ответы и выдать первый из них через transferCheck без отката. Коды дёшевы, индексируемы, локализуемы и снабжены пространствами имён (keccak256("AREX:BATCH_EXPIRED"), keccak256("MYHOOK:QUOTA")).

Аттестации по партиям, эмитенты по темам

Сертификация производителя — это проблема идентичности, для которой существуют зрелые решения (ONCHAINID, Ethereum Attestation Service, верифицируемые учётные данные, национальные e-ID). Сертификация лота — это то, что проверяют покупатели, таможня и регуляторы, и стандартной формы для неё не было. IARexAttest записывает (batch, topic) → (issuer, reference, validity) и позволяет администратору решать, какой эмитент вправе аттестовать по какой теме, повторяя реестр доверенных эмитентов ERC-3643 без навязывания поставщика идентичности. Темы — открытые значения bytes32, поэтому темы утверждений ERC-735, идентификаторы схем EAS и хеши названий сертификаций сосуществуют.

isAttested — единственный вопрос, который задаёт хук: он ложен, если аттестация отсутствует, отозвана, истекла или её эмитент утратил доверие. Это позволяет хуку обеспечить соблюдение правила «партиям кофе нужна ссылка на должную осмотрительность по EUDR до того, как их можно продать» в шести строках.

О чём стандарт не говорит

  • Он не говорит, кто может создавать партии, менять статус или применять принудительное исполнение, — лишь то, что это роли, но никогда не балансы.
  • Он не говорит, что означают статусы 1..254; эмитент публикует таблицу в метаданных.
  • Он не говорит, как оценивать партию, как она портится, когда ею можно торговать с учётом сезонности, как её доставляют или страхуют: всё это хуки или сопутствующие контракты.
  • Он не говорит, какую сеть, какого поставщика идентичности, какой оракул, какой реестр использовать.
  • Он не говорит, является ли токен ценной бумагой или товаром.

Уроки, сформировавшие проект

УрокСледствие в A-REX Core
Стандарт, включающий реестр ферм и систему идентичности как ОБЯЗАТЕЛЬНЫЕ, — не стандарт токена, а продуктничто за пределами токена не является обязательным
Закрытое перечисление в сигнатуре функции превращает любой «динамический реестр» товаров в мёртвый кодтовары, единицы измерения, статусы и темы — открытые коды
Полномочия, вытекающие из баланса, — уязвимость в токене со многими держателямиизменение статуса ограничено ролями; RETIRED терминален
Бизнес-логика в ядре противоречит принципу «ядро без бизнес-логики»оценка стоимости, порча и окна находятся в хуках
Сборка, которая не компилируется из чистого клона, — не эталонная реализациязависимости зафиксированы, lock-файл закоммичен, CI при каждом push
Регуляторные даты в whitepaper устаревают; код, зависящий от них, устаревать не должентокен хранит ссылки и хеши, но никогда не регуляторную логику

Обратная совместимость

Токены A-REX Core — полноценные токены ERC-1155 и ERC-7943. Кошельки, торговые площадки и индексаторы, знающие ERC-1155, работают без изменений; инструментарий комплаенса с поддержкой ERC-7943 распознаёт поверхность принудительного исполнения. Движки правил, написанные для других токенов, подключаются через адаптер IARexHook, если их решения зависят только от параметров вызова и записи партии.