C++, Rust und dezentraler Krypto-Austausch: Anwendbarkeit und Effizienz

C++, Rust und dezentraler Krypto-Austausch: Anwendbarkeit und Effizienz

C++, Rust und dezentraler Krypto-Austausch: Anwendbarkeit und Effizienz

Einführung

Sprachargumente werden bei Krypto besonders irreführend, weil die Systeme selbst so leicht falsch beschrieben werden können. Die Leute sagen „bauen Sie einen DEX“, als ob eine dezentrale Börse eine ausführbare Datei mit einem Latenzprofil, einem Vertrauensmodell und einer Art von Fehler wäre. In Wirklichkeit ist ein ernsthafter DEX ein vielschichtiger Organismus. Dazu können On-Chain-Logik, Validator- oder Node-Interaktionen, Blockbuilding-Bewusstsein, Mempool-Überwachung, Marktdatenerfassung, Zustandssimulation, Preisgestaltung, Routing, Risikoprüfungen, Betreiber-Dashboards und manchmal Orderbuch- oder Matching-Adjacent-Dienste gehören, die verdächtig nach traditioneller Börseninfrastruktur mit Blockchain-Vokabular aussehen.

Sobald wir diese vielschichtige Realität anerkennen, wird der Streit zwischen C++ und Rust ruhiger und viel nützlicher. Die richtige Frage ist nicht, welche Sprache der gesamten Architektur als Ehrensache gebührt. Die richtige Frage ist, welche Schichten von der Sicherheit und der Ökosystemtauglichkeit von Rust profitieren, welche Schichten immer noch die Leistungskontrolle auf niedriger Ebene von C++ belohnen und wo Hybriddesign aufhört, Kompromisse zu sein, sondern einfach sinnvoll ist.

Dieser Rahmen ist wichtig, da dezentrale Börsensysteme einem gemischten Druck ausgesetzt sind. Einige Schichten werden am härtesten für Korrektheitsfehler, Überprüfbarkeitsprobleme und unsichere Zustandsübergänge bestraft. Andere Schichten werden wegen Latenz, Durchsatz und der Unfähigkeit, Chancen schnell genug zu bewerten, bestraft. Wieder andere sind Betriebsdienste, bei denen die tatsächlichen Kosten in der langfristigen Wartung und der Teamgeschwindigkeit liegen. Eine Sprache kann für eine dieser Belastungen hervorragend sein und für eine andere lediglich ausreichend sein. Reife Architektur beginnt, wenn wir das offen zugeben.

Ein DEX ist ein Stack, keine Identitätserklärung

Die erste und wichtigste Korrektur ist konzeptioneller Natur. Ein DEX ist keine Sache. Ein EVM-orientiertes AMM-Protokoll, ein Solana-natives Programmökosystem, ein App-Chain-Perpetuals-Exchange und ein Suchsystem, das auf Marktbedingungen reagiert, erfordern alle unterschiedliche technische Instinkte. Die On-Chain-AMM-Logik unterliegt einer Reihe von Einschränkungen. Off-Chain-Simulatoren und Routenauswerter leben ineinander. Orderbuchähnliche Komponenten oder eine Hochfrequenz-Suchinfrastruktur ähneln aus Systemsicht möglicherweise viel eher klassischer Börsensoftware als der gewöhnlichen Webanwendungsentwicklung.

Deshalb gehen Sprachdebatten so schnell in die Irre. Ein Ingenieur zeigt auf Solana und stellt richtig fest, dass Rust dort der natürliche Weg für die Programmentwicklung ist. Ein anderer verweist auf eine latenzempfindliche Routing- oder Simulations-Engine und stellt richtig fest, dass C++ immer noch eine brutal starke Wahl ist. Beides stimmt im Kontext. Das Problem beginnt, wenn jede Beobachtung zu einer Gesamttheorie des gesamten Stapels aufgeblasen wird.

