Bereitstellung von Hinweisen für Vault-Operationen
Alle Vault-Operationen, die das Kollateralisierungsverhältnis ändern, erfordern das Einfügen oder Wiedereinfügen in die SortedTroves
Liste. 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
Der Benutzer startet eine Vault-Operation in seinem Browser.
Die Operation wird mit
_lowerHint = _upperHint = userAddress
aufgerufen.Gasgebühr im schlimmsten Fall:
O(n)
, wobein
die Größe derSortedTroves
-Liste ist.
Vault-Operation mit Hinweisen
Der Benutzer startet eine Vault-Operation in seinem Browser.
Das Frontend berechnet lokal ein neues Kollateralisierungsverhältnis basierend auf den Änderungen am Kollateral und/oder den Schulden.
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.SortedTroves::findInsertPosition(...
) wird mit dem ungefähren Hinweis (_prevId
und_nextId
) und dem neuen Verhältnis aufgerufen.Die genauen Nachbarn (
_nextId
als_lowerHint
und_prevId
als_upperHint
) werden der Vault-Operation übergeben.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