
Quelle: Gryphsis Academy
Dieser Forschungsbericht bietet eine detaillierte Interpretation des Arbeitsprinzips, der Projektzusammensetzung, der Quellcodeanalyse und anderer Teile des UNISWAPV2 -Protokolls.Das Arbeitsprinzip umfasst hauptsächlich automatische Markthersteller (AMMS) Hauptverträge (wie Fabrikverträge, Austauschverträge) und ihre Funktionen im Abschnitt Quellcodeanalyse analysieren, analysieren wir den Smart Contract -Code von UNISWAPV2 und erläutern die Entwurfskonzepte von Schlüsselfunktionen und Datenstrukturen.
1. Einführung in die Vereinbarung
UNISWAPV2 ist ein dezentrales Transaktionsprotokoll, das auf der Ethereum -Blockchain basiert und es Benutzern ermöglicht, Kryptowährungen ohne Vertrauen der Vermittler zu tauschen.Im Gegensatz zu herkömmlichen zentralisierten Börsen nimmt UNISWAPV2 das automatische Market Maker -Modell (AMM) an, um Transaktionen und Liquiditätspools durch intelligente Verträge zu verwalten, wodurch eine vollständige Dezentralisierung erreicht wird.
Der Kern von UNISWAPV2 ist seine konstante Produktformel (x * y = k),InXUndyRepräsentiert die Anzahl von zwei verschiedenen Vermögenswerten im Liquiditätspool.kist eine Konstante.Diese Formel stellt sicher, dass nach jeder Transaktion der Anteil der Vermögenswerte im Pool neu gestaltet wird und so Liquidität für Benutzer liefert.Dieses Design macht den Handelsprozess transparent und fair, und Benutzer können jederzeit Liquidität hinzufügen oder entfernen und durch Transaktionsgebühren Gewinne erzielen.
Das UNISWAPV2 -Protokoll besteht aus mehreren intelligenten Verträgen, von denen die wichtigsten Fabrikverträge und Austauschverträge sind.Fabrikverträge sind für die Erstellung und Verwaltung von Liquiditätspools verantwortlich, während jeder Austauschvertrag einem bestimmten Handelspaar (z. B. ETH/DAI) entspricht.
Darüber hinaus führte UNISWAPV2 auch Router -Verträge und Bibliotheksfunktionen ein, um die Transaktionseffizienz und -sicherheit zu verbessern.Im Vergleich zu seinem Vorgänger UNISWAPV1 bringt UNISWAPV2 mehrere wichtige Verbesserungen mit sich.Erstens ermöglicht die Lightning Exchange -Funktion den Benutzern, Vermögenswerte in einer einzigen Transaktion auszuleihen und sie zurückzugeben, bevor die Transaktion abgelaufen ist.Der zweite ist der Preis von Oracle, der zuverlässigere Preisdaten liefert, indem der preis zeitgewichtete Durchschnitt (TWAP) gesammelt wird.
Darüber hinaus unterstützt UNISWAPV2 direkte Transaktionen eines ERC-20-Tokens, ohne dass Ethereum als Vermittler verwendet werden muss.Der Erfolg von UNISWAPV2 liegt nicht nur in seiner technologischen Innovation, sondern auch in seinem offenen und gemeindenahen Entwicklungsmodell.Das UNISWAP -Protokoll kann jeden verwendet und erweitert, was unbegrenzte Möglichkeiten für das dezentrale Finanzierungs -Ökosystem (DEFI) einbringt.Viele andere Defi -Projekte wie Kreditplattformen und Stablecoin -Protokolle basieren auf UNISWAP, um ein florierendes Ökosystem zu bilden.
Im Allgemeinen hat UNISWAPV2 die Art und Weise, wie Kryptowährungstransaktionen durch sein innovatives Protokolldesign und das dezentrale Betriebsmodell transfiziert werden, vollständig verändert und ist zu einem wichtigen Eckpfeiler im Defi -Feld geworden.Mit der kontinuierlichen Entwicklung der Technologie und der kontinuierlichen Innovation der Community wird der Einfluss von UNISWAPV2 weiter erweitert, wodurch globale Nutzer mehr finanzielle Freiheit und Möglichkeiten bieten.
2. Protokollmerkmale
2.1 ERC-20-Paare
UNISWAPV1 wird Ethereum (ETH) als Übergangswährung verwenden, dh wenn der Benutzer Token und Tokenb austauschen möchte, muss er Token verwenden, um ETH zuerst auszutauschen, und dann ETH zum Austausch von Tokenb verwenden. Liquidität, es wird auf Liquiditätsanbieter enormer Kostendruck ausgeübt.Jeder Liquiditätsanbieter muss über eine Schnittstelle mit ETH ausgetauscht werden.
Wenn zwei Vermögenswerte ABC und XYZ assoziiert sind (z. B. sind sie beide US -Dollar Stablecoins), erleiden Liquiditätsanbieter auf UNISWAP in der Regel kleinere dauerhafte Verluste im ABC/XYZ -Paar im Vergleich zu ABC/ETH oder XYZ/ETH IST IST Right.Darüber hinaus erhöht die Verwendung von ETH als Zwangsübergangswährung die Kosten der Händler.Der Händler zahlt doppelt so viel wie den direkten Kauf von ABC/XYZ und erleidet auch zwei Ausrutscher.
In UNISWAPV2 dürfen Liquiditätsanbieter Paarverträge für zwei ERC-20-Token erstellen.Während der Anstieg der Anzahl der Transaktionspaare zwischen ERC-20-Token es möglicherweise komplizierter machen kann, einen bestimmten Asset-Transaktionspfad zu finden ).
2.2 Preis Orakel
Der Preis von UNISWAPV1 wird nach t -Zeit t berechnet, der Grenzpreis von UNISWAP (mit Ausnahme der Handhabungsgebühren) erhalten wird, indem der Reservenbetrag von Vermögenswert A durch den Reservenbetrag des Vermögenswerts b geteilt wird.Die spezifische Berechnungsformel lautet wie folgt:
UNISWAPV1 ist jedoch nicht sicher als On-Chain-Preis-Orakel, da es sehr einfach zu manipulieren ist.Der Manipulator verkauft zu Beginn eines Blocks eine große Menge an Vermögenswert A, um den Preis zu beeinflussen, und führt dann andere Vertragsvorgänge (Nicht-Uniswap-Paarverträge) in der Mitte des Blocks durch und kauft schließlich am Ende des Block.UNISWAP V2 führt einen Preisakkumulationsmechanismus ein, der es Dritten ermöglicht, den Durchschnittspreis eines bestimmten Bereichs zu verwenden, was die Schwierigkeit der Preismanipulation erheblich erhöht und das Manipulationsverhalten nicht wesentliche Vorteile hat.
Insbesondere UNISWAP V2 sammelt diesen Preis durch die Aufzeichnung der angesammelten Preisesumme zu Beginn jedes Blocks, bei dem jemand mit dem Vertrag interagiert.Jeder Preis wird basierend auf der seit dem Aktualisierung des vorherigen Blocks verstrichenen Zeit, basierend auf dem Block -Zeitstempel.Dies bedeutet, dass zu einem bestimmten Zeitpunkt (nach dem Update) der Wert des Akkumulators die Summe des Spotpreises für jede Sekunde in der Vertragsgeschichte sein sollte.
Um den zeitgewichteten Durchschnittspreis von Zeit T₁ bis T₂ abzuschätzen, kann ein externer Anrufer den Akkumulatorwert bei T₁ überprüfen, dann erneut bei T₂ überprüfen, den ersten Wert subtrahieren und durch die verstrichenen Sekunden dividieren.(Beachten Sie, dass der Vertrag selbst den historischen Wert dieses Akkumulators nicht speichert – der Anrufer muss den Vertrag zu Beginn des Zyklus anrufen, um diesen Wert zu lesen und zu speichern.)
Der Oracle -Benutzer kann wählen, wann der Zyklus starten und beenden soll.Wenn Sie einen längeren Zyklus auswählen, wird es für einen Angreifer teurer, den zeitgewichteten Durchschnittspreis (TWAP) zu manipulieren, obwohl dies zu einem niedrigeren neuesten Preis führt.Da der Durchschnittswert verwendet wird, ist der Durchschnittswert von A/B und B/A in einem bestimmten Intervall keine wechselseitige Beziehung mehr, daher bietet Uniswap V2 beide Preise.
2.3 Preisberechnung Genauigkeit
Da Solidität keine numerischen Datentypen von Nicht-isolen unterstützt, nimmt UNISWAPV2 das UQ112.112-Datenformat an, um die Genauigkeit der Preisberechnungen zu verbessern, und verwendet UINT112, um die Anzahl der Vermögenswerte im Transaktionspaar zu speichern, und verwendet 32 Bit, um die Erstellung aufzuzeichnen Zeit des aktuellen Blocks.Diese Zeit -Aufzeichnungsmethode führt dazu, dass Unix -Zeitstempel 100 Jahre später, 7. Februar 2106, überfließen.Dies liegt daran, dass UNIX -Zeitstempel seit dem 1. Januar 1970 die Zeit in Sekunden lang darstellen (genannt Unix -Ära), und Uint32 kann einen Bereich von 0 bis 2^{32} – 1 Sekunde darstellen, das sind ungefähr 136 Jahre.
Um sicherzustellen, dass das System am 7. Februar 2106 und darüber hinaus ordnungsgemäß funktioniert, ist Uniswapv2 so konzipiert, dass Orakel den Preis mindestens einmal über jeden anderen Überlaufzyklus (ca. 136 Jahre) überprüfen.Dies liegt daran, dass in diesem Design die Methode zum Anhäufung der Preise immer noch überflüssig ist, selbst wenn die Zeitstempel überlaufen sind und die Preisänderung auch dann korrekt berechnet werden kann, wenn sich die Transaktion über das Überlaufintervall erstreckt.Auf diese Weise wird das System für lange Zeit sichergestellt, dass das System genau und zuverlässig bleibt.
2.4 Blitzerlösung
Lightning Exchange ist ein sofortiger Kryptowährungsaustausch, der auf einer Blockchain -Plattform durchgeführt wird, bei der Benutzer die Transaktionen zwischen verschiedenen Kryptowährungen schnell abschließen können, ohne auf die Bestätigung mehrerer Blöcke zu warten.Solche Transaktionen werden normalerweise automatisch von intelligenten Verträgen ausgeführt, um sicherzustellen, dass beide Parteien der Transaktion ihre Austauschverpflichtungen gleichzeitig erfüllen und damit die Transaktionsrisiken verringern und die Effizienz verbessern.Kurz gesagt, Lightning Exchange bedeutet zuerst Handel und dann zurückzahlen.
Erklären wir die Blitzerlösung durch ein praktisches Beispiel. Menge an A.Durch den obigen Prozess haben wir die Preisdifferenz Arbitrage zwischen A0-A zu 0 Kosten abgeschlossen.Wir brauchen keinen Auftraggeber, wir müssen nur eine Gasgebühr zahlen.Wenn Sie feststellen, dass es einen Preisunterschied zwischen anderen Dexes in der Kette gibt, können Sie auch ähnliche Vorgänge mit Null -Kosten -Arbitrage ausführen.
2.5 Protokollgebühr
UNISWAPV2 führt eine Protokollgebühr von 0,05% ein, die ein- und ausgeschaltet werden kann.Wenn dies aktiviert ist, wird diese Gebühr an die im Fabrikvertrag festgelegte Feeto -Adresse gesendet.Anfangs wurde Feeto nicht festgelegt, so dass keine Gebühr erhoben wurde.Eine vorgegebene Adresse Feetosetter kann die Setfeeto-Funktion im UNISWAPV2-Werksvertrag aufrufen und Feeto auf einen anderen Wert setzen.Feetosetter kann auch als SetfeetoSetter bezeichnet werden, um die Feetosetter -Adresse selbst zu ändern.
Wenn die Feeto -Adresse festgelegt ist, beginnt das Protokoll eine 5 -Basis -Punktgebühr, die die 30 -Basispunkt -Gebühr von Liquiditätsanbietern \ Frac {1} {6} erhält.Das heißt, die Händler zahlen weiterhin 0,30% aller Transaktionsgebühren, von denen 83,3% (d. H. 0,25%) an Liquiditätsanbieter gezahlt werden und 16,6% (d. H. 0,05%) an die Feeto -Adresse gezahlt werden.Die Gebühr von 0,05% bei jeder Transaktion erhöht zusätzliche Gaskosten.Um dies zu vermeiden, werden die angesammelten Gebühren nur dann erhoben, wenn Liquidität abgelagert oder zurückgezogen wird.Der Vertrag berechnet die akkumulierten Gebühren und milderte neue Liquiditäts -Token für die Gebührenbegünstigten unmittelbar vor dem Minten oder zerstört.
Die akkumulierten Gebühren können berechnet werden, indem das Wachstum von √k (d. H. √ (x · y)) gemessen wird, da die Gebühr das letzte Mal berechnet wurde.Diese Formel gibt den kumulativen Aufwand für den Prozentsatz der Liquidität im Durchflusspool zwischen T₁ und T₂ als T₂ an:
Wenn die Gebühr vor T₁ aktiviert wird, sollte die Feeto -Adresse zwischen T₁ und T₂ nach ⅙ erfasst werden.Daher möchten wir einen neuen Liquiditäts -Token an die Feeto -Adresse prägen, die den Pool von φ · f₁, ₂ darstellt, wobei φ = ⅙.
Das heißt, wir möchten Sₘ auswählen, um die folgende Beziehung zu befriedigen, in der S₁ die Gesamtmenge der ausstehenden Aktien zum Zeitpunkt T₁ ist:
Nach einigen Berechnungen, einschließlich der Verwendung von 1-
Anstelle von f₁, ₂ und selevant sₘ können wir es neu schreiben wie:
Setzen Sie φ auf ⅙ und wir erhalten die folgende Formel
Lassen Sie es uns im Folgenden mit einem bestimmten Beispiel erklären.Nehmen wir an, dass der erste Einleger 100 DAI und 1 ETH in ein Paar einleitet und 10 Aktien erhalten.Nach einer Weile (keine anderen Einleger waren an der Paarung beteiligt) versuchten sie, Mittel zurückzuziehen. Zu diesem Zeitpunkt befanden sich 96 DAI und 1,5 ETH in der Paarung.Wenn wir diese Werte in die obige Formel ersetzen, erhalten wir das folgende Ergebnis:
2.6 Berechnung der Transaktionsgebühr
UNISWAPV1 Die Berechnung der Transaktionsgebühr ist die Formel
Diese Formel bedeutet, dass die konstante Produktformel erst zuerst reduziert und dann in der Version von UNISWAPV2 ausgeführt wird, da der Flash -Swaps -Mechanismus existiert, die Berechnung der Transaktionsgebühren an die Transaktionsgebühren angepasst werden.
2.7 sync () und Skim ()
Sync () wird verwendet, um die Anzahl der im Vertrag vorübergehend gespeicherten Vermögenswerte auf den aktuellen tatsächlichen Wert des Vertrags zu aktualisieren, hauptsächlich für Handhabungsfälle, in denen proportionale Ungleichgewichte und keine Liquiditätsanbieter verfügbar sind.Skim () wird verwendet, um die Situation zu bewältigen, in der die Anzahl der Vermögenswerte im Vertrag den Maximalwert von UINT112 überschreitet, sodass der Benutzer den Teil des Vermögens, der den Maximalwert von UINT112 überschreitet, zurückziehen kann.
2.8 Umgang mit nicht standardmäßigen und selten gebrauchten Token
Der Standard -ERC20 -Token -Vertrag muss nach der Übertragung des Tokens einen booleschen Wert zurücksenden, um anzugeben, ob die Übertragung erfolgreich ist, aber nicht alle Token werden dies tun.Einige Token geben keine Werte zurück.In UNISWAPV1 werden Token -Übertragungen ohne Rückgabewerte standardmäßig als Fehler angesehen, und die gesamte Transaktion wird zurückgesetzt.Und in UNISWAP V2 werden Token ohne Rückgabewerte als erfolgreich angesehen.
Darüber hinaus geht UNISWAPV1 davon aus, dass Token -Transfers nicht die Wiedereintritt des Transaktionspaars auslösen, sondern einige ERC20 -Token, die ERC777 -Hooks unterstützen, brechen diese Annahme aus.Um diese Token zu unterstützen, fügt UNISWAPV2 allen Funktionen für die Variablenveränderungen der öffentlichen staatlichen Variablen gegen Reentry-Sperrfunktionen hinzu und verhindert auch die Wiedereintritt von benutzerdefinierten Rückrufen in Flash-Swaps.
2.9 Einstellungen der Liquiditätsinitialisierung
Wenn der Benutzer Liquidität für ein vorhandenes Handelspaar A/B liefert, kann er basierend auf dem aktuellen Verhältnis von A und B berechnen, wie viele Verhältnisse A und B bereitgestellt werden sollen.Wenn jedoch ein Transaktionspaar initialisiert wird, gibt es kein Referenzverhältnis.In der Version von UNISWAPV1 wird bei einem neuen Liquiditätsanbieter Token in ein vorhandenes UNISWAP -Token -Paar eingeleitet, die auf der Grundlage der Anzahl der vorhandenen Token berechnet wird.Die spezifische Berechnungsformel lautet wie folgt:
Damit die erste Person Liquidität liefert, ist die FormelXstartingJa 0.Angesichts dieser Situation ist die von UNISWAPV1 angewandte Methode, dass der Wert der anfänglichen Liquidität direkt der anfänglichen ETH -Menge entspricht. bestimmt durch den Anteil der anfänglichen Liquidität.In UNISWAPV2 kann die Initialisierung der Liquidität durch die folgende Formel erfolgen
Diese Formel bedeutetSchmintendDies ist die Höhe der Liquiditäts -Token, die Sie erhalten.XdeposiertDies ist die Anzahl der ersten Token, die Sie beispielsweise einlegen, wenn Sie ETH einlegen, dann, dannXdeposiertEs ist die Höhe der ETH, die Sie hinterlegen.YdeposiertDies ist die Anzahl des zweiten Tokens, den Sie hinterlegen.
Zum Beispiel, wenn Sie DAI einlegen,YdeposiertEs ist die Höhe der DAI, die Sie hinterlegen.Diese Formel kann sicherstellen, dass der Anteil im Liquiditätspool niemals niedriger ist als der geometrische Durchschnitt im Pool, aber der Wert dieser Formel ändert sich auch mit der Änderung der Anzahl der Token im Pool, um die Zahl zu schwächen Von Token im Fondsbecken aufgrund der Auswirkungen der Änderung zerstörte UNISWAPV2 die anfängliche 1e-¹⁵-Liquidität, die 1000-mal so liquidiert ist, 1e-¹⁸.Obwohl dies für jedes Transaktionspaar trivial ist, erhöht es die Kosten von Angreifern, die von diesem Mechanismus profitieren, erheblich.
2.10 Weth
Da sich die Schnittstelle für den Handel mit der Native Currency ETH von Ethereum unterscheidet, die für den Handel mit ERC20 -Tokens unterscheidet, unterstützen viele Protokolle nicht direkt die ETH, sondern verwenden einen alternativen Weth (verpacktes ETH -Token).UNISWAPV1 ist eine Ausnahme, da seine Handelspaare direkt ETH enthalten, sodass Benutzer direkt mit ETH handeln können.UNISWAP V2 ist jedoch entwickelt, um Handelspaare zwischen ERC20 -Token zu unterstützen, und die direkte Unterstützung für die ETH kann das System erschweren und das Risiko erhöhen.
Daher wird ETH in UNISWAPV2 nicht direkt unterstützt, und die Benutzer müssen ETH in Weth konvertieren, bevor sie das Transaktionspaar verwenden.Tatsächlich konvertiert UNISWAPV2 die von Benutzer gelieferte ETH in Weth intern, was die Operationen der Benutzer vereinfacht, ohne die ETH manuell in Weth zu konvertieren.Während diese Konvertierung für jedes Transaktionspaar trivial ist, verbessert sie die Sicherheit und den Betrieb des Systems effektiv.
2.11 Deterministische Handelspaaradresse
Egal, ob es sich um Uniswapv1 oder UNISWAPV2 handelt, alle Paare werden durch einen einzigen Fabrikvertrag erstellt.In UNISWAPV1 wird der OPCODE erstellen verwendet, und die Adresse des Transaktion zu Contract wird durch die Reihenfolge beeinflusst, in der er erstellt wird.In UNISWAPV2 wird ein neuer Opcode create2 verwendet, und die von dieser Methode generierte Adresse wird bestimmt.Dies bedeutet, dass die Adresse des Transaktionspaars im Voraus außerhalb der Kette berechnet werden kann, ohne den Status in der Kette abzufragen.
2,12 maximale Anzahl von Token
Um Oracle -Funktionen effizient zu implementieren, verwendet UNISWAP V2 UINT112, um die Anzahl der Token zu speichern, was bedeutet, dass die maximal unterstützte Anzahl von Token 2¹² – 1 beträgt.Für Token mit einer Genauigkeit von 18 reicht dieser Wert ungefähr 5192296858534828 (5,19E¹⁵), dh 5,19 Billionen.Wenn der Datensatzwert im Vertrag diese Grenze überschreitet, schlägt die Transaktion fehl und wird zurückgesetzt.Wie bereits erwähnt, kann jeder mit der Funktion Skim () wiederherstellen und dieses Problem lösen, indem überschüssige Vermögenswerte aus dem Liquiditätspool entfernt werden.
3.. Analyse des UNISWAPV2 -Prinzips
UNISWAP ist ein automatisiertes Liquiditätsprotokoll, das von konstanten Produktformeln angetrieben und in nicht-upgradierbaren Smart Contract-Systemen auf der Ethereum-Blockchain implementiert wird.Es beseitigt die Notwendigkeit vertrauenswürdiger Vermittler, die Dezentralisierung, Zensurresistenz und Sicherheit priorisieren.Jedes UNISWAP-Smart-Vertrags- oder Währungspaar verwaltet einen Liquiditätspool, der aus zwei ERC-20-Token-Reserven besteht.Jeder kann Pool -Token austauschen, indem er den äquivalenten Wert jedes zugrunde liegenden Tokens einleitet und so ein Liquiditätsanbieter (LP) des Fondspools wird.Diese Token verfolgen prorierte LP -Aktien in der gesamten Reserve und können jederzeit die zugrunde liegenden Vermögenswerte einlösen.
Zunächst werden wir den automatischen Marktherstellungsmechanismus von UNISWAP einführen.
In,XRepräsentiert die Anzahl der Token a,yRepräsentiert die Anzahl der Token B,kist eine Konstante, die angibt, dass das Produkt der beiden Token im Pool unverändert bleibt.Wenn ein Händler auf UNISWAP handelt, ändert er die Anzahl der Token im Pool, indem er den Pool hinzufügen oder entfernt.Nach der konstanten Produktformel ändert sich die Anzahl eines anderen Tokens entsprechend, um das Produkt zu pflegenkKonstante.Diese Änderung bestimmt den Preis der Transaktion.
Wenn ein Händler beispielsweise mit Token A Token B austauschen möchte, müssen er eine bestimmte Anzahl von Token A zum Pool hinzufügen, was dazu führt, dass die Anzahl der Token B im Pool sinkt, wodurch der Preis geändert wird.Die Geschäftstätigkeit des Händlers werden sich entlang dieser Kurve bewegen und die Anzahl und den Preis von Token ändern.Jeder Punkt auf der Kurve erfüllt die konstante Produktbeziehung.
Das Arbeitsprinzip von UNISWAPV2 kann grob in drei Teile unterteilt werden: Liquiditätsanbieter, UNISWAP -Pool und Händler.Die Rolle der Liquiditätsanbieter besteht darin, dass Liquiditätsanbieter zwei Token (z. B. Token A und Token B) in einen Uniswap -Pool einlegen.
In dem in der Abbildung gezeigten Beispiel legt der Liquiditätsanbieter 10 Token A und 1 Token B ein;
Der Liquiditätsanteil im Pool wird durch den Liquiditäts -Token dargestellt, der zeigt, dass 12 Liquiditäts -Token in der Zahl auf dem Pool einreichen und einen weiteren Token austauschen können, den sie benötigen.Beispielsweise kann ein Händler 10 Token A einzahlt und eine Bearbeitungsgebühr von 0,3% zahlen, um 1 Token B aus dem Pool zu erhalten.
Schauen wir uns zunächst an, wie Liquiditätsanbieter (LPS) Liquidität liefern.Wie in der folgenden Abbildung gezeigt, legen Liquiditätsanbieter Token in UNISWAP -Pools ein, um die Liquidität zu erhöhen.
In der Abbildung beispielsweise legt der Liquiditätsanbieter 3 Token A und 1 Token B. einWenn Liquiditätsanbieter Token einlösen, erhalten sie Pool -Token, die ihre Liquiditätsanteile repräsentieren.In der Abbildung erhielt der Liquiditätsanbieter 12,4 Pool -Token.Die Token -Reserven im Pool erhöhen sich beispielsweise die Token -Reserven im Pool in der Abbildung 1210 Token A und 399 Token B.Mehr Liquidität hilft bei der Verringerung des Preisschupps und wird stabiler.
Die von UNISWAP verwendete konstante Produktformelx · y = kum die Preiskurve zu bestimmen.Die erhöhte Liquidität erweitert den niedrigen Schlupfbereich und verbessert die Preisstabilität von Transaktionen.Liquiditätsanbieter erhöhen die Liquidität im Pool, indem sie Token einlösen und entsprechende Liquiditätstoken im Gegenzug erhalten.Dies hilft Händlern nicht nur, stabilere Preise zu erhalten, sondern bietet auch Liquiditätsanbietern von Transaktionsgebühren Vorteile.
Aus der Sicht von Händlern, wie Händler Token austauschen und welche Auswirkungen das Handelsverhalten auf den UNISWAP -Pool haben.
Wie in der folgenden Abbildung gezeigt, möchten Händler Token auf UNISWAP austauschen.In der Abbildung beabsichtigt der Händler beispielsweise, 3 Token auszutauschen.Händler geben 3 Token A ein und zahlen eine Umgangsgebühr von 0,3%.Schließlich erhält der Händler etwa 0,997 Token BS als Ausgabe.Die Transaktion ändert den Reserveguthaben im Pool, was zu einem neuen Preis führt.Vor der Transaktion befanden sich 1200 Token A und 400 Token B im Pool.
Nach der konstanten Produktformelx · y = kEs gibt ungefähr 1203,009 Token A und ungefähr 399,003 Token B im Pool nach der Transaktion.UNISWAP -Verwendungx · y = kDie konstante Produktformel der Preiskurve ist definiert.Während der Händler wechselt, ändert sich auch die Anzahl der Token im Pool, und die Preiskurve passt auch an, um den neuen Preis zu bestimmen.
4. Quellcodeanalyse
4.1 Analyse des Kernbetriebsflussdiagramms
In diesem Abschnitt werden wir die drei am häufigsten verwendeten Operationen in UNISWAPV2 einführen, nämlich Liquidität, Entfernen von Liquidität und Austausch von Token.Wir werden die Verträge analysieren, die sie anrufen, und die Funktionen, die sie über das Flowdiagramm aufrufen, um ein tieferes Verständnis des Quellcode von UNISWAPV2 zu erlangen.
4.1.1 Liquidität hinzufügen
Wenn der Benutzer Liquidität hinzufügt, ruft der Benutzer zunächst den UNISWAPV2ROUTER an.
Die Addliquiditätsfunktion ruft den Uniswapv2Pair -Vertrag weiter auf. B vom Benutzer bereitgestellt (:::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::: Die Anzahl der LP -Token) und diese LP -Token dem Benutzer zuordnen. Aktualisieren Sie die Reserve.
4.1.2 Exchange -Token
Wenn ein Benutzer Token austauschen möchte, ruft er zunächst den Uniswapv2Router.Sol -Vertrag an, um die Anzahl der Eingangs -Token und die Mindestanzahl der Ausgabe -Token bereitzustellen.
Dann erhält die Funktion des UNISWAPV2ROUTER die Anfrage des Benutzers und verarbeitet die Funktion des Benutzers basiert auf der Anzahl der Eingangs -Token und -Reserven.Der spezifische Prozess ist wie folgt:
4.1.3 Entfernung der Liquidität
Der Benutzer ruft zunächst den UNISWAPV2ROUTER an. .
4.2 Kernvertrag
Der UNISWAPV2 -Kernvertrag ist ein zentraler Bestandteil von UNISWAP, einer dezentralen Handelsplattform, und verantwortlich für die Implementierung der Funktionen für automatisierte Market Maker (AMM).Im Gegensatz zu herkömmlichen Auftragsbüchern passt Uniswap Liquiditätspools und konstante Produktformeln überx · y = kdie Transaktion zu verwirklichen.Der Liquiditätsanbieter legt zwei Token in den Pool ein und erhält Liquiditätstoken als Anmeldeinformationen.Wenn ein Benutzer eine Transaktion durchführt, berechnet der Vertrag den Transaktionspreis basierend auf der Anzahl der Token im Pool und der konstanten Produktformel.UNISWAPV2 führte mehrere Verbesserungen ein, darunter ERC20 -Paare direkte Transaktionen, Preis -Oracle -Verbesserungen, Flash -Kredite und Protokollgebühren.Die Kernkomponenten des Kernvertrags enthalten die folgenden drei Dateien:
-
UNISWAPV2PAIR.SOL: Verwaltet Liquiditätspools für jedes Handelspaar, begeht mit Token -Börsen, Liquiditätserweiterungen und Entfernungen
-
UNISWAPV2FACTORY.SOL: Verantwortlich für das Erstellen und Verwalten von Transaktionspaaren
-
UNISWAPV2ERC20.SOL: Standardumsetzung von Liquiditätstoken, die den Anteil der Liquiditätsanbieter repräsentiert
4.2.1 UNISWAPV2 FACTORY.SOL
Die Rolle des UNISWAPV2Factory -Vertrags ist für die Erstellung und Verwaltung von Handelspaaren (Liquiditätspools) verantwortlich.Mit diesem Vertrag können Benutzer neue Handelspaare erstellen und alle erstellten Handelspaare aufzeichnen.Darüber hinaus verwaltet es Transaktionsgebühren, die Adressen und Setter -Adressen erhalten.Uniswapv2Factory.sol hat fünf Funktionen, schauen wir es uns getrennt an
-
Konstruktorfunktion: Konstruktorfunktion, verwendet zur Initialisierung von UNISWAPV2FAKTORY -Vertrag.Die Eingabe ist die Transaktionsgebühr -Setter -Adresse _FEETOSETTER und die Ausgabe ist keine.
-
AllpairsLength -Funktion: Gibt die Anzahl aller erstellten Transaktionspaare zurück.Der Eingang ist keiner und der Ausgang ist die Einheit der Anzahl aller Transaktionspaare.
-
CreatePair -Funktion: Erstellt ein neues Transaktionspaar.Der Eingang ist die beiden Token -Adressen von Tokena und Tokenb, und der Ausgang ist das erstellte Transaktionspaaradressenpaar.
-
SETFEETO -Funktion: Legen Sie die Annahmeadresse der Transaktionsgebühr fest.Die Eingabe ist die neue Annahmeadresse für Transaktionsgebühren _FEETO, und die Ausgabe ist keine.
-
SETFEETOSETTER -Funktion: Legt die neue Transaktionsgebühr -Setter -Adresse fest.Die Eingabe ist die neue Transaktionsgebühr -Setter -Adresse _FEETOSETTER, und die Ausgabe ist keine.
Die spezifische Codeanalyse lautet wie folgt:
CreatePair -Funktion
Die Funktion der CreatePair -Funktion besteht darin, ein Transaktionspaar mit Tokena und Tokenb zu erstellen. TokenB, gefolgt von Überprüfung der Adresse von Token0 und verlangt, dass die Adresse von Token0 nicht 0 betragen kann;
Überprüfen Sie, ob dieses Token -Paar vorhanden ist (GetPair [Token0] [Token1] == Adresse (0), ‚Uniswapv2: patexists‘). der Vertrag;
Verwenden Sie dann die Hash -Werte von Token0 und Token1 als Salzwert, um sicherzustellen Erstellen Sie dann einen Vertrag mit der Inline -Assembly Create2 -Anweisung, um die Einzigartigkeit und Vorhersagbarkeit der Vertragsadresse zu gewährleisten.
Initialisieren Sie dann den neu erstellten Tokenpaarvertrag, aktualisieren Sie die Zuordnungstabelle, zeichnen Sie die Adresse des Token -Paarvertrags auf und fügen Sie dann die neu erstellte Token -Pair -Vertragsadresse in die Liste aller Token -Paare hinzu und lösen schließlich gepaarte Ereignisse aus, um es zu benachrichtigen, um es zu benachrichtigen außerhalb neuer Token -Paare zu erstellen.
4.2.2 UNISWAPV2 ERC20.SOL
Die Hauptfunktion von UNISWAPV2erc20.Sol besteht darin, ERC-20-Token zu implementieren, was die ERC20-Standard-Token-Funktion implementiert, die speziell in UNISWAPV2-Liquiditätspools verwendet wird.Der Vertrag umfasst grundlegende Operationen wie Casting, Verbrennung, Genehmigung und Übertragung.Darüber hinaus unterstützt es die Berechtigungsfunktion und ermöglicht die Verwendung von Unterschriften zur Genehmigung von Token -Transfers.Schauen wir uns die Funktionen an, die einzeln enthält:
-
Konstruktorfunktion: Initialisieren Sie den Vertrag und setzen Sie Domain_separator für die Berechtigungsfunktion fest.Keine Eingabe, Ausgabe keine.
-
_mint Funktion: Mint -neue Token, Eingabe ist die empfangende Adresse „zu“ und Minzmenge „Wert“, Ausgabe ist nein
-
_burn Funktion: Zerstöre Token, Eingabe ist die Zerstörungsadresse von und der zerstörte Mengenwert, die Ausgabe ist keine.
-
_ ARTROVE FUNKTION: Genehmigen Sie Token -Übertragung, Eigentümeradressenbesitzer, genehmigter Adressverstände und genehmigter Mengenwert, Ausgabe Keine.
-
_transfer -Funktion: Übertragungstoken, Eingabe ist die Übertragungsadresse von, Empfangsadresse an und Übertragungsmengenwert, die Ausgabe ist keine.
-
Genehmigungsfunktion: Die Funktion der öffentlichen Genehmigungsfunktion, die Funktion besteht darin, die Funktion _ Approve aufzurufen, die Eingabe ist die öffentliche Genehmigungsfunktion der Genehmigungsfunktion, und die Ausgabe besteht darin, einen booleschen Wert zurückzugeben, um anzuzeigen, dass der Betrieb erfolgreich ist.
-
Übertragungsfunktion: Die Funktion besteht darin, die Funktion _transfer aufzurufen, die Eingabe soll die Adresse an und übertragen nummer
-
Übertragung von Funktion: Eine exponierte Autorisierungsübertragungsfunktion.Die Eingabe ist die Übertragungsadresse von der Empfangsadresse an und der Wert der Übertragungsmenge. Der Ausgang ist der Rückgabe -Boolean -Wert TRUE zeigt an, dass der Vorgang erfolgreich ist
-
Genehmigungsfunktion: Verwenden Sie die Signatur, um die Token -Übertragung zu genehmigen, die Signatur zu überprüfen und die _ Approve -Funktion aufzurufen. Die Ausgabe ist keine.
Die offizielle Quellcodeanalyse lautet wie folgt:
4.2.3 UNISWAPV2 -Paar.Sol
UNISWAPV2PAIR ist ein Handelspaarvertrag, der die Kernfunktion von UNISWAP V2 realisiert, nämlich den Liquiditätspool jedes Handelspaars verwaltet und betreibt.Dieser Vertrag ist für den Umgang mit dem Austausch von Token, die Addition und Entfernung der Liquidität und die Akkumulation der Preise verantwortlich.Es stellt sicher, dass nach jeder Transaktion die Reserve- und Preisinformationen des Transaktionspaars aktualisiert werden und entsprechende Ereignisbenachrichtigungen ausgelöst werden.Es gibt 11 Funktionen in UNISWAPV2PAIR.SOL, die in der folgenden Tabelle angezeigt werden:
Der offizielle UNISWAPV2PAIR.Sol -Code und die Kommentare sind wie folgt:
UNISWAPV2PAIR erbt Iuniswapv2Pair, UNISWAPV2ERC20.
Globale Variablen und Modifikatoren werden dann definiert
Die obige Minimum_Liquidity ist eine Konstante, die die Mindestanzahl von Liquiditäts -Token festlegt, die im Liquiditätspool aufbewahrt werden müssen, um sicherzustellen, dass Liquiditätsanbieter mindestens eine bestimmte Menge an Token beibehalten, wodurch die Erschöpfung der Liquidität vermieden wird. 10, das bei der Erstliquidität ausgebrannt ist; Die korrekte Funktionssignatur wird bei der Ausführung von Token -Transfers verwendet.
Die Fabrik wird verwendet, um die Adresse des UNISWAP V2 -Werksvertrags für den Transaktionspaarvertrag, Token0, Token1 zu speichern Produkt- und Transaktionszeitblock (Erstellung) Zeit;
Die Variablen von Price0cumulatival und Price1cumulatival werden verwendet, um die akkumulierten Werte der beiden Preise im Handelspaar aufzuzeichnen Um die Preisstabilität des Liquiditätspools aufrechtzuerhalten und Transaktionsgebühren zu berechnen, wird hauptsächlich für die Berechnung der Teambearbeitungsgebühren verwendet.
Der folgende Abschnitt des Dekors liefert einen Schließmechanismus, um Wiedereintrittsangriffe zu verhindern.
Die _; Wiederbeeinflussung von Angriffen und Rassenbedingungen.
Die folgende Funktion besteht darin, eine Möglichkeit zu geben, Informationen zu den aktuellen zwei Token -Reserven und dem zuletzt aktualisierten Zeitstempel des UNISWAPV2 -Transaktionspaarvertrags öffentlich abfragen und zurückzugeben.
Die Funktion der _Safetransfer -Funktion besteht darin, Token -Übertragungsvorgänge innerhalb des Smart -Vertrags durchzuführen und zu überprüfen, ob die Übertragung erfolgreich ist ist der detaillierte Code dieses Abschnitts.
Der folgende Konstruktor wird einfach verwendet, um die Fabrik zu initialisieren:
Die Funktion der Initialisierungsfunktion besteht darin, die Adressen der beiden am Transaktionspaarvertrag beteiligten Token festzulegen, und kann nur vom Fabrikvertrag aufgerufen werden, in dem das Transaktionspaar bereitgestellt wird, um sicherzustellen, dass der Initialisierungsprozess des Transaktionspaars sicher und kontrolliert.
Die Hauptfunktion der Funktion _UPDATE besteht darin, sicherzustellen, dass die Reservenbetrag und der Preisspeicher des Transaktion zu Contract den neuesten Status widerspiegeln können. eins.Die vier Eingabeparameter der Funktion _UPDate sind: Balance0 und Balance1, das den aktuellen Gleichgewicht der beiden Token im Transaktionspaar darstellt.Als nächstes werden wir die Bullet Point -Methode verwenden, um zu erklären, wie die Funktion _update implementiert wird:
-
Überprüfen Sie, ob der Saldo -Wert zu Überlauf führen kann: Verwenden Sie die Anweisung, um sicherzustellen, dass der Einkommensbilanz0 und das Saldo1 den Maximalwert von UINT112 nicht überschreiten, da Reserve0 und Reserve1 beim Speichern den Typ UINT112 verwenden, und die Sicherheit der Datentyp -Konvertierung ist erforderlich .
-
Notieren Sie die aktuelle Blockzeit: Erhalten Sie den Zeitstempel des aktuellen Blocks und führen Sie den Vorgang des Modulo 2^32 mit BlockTimestAmplast durch, um Blocktimestamp zu erhalten.Diese Operation liegt daran, dass der Blockstempel von Ethereum 32 Bit beträgt und wir uns nur um den Zeitunterschied innerhalb eines Blocks und nicht um die absolute Zeit kümmern.
-
Berechnen Sie die Zeitdifferenz: Berechnen Sie die Differenz zwischen der aktuellen Blockzeit und der letzten Aktualisierungszeit.Wenn zeitlich 0 beträgt, bedeutet dies, dass dies ein kontinuierlicher Aufruf innerhalb desselben Blocks ist, sodass der angesammelte Preiswert nicht aktualisiert wird.
-
Preiskumulativer Aktualisierung: Wenn die Zeitdifferenz größer als 0 ist und die Reserve nicht 0 ist, verwenden Sie die Mathematikbibliothek mit fester Punkte UQ112X112, um das Preisverhältnis zu berechnen und Price0cumulatival und Price1cumulativast zu aktualisieren.“Niemals überläuft“ hier bedeutet, dass, da der Zeitintervall -Zeitelaps vom Typ UINT32 ist, der Multiplizieren mit dem akkumulierten Preiswert (UINT224) keinen Überlauf verursacht.“+ Überlauf wird gewünscht“ bezieht sich auf den akkumulierten Wert des Preises, um Überlauf zu ermöglichen, da die Preisberechnung das Delta anstelle des absoluten Werts verwendet.
-
Reserve Aktualisieren: Weisen Sie den neuen Restbetrag Reserve0 und Reserve1 ab, um die Reserve des Liquiditätspools zu aktualisieren.
-
Update TimeStamp: Weisen Sie BlockTimestAmplast dem aktuellen Block -Zeitstempel zu, um sich auf das nächste Update vorzubereiten.
-
Auslöser -Synchronisationsereignis: Geben Sie ein Synchronisationsereignis über das Schlüsselwort EMIT aus, um den externen Hörer darüber zu informieren, dass die Reserve aktualisiert wurde.
Mit diesem Design kann Uniswapv2 bei der Verarbeitung großer Transaktionsmengen die Preiskontinuität und -genauigkeit aufrechterhalten und den durchschnittlichen Transaktionspreis durch das Änderungsvolumen auch dann, wenn der Block -Zeitstempel oder der akkumulierte Wert des Preises überfließen kann, genau berechnen.Dies wird erreicht, indem die Mathematik und den Zeitunterschied von festem Punkt geschickt verwendet wird.
In UNISWAPV2 werden den Benutzern eine Umgangsgebühr von 0,3% pro Transaktion berechnet.Ein Sechstel dieser Gebühr wird dem Entwicklungsteam zugewiesen, und der verbleibende fünf Sechstel wird dem Liquiditätsanbieter als Belohnung vergeben.Wenn die Handhabungsgebühr jedoch einmal pro Transaktion berechnet wird, erhöht dies die Gasgebühr des Benutzers zwangsläufig.
Daher wird in UNISWAPV2 die Handhabungsgebühr angesammelt und die Handhabungsgebühr nur dann zugewiesen, wenn sich die Liquidität ändert.Die Funktion von _Mintfee prüft zunächst, ob die Transaktionsgebühr aktiviert ist, und ermittelt die Gebührendressadresse.Wenn die Transaktionsgebühr nicht aktiviert ist und es eine Mündergebühr erfolgt (_klast ist nicht 0), setzen Sie den KLAST -Wert zurück.Dieser Gebührenmechanismus ist Teil von UNISWAPV2, um zusätzliche Anreize für Liquiditätsanbieter zu bieten.
Sₘ repräsentiert die Anzahl der flüssigen Token, die geprägt werden sollten, K₁ repräsentiert das Produkt von Reserven nach der vorherigen Liquiditätsereignis.
4.3 Periphery -Vertrag
Die Hauptfunktion von UNISWAPV2 -Peripherieverträgen besteht darin, als Brücke zwischen externen Konten und Kernverträgen zu dienen, einschließlich vier Teile: Schnittstellendefinition, Werkzeugbibliothek, Router und Beispielimplementierung.
4.3.1 Bibliotheken
Der Bibliotheksordner enthält vier Dateien
-
Safemath.Sol
-
Uniswapv2library.sol
-
UNISWAPV2LISCICITYMATHLIBRARY.SOL
-
Uniswapv2oraclelibrary.Sol
Als nächstes werden wir diese vier Sol -Dateien im Detail analysieren
Safemath.Sol
Safemath.sol wird verwendet, um überlaufsichere mathematische Operationen durchzuführen.Es enthält hauptsächlich drei Funktionen.
-
Funktion hinzufügen: Wird verwendet, um Additionsvorgänge von zwei nicht signierten Ganzzahlen sicher durchzuführen
-
Subfunktion: Wird verwendet, um Subtraktionsvorgänge von zwei unsignierten Ganzzahlen sicher durchzuführen
-
MUL -Funktion: Wird verwendet, um Multiplikationsvorgänge von zwei nicht signierten Ganzzahlen sicher durchzuführen
Die spezifischen Code -Kommentare sind wie folgt
Uniswapv2library.sol
UNISWAPV2LIBRARY.SOL bietet einige praktische Funktionen für die Interaktion und den Betrieb mit UNISWAP V2 -Austauschpaaren.
Diese Funktionen werden hauptsächlich zur Berechnung von Transaktionspfaden verwendet, Reserven erhalten, die Preise berechnen und Kettenberechnungen durchführen.Diese Bibliothek verwendet eine Bibliothek namens Safemath, um die Sicherheit mathematischer Operationen zu gewährleisten und einen Überlauf und Unterströmung von Ganzzahl zu vermeiden.UNISWAPV2LIBRARY.SOL Diese Datei enthält acht Funktionen:
-
SortTokens -Funktion: Gibt zwei Token -Adressen zurück, die nach der Adresse sortiert sind.Der Eingang besteht aus zwei Token -Adressen mit Tokena und Tokenb.Die Ausgabe ist die sortierte Token -Adresse Token0 und Token1.
-
Paarfunktion: Berechnet die Adresse der angegebenen Fabrikadresse und das Paar von zwei Token -Adressen, ohne externe Anrufe zu tätigen.Die Eingabe ist die Fabrik -Adressfabrik, die beiden Token adressiert Tokena und Tokenb.
-
GetReserves -Funktion: Holen Sie sich und sortieren Sie ein Paar Reserven.Die Eingabe ist die Fabrik -Adressfabrik, die beiden Token adressieren Tokena und Tokenb.
-
Zitatfunktion: Gibt die äquivalente Menge eines anderen Vermögenswerts basierend auf der angegebenen Vermögensmenge und der Reserve des Paares zurück.Geben Sie: Vermögensmenge A, Reservea und ReserveB.Der Ausgang ist der Betrag eines anderen Vermögenswerts.
-
GetAmountout -Funktion: Gibt die maximale Ausgangsnummer eines anderen Vermögenswerts basierend auf der Anzahl der Eingangsanlagen und den Reserven des Paares zurück.Die Eingabe ist die Anzahl der Eingangsvermögensbetrag, Reserve und Reserve.
-
GetAmountin -Funktion: Gibt die Anzahl eines anderen Vermögenswerts zurück, der auf der Anzahl der Ausgabevermögen und der Reserven des Paares eingegeben wird.Der Eingang ist der Ausgangsanlagenmengen, Reserve und Reserveout.
-
GetAmountSout -Funktion: Führen Sie die Kette GetAmountout -Berechnung auf einer beliebigen Anzahl von Paaren durch, die Eingabe ist die Werksadressfabrik, die Anzahl der Vermögenswerte, der Pfad;
-
GetAmountsin -Funktion: Führen Sie die Kette GetAmountin -Berechnung für eine beliebige Anzahl von Paaren durch, die Eingabe ist die Werksadressfabrik, die Ausgangszahl der Vermögensummen, der Pfad der Ausgabe;
Die detaillierten Kommentare zu UNISWAPV2Libray -Quellcode sind wie folgt:
Uniswapv2oraclelibrary.Sol
Die UNISWAPV2oraclelibrary.Sol -Datei enthält einige Hilfsmethoden für Operationen, die sich auf Oracle -Berechnung der Durchschnittspreise beziehen.Die Bibliothek enthält Methoden, um den aktuellen Block -Zeitstempel zu erhalten und den kumulativen Preis zu berechnen, um Gaskosten zu sparen und häufige synchrone Anrufe zu vermeiden.Es enthält zwei Funktionen wie folgt:
-
CurrentBlockTimestAMP -Funktion: Gibt den aktuellen Block -Zeitstempel zurück.Eingabe keine, der Ausgang ist der aktuelle Block -Zeitstempel, geben Sie UINT32 ein.
-
CurrentCumulativePrices -Funktion: Berechnet und gibt den akkumulierten Preis zurück.Die Eingabe ist das Transaktionspaaradressen -Paar, und die Ausgabe ist der kumulative Preispreis0cumulative und Price1cumulative und der aktuelle Block -Blockstempel -Blocktimestamp.
Der offizielle Quellcode von UNISWAPV2oraclelibrary.Sol ist wie folgt:
UNISWAPV2LISCICITYMATHLIBRARY.SOL
Der offizielle Quellcode von UNISWAPV2liquidityMathlibrary.Sol ist wie folgt
-
COMMUCTEPROFITMAXIMISIONTRADE -Funktion: Berechnet die Transaktionsrichtung und -größe, die den Gewinn maximiert.
-
GetReservesafterarBitrage -Funktion: Unter dem beobachteten „realen Preis“ werden die Reserven des Liquiditätspools nach Arbitrage -Transaktionen erhalten.
-
ComputeliquidityValue -Funktion: Berechnet Liquiditätswert, alle Parameter eines bestimmten Liquiditätspools.
-
GetLiquidityValue -Funktion: Erhält alle aktuellen Parameter und berechnet den Wert des Liquiditätsbetrags.
-
GetLiquiditätsvalua -Funktionsfunktion: Bei zwei Token und ihrem „realen Preis“ sowie des Liquiditätsbetrags geben Sie den Wert der Liquidität zurück.
UNISWAPV2ROUTER02.SOL
Schauen wir uns zunächst den Quellcode von UNISWAPV2ROUTER02 an.
Konstruktoren und Modifikatoren
-
Konstruktor (Adresse _factory, Adresse _WETH): Initialisieren Sie die Fabrikvertragsadresse und die WETH -Vertragsadresse.
-
Modifikator Sicherstellen (UINT -Frist): Stellen Sie sicher, dass die Transaktion vor Ablauf der Frist abgeschlossen ist.
Funktionen, die ETH erhalten
-
Empfangen () extern zu zahlbar: ETH erhält, nur Anrufe von Weth -Verträgen sind zulässig.
Liquidität hinzufügen
-
_addliquidity: Eine interne Funktion, die zum Hinzufügen von Liquidität verwendet wird, berechnen Sie die optimale Anzahl von Token basierend auf den vorhandenen Reserven.
-
Addliquidität: Fügen Sie Liquidität von zwei ERC-20-Token hinzu.
-
Addliquidityeth: Fügen Sie Liquidität von ERC-20-Token und ETH hinzu.
Liquidität entfernen
-
Removeliquidität: Entfernt die Liquidität von zwei ERC-20-Token.
-
REMOVEVELICIDICITYTH: Entfernt die Liquidität von ERC-20-Token und ETH.
-
REMOVEVILICITY WITHPERMIT: Entfernt die Liquidität von zwei ERC-20-Token mit Lizenz.
-
REMOVEVILICITYTHWITHPERMIT: ERC-20-Token und ETH-Liquidität mit Lizenz entfernt.
-
REMOVEVICIDICITYTHSUPPORTINGFEEONTRANSFERTOKENS: Entfernt die Liquidität von ERC-20-Token und ETH und unterstützt Gebühren-Token.
-
REMOVELICIDICITYETHWITHPERMITSUMPORTINGFEEONTRANSFERTOKENS: Entfernt die Liquidität von ERC-20-Token und ETH mit Lizenz, unterstützt Gebühren-Token.
Token -Austausch
-
_SWAP: Interne Funktion, führt Token Exchange Logic aus.
-
SWAPEXACTTOKENSFORTOKENS: Verwenden Sie die genaue Anzahl von Token, um gegen einen anderen Token auszutauschen.
-
SwaptokensforexactTokens: Verwenden Sie Token, um eine genaue Anzahl anderer Token auszutauschen.
-
swapexactethforkens: Verwenden Sie die genaue Anzahl von ETH, um Token auszutauschen.
-
Swaptokensforexacteth: Verwenden Sie Token, um die genaue Menge an ETH auszutauschen.
-
SWAPEXACTTOKENSForeth: Tauschen Sie die ETH mit der genauen Anzahl von Token aus.
-
SwaptheForexactTokens: Verwenden Sie die ETH, um die genaue Anzahl von Token auszutauschen.
-
SWAPEXACTTOKENSFORTOKENSSUPTRORTINGFEEONTRANSFERTOKENS: Verwenden Sie die genaue Anzahl von Token, um ein anderes Token zu wechseln, um Gebühren -Token zu unterstützen.
-
SWAPEXACTETHFORTOKENSSUPTRORTINGFEEONTRANSFERTOKENS: Verwenden Sie die genaue Anzahl der ETH -Austausch -Token, die Gebühren -Token unterstützen.
-
SWAPEXACTTOKENSFORETHSUPPORTINGFEEONTRANSFERTOKENS: Verwenden Sie die genaue Anzahl von Token, um ETH zu tauschen, und unterstützt Gebühren -Token.
Bibliotheksfunktionen
-
Zitat: Berechnen Sie die Anzahl der Token B, die einer gegebenen Menge an Token A entspricht, basierend auf dem Reservenbetrag.
-
GetAmountout: Berechnet die Anzahl der Ausgänge, die angesichts der Anzahl der Eingänge und Reserven erhalten werden können.
-
GetAmountin: Berechnet die Anzahl der für eine bestimmte Ausgangsmenge und Reservenmenge erforderliche Eingänge.
-
GetAmountSout: Berechnen Sie die Ausgabennummer basierend auf dem Pfad und der Eingangsnummer.
-
GetAmountsin: Berechnen Sie die Anzahl der Eingänge basierend auf dem Pfad und der Anzahl der Ausgänge.
Schauen wir uns die Funktionen nacheinander an.
Der Vertrag von UNISWAPV2ROUTER02 implementiert die IUNISWAPV2ROUTER02 -Schnittstelle und bietet die folgenden Schlüsselfunktionen:
-
Liquidität hinzufügen: Ermöglicht Benutzern, den Liquiditätspool im Austausch für Liquiditätsanbieter -Token zwei Token hinzuzufügen.
-
Liquidität entfernen: Lassen Sie die Liquiditätsanbieter ihre Liquiditätsanbieter -Token an beide Token aus.
-
Transaktionen: Ermöglicht Benutzern den Handel zwischen verschiedenen Token und unterstützt direkte Transaktionen und Pfade durch mehrere Handelspaare.
-
Anführungsberechnung: Bietet eine Reihe von Funktionen zur Berechnung der Transaktionsdetails, wenn ein bestimmtes Eingang oder ein Ausgangsvolumen.
Mit dem Modifikator wird überprüft, ob die aktuelle Blockzeit die neueste Transaktionszeit überschreitet, und stellt sicher, dass die vom Benutzer angegebene Transaktion aufgrund von Zeitüberschreitungen nicht fehlschlägt, wodurch die Sicherheit und Zuverlässigkeit der Transaktion verbessert wird.
Der Konstruktor initialisiert die Projektvertragsadresse und die WETH -Vertragsadresse, die beide während des gesamten Lebenszyklus des Vertrags unverändert sind.
Die Empfangsfunktion wird normalerweise verwendet, um einen Vertrag direkt zu ermöglichen und über einen Funktionsaufruf direkt zu empfangen.In diesem speziellen Beispiel verwendet die Empfangsfunktion die Assert -Anweisung, um sicherzustellen, dass nur der Weth -Vertrag Äther an sie senden kann.
Der Zweck der Funktion _addliquidity besteht darin, die optimale Anzahl von zwei Token zu berechnen, die der Benutzer beim Hinzufügen von Liquidität ablegen muss.Es gibt sechs Parameter für diese Funktion. Benutzer, um eine Menge hinzuzufügen, um zu verhindern, dass der Schlupf zu niedrig ist.
Diese Berechnung berücksichtigt die Menge an Token -Reserven, die bereits im Liquiditätspool sind, um sicherzustellen, dass die vom Benutzer hinzugefügte Liquidität ausgeglichen ist.Wenn der Liquiditätspool neu ist und es keine vorhandene Reserve gibt, können Benutzer den gewünschten Betrag direkt hinzufügen.Wenn im Pool bereits eine Reserve vorhanden ist, berechnet die Funktion die optimale Anzahl von Ergänzungen basierend auf dem aktuellen Anteil und stellt sicher, dass der Anteil der Token im Pool nach hinzugefügter Liquidität unverändert bleibt.
Die öffentliche Funktion der Addliquidität, dem Liquiditätspool der angegebenen zwei Token (Tokena und Tokenb) Liquidität zu verleihen
Die Addliquidityeth-Funktion ermöglicht den UNISWAPV2-Liquiditätspool im Austausch für den entsprechenden Liquiditäts-Token, dass diese Funktion sechs anerkannte Parameter hinzufügen können. von Nichtether-Token, die der Benutzer hinzufügen möchte, ist untergeordnetes Minim der Mindestanzahl von Nicht-Enten-Token, die der Benutzer akzeptieren kann, um zu verhindern Wird verwendet, um zu verhindern, dass ein zu niedriger Abfall zu niedrig ist, und die Adresse des Empfangs neu geprägter Liquiditäts -Token ist die Frist für die Transaktion, die zur Verhinderung von Transaktionszeitüberschreitungen verwendet wird.
Die Funktion gibt drei Parameter zurück: Antexte und Menge sind die Menge an Nichtether- und Ethermünzen, die tatsächlich zum Liquiditätspool hinzugefügt werden, und die Liquidität ist die Anzahl der neu geprägten Liquiditäts-Token.
Mit der Removeliquiditätsfunktion können Benutzer die zuvor aus dem Liquiditätspool hinzugefügte Liquidität entfernen und zwei Token proportional erhalten.Die Verbrennungsfunktion ist eine zugrunde liegende Funktion im Iuniswapv2Pair -Liquiditätspool -Vertrag, die zur Durchführung der tatsächlichen Liquiditätszerstörung und der Token -Allokation -Operationen verwendet wird.
Mit der Funktion Removeliquidityeth können Benutzer die Liquidität, die sie zuvor mit Ether aus dem UNISWAPV2-Liquiditätspool hinzugefügt haben, entfernen und entsprechende Nichtether bzw. Ether erhalten.Die Funktion ruft zuerst die Entfernung von der Entfernung auf, extrahiert dann das entsprechende Token durch Safetransfer, ersetzt dann die aus der Verbrennungsliquidität extrahierte Weth und überträgt dann die eingelöste ETH an den Empfänger.
Mit der Funktion Removeliquidity WithPermit können Benutzer über ECDSA -Signaturen autorisieren und die Vertragsabläufe im Namen der Benutzer ohne die vorherige Genehmigung des Benutzers über die Genehmigungsfunktion entfernen.
Die Funktion RemoveliquidityethWithPerMit kombiniert die Removeliquidität und erlaubt Autorisierungsmechanismen, sodass Benutzer Liquidität durch Unterzeichnung eines einmaligen Autorisierungsvertrags entfernen können, ohne den Standard-Genehmigungsmodus zu verwenden.Dies bietet eine bessere Benutzererfahrung und -sicherheit und senkt gleichzeitig die Gaskosten von Transaktionen.
Mit der Funktion „RemoveliquidityethSupportingFeeOntransferTokens“ können Benutzer die zuvor mit spezifischen Token hinzugefügte Liquidität entfernen, unter Berücksichtigung, dass einige Token bei der Übertragung Gebühren erheben können.
Die Funktion ruft zunächst die Entfernung von der Entfernung auf, um die Liquidität zu entfernen, und behandelt dann die Übertragung von Token, um sicherzustellen, dass der Benutzer die Anzahl der von ihm verdienten Token erhält, und konvertiert schließlich die Weth zurück in Ether und überträgt sie an den Benutzer.Der gesamte Vorgang muss abgeschlossen sein, bevor der vom Benutzer angegebene Transaktionsfrist angegeben ist.
REMOVELICIDICITYTHWITHPERMITSSUPPORTINGINGFEEONTRANSFERTOKENS-Funktion kombiniert die RemoveLiquidityThSupportingFeeOntransferTokens und ermöglichen Sie den Benutzern, dass Benutzer durch die Unterzeichnung eines einmaligen Autorisierungsvertrags entfernen können, während die für die Übertragung angeklagten Vertragsbeschwerden verarbeitet werden können.
Dieser Ansatz bietet eine Möglichkeit, Verträge für den Betrieb von Benutzervermögen zu autorisieren, ohne den Genehmigungsmodus zu verwenden, die Gaskosten zu senken und die Benutzererfahrung zu verbessern.
Die _swap -Funktion ist eine interne Funktion, die eine Reihe von Token -Austauschoperationen ausführt.Es wechselt von einem Token zum anderen nach dem angegebenen Pfad und der Menge, bis das endgültige Token erreicht ist.Diese Funktion ist der zentrale Bestandteil der Interaktion mit Liquiditätspool, die zur Implementierung von Token -Conversion- und Liquiditätspool -Aktualisierungen verwendet wird.
Die Funktion SWAPEXACTTOKENSFORTOKENS ist eine wichtige Funktion des UNISWAPV2 -Routers, mit dem Benutzer mindestens ein minimales Ausgabe -Token mit einer genauen Eingangsmenge austauschen können.Diese Funktion berechnet zunächst die Ausgabe des gesamten Austauschpfads und stellt dann sicher, dass die endgültige Ausgabe den Mindestanforderungen des Benutzers erfüllt, dann die Token vom Benutzer sicher vom Benutzer in den Liquiditätspool überträgt und den Austauschvorgang durchführt.
Mit der Funktion SwaptokensforexactTokens können Benutzer die Anzahl der Token angeben, die sie erhalten möchten, und bietet Token, die den Maximalwert für den Austausch nicht überschreiten.Diese Funktion berechnet zunächst die maximale Eingabe, die erforderlich ist, um den Betrag zu erhalten, und stellt dann sicher, dass diese Eingabe nicht den vom Benutzer angegebenen Betrag überschreitet.
Mit der Funktion SWAPEXACTETHFORTOKENS kann der Benutzer mindestens eine bestimmte Anzahl anderer Token mit einer genauen Menge ETH austauschen.Diese Funktion überprüft zunächst, ob der Austauschpfad gültig ist, dann berechnet die erforderliche Anzahl von Weth, spart die ETH in den Weth -Vertrag, führt dann den Austauschvorgang durch und sendet die vom Benutzer angegebenen Adresse an die von dem Benutzer angegebene Adresse.Der gesamte Vorgang muss abgeschlossen sein, bevor der vom Benutzer angegebene Transaktionsfrist angegeben ist.
Die Funktion der Funktion der Swapexactethfortokens besteht darin, eine festgelegte Anzahl von ETH im Austausch für andere Token zu verkaufen.Führen Sie zunächst effektive Pfadüberprüfungen durch, um sicherzustellen, dass das erste Element des Pfadarrays die Weth -Adresse ist, da das UNISWAP -Transaktionspaar ein ERC20/ERC20 -Transaktionspaar ist.
Als nächstes wird die Ausgabemenge berechnet, verwenden Das Mengenarray ist als nächstes die Mindestausgangsüberprüfung durchzuführen, und die Funktion prüft, ob das letzte Element im Mengenarray (d. H. Die Anzahl der Ziel -Token) der Mindestausgangsmenge entspricht, die von der Benutzerkontrolle eingestellt ist.
Wenn es nicht erfüllt ist, wird ein Fehler geworfen. In der angegebenen Transaktionspaarvertragsadresse Weth wird die Transaktion zurückgeführt, und schließlich wird die interne Funktion _swap aufgerufen, um den tatsächlichen Token -Austauschprozess auszuführen.
Swaptokensforexacteth ist ein Prozess des Verkaufs anderer Token im Austausch für eine bestimmte Menge an ETH. , die Adresse, an die die ETH empfangen wird, und die Frist für Transaktionen;
Zunächst wird die Pfadvaliditätsprüfung überprüft, um sicherzustellen, dass das letzte Element des Austauschpfads die WETH -Adresse ist, und wenn nicht, wird eine Ausnahme als nächstes die Eingabebetragsberechnung und die UNISWAPV2LIBRARY.GetAmountsin -Funktion verwendet, um die Erzeugung zu berechnen, um die Erzeugung zu berechnen, um die Erzeugung zu berechnen, um die Erzeugung zu berechnen. Damit der Benutzer die Anzahl der ETH -Münzen erhalten muss, stellen Sie sicher, dass die berechnete Anzahl der vom Benutzer festgelegten Token nicht überschreitet die SafetRansferfrom -Funktion von TransferHelper, um Token aus der Adresse von MSG.Sender sicher zu übertragen;
Rufen Sie als Nächstes den tatsächlichen Token -Austauschprozess die Funktion des WETH -Vertrags an, um die ausgetauschte Weth in ETH zu konvertieren. Benutzer.
Die Funktion der Funktion SWAPEXACTTOKENSForeth wird verwendet, um mindestens die Anzahl der ETH mit einer festen Anzahl von Token auszutauschen. Um den Anbieter zu erhalten, ist der Token -Austauschpfad, die Adresse, an die die ETH empfangen wird, und die Frist der Transaktion ist die Frist der Implementierung.
Mit der Funktion von SwaptheForexactTokens können Benutzer eine feste Anzahl von Token mithilfe von ETH austauschen, und die Implementierungslogik ähnelt dem oben genannten SwapexactTokensforeth, Swaptokensforexacteth.
Die Funktion _swapsupportingFeeOntransferTokens unterstützt die Logik des Token -Austauschs für Transaktionsgebühren.
SWAPEXACTTOKENSFORTOKENSSUPTRORTINGFEEONTRANSFERTOKENS Die feste Anzahl von Token wird mindestens die erwartete Anzahl eines anderen Tokens genau ausgetauscht, während der Fall von Transaktionsgebühren -Token bearbeitet wird.
swapexactethOffortokensSupportingFeeOntransferTokens implementiert die Verwendung einer bestimmten Anzahl von ETH, um andere Token auszutauschen
Die SwapexactTokensForethSupportingFeeOntransferTokens -Funktion ermöglicht es dem Benutzer, mindestens die erwartete ETH -Menge mit einer festen Anzahl von Token genau zu tauschen, während die Transaktionsgebühren -Token abwickelt und eine genaue Übertragung von ETH sichergestellt wird.
Die Zitatfunktion implementiert die Funktion der Berechnung und Rückgabe der Anzahl anderer Token, die der Benutzer basierend auf der Anzahl der vom Benutzer angegebenen Token und der Reserve von zwei Token im Liquiditätspool austauschen kann.
Die Berechnungsprinzipien der GetAmountout -Funktion und der GetAmountSout -Funktion sind beide konstante Produktalgorithmen.Definieren Sie die Funktion GetAmountout, um den Ausgangsbetrag zu berechnen, den der Benutzer nach einem bestimmten Eingangsbetrag und der Reservenbetrag erhalten kann.
Das Berechnungsprinzip von GetAmountin und GetAmountsin besteht darin, die Anzahl der auf dem konstanten Produktalgorithmus verkauften Vermögenswerte zu berechnen.
4.3.2 UNISWAPV2 Migrator.Sol
UNISWAPV2Migrator.sol wird verwendet, um die Liquidität von UNISWAP V1 auf UNISWAP V2 zu migrieren.Dieser Vertrag beinhaltet die Möglichkeit, ETH zu erhalten und UNISWAP V1- und V2 -Router zu verwenden, und Austauschverträge für die Migration.Es stellt sicher, dass Benutzer ihre Liquidität in UNISWAP V1 sicher auf UNISWAP V2 übertragen können.Es gibt drei Funktionen, und die spezifischen Funktionen jeder Funktion sind wie folgt:
-
Konstruktorfunktion: Konstruktorfunktion, verwendet, um den Uniswapv2Migrator -Vertrag zu initialisieren.Die Eingabe ist die V1 -Fabrikadresse _factoryv1 und V2 -Router -Adresse _router;
-
Empfangsfunktion: Empfängt ETH und ermöglicht den Vertrag, ETH von V1 -Switch und Router zu erhalten.Keine Eingabe, Ausgabe keine.
-
Migratfunktion: Die Eingabe ist Token -Adress -Token, minimaler Token -Zahlenmengen, minimales Eth -Mengenmengen, Empfangsadresse an, die Ausgabe ist keine
Der offizielle Quellcode von UNISWAPV2Migrator wird wie folgt ausführlich analysiert:
4.3.3 Schnittstellenordner
Der Schnittstellenordner enthält Schnittstellendefinitionen für die Interaktion mit UNISWAPV1- und V2 -Börsen, Routern, Fabriken sowie Weth- und ERC20 -Verträgen.Zu den wichtigsten Funktionen gehören das Verwalten und Migrieren von Liquidität, Handhabung des Handels mit dem Handel, das Hinzufügen und Entfernen von Liquidität sowie das Verpacken und das Auspacken von ETH.Diese Schnittstellen gewährleisten standardisierte Wechselwirkungen zwischen Verträgen.Schauen wir uns den Inhalt jeder Datei ausführlich an.
Iuniswapv1Exchange.sol
Diese Datei definiert eine Schnittstelle iuniswapv1Exchange, mit der mit UNISWAPV1 -Exchange -Verträgen interagiert wird.Der Austauschvertrag ist hauptsächlich für die Behandlung von Transaktionen und Liquiditätsmanagement zwischen Token und ETH verantwortlich.Es enthält die folgenden vier Funktionen:
-
Guthabenfunktion: Gibt den Restbetrag einer Adresse im Wechselvertrag zurück.
-
Übertragung von Funktion: Übertragung von Token von einer Adresse an eine andere.
-
TokentoethSwapinput -Funktion: Wird verwendet, um Token in Ether auszutauschen.
-
EthtotokensWapinput -Funktion: Austauschen Sie Ether in Token.
Iuniswapv1factory.Sol
Iuniswapv1factory.Sol Es wird verwendet, um mit den Fabrikverträgen von UNISWAPV1 zu interagieren.Die spezifische Codeanalyse lautet wie folgt:
Ierc20.sol
IERC20.Sol definiert eine Schnittstelle namens IERC20, die dem Ethereum-Token-Standard (ERC-20) folgt (ERC-20)
Iuniswapv2Migrator.sol
Iuniswapv2Migrator.Sol wird verwendet, um mit dem Migrationsvertrag von UNISWAP V2 zu interagieren.
Iuniswapv2Router01.Sol
Die IunisWAPV2Router01 -Schnittstelle bietet eine Vielzahl von Funktionen, einschließlich Liquiditätsabschluss und Entfernung, Token -Austausch usw. Diese Funktionen sind der Kern des Aufbaus einer dezentralen Handelsplattform und Liquiditätspool.Über diese Schnittstelle können Benutzer problemlos mit dem UNISWAPV2 -Protokoll interagieren.
Iuniswapv2router02.sol
Die Methode in der IUNISWAPV2ROUTER02.SOL -Schnittstelle erhöht hauptsächlich Unterstützung für Übertragungsgebühren, wodurch Liquiditätsanbieter oder Token -Inhaber einen Teil der Gebühren erhalten können, wenn sie Token übertragen.Die Implementierung dieser Methoden ruft normalerweise den entsprechenden Tokenvertrag unten auf, um die während der Übertragung erhobene Gebühr zu erkennen.
Iweth.sol
Iweth.sol definiert eine Schnittstelle namens IWETH, die eine Standardschnittstelle über Ethereum für die Interaktion mit WETH -Verträgen (Wechselgepackte (Weth) darstellt.