C++, Rust en gedecentraliseerde crypto-uitwisselingen: toepasbaarheid en efficiëntie

C++, Rust en gedecentraliseerde crypto-uitwisselingen: toepasbaarheid en efficiëntie

C++, Rust en gedecentraliseerde crypto-uitwisselingen: toepasbaarheid en efficiëntie

Invoering

Taalargumenten worden vooral misleidend in crypto omdat de systemen zelf zo gemakkelijk verkeerd te beschrijven zijn. Mensen zeggen 'bouw een DEX' alsof een gedecentraliseerde uitwisseling één uitvoerbaar bestand is met één latentieprofiel, één vertrouwensmodel en één soort mislukking. In werkelijkheid is een serieuze DEX een gelaagd organisme. Het kan gaan om on-chain logica, validator- of knooppuntinteracties, bewustzijn van het bouwen van blokken, mempool-monitoring, het verzamelen van marktgegevens, toestandssimulatie, prijzen, routering, risicocontroles, operatordashboards en soms orderboek- of matching-aangrenzende diensten die verdacht veel lijken op traditionele uitwisselingsinfrastructuur die blockchain-vocabulaire draagt.

Zodra we die gelaagde realiteit erkennen, wordt het argument tussen C++ en Rust rustiger en veel nuttiger. De juiste vraag is niet welke taal de hele architectuur als erepunt verdient. De juiste vraag is welke lagen profiteren van de veiligheid en het ecosysteem van Rust, welke lagen nog steeds de lage prestatiecontrole van C++ belonen, en waar hybride ontwerp niet langer een compromis is, maar eenvoudigweg gezond verstand begint te worden.

Die framing is van belang omdat gedecentraliseerde uitwisselingssystemen onder gemengde druk staan. Sommige lagen worden het zwaarst gestraft voor fouten in de correctheid, problemen met de controleerbaarheid en onveilige statusovergangen. Andere lagen worden gestraft vanwege latentie, doorvoer en het onvermogen om kansen snel genoeg te evalueren. Weer andere zijn operationele diensten waarbij de werkelijke kosten bestaan ​​uit onderhoud op lange termijn en teamsnelheid. De ene taal kan uitstekend zijn voor de ene last en slechts voldoende voor een andere. Volwassen architectuur begint als we dat openlijk toegeven.

Een DEX is een stapel, geen identiteitsverklaring

De eerste en belangrijkste correctie is conceptueel. Een DEX is niet één ding. Een EVM-georiënteerd AMM-protocol, een Solana-native programma-ecosysteem, een app-chain perpetuals-uitwisseling en een zoeksysteem dat reageert op marktomstandigheden verdienen allemaal verschillende technische instincten. On-chain AMM-logica leeft binnen één reeks beperkingen. Off-chain simulatoren en routebeoordelaars leven in een andere. Orderboekachtige componenten of hoogfrequente zoekinfrastructuur kunnen vanuit systeemperspectief veel dichter bij klassieke uitwisselingssoftware lijken dan bij de gewone ontwikkeling van webapplicaties.

Dit is de reden waarom taaldebatten zo snel op een dwaalspoor terechtkomen. Een ingenieur wijst naar Solana en constateert terecht dat Rust de natuurlijke weg is voor programmaontwikkeling daar. Een ander wijst op een latentiegevoelige routerings- of simulatie-engine en constateert terecht dat C++ nog steeds een brutaal sterke keuze is. Beide hebben gelijk in hun context. Het probleem begint wanneer elke observatie wordt opgeblazen tot een totale theorie van de hele stapel.

Een nuttige mentale reset is om voor elk subsysteem te vragen voor welke soort pijn het wordt gestraft. Als een onderdeel verkeerd is, is de pijn dan in de eerste plaats een mislukking van de publieke correctheid? Zijn het particuliere operationele kosten? Is het onvermogen om te reageren op snel veranderende omstandigheden voordat de kans zich sluit? Is het auditlast, wervingslast of infrastructuurlast? Verschillende lagen beantwoorden deze vragen verschillend. Daarom eindigen volwassen DEX-systemen vaak taalkundig gemengd, zelfs als publieke debatten hunkeren naar zuiverheid.