Ein nützlicher mentaler Neustart besteht darin, für jedes Subsystem zu fragen, für welche Art von Schmerz es bestraft wird. Wenn eine Komponente falsch ist, liegt das Problem dann in erster Linie an der öffentlichen Korrektheit? Handelt es sich um private Betriebskosten? Liegt es an der Unfähigkeit, auf sich schnell ändernde Zustände zu reagieren, bevor sich die Gelegenheit verschließt? Ist es Prüfungsaufwand, Einstellungsaufwand oder Infrastrukturaufwand? Verschiedene Schichten beantworten diese Fragen unterschiedlich, weshalb ausgereifte DEX-Systeme oft sprachlich gemischt sind, selbst wenn öffentliche Debatten nach Reinheit verlangen.

Wo Rust zu Recht die Führung übernimmt

Rust verdient seinen Platz am natürlichsten dort, wo Zustandsübergänge, Sicherheitsdisziplin und Ökosystemanpassung die Architektur dominieren. In Rust-first-Blockchain-Umgebungen wie Solana ist das kein marginaler Vorteil. Es ist der Schwerpunkt. Die Sprache ist dort nicht nur verfügbar; Es ist umgeben von Frameworks, Beispielen, Sicherheitsgewohnheiten und Tools, die Protokollteams dabei helfen, sich im Kern des Ökosystems und nicht dagegen zu bewegen. Bei On-Chain-Programmen ist die Passung wichtiger als ein abstrakter Sprachvergleich. Die beste Sprache auf dem Papier ist oft die schlechteste Sprache, wenn jeder ernsthafte operative Weg, der sie umgibt, etwas anderes erwartet.

Rust ist auch bei Greenfield-Diensten rund um einen DEX attraktiv, wenn der Hauptfeind nicht in der extrem niedrigen Latenz, sondern in der langfristigen Korrektheit und Wartbarkeit liegt. Steuerungsebenendienste, Koordinationsschichten und bestimmte protokollorientierte Tools können wirklich von der von Rust geförderten Disziplin profitieren. Der Compiler erkennt Kategorien von Fehlern, deren Kontrolle in C++ andernfalls Prozess, Wachsamkeit und Überprüfungskultur erfordern würde. Das ist keine romantische Behauptung. Es ist praktisch. Teams mit starkem Rust-Talent können einige Risikoklassen frühzeitig reduzieren und die Servicegrenzen im Laufe der Zeit ruhiger halten.

Ein nützliches Gegenbeispiel hält dies auf dem Boden. Teams schließen manchmal aus Rusts Stärke in der Chain-native-Arbeit, dass jedes umgebende Off-Chain-Subsystem standardmäßig ebenfalls Rust sein sollte. Dies geschieht jedoch nur, wenn die umgebenden Systeme denselben dominanten Schmerz haben. Ein Hot-Path-Simulator oder eine Suchmaschine, die unter engem Zeitdruck wiederholt die Marktlage bewertet, hört nicht auf, ein leistungsempfindliches natives System zu sein, nur weil sie ein Kryptoprodukt bedient. Die Kette kann Rust-förmig sein, während der umgebende Ausführungspfad weitgehend C++-förmig bleibt.

Wo C++ immer noch seinen Unterhalt verdient

C++ lässt sich nur schwer ersetzen, wenn sich ein DEX weniger wie eine Anwendungsplattform, sondern mehr wie eine Austauschinfrastruktur verhält. Marktdatenaufnahme, Mempool-Listening, Normalisierungspipelines, Routenauswertung, Zustandssimulation, Arbitragesuche, Liquidations-Engines und an das Orderbuch angrenzende Dienste haben alle eine gemeinsame Eigenschaft: Sie führen wiederholte Arbeiten auf niedriger Ebene unter Druck aus, und diese Arbeit hängt oft eng mit dem Speicherlayout, der Zuordnungsstrategie, der Parsereffizienz, dem Warteschlangenverhalten oder der CPU-Vorhersagbarkeit zusammen.

Hier spielt die lange Geschichte von C++ in Systemen und im Handel weiterhin eine Rolle. Die Sprache gibt Ingenieuren direkte Kontrolle über Datenstrukturen, Threading-Modelle, Objektlebensdauer, benutzerdefinierte Zuweisungen, vektorfreundliche Layouts und Leistungstools, die sich in genau solchen Umgebungen praxiserprobt haben. Es profitiert auch von einem älteren und dichteren Ökosystem von Beispielen für leistungsstarke vernetzte Systeme, Simulatoren, Parser, native Gateways und hardwarebewussten Code. In einer Zeit, in der auch KI-Assistenten gebeten werden, bei diesen Problemen zu helfen, macht diese Dichte den Vorteil noch größer.

