Sui.

Beitrag

Teile dein Wissen.

Benjamin XDV.
Jul 14, 2025
Experten Q&A

Grundlegendes zum Sui Clock-Modul und zur Verwendung von Zeitstempeln

Ich baue zeitkritische Logik inSui Moveauf (z. B. Token-Vesting, Auktionsfristen), habe aber Probleme mit der zuverlässigen Handhabung von Zeitstempeln. Die wichtigsten Fragen:

  1. Uhr-Objekt: Warum braucht Sui eine gemeinsame Uhr statt Block-Zeitstempel?
  2. Genauigkeit: Wie genau sind diese Zeitstempel im Vergleich zu Blockzeiten?
  3. Nutzungsmuster: Bewährte Methoden für Zeitsperren, Termine und Zeitplanung?
  4. Testen: Wie simuliert man Zeit in Komponententests?

Aktuelle Probleme:

  • Die grundlegende Verwendung von sui: :clock funktioniert, fühlt sich aber restriktiv an
  • Sie sind sich nicht sicher, wie Sie mit der Zeit zwischen verschiedenen Shards/Validatoren umgehen sollen
  • Das Testen zeitabhängiger Logik ist unzuverlässig
  • Sui
0
2
Teilen
Kommentare
.

Antworten

2
Arnold.
Jul 14 2025, 14:47

####1. Grundlagen der Sui-Uhr

Warum eine gemeinsame Uhr? Das parallele Ausführungsmodell von Sui bedeutet:

  • Keine garantierte Blockreihenfolge → Blocknummern/Zeitstempel können nicht verwendet werden
  • Clockist eingemeinsames Objekt, das konsensgestützte Zeit bereitstellt

Kernstruktur:

module sui::clock {  
    struct Clock has key {  
        id: UID,  
        timestamp_ms: u64,  
    }  
}  

Wichtigste Eigenschaften:

  • Alle2 Sekundenaktualisiert (durch Validatoren konfigurierbar)
  • Genauigkeit in Millisekunden (im Vergleich zu den ~12-Sekunden-Blöcken von Ethereum)
  • Unveränderlich — kann nicht durch Verträge geändert werden

####2. Praktische Nutzungsmuster

#####Grundlegende Zeitprüfung

use sui::clock;  

public entry fn execute_if_ready(  
    clock: &Clock,  
    lock: &mut LockedAsset  
) {  
    assert!(clock.timestamp_ms >= lock.unlock_time, ELocked);  
    // Release assets  
}  

#####Fristdurchsetzung

struct Auction has key {  
    id: UID,  
    end_time: u64, // Stored as Clock timestamp  
    highest_bid: u64  
}  

public entry fn bid(  
    auction: &mut Auction,  
    clock: &Clock,  
    bid_amount: u64  
) {  
    assert!(clock.timestamp_ms < auction.end_time, EAuctionEnded);  
    // Process bid  
}  

#####Zeitgebundene Aktionen

struct VestingSchedule has key {  
    id: UID,  
    start_time: u64,  
    cliff_duration: u64 // In milliseconds  
}  

public fun claimable_amount(  
    vesting: &VestingSchedule,  
    clock: &Clock  
): u64 {  
    let elapsed = clock.timestamp_ms - vesting.start_time;  
    // Linear vesting math  
}  

####3. Überlegungen für Fortgeschritten

#####Gemeinsame Konsistenz

  • Alle Shards sehen innerhalb einer Transaktion dengleichen Uhrzeitstempel &Clock- Übergeben Sie bei shard-übergreifenden Operationen als gemeinsam genutzte Objektreferenz

#####Gasoptimierung duration_ms: u64- Speichere, wenn möglich,relative Zeiten(z. B.) statt absoluter Zeiten

  • Verwenden Sie dieselbe ClockReferenz für alle Funktionen

#####Fehlerbehandlung

const MAX_CLOCK_DRIFT_MS: u64 = 3000; // 3s tolerance  

public fun validate_clock(clock: &Clock) {  
    assert!(tx_context::epoch(ctx) == clock.epoch(), EStaleClock);  
    assert!(clock.timestamp_ms <= tx_context::now_ms(ctx) + MAX_CLOCK_DRIFT_MS, EInvalidTime);  
}  

####4. Teststrategien

#####Scheinuhr in Testen

#[test_only]  
fun mock_clock(timestamp_ms: u64): Clock {  
    Clock { id: test_scenario::new_object(ctx), timestamp_ms }  
}  

#[test]  
fun test_vesting() {  
    let clock = mock_clock(1000);  
    let vesting = VestingSchedule { start_time: 0, ... };  
    // Test claimable amount at t=1000  
}  

#####Epochenübergangstests

#[test]  
fun test_clock_epoch_change() {  
    let mut scenario = test_scenario::begin(...);  
    // Advance epoch  
    test_scenario::next_epoch(&mut scenario);  
    let clock = test_scenario::take_shared<Clock>(scenario);  
    assert!(clock.epoch() == 1, EEpochError);  
}  
0
Kommentare
.
24p30p.
Jul 14 2025, 13:53

Wenn Sie in Sui Move an zeitsensitiven Logiken wie Auktionen oder Sperrzeitplänen arbeiten, sui::clockist das Modul Ihre erste Wahl, um Zeit zu verfolgen. Sui verlässt sich nicht auf Block-Zeitstempel wie Ethereum oder Solana, da es auf deterministische Ausführung und Parallelität abzielt. Aus diesem Grund verwendet es einShared Clock-Objekt, das einmal pro Checkpoint aktualisiert wird und dir eine kanonische Zeitquelle bietet.

clock.timestampDu interagierst mit der Zeit, indem du aus diesem gemeinsamen Uhr-Objekt liest (das normalerweise an Eingabefunktionen weitergegeben wird) mithilfe von. Dieser Wert wird ungefähr jede Sekunde aktualisiert und gibt Ihnen den aktuellen UNIX-Zeitstempel in Sekunden an. Er ist zwar nicht wie bei EVM an jeden Block gebunden, aber für praktische Anwendungsfälle wie Token-Entsperrungen oder Ablauf von Geboten genau genug — nur eben nicht im Mikrosekundenbereich.

Übergeben Sie beim Erstellen zeitbasierter Logik immerdas Clock-Objekt explizit, damit Ihre Move-Funktion es lesen und Zeitstempel mit Ihren gespeicherten Terminen vergleichen kann. Um starres Verhalten zu vermeiden, verwenden Sie Nachfristen oder Spielraum in Ihren Vergleichen (if current_time > unlock_time + buffer) und vermeiden Sie es, sich auf exakte Sekunden zu verlassen.

Zum Testen können Sie mit Sui die Uhr in Komponententests nachspielen**, indem Sie Ihre eigene Instanz des gemeinsam genutzten Objekts mit einem benutzerdefinierten Zeitstempel erstellen. Auf diese Weise können Sie zukünftige Bedingungen simulieren, ohne dass dafür Echtzeit benötigt wird. Konstruieren Sie die Uhr einfach manuell mit einem festgelegten Wert in Ihren #[test]Funktionen.

Wenn du dich eingeschränkt fühlst, liegt das wahrscheinlich daran, wie Sui die Uhr vor Mutationen außerhalb der Checkpoints schützt. Du musst deine Module so gestalten, dass sie Zeitstempel als Eingabe erwarten und sie aus dem offiziellen gemeinsamen Objekt lesen. Vermeiden Sie es, Ihre eigene Zeitquelle zu erstellen, da dies den Determinismus durchbricht.

🔗 Erfahren Sie mehr über das Sui Clock-Modul

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

420Beiträge611Antworten
Sui.X.Peera.

Verdiene deinen Anteil an 1000 Sui

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

BelohnungskampagneJuli