Waar Rust terecht de leiding neemt

Roest verdient zijn plaats op de meest natuurlijke manier waar staatsovergangen, veiligheidsdiscipline en ecosysteemaanpassing de architectuur domineren. In Rust-first blockchain-omgevingen zoals Solana is dat geen marginaal voordeel. Het is het zwaartepunt. De taal is daar niet alleen beschikbaar; het wordt omgeven door raamwerken, voorbeelden, beveiligingsgewoonten en tools die protocolteams helpen zich in de kern van het ecosysteem te bewegen in plaats van ertegenin. Voor on-chain-programma's is die pasvorm belangrijker dan abstracte taalvergelijking. De beste taal op papier is vaak de slechtste taal als elk serieus operationeel pad eromheen iets anders verwacht.

Roest is ook aantrekkelijk in greenfield-services rondom een ​​DEX, wanneer de belangrijkste vijand niet de ultralage latentie is, maar juistheid en onderhoudbaarheid op de lange termijn. Diensten op het controlevlak, coördinatielagen en bepaalde protocolgerichte tools kunnen echt profiteren van de discipline die Rust aanmoedigt. De compiler vangt categorieën fouten op die anders proces-, waakzaamheid- en beoordelingscultuur zouden vereisen om te controleren in C++. Dat is geen romantische bewering. Het is een praktische. Teams met sterk Rust-talent kunnen sommige risicoklassen vroegtijdig verminderen en de servicegrenzen in de loop van de tijd rustiger houden.

Een nuttig tegenvoorbeeld houdt dit gegrond. Teams leiden soms uit de kracht van Rust op het gebied van ketennatief werk af dat elk omringend subsysteem buiten de keten standaard ook Rust zou moeten zijn. Maar dat volgt alleen als de omringende systemen dezelfde dominante pijn hebben. Een hot-path-simulator of zoekmachine die herhaaldelijk de markttoestand evalueert onder strakke timingdruk, houdt niet op een prestatiegevoelig systeem te zijn alleen maar omdat het een cryptoproduct bedient. De ketting kan een roestvorm hebben, terwijl het omliggende uitvoeringspad sterk C++-vormig blijft.

Waar C++ nog steeds zijn waarde verdient

C++ wordt moeilijk te vervangen wanneer een DEX zich minder als een applicatieplatform en meer als een uitwisselingsinfrastructuur gaat gedragen. Het opnemen van marktgegevens, het luisteren naar mempools, normalisatiepijplijnen, route-evaluatie, toestandssimulatie, arbitrageonderzoek, liquidatie-engines en orderboek-aangrenzende diensten hebben allemaal een gemeenschappelijke eigenschap: ze voeren herhaald werk op laag niveau uit onder druk, en dat werk hangt vaak dicht bij de geheugenindeling, toewijzingsstrategie, parser-efficiëntie, wachtrijgedrag of CPU-voorspelbaarheid.

Dit is waar de lange geschiedenis van C++ op het gebied van systemen en handel er nog steeds toe doet. De taal geeft ingenieurs directe controle over datastructuren, threading-modellen, de levensduur van objecten, aangepaste allocators, vectorvriendelijke lay-outs en prestatietools die in precies dit soort omgevingen in de praktijk zijn getest. Het profiteert ook van een ouder en dichter ecosysteem van voorbeelden voor krachtige netwerksystemen, simulatoren, parsers, native gateways en hardwarebewuste code. In een tijdperk waarin AI-assistenten worden gevraagd om ook bij deze problemen te helpen, vergroot die dichtheid het voordeel.