Stellen Sie sich einen Sucher vor, der auf Marktsignale hört, Pfade simuliert und entscheidet, ob es sich lohnt, einer Gelegenheit nachzugehen. Die interessanten Kosten sind selten eine isolierte Formel. Der interessante Kostenfaktor ist die wiederholte, zustandsbehaftete Verwendung vieler Formeln, umgeben von Aufnahme-, Dekodierungs-, Routing- und Entscheidungslogik. Ein paar vermeidbare Kopien, ein schlecht platziertes Schloss oder eine undisziplinierte Warteschlange können die Wirtschaftlichkeit des gesamten Weges verändern. C++ ist hier keine Zauberei, aber es gibt Ingenieuren eine zutiefst vertraute Sprache an die Hand, mit der sie der Maschine genaue Fragen stellen können. In Systemen, die durch Wiederholung unter Zeitdruck leben und sterben, ist das immer noch wichtig.

Die Wirtschaftswissenschaften verändern die sprachliche Antwort

Ein Grund dafür, dass diese Debatten überhitzt werden, ist, dass Ingenieure so reden, als sei Eleganz die Erfolgsbedingung. In DEX-Systemen ist die Gewinnbedingung normalerweise wirtschaftlich. Latenz ist wichtig, weil verpasste Gelegenheiten ihren Preis haben. Effizienz ist wichtig, da wiederholte Simulationen im großen Maßstab mit Kosten verbunden sind. Sicherheit ist wichtig, weil falsche Zustandsübergänge mit Kosten verbunden sind. Einfachheit im Betrieb ist wichtig, denn ein System, das seinen Bedienern ständig Angst macht, hat seinen Preis. Sobald das Argument in diesen Begriffen formuliert wird, ist die Sprachwahl nicht mehr symbolisch, sondern wird finanziell.

Rust zahlt sich oft aus, wenn die größten zukünftigen Kosten durch Korrektheitsfehler in der harten Stateful-Logik oder durch die Aufrechterhaltung komplexer Dienste ohne ausreichende strukturelle Disziplin entstehen würden. C++ zahlt sich oft aus, wenn die größten zukünftigen Kosten durch Ineffizienz des Hot-Path-Modus, zu viel Abstraktion bei wiederholten Berechnungen oder die Schwierigkeit der Integration in eine leistungsstarke native Infrastruktur entstehen würden. Ein vernünftiges Team fragt, welche Kosten über die Lebensdauer des Subsystems dominieren werden, und trifft eine entsprechende Entscheidung.

Diese Perspektive hilft auch bei einer häufigen Verwirrung: Abwicklungsgeschwindigkeit und Ausführungsgeschwindigkeit sind nicht dasselbe. Eine Blockchain kann auf Protokollebene einen Satz von Timing-Eigenschaften aufweisen, während die sie umgebenden Off-Chain-Systeme in einer völlig anderen Latenzwelt leben. Eine langsame Abwicklung in der Kette macht eine schnelle Bewertung außerhalb der Kette nicht irrelevant. Tatsächlich kann die Off-Chain-Geschwindigkeit sogar noch wertvoller werden, wenn Gelegenheiten umkämpft sind, da sie darüber entscheidet, wer reagiert, wer die richtigen Preise setzt und wer zuerst eine nützliche Aktion unterbreitet. Ingenieure, die diese beiden Timing-Domänen in einem Konzept namens Geschwindigkeit zusammenfassen, verfehlen in der Regel ihren Aufwand.

Hybridarchitektur ist oft die Antwort für Erwachsene

Über viele der seriösesten DEX-Architekturen lässt sich leichter nachdenken, sobald Hybriddesign seriös sein darf. Die On-Chain-Logik kann in der Sprache und Framework-Umgebung leben, die die Kette erwartet. Steuerungsebene und Produktservices können die Sprache wählen, die eine reibungslose Wartung gewährleistet. Hot-Path-Simulation, Routing, Marktdatenverarbeitung oder Matching-Adjacent-Komponenten können nah an den Leistungstraditionen bleiben, was ihre Abstimmung und Verifizierung erleichtert. Das Ergebnis ist kein ideologischer Kompromiss. Es ist ein System, in dem jeder Teil seine tatsächliche Belastung optimieren kann.

