Sui.

Beitrag

Teile dein Wissen.

Owen.
Owen1466
May 31, 2025
Experten Q&A

Fehler bei der Typprüfung, wenn eine benutzerdefinierte Struktur als Typparameter in coin: :Coin von Sui Move verwendet wird?

Frage:

In meinem Sui Move-Code tritt bei der Typprüfung ein Fehler auf, den ich nicht verstehe. Hier ist eine vereinfachte Version meines Codes:

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

    struct MyCoin has drop {}

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

Wenn ich versuche zu kompilieren, erhalte ich die folgende Fehlermeldung:

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

Was mache ich falsch? Warum kann ich ihn nicht MyCoinals Typparameter für verwendencoin::Coin, und wie kann ich dieses Problem mit der Typprüfung beheben?

  • Sui
  • Architecture
4
4
Teilen
Kommentare
.

Antworten

4
HaGiang.
Jun 1 2025, 03:20

Sie stoßen auf diesen Typprüfungsfehler, weil coin: :Coin erwartet, dass T ein Phantomtyp ist — was bedeutet, dass er nur auf Typebene verwendet und niemals in tatsächlichen Datenstrukturen gespeichert wird. In Ihrem ursprünglichen Code haben Sie MyCoin als normale Struktur ohne Typparameter oder Phantomverwendung definiert. Das widerspricht den Erwartungen an das Coinmodul.

Das Münzmodul in Sui ist generisch gestaltet, wobei der Münztyp nur eine Markierung ist — wie ein Etikett, um eine Münze von einer anderen zu unterscheiden. Deshalb wird erwartet, dass der Typ keine tatsächlichen Daten enthält und nur zu Tippzwecken existiert.

4
Kommentare
.
harry phan.
May 31 2025, 09:45

Sie versuchen, coin: :mint (1000) zu verwenden, ohne Ihren benutzerdefinierten Münztyp MyCoin ordnungsgemäß zu registrieren. Bevor Sie in Sui Move eine benutzerdefinierte Münze prägen können, müssen Sie sie mithilfe der Funktion create_currency definieren und registrieren.

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

1
Kommentare
.
MoonBags.
Jul 23 2025, 16:08

Sie erhalten den Fehler, weil sui: :coin: :Coin erfordert, dass T ein Phantomtyp ist und Ihre MyCoin-Struktur nicht als solche markiert ist. Um deinen benutzerdefinierten MyCoin als Typ für coin: :Coin zu verwenden, muss deine Struktur:

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
Kommentare
.
0xduckmove.
Jul 23 2025, 16:09

Sie versuchen, Ihr benutzerdefiniertes MyCoin als Typargument für coin: :Coin zu verwenden, aber Move wirft:

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

Das bedeutet im Klartext: coin: :Coin ist so konzipiert, dass es nur Typen akzeptiert, die als Phantom deklariert sind. Sie haben versucht, eine reguläre Struktur zu übergeben, und der Compiler sagte: „Nein, ich kann nicht sicher garantieren, wie das im Speicher verwendet wird.

Also, es sei denn, dein Typ ist so deklariert:

phantom struct MyCoin has store, drop {}

... es kann nicht mit coin: :Coin verwendet werden.

-1
Kommentare
.

Weißt du die Antwort?

Bitte melde dich an und teile sie.

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

610Beiträge1335Antworten
Sui.X.Peera.

Verdiene deinen Anteil an 1000 Sui

Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

BelohnungskampagneJuli