Denk aan een zoeker die naar marktsignalen luistert, routes simuleert en besluit of een kans de moeite waard is om te volgen. De interessante kosten zijn zelden één formule op zichzelf. De interessante kosten zijn het herhaalde, stateful gebruik van veel formules omgeven door opname, decodering, routering en beslissingslogica. Een paar vermijdbare kopieën, een slecht geplaatst slot of een ongedisciplineerde wachtrij kunnen de economie van het hele pad veranderen. C++ is hier niet magisch, maar het geeft ingenieurs een zeer vertrouwde taal waarmee ze exacte vragen aan de machine kunnen stellen. In systemen die leven en sterven door herhaling onder tijdsdruk, is dat nog steeds van belang.

Economie verandert het taalantwoord

Eén reden waarom deze debatten oververhit raken, is dat ingenieurs spreken alsof de overwinningsvoorwaarde elegantie is. In DEX-systemen is de winvoorwaarde meestal economisch. Latency is van belang omdat gemiste kansen kosten met zich meebrengen. Efficiëntie is van belang omdat herhaalde simulatie op schaal kosten met zich meebrengt. Veiligheid is belangrijk omdat onjuiste statusovergangen kosten met zich meebrengen. Operationele eenvoud is belangrijk omdat een systeem dat zijn operators voortdurend bang maakt, kosten met zich meebrengt. Zodra het argument in die termen wordt geformuleerd, is de taalkeuze niet langer symbolisch, maar wordt ze financieel.

Rust betaalt zichzelf vaak terug waar de grootste toekomstige kosten zouden voortkomen uit fouten in de correctheid van harde stateful logica of uit het in stand houden van complexe diensten zonder voldoende structurele discipline. C++ betaalt zichzelf vaak terug waar de grootste toekomstige kosten zouden komen uit hot-path-inefficiëntie, te veel abstractie bij herhaalde berekeningen of de moeilijkheid om te integreren met hoogwaardige native infrastructuur. Een verstandig team vraagt ​​zich af welke kosten gedurende de levensduur van het subsysteem zullen domineren en maakt dienovereenkomstig een keuze.

Dit perspectief helpt ook bij een veel voorkomende verwarring: afwikkelingssnelheid en uitvoeringspadsnelheid zijn niet hetzelfde. Een blockchain kan één reeks timingkarakteristieken hebben op protocolniveau, terwijl off-chain systemen eromheen in een compleet andere latentiewereld leven. Een langzame afwikkeling binnen de keten maakt een snelle evaluatie buiten de keten niet irrelevant. Wanneer kansen worden betwist, kan de snelheid buiten de keten zelfs nog waardevoller worden, omdat het bepaalt wie reageert, wie nauwkeurig prijst en wie als eerste een nuttige actie onderneemt. Ingenieurs die deze twee timingdomeinen samenbrengen tot één concept dat snelheid wordt genoemd, eindigen meestal met het misplaatsen van inspanning.

Hybride architectuur is vaak het volwassen antwoord

Veel van de meest serieuze DEX-architecturen worden gemakkelijker om over te redeneren zodra hybride ontwerp respectabel mag zijn. On-chain-logica kan leven in de taal- en raamwerkomgeving die de keten verwacht. Control-plane en productservices kunnen de taal kiezen die het onderhoud gezond houdt. Hot-path-simulatie, routing, marktgegevensverwerking of matching-aangrenzende componenten kunnen dicht bij de prestatietradities blijven, waardoor ze gemakkelijker af te stemmen en te verifiëren zijn. Het resultaat is geen ideologisch compromis. Het is een systeem waarbij elk onderdeel kan optimaliseren voor zijn werkelijke belasting.

Dit vergt volwassenheid. Hybride systemen zijn alleen gezond als de grenzen expliciet zijn. Teams hebben behoefte aan duidelijke interfaces, beperkte verantwoordelijkheden en eerlijkheid over waar complexiteit thuishoort. Maar dat geldt ongeacht de taal. Een eentalige architectuur met verwarde grenzen is niet eenvoudiger dan een tweetalige architectuur met schone grenzen. Soms is het eenvoudigweg een uitdrukking in één taal van dezelfde verwarring.

