Sui.

Допис

Діліться своїми знаннями.

HaGiang.
Jun 15, 2025
Питання та відповіді експертів

який сенс помилок з атрибутом # [error]?

Вони все ще є числами в рядку як у гаманціх/дослідних/модулях переміщення.

  • 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) дозволяє визначати константи помилок як повідомлення, що читаються людиною (як вектор), а не лише як числа. Це нова функція, яка покращує досвід розробників та користувачів.

Навіщо використовувати # [помилка]?

-Описові повідомлення про помилки: Замість того, щоб просто повернути число (наприклад, abort 1), ви можете повернути рядкове повідомлення, яке пояснює, що пішло не так. -Краще налагодження: Розробники та користувачі можуть побачити чітку причину збою, що полегшує розуміння та виправлення проблем. -Покращений UX: Гаманці, дослідники та 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), а гаманці/дослідники показали лише код. -**З # [помилка] :**Якщо гаманець/провідник підтримує повідомлення про помилки Move 2024, він може розшифрувати та відображати рядок. Якщо ні, він все одно може відображати необроблені байти або число.

Отже, атрибут # [error] полягає в тому, щоб зробити обробку помилок більш виразною та зручною для користувачів, але повна підтримка залежить від оновлень інструментів (гаманців, дослідників) для відображення цих повідомлень.

Докладніші відомості див. у розділі Переміщення книги: повідомлення про помилки.

Бажаєте побачити, як визначити як числові, так і рядкові помилки в модулі «Переміщення»? Або вас цікавить, як змусити ваш DApp або гаманець відображати ці повідомлення?

Як розшифрувати # [помилка] Повідомлення

Коли ви бачите помилку в гаманці, провіднику або журналі, вона може виглядати як число або рядок байтів (наприклад, 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726f726f726d207468697320616374696f6e).

1.Якщо ви бачите число (наприклад,1) :

  • Це застарілий код помилки. Вам потрібно шукати код у джерелі модуля, щоб побачити, що він означає.

2.Якщо ви бачите шістнадцятковий рядок (наприклад,0x546865...) :

  • Це повідомлення про помилку, кодоване UTF-8 як вектор байтів.

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

  • Видаліть 0xприставку.
  • Перетворення шістнадцяткового рядка в байти.
  • Інтерпретувати байти як рядок UTF-8.

####Приклад

Припустимо, ви бачите цю помилку: 0x5468652075736572206973206e6ф7420617574686ф72697а656420746ф20706572666ф726д207468697320616374696ф6е

  • Видалі 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 тощо) :

-Іржа:

нехай шестигранник = «5468652075736572206973206e6ф7420617574686ф72697а656420746ф20706572666ф726д207468697320616374696ф6е»; нехай байт = hex: :decode (hex) .unwrap (); нехай повідомлення = Рядок: :from_utf8 (байт) .unwrap (); друк! («{}», повідомлення); -JavaScript:

конст шестигранний = «5468652075736572206973206е6ф7420617574686ф72697а656420746ф20746ф20706572666ф726д207468697320616374696ф6е»; повідомлення const = буфер.від (шестигранник, «шестигранник») .toString («utf8"); console.log (повідомлення); -Пітон:

шестигранний_стор = «5468652075736572206973206е6ф7420617574686ф72697а656420746ф20706572666ф726д20746869732061637469696ф6е» повідомлення = байти.відшестигранник (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.

Кампанія винагородЛипень