Bereitstellung von Hinweisen für Vault-Operationen

Alle Vault-Operationen, die das Kollateralisierungsverhältnis ändern, erfordern das Einfügen oder Wiedereinfügen in die SortedTrovesListe. Um Gasgebühren und die Rechenkomplexität beim Einfügen zu optimieren, können zwei Hinweise (Hints) bereitgestellt werden.

Ein Hinweis ist die Adresse eines Vaults, die sich in der Nähe der korrekten Einfügeposition in der sortierten Liste befindet. Vault-Operationen verwenden zwei Hinweis-Argumente: _lowerHint, das auf nextId verweist, und _upperHint, das auf prevId verweist—die beiden angrenzenden Knoten, die Nachbarn des zu bearbeitenden Vaults sind (oder werden). Diese Methode gewährleistet Widerstandsfähigkeit gegenüber Änderungen in benachbarten Vaults, bevor die Transaktion verarbeitet wird.

Die Wirksamkeit eines Hinweises reduziert die Gasgebühren erheblich, da der erforderliche Listendurchlauf minimiert wird. Die Funktion SortedList::findInsertPosition(...), die während Vault-Operationen aufgerufen wird, überprüft zuerst, ob _prevId gültig ist (mit einem größeren LACR als der einzufügende Vault) und steigt die Liste von dort aus ab. Wenn dies nicht erfolgreich ist, wird _nextId (mit einem kleineren LACR) überprüft und aufsteigend durchsucht.

Um nützliche Hinweise zu generieren, wählt die Funktion HintHelpers::getApproxHint(...) zufällig Vaults aus und gibt denjenigen zurück, der der Zielposition am nächsten liegt. Mathematisch wird mit numTrials = k * sqrt(n), wobei n die Listengröße ist, der Gasverbrauch typischerweise auf O(sqrt(n)) reduziert, wenn k >= 10. Diese Funktion akzeptiert auch einen zufälligen Seed (_inputRandomSeed), um bei aufeinanderfolgenden Aufrufen unterschiedliche Ergebnisse zu erzielen und die Genauigkeit der Annäherung zu verbessern.

Vault-Operation ohne Hinweis

  1. Der Benutzer startet eine Vault-Operation in seinem Browser.

  2. Die Operation wird mit _lowerHint = _upperHint = userAddress aufgerufen.

  3. Gasgebühr im schlimmsten Fall: O(n), wobei n die Größe der SortedTroves-Liste ist.

Vault-Operation mit Hinweisen

  1. Der Benutzer startet eine Vault-Operation in seinem Browser.

  2. Das Frontend berechnet lokal ein neues Kollateralisierungsverhältnis basierend auf den Änderungen am Kollateral und/oder den Schulden.

  3. HintHelpers::getApproxHint(...) wird mit dem berechneten Verhältnis aufgerufen, und es wird eine Vault-Adresse zurückgegeben, die sich nahe der richtigen Einfügeposition befindet.

  4. SortedTroves::findInsertPosition(...) wird mit dem ungefähren Hinweis (_prevId und _nextId) und dem neuen Verhältnis aufgerufen.

  5. Die genauen Nachbarn (_nextId als _lowerHint und _prevId als _upperHint) werden der Vault-Operation übergeben.

  6. Gasgebühren: Die Schritte 2-4 sind gasfrei, und Schritt 5 kostet O(1).

Durch die Verwendung von Hinweisen werden Vault-Operationen für Benutzer günstiger, allerdings mit einer geringfügig längeren Ausführungszeit, da die Ergebnisse von JSON-RPC-Anfragen (z. B. an Infura) abgewartet werden müssen, es sei denn, der Frontend-Betreiber betreibt eine Full Node.

Last updated