Er is hier ook sprake van een personeelsdimensie. Teams denken vaak dat ze één taal moeten kiezen, omdat het lastig is om mensen in meerdere native domeinen aan te werven. Die bezorgdheid is begrijpelijk, maar kan een excuus worden voor architectonische luiheid. Een betere vraag is of de meest prestatiegevoelige laag echt een eigen taal nodig heeft, of dat de profiler die kosten nog niet heeft gerechtvaardigd. Sommige teams moeten absoluut grotendeels bij Rust blijven en C++ alleen introduceren als een hot path dit heeft verdiend. Anderen hebben al een diepgaande C++-expertise en zouden zichzelf schade berokkenen door alles in een Rust-vormige workflow te dwingen die niet past bij hun sterkste systeeminstincten. Context is opnieuw belangrijker dan prestige.

Welke AI-ondersteunde technische veranderingen

De komst van AI-coderingssystemen versterkt feitelijk de argumenten voor contextuele taalkeuze in plaats van deze te verzwakken. In Rust-first blockchain-ecosystemen kunnen agenten gemakkelijker dan voorheen helpen met raamwerkbewuste steigers, routinematige servicecode en sommige categorieën refactor. Maar in native subsystemen met een laag niveau, die hoge prestaties vereisen, neigt de balans nog steeds naar C++, om een ​​simpele reden: publieke code, publieke tooling en publieke integratievoorbeelden zijn daar veel dichter. Agenten beschikken momenteel over meer historisch materiaal waaruit ze bruikbare concepten kunnen maken voor het soort hot-path-infrastructuur dat DEX-systemen vaak nodig hebben.

Dit betekent niet dat AI C++ universeel superieur maakt. Het betekent dat de oude zwaartekracht van het ecosysteem nu wordt versterkt door een nieuw instrument. Wanneer een assistent helpt bij het debuggen van een CMake-integratie, een herontwerp van een wachtrij voorstelt, een parser verbetert of een benchmark voor een simulatielus opstelt, profiteert hij van het diepe native geheugen van de publieke C++-wereld. Wanneer een assistent in een Rust-first on-chain-omgeving werkt, kan het tegenovergestelde waar zijn. De taalbeslissing behoort nog steeds tot de werklast, maar het AI-tijdperk maakt de omgevingsdichtheid nog belangrijker dan voorheen.

Mijn praktische aanbeveling

Als je keteneigen programma's bouwt in een Rust-first-ecosysteem, vecht dan niet ter wille van de taalretoriek. Laat Rust leiden waar het al de natuurlijke thuisbasis is van correctheid, tooling en gemeenschapspraktijk. Als je een off-chain infrastructuur bouwt die zich gedraagt ​​als prestatiegevoelige uitwisselingstechniek, laat C++ dan niet varen alleen maar omdat het productdomein crypto is. Laat C++ het werk doen dat het nog steeds uitzonderlijk goed doet: snelle opname, herhaalde simulatie, strakke routeringslogica en systeemcontrole op laag niveau.

En als uw architectuur werkelijk beide werelden omvat, omarm dat feit dan zonder schaamte. Goede techniek wordt niet zuiverder gemaakt door te doen alsof elk onderdeel aan dezelfde soort defecten lijdt. Het wordt sterker gemaakt door aan elk onderdeel een taal toe te wijzen die de fysica van zijn eigenlijke taak respecteert.

Er schuilt een rustig optimisme in het op deze manier benaderen van het probleem. Het herinnert ingenieurs eraan dat architectuur rustiger kan zijn dan het publieke discours. We hoeven niet één taal te kiezen om de discussie voor altijd te winnen. We hoeven alleen maar het juiste instrument te kiezen voor de volgende eerlijke laag van het systeem. Dat is een veel winstgevender soort intelligentie.

Hands-On Lab: Bouw een kleine AMM-route-evaluator

Laten we iets bouwen dat klein genoeg is om te begrijpen en reëel genoeg om aan te raken.

Het doel is niet om Uniswap opnieuw te creëren. Het doel is om te voelen hoe snel DEX-werk een kwestie wordt van herhaalde simulatie en vergelijking.

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";
    }
}

Bouwen

Op Linux of macOS:

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

