Пост
Поделитесь своими знаниями.
в чем смысл ошибок с атрибутом # [error]?
Они по-прежнему остаются строковыми числами и в кошельках, и в проводниках, и в модулях move.
- Sui
Ответы
2Атрибут # [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
Атрибут # [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?
Знаете ответ?
Пожалуйста, войдите в систему и поделитесь им.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?53
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок43
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции25
- Как ограничения возможностей взаимодействуют с динамическими полями в гетерогенных коллекциях?05