Dies erfordert Reife. Hybridsysteme sind nur dann gesund, wenn die Grenzen klar sind. Teams brauchen klare Schnittstellen, enge Verantwortungsverteilungen und Ehrlichkeit darüber, wo Komplexität hingehört. Aber das gilt unabhängig von der Sprache. Eine einsprachige Architektur mit verworrenen Grenzen ist nicht einfacher als eine zweisprachige Architektur mit klaren Grenzen. Manchmal ist es einfach ein einsprachiger Ausdruck derselben Verwirrung.

Hier gibt es auch eine Personaldimension. Teams stellen sich oft vor, sie müssten sich für eine Sprache entscheiden, weil sich die Einstellung von Mitarbeitern über mehrere native Domänen hinweg schwierig anfühlt. Diese Sorge ist verständlich, kann aber als Entschuldigung für architektonische Faulheit dienen. Eine bessere Frage ist, ob die leistungsempfindlichste Schicht wirklich eine eigene Sprache benötigt oder ob der Profiler diese Kosten noch nicht gerechtfertigt hat. Einige Teams sollten unbedingt weitgehend bei Rust bleiben und C++ nur dann einführen, wenn ein heißer Weg es verdient hat. Andere verfügen bereits über umfassende C++-Kenntnisse und würden sich selbst schaden, wenn sie alles in einen Rust-förmigen Workflow zwingen würden, der nicht ihren stärksten Systeminstinkten entspricht. Auch hier ist der Kontext wichtiger als das Prestige.

Welche Veränderungen durch KI-unterstütztes Engineering

Die Einführung von KI-Codierungssystemen stärkt tatsächlich die Argumente für die kontextbezogene Sprachwahl, anstatt sie zu schwächen. In Rust-first-Blockchain-Ökosystemen können Agenten komfortabler als zuvor mit Framework-fähigem Gerüst, routinemäßigem Servicecode und einigen Refaktorierungskategorien helfen. Aber in leistungsintensiven nativen Subsystemen auf niedriger Ebene tendiert das Gleichgewicht aus einem einfachen Grund immer noch zu C++: Öffentlicher Code, öffentliche Tools und öffentliche Integrationsbeispiele sind dort weitaus dichter. Agenten verfügen derzeit über mehr historisches Material, aus dem sie nützliche Entwürfe für die Art von Hot-Path-Infrastruktur erstellen können, die DEX-Systeme häufig benötigen.

Das bedeutet nicht, dass KI C++ allgemein überlegen macht. Das bedeutet, dass die alte Schwerkraft des Ökosystems nun durch ein neues Werkzeug verstärkt wird. Wenn ein Assistent beim Debuggen einer CMake-Integration hilft, eine Neugestaltung der Warteschlange vorschlägt, einen Parser verbessert oder einen Benchmark für eine Simulationsschleife erstellt, profitiert er vom tiefen nativen Speicher der öffentlichen C++-Welt. Wenn ein Assistent in einer Rust-first-On-Chain-Umgebung arbeitet, kann das Gegenteil der Fall sein. Die Sprachentscheidung gehört immer noch zum Arbeitsaufwand, aber das KI-Zeitalter macht die Umweltdichte noch folgenreicher als zuvor.

Meine praktische Empfehlung

Wenn Sie Chain-native-Programme in einem Rust-first-Ökosystem erstellen, kämpfen Sie nicht um der Sprachrhetorik willen gegen das Terrain. Lassen Sie Rust dorthin führen, wo es bereits die natürliche Heimat von Korrektheit, Werkzeugen und gemeinschaftlicher Praxis ist. Wenn Sie eine Off-Chain-Infrastruktur aufbauen, die sich wie leistungsempfindliches Exchange Engineering verhält, sollten Sie C++ nicht aufgeben, nur weil die Produktdomäne Krypto ist. Lassen Sie C++ die Arbeit erledigen, die es immer noch außergewöhnlich gut macht: schnelle Aufnahme, wiederholte Simulation, strenge Routing-Logik und Systemsteuerung auf niedriger Ebene.