Op Windows:

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

Waarom dit ertoe doet

Zelfs dit kleine programma verwijst al naar de echte vorm van off-chain DEX-werk:

  • herhaalde trajectevaluatie
  • prijsbewuste vergelijking
  • toestandsafhankelijke uitgang
  • constante spanning tussen correctheid en snelheid

Schaal dit op naar honderden pools, frequente statusupdates en vijandige timingdruk, en je begint te begrijpen waarom de taalkeuze niet langer abstract is.

Testtaken voor liefhebbers

  1. Voeg sliptolerantie toe en wijs routes af waarvan de effectieve output onder een geconfigureerde drempel valt.
  2. Breid het programma uit om vijf of tien pools te vergelijken in plaats van twee en te profileren waar de tijd verstrijkt.
  3. Voeg een lus toe die de route een miljoen keer opnieuw evalueert met licht veranderende reserves en meet hoe een "speelgoed" -router op een echt heet pad begint te lijken.
  4. Vervang de uitvoeropmaak met drijvende komma door gestructureerde numerieke registratie en kijk hoeveel "niet-wiskundig" werk er rond de daadwerkelijke routelogica verschijnt.
  5. Voeg een tweede versie toe in Rust of een andere taal en vergelijk niet alleen de onbewerkte runtime, maar ook hoe comfortabel de taal aanvoelt zodra de simulatielus het middelpunt van het werk wordt.

Dit is een goede oefening omdat het iets subtiels aan het licht brengt: bij uitwisselingssoftware ligt de interessante moeilijkheid vaak niet in één enkele formule, maar in het herhaalde, stateful, latentiegevoelige gebruik van veel gewone formules tegelijk.

Samenvatting

C++ en Rust horen beide thuis in gedecentraliseerde uitwisselingstechniek, maar ze horen daar om verschillende redenen thuis. Rust verdient vertrouwen in ecosystemen en lagen waar staatsveiligheid, controleerbaarheid en keteneigen workflow centraal staan. C++ verdient vertrouwen in lagen waar het werk weer op een uitwisselingsinfrastructuur begint te lijken: herhaalde simulatie, verwerking van marktgegevens, routering, zoeken en andere hot-path-systemen die strakke controle over geheugen, planning en prestatieverificatie belonen.

De meest bruikbare vraag is dus niet welke taal de hele stapel wint. Het gaat erom welke laag we eigenlijk ontwerpen en wat voor soort mislukking die laag zich het minst kan veroorloven. Als die vraag eenmaal eerlijk wordt gesteld, wordt de architectuur doorgaans veel duidelijker en wordt de argumentatie minder ideologisch. Een goed ontworpen DEX is zelden een monument voor taalzuiverheid. Het is een praktische opstelling van componenten, elk geschreven in de taal die de last die het met zich meebrengt het beste respecteert.

Referenties

  1. Uniswap v3-whitepaper: https://uniswap.org/whitepaper-v3.pdf
  2. Uniswap v3 kernrepository: https://github.com/Uniswap/v3-core
  3. Ethereum.org MEV-documentatie: https://ethereum.org/developers/docs/mev/
  4. Overzicht van Solana-programma's: https://solana.com/docs/core/programs
  5. Solana Rust-programmaontwikkeling: https://solana.com/docs/programs/rust
  6. Ankerdocumentatie: https://www.anchor-lang.com/docs
  7. dYdX Chain-documentatie: https://docs.dydx.exchange/
  8. dYdX-integratiedocumentatie: https://docs.dydx.xyz/
  9. dYdX op off-chain orderboeken met on-chain afwikkeling: https://integral.dydx.exchange/dydx-closes-10m-series-b-investment/
  10. Cosmos SDK-documentatie: https://docs.cosmos.network/
Philip P.

Philip P. – CTO

Back to Blogs

Contact

Begin het gesprek

Een paar duidelijke lijnen zijn voldoende. Beschrijf het systeem, de druk en de beslissing die wordt geblokkeerd. Of schrijf rechtstreeks naar 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