Sui.

Допис

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

Owen.
Owen1466
May 31, 2025
Питання та відповіді експертів

Помилка перевірки типу при використанні користувацької структури як параметра типу в монеті Sui Move: :Coin?

Питання:

Я стикаюся з помилкою перевірки типу в моєму коді Sui Move, яку я не розумію. Ось спрощена версія мого коду:

module my_module::mymodule {
    use sui::coin;
    use sui::wallets;

    struct MyCoin has drop {}

    public fun create_coin(): coin::Coin<MyCoin> {
        coin::mint(1000)
    }
}

Коли я намагаюся компілювати, я отримую таку помилку:

Invalid type parameter instantiation.
Expected type 'phantom type T' but found 'MyCoin'

Що я роблю неправильно? Чому я не можу використовувати MyCoinяк параметр типу coin::Coinі як виправити цю проблему перевірки типу?

  • Sui
  • Architecture
4
4
Поділитися
Коментарі
.

Відповіді

4
HaGiang.
Jun 1 2025, 03:20

Ви отримуєте цю помилку перевірки типу, оскільки coin: :Coin очікує, що T буде фантомним типом - це означає, що він використовується лише на рівні типу і ніколи не зберігається у фактичних структурах даних. У своєму оригінальному коді ви визначили MyCoin як звичайну структуру без будь-яких параметрів типу або фантомного використання. Це порушує очікування модуля монет.

Модуль монет у Sui розроблений так, щоб бути загальним, де тип монети є лише маркером - як етикетка, щоб відрізнити одну монету від іншої. Ось чому він очікує, що тип не буде містити фактичних даних і існуватиме лише для цілей набору тексту.

4
Коментарі
.
harry phan.
May 31 2025, 09:45

Ви намагаєтеся використовувати coin: :mint (1000) без належної реєстрації вашого типу монети MyCoin. У Sui Move, перш ніж ви зможете карбувати власну монету, вам потрібно визначити та зареєструвати її за допомогою функції create_currency.

https://docs.sui.io/references/framework/sui/coin

1
Коментарі
.
MoonBags.
Jul 23 2025, 16:08

Ви отримуєте помилку, оскільки sui: :coin: :Coin вимагає, щоб T був фантомним типом, а ваша структура MyCoin не позначена як така. Щоб використовувати ваш власний MyCoin як тип для coin: :Coin, ваша структура повинна:

module my_module::mymodule {
    use sui::coin;

    struct MyCoin has drop, store {} // add `store` because it's often required
    phantom struct PhantomMyCoin has drop, store {}

    public fun create_coin(): coin::Coin<PhantomMyCoin> {
        coin::mint<PhantomMyCoin>(1000)
    }
}
1
Коментарі
.
0xduckmove.
Jul 23 2025, 16:09

Ви намагаєтеся використовувати свій власний MyCoin як аргумент типу для coin: :Coin, але Move кидає:

Invalid type parameter instantiation. Expected type 'phantom type T' but found 'MyCoin'

Простіше кажучи, це означає: coin: :Coin призначений для прийняття лише типів, які оголошені фантомними. Ви спробували передати звичайну структуру, і компілятор сказав: «Ні, я не можу безпечно гарантувати, як це використовується в пам'яті.

Отже, якщо ваш тип не оголошений так:

phantom struct MyCoin has store, drop {}

... його не можна використовувати з coin: :Coin.

-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.

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