Und wenn Ihre Architektur wirklich beide Welten umfasst, akzeptieren Sie diese Tatsache ohne Verlegenheit. Gute Technik wird nicht reiner, wenn man vorgibt, dass jede Komponente unter der gleichen Art von Fehler leidet. Sie wird dadurch verstärkt, dass jeder Komponente eine Sprache zugewiesen wird, die die Physik ihrer eigentlichen Aufgabe berücksichtigt.

Es liegt ein stiller Optimismus darin, das Problem auf diese Weise anzugehen. Es erinnert Ingenieure daran, dass Architektur ruhiger sein kann als der öffentliche Diskurs. Wir müssen uns nicht für eine Sprache entscheiden, um den Streit für immer zu gewinnen. Wir müssen nur das richtige Werkzeug für die nächste ehrliche Schicht des Systems auswählen. Das ist eine viel profitablere Art von Intelligenz.

Praktisches Labor: Erstellen Sie einen kleinen AMM-Routen-Evaluator

Lassen Sie uns etwas bauen, das klein genug ist, um es zu verstehen, und real genug, um es anzufassen.

Das Ziel besteht nicht darin, Uniswap neu zu erstellen. Ziel ist es zu spüren, wie schnell DEX-Arbeit zu einer Angelegenheit wiederholter Simulation und Vergleich wird.

main.cpp

#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

struct Pool {
    std::string name;
    double reserve_in;
    double reserve_out;
    double fee; // 0.003 for 0.3%
};

double swap_out(const Pool& p, double amount_in) {
    const double effective_in = amount_in * (1.0 - p.fee);
    return (effective_in * p.reserve_out) / (p.reserve_in + effective_in);
}

double two_hop(const Pool& a, const Pool& b, double amount_in) {
    const double mid = swap_out(a, amount_in);
    return swap_out(b, mid);
}

int main() {
    Pool eth_usdc_a{"ETH/USDC pool A", 500.0, 1750000.0, 0.003};
    Pool eth_usdc_b{"ETH/USDC pool B", 650.0, 2262000.0, 0.0005};
    Pool usdc_dai{"USDC/DAI stable pool", 900000.0, 901200.0, 0.0001};

    const double trade_eth = 4.0;

    const double direct_a = swap_out(eth_usdc_a, trade_eth);
    const double direct_b = swap_out(eth_usdc_b, trade_eth);
    const double routed = two_hop(eth_usdc_b, usdc_dai, trade_eth);

    std::cout << std::fixed << std::setprecision(4);
    std::cout << "Input: " << trade_eth << " ETH\n";
    std::cout << "Direct via " << eth_usdc_a.name << ": " << direct_a << " USDC\n";
    std::cout << "Direct via " << eth_usdc_b.name << ": " << direct_b << " USDC\n";
    std::cout << "Two-hop via " << eth_usdc_b.name << " -> " << usdc_dai.name
              << ": " << routed << " DAI\n";

    if (direct_b > direct_a) {
        std::cout << "Best direct route: " << eth_usdc_b.name << "\n";
    } else {
        std::cout << "Best direct route: " << eth_usdc_a.name << "\n";
    }
}

Bauen

Unter Linux oder macOS:

g++ -O2 -std=c++20 -o amm_router main.cpp
./amm_router

Unter Windows:

cl /O2 /std:c++20 main.cpp
.\main.exe

Warum das wichtig ist

Sogar dieses winzige Programm deutet bereits auf die wahre Form der Off-Chain-DEX-Arbeit hin:

  • wiederholte Pfadauswertung
  • kostenpflichtiger Vergleich
  • zustandsabhängige Ausgabe
  • ständige Spannung zwischen Korrektheit und Geschwindigkeit

Skalieren Sie dies auf Hunderte von Pools, häufige Statusaktualisierungen und kontroversen Zeitdruck, und Sie beginnen zu verstehen, warum die Sprachauswahl sehr schnell nicht mehr abstrakt ist.

