Sui.

Пост

Поделитесь своими знаниями.

HaGiang.
Jun 15, 2025
Экспертные Вопросы и Ответы

в чем смысл ошибок с атрибутом # [error]?

Они по-прежнему остаются строковыми числами и в кошельках, и в проводниках, и в модулях move.

  • Sui
2
2
Поделиться
Комментарии
.

Ответы

2
0xduckmove.
Jun 15 2025, 09:24

Атрибут # [error] в Move (особенно в Move 2024) позволяет определять константы ошибок как удобочитаемые сообщения (в виде вектора), а не как числа. Это новая функция, улучшающая работу разработчиков и пользователей.

#[error]
const ENotAuthorized: vector<u8> = b"The user is not authorized to perform this action";

public fun update_value(user: &mut User, value: u64) {
    assert!(user.is_authorized, ENotAuthorized);
}

Дополнительные сведения см. в книге переездов: https://move-book.com/move-basics/assert-and-abort.html#error-messages

2
Лучший ответ
Комментарии
.
harry phan.
Jun 30 2025, 07:55

Атрибут # [error] в Move (особенно в Move 2024) позволяет определять константы ошибок как удобочитаемые сообщения (в виде вектора), а не как числа. Это новая функция, улучшающая работу разработчиков и пользователей.

Зачем использовать # [error]?

-Описательные сообщения об ошибках: Вместо того, чтобы просто возвращать число (например, аборт 1), вы можете вернуть строковое сообщение, объясняющее, что пошло не так. -Улучшенная отладка: Разработчики и пользователи могут четко определить причину сбоя, что упрощает понимание и устранение проблем. -Улучшенный пользовательский интерфейс: Кошельки, браузеры и dApps могут отображать пользователям значимые сообщения об ошибках, а не только коды ошибок.

Примеры

#[error]
const ENotAuthorized: vector<u8> = b"The user is not authorized to perform this action";

public fun update_value(user: &mut User, value: u64) {
    assert!(user.is_authorized, ENotAuthorized);
}

Если утверждение не выполняется, вместо цифры может отображаться сообщение об ошибке «Пользователь не уполномочен выполнять это действие».

По-прежнему ли количество ошибок в кошельках/браузерах?

-Старый стиль: Ошибки представляли собой просто цифры (например, аборт 1), а в кошельках и браузерах отображался только код. -**С кодом # [error] :**Если кошелек/проводник поддерживает сообщения об ошибках Move 2024, он может расшифровать и отобразить строку. В противном случае в нем все равно могут отображаться необработанные байты или числа.

Таким образом, атрибут # [error] призван сделать обработку ошибок более выразительной и удобной для пользователя, но полная поддержка зависит от обновления инструментов (кошельков, браузеров) для отображения этих сообщений.

Дополнительные сведения см. в книге Move Book: сообщения об ошибках.

Хотите узнать, как определять числовые и строковые ошибки в модуле Move? Или вас интересует, как заставить dApp или кошелек отображать эти сообщения?

Как декодировать # [ошибок] сообщений

Когда вы видите ошибку в кошельке, проводнике или журнале, она может выглядеть как число или строка байтов (например, 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e).

1. 1Если вы видите цифру (например,) :
  • Это устаревший код ошибки. Вам нужно посмотреть код в исходном коде модуля, чтобы понять, что он означает.

2. 0x546865...Если вы видите шестнадцатеричную строку (например,) :

  • Это сообщение об ошибке в кодировке UTF-8 в виде вектора байтов.

######Для декодирования:

  • Удалите префикс0x.
  • Преобразуйте шестнадцатеричную строку в байты.
  • Интерпретируйте байты как строку UTF-8.

####Пример

Предположим, вы видите эту ошибку: 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e 0x- Удалить.

  • Преобразуйте шестнадцатеричное число в ASCII/UTF-8:
  • 54 68 65 20 75 73 65 72 20 69 73 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 63 74 69 6f 6e
  • Это расшифровывается следующим образом:
  • Пользователь не уполномочен выполнять это действие

####Как декодировать код (Rust, JS, Python и т. д.) :

-Ржавчина:

пусть шестнадцатерично = «5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e»; пусть байты = шестнадцатеричное число: :decode (шестнадцатеричное число) .unwrap (); пусть сообщение = строка: :from_utf8 (байты) .unwrap (); распечатка! («{}», сообщение); -JavaScript:

шестнадцатеричная константа = «5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e»; константное сообщение = Buffer.from (шестнадцатеричное, «шестнадцатеричное») .toString («utf8»); console.log (сообщение); -Python:

hex_str = «5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e» сообщение = байты. Из шестнадцатеричного числа (hex_str). декодируйте («utf-8») распечатать (сообщение)

Резюме:

  • Если вы видите цифру, найдите ее в коде.
  • Если вы видите шестнадцатеричную строку, декодируйте ее как UTF-8, чтобы получить удобочитаемую ошибку.

Если вам нужен быстрый онлайн-инструмент, просто введите «конвертер шестнадцатеричных чисел в текст» и вставьте шестнадцатеричную строку.

Вам нужен скрипт или инструмент для автоматического декодирования этих ошибок? Или вы хотите узнать, как сделать собственные ошибки более понятными в коде Move?

1
Комментарии
.

Знаете ответ?

Пожалуйста, войдите в систему и поделитесь им.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610Посты1335Ответы
Sui.X.Peera.

Заработай свою долю из 1000 Sui

Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

Кампания вознагражденийИюль