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.

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