Testaufgaben für Enthusiasten

  1. Fügen Sie Schlupftoleranz hinzu und lehnen Sie Routen ab, deren effektive Leistung unter einen konfigurierten Schwellenwert fällt.
  2. Erweitern Sie das Programm, um fünf oder zehn statt zwei Pools zu vergleichen und ein Profil zu erstellen, wo die Zeit vergeht.
  3. Fügen Sie eine Schleife hinzu, die die Route eine Million Mal mit leicht ändernden Reserven neu bewertet, und messen Sie, wie ein „Spielzeug“-Router anfängt, einem echten heißen Pfad zu ähneln.
  4. Ersetzen Sie die Fließkomma-Ausgabeformatierung durch strukturierte numerische Protokollierung und beobachten Sie, wie viel „nicht-mathematische“ Arbeit rund um die eigentliche Routenlogik entsteht.
  5. Fügen Sie eine zweite Version in Rust oder einer anderen Sprache hinzu und vergleichen Sie nicht nur die reine Laufzeit, sondern auch, wie angenehm sich die Sprache anfühlt, wenn die Simulationsschleife zum Mittelpunkt der Arbeit wird.

Dies ist eine gute Übung, weil sie etwas Subtiles offenbart: Bei Austauschsoftware liegt die interessante Schwierigkeit oft nicht in einer einzelnen Formel, sondern in der wiederholten, zustandsbehafteten, latenzempfindlichen Verwendung vieler gewöhnlicher Formeln gleichzeitig.

Zusammenfassung

C++ und Rust gehören beide zum dezentralen Exchange Engineering, aber sie gehören aus unterschiedlichen Gründen dorthin. Rust gewinnt Vertrauen in Ökosystemen und Schichten, in denen staatliche Sicherheit, Überprüfbarkeit und kettennative Arbeitsabläufe im Mittelpunkt stehen. C++ gewinnt Vertrauen in Schichten, in denen die Arbeit wieder wie eine Austauschinfrastruktur aussieht: wiederholte Simulation, Marktdatenverarbeitung, Routing, Suche und andere Hot-Path-Systeme, die eine strenge Kontrolle über Speicher, Planung und Leistungsüberprüfung belohnen.

Die nützlichste Frage ist daher nicht, welche Sprache den gesamten Stapel gewinnt. Es kommt darauf an, welche Schicht wir tatsächlich entwerfen und welche Art von Fehlern diese Schicht am wenigsten verkraften kann. Sobald diese Frage ehrlich gestellt wird, wird die Architektur normalerweise viel klarer und die Argumentation weniger ideologisch. Ein gut gestalteter DEX ist selten ein Denkmal für die Reinheit der Sprache. Es handelt sich um eine praktische Anordnung von Komponenten, die jeweils in der Sprache verfasst sind, die der Belastung, die sie mit sich bringt, am besten Rechnung trägt.

Referenzen

  1. Whitepaper zu Uniswap v3: https://uniswap.org/whitepaper-v3.pdf
  2. Uniswap v3-Kern-Repository: https://github.com/Uniswap/v3-core
  3. Ethereum.org MEV-Dokumentation: https://ethereum.org/developers/docs/mev/
  4. Übersicht über die Solana-Programme: https://solana.com/docs/core/programs
  5. Entwicklung des Solana Rust-Programms: https://solana.com/docs/programs/rust
  6. Ankerdokumentation: https://www.anchor-lang.com/docs
  7. dYdX-Kettendokumentation: https://docs.dydx.exchange/
  8. dYdX-Integrationsdokumentation: https://docs.dydx.xyz/
  9. dYdX in Off-Chain-Orderbüchern mit On-Chain-Abwicklung: https://integral.dydx.exchange/dydx-closes-10m-series-b-investment/
  10. Cosmos SDK-Dokumentation: https://docs.cosmos.network/
Philip P.

Philip P. – CTO

Back to Blogs

Kontakt

Starten Sie das Gespräch

Ein paar klare Zeilen genügen. Beschreiben Sie das System, den Druck und die Entscheidung, die blockiert wird. Oder schreiben Sie direkt an midgard@stofu.io.

01 What the system does
02 What hurts now
03 What decision is blocked
04 Optional: logs, specs, traces, diffs
0 / 10000