Перейти к содержанию

ERC-20: передача учебных кредитов

У LibraryCredit уже есть начальное предложение и шесть знаков отображения. Теперь рассмотрим передачу между читателями. Это самостоятельное действие токена: оно не публикует курс, не меняет owner реестра и не подписывает вход в серверную систему.

Для расчёта предположим, что у R десять отображаемых кредитов, а у Q ноль. R хочет передать три. Вызов должен использовать 3 000 000 базовых единиц, поскольку выбран decimals=6. Эти начальные балансы — условие упражнения, а не полученные данные реального развёртывания.

Отправитель определяется вызовом

Метод transfer принимает получателя и количество. Отправителем для обычной реализации является текущий вызывающий субъект по контексту библиотеки. В параметрах метода нет произвольного from, который можно заменить адресом другого читателя.

Контракт: выбранный LibraryCredit
Отправитель вызова: R
Метод: transfer(Q, 3_000_000)
До: R=10_000_000, Q=0
После: R=7_000_000, Q=3_000_000

Эта модель полезна для интерфейса: человек должен видеть выбранный токен, полный адрес получателя и сумму с единицами. Сумма комиссии сети относится к другой величине. Нельзя вычесть три LCR из баланса ETH только потому, что транзакция подписывается тем же кошельком.

Если Solidity-посредник сам вызывает credit.transfer(Q,amount), токен видит посредника как отправителя. Перевод идёт с баланса посредника, а не автоматически с баланса R, который начал верхний вызов. Для расходования от имени R применяется другой маршрут transferFrom с соответствующим разрешением.

Сохранение количества

В нашем LibraryCredit нет комиссии на перевод и нет дополнительного выпуска в transfer. Передача перераспределяет уже существующие единицы. При указанном переходе сумма балансов R и Q сохраняется: десять миллионов до и после.

TotalSupply также не меняется от обычной передачи. Это отличается от mint и burn, которые имеют другой смысл. Событие Transfer показывает движение от одного адреса к другому, но оно не является самостоятельным полем баланса: текущее количество можно читать через balanceOf.

При переводе самому себе from и to совпадают. Ожидаемый итоговый баланс в этой реализации остаётся прежним, хотя действие может создавать событие и использовать ресурсы. Такой вызов не удваивает единицы и не является способом получить новый выпуск. Интерфейс может предупредить о бессмысленности, но это отдельная помощь пользователю.

Нулевой перевод и недопустимый получатель

Перевод нулевого количества в стандартной модели рассматривается как нормальный маршрут с предусмотренным событием. Это не означает покупку доступа или полезный редакционный результат. Если сервер считает любой Transfer подтверждением покупки, он может ошибочно принять нулевое действие.

Нулевой адрес получателя в закреплённом ERC20.transfer отклоняется. Его нельзя использовать как случайную кнопку сжигания. Burn осуществляется отдельной внутренней операцией в модели, где такой путь предоставлен. В нашем фиксированном LibraryCredit внешнего burn нет.

Вызов в выбранной модели Ожидаемое поведение
R → Q, 3 млн при балансе 10 млн Два баланса обновлены
R → Q, 11 млн при балансе 10 млн Отказ, состояние не частично изменено
R → R, 3 млн Итоговый баланс R прежний
R → Q, 0 Предусмотренный нулевой перевод
R → нулевой адрес Недопустимый получатель

Результат метода и квитанция

Интерфейс ERC-20 содержит логический ответ transfer. Общий вызывающий код должен учитывать возможность false. Конкретный OpenZeppelin ERC20 5.4.0 при успехе возвращает true, а при недопустимых условиях откатывается. Нельзя переносить это удобство на любой адрес с похожим ABI.

При отправке через кошелёк клиент обычно сначала получает хеш транзакции. Он не равен значению bool метода и не подтверждает движение баланса. Требуется результат исполнения и актуальное чтение. Если ожидание квитанции истекло, итог остаётся неизвестным, а не автоматически false.

После успеха другой перевод может снова изменить балансы. Поэтому отчёт о конкретном действии и текущий баланс отвечают на разные вопросы. Например, R успешно получил три кредита, затем передал их другому адресу. Нулевой текущий balanceOf не отменяет прежний Transfer.

Баланс и право доступа

Пока LCR служит только упражнению количества. Наличие десяти единиц не даёт право publish в EditorialCatalog. Серверный маршрут токенового доступа также ещё не введён. Если интерфейс обещает «после transfer вы стали редактором», он добавляет отсутствующую связь между контрактами.

Даже в будущем доступе понадобится определить момент проверки. Пользователь может передать токен после входа на сайт. Сервер решит, действует ли ранее выданная сессия до срока или требуется новое чтение. ERC-20 самостоятельно не отправляет вашей базе данных сообщение об отключении каждой сессии.

Ошибка масштаба

Изменим только количество: вместо 3 000 000 передадим 3. Вызов технически может успешно выполнить перевод, но отображаемая сумма составит 0,000003 LCR. Здесь нет сбоя токена. Ошибка находится в подготовке пользовательского намерения и единиц.

Поэтому перед подписью полезно показывать машинное количество в подробностях и понятную сумму в основной форме. Оба значения должны быть получены одним согласованным преобразованием. При невозможности представить дробь нужно отклонить вход, а не незаметно округлить его.

Теперь transfer имеет точную модель: выбранный субъект передаёт выбранное количество выбранному получателю внутри одного токена. Следующая страница добавит независимое разрешение spender для расходования от имени владельца. Исходник ERC20 5.4.0 позволяет сверить именно эту реализацию.

Два события с одинаковой суммой

R может передать Q три кредита дважды. Каждый успешный перевод имеет свои реквизиты, а совпадение суммы не делает второй доставкой первого. Индексатор различает конкретные логи по источнику и положению, поэтому не теряет реальные повторные действия и не удваивает повторно прочитанную запись.

Для отчёта пользователю полезно сохранить сеть, адрес токена, отправителя, получателя и количество. Прежнее имя LCR не заменяет адрес, а текущий баланс не является идентификатором перевода. Такой комплект позволяет восстановить смысл действия независимо от состояния формы после обновления страницы.

Для самостоятельного уточнения: ERC20.sol (5.4.0).

Оглавление курса. Листинги, расчёты и наблюдения здесь разобраны как ожидаемое поведение; компиляция, учебные программы и проверки при написании не запускались.

Оглавление серии