Beitrag
Teile dein Wissen.
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:
- Uhr-Objekt: Warum braucht Sui eine gemeinsame Uhr statt Block-Zeitstempel?
- Genauigkeit: Wie genau sind diese Zeitstempel im Vergleich zu Blockzeiten?
- Nutzungsmuster: Bewährte Methoden für Zeitsperren, Termine und Zeitplanung?
- 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
Antworten
2####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
Clock
ist 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
Clock
Referenz 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);
}
Wenn Sie in Sui Move an zeitsensitiven Logiken wie Auktionen oder Sperrzeitplänen arbeiten, sui::clock
ist 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.timestamp
Du 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.
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.
Verdiene deinen Anteil an 1000 Sui
Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?53
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung43
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert25
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?05