Meta-transacties (ERC-2771): Gasloos via Relayers

Een meta-transactie is een transactie die een gebruiker ondertekent maar niet zelf verstuurt. De gebruiker ondertekent een verzoek, bijvoorbeeld "roep deze functie aan op dit contract", en een relayer stuurt het naar de blockchain en betaalt het gas. Het contract weet nog steeds wie de echte gebruiker is. Het is een van de oudste manieren om een applicatie gasloos te maken, en het werkt met elke wallet, ook met gewone wallets zoals MetaMask.

ERC-2771 is de standaard die vastlegt hoe dit veilig werkt: hoe het contract het verzoek ontvangt en hoe het de oorspronkelijke afzender te weten komt. Voor een overzicht van alle gasloze methoden, inclusief paymasters en EIP-7702, zie gasloze transacties.

Zo werkt ERC-2771

  1. De gebruiker ondertekent een verzoek als EIP-712-bericht: het doelcontract, de functieaanroep, een nonce, een gaslimiet en een deadline.
  2. De relayer verstuurt het naar een trusted forwarder-contract en betaalt het gas.
  3. De forwarder controleert de handtekening, de nonce en de deadline, en roept daarna het doelcontract aan met het adres van de oorspronkelijke gebruiker achter de call data geplakt.
  4. Het doelcontract leest de echte afzender via _msgSender() in plaats van msg.sender, maar alleen als de aanroep van de forwarder komt die het vertrouwt.

Het resultaat: de relayer betaalt de transactie, maar elke rechtencontrole, elk saldo en elk event in uw contract hoort bij de gebruiker.

Wat wij bouwen

  • Contracts die ERC-2771 ondersteunen: contracts die consequent _msgSender() gebruiken, ook in overgeërfde code en in de toegangscontrole.
  • Forwarder-opzet: een goed gereviewde forwarder deployen of hergebruiken, en bepalen of en hoe de trusted forwarder kan worden gewijzigd.
  • Relayerdienst: de backend die ondertekende verzoeken ontvangt, uw sponsorregels controleert, de aanroep simuleert, verstuurt en volgt tot bevestiging.
  • Ondertekeningsflow in de frontend: duidelijke handtekeningverzoeken die gebruikers in gewone taal laten zien wat ze autoriseren.

Een relayer goed draaien

Het meeste operationele werk zit in de relayer:

  • Nonce- en wachtrijbeheer: veel transacties vanaf relayer-wallets versturen zonder dat één vastgelopen transactie de rest blokkeert.
  • Feeafhandeling: gasfees zo instellen dat verzoeken bevestigd worden zonder te veel te betalen, en vastgelopen transacties vervangen, zie EIP-1559 feeafhandeling.
  • Eerst simuleren: een verzoek dat mislukt kost de relayer toch gas, dus elk verzoek wordt eerst gesimuleerd en geweigerd als het zou falen.
  • Sponsorregels en limieten: welke gebruikers, contracts en functies gedekt zijn, en hoeveel per gebruiker per dag, zodat bots de relayer niet leeghalen.
  • Tegoed en monitoring: relayer-wallets automatisch aangevuld, met meldingen bij saldo, foutpercentages en ongebruikelijke activiteit.

Valkuilen in de beveiliging

  • De forwarder wordt volledig vertrouwd: wie hem beheert, kan richting uw contract als elke gebruiker optreden. Vertrouw alleen een forwarder die u heeft gereviewd, en behandel het wijzigen ervan als een kritieke adminactie achter een multisig.
  • Multicall gecombineerd met ERC-2771: eind 2023 bleken contracts die ERC-2771 combineerden met een multicall-functie kwetsbaar voor adresvervalsing, omdat de toegevoegde afzender binnen een gebundelde aanroep te vervalsen was. Bibliotheken zijn inmiddels aangepast; elk contract met beide functies vraagt om een expliciete review.
  • msg.sender en _msgSender door elkaar: één functie of overgeërfde bibliotheek die nog msg.sender gebruikt, behandelt de relayer als de gebruiker. Wij controleren elk pad.
  • Replay: verzoeken zijn gebonden aan een chain, een forwarder, een nonce en een deadline, zodat ze niet elders of later opnieuw te gebruiken zijn.

ERC-2771, ERC-4337 of EIP-7702?

ERC-2771 werkt met elke wallet, maar elk contract moet de forwarder ondersteunen, dus het past het best als u de contracts beheert waarmee gebruikers werken. ERC-4337 met paymasters verplaatst de logica naar smart accounts en werkt met elk contract, maar gebruikers hebben een smart account nodig. EIP-7702 geeft bestaande wallets de functies van een smart account en verbindt zo beide werelden. Voor alleen token-approvals en -transfers zijn permit-handtekeningen en EIP-3009 vaak eenvoudiger. Wij helpen u kiezen, en veel projecten combineren methoden.

Veelgestelde vragen over meta-transacties

Hebben gebruikers een speciale wallet nodig voor meta-transacties?

Nee. Elke wallet die EIP-712-berichten kan ondertekenen werkt, ook MetaMask en hardware wallets. Dat is het grote voordeel ten opzichte van methoden die smart accounts vereisen.

Kan ik meta-transacties toevoegen aan een bestaand contract?

Alleen als het contract kan worden geüpgraded of opnieuw gedeployed. Ondersteuning voor de trusted forwarder moet in het contract zitten; een onveranderlijk contract zonder die ondersteuning kan geen meta-transacties ontvangen.

Wie betaalt voor meta-transacties?

De relayer, die meestal door u wordt beheerd of door een relayerdienst die u betaalt. U bepaalt welke verzoeken worden gesponsord; verzoeken buiten uw regels worden simpelweg niet doorgestuurd.

Is ERC-2771 nog relevant nu account abstraction bestaat?

Ja, vooral voor apps waarvan de gebruikers gewone wallets hebben en waarvan u de contracts beheert. Het is eenvoudig, goed begrepen en goedkoop te draaien. Voor nieuwe producten op basis van smart wallets is ERC-4337 of EIP-7702 op de lange termijn vaak de betere route.

Wie is eigenaar van de code?

Het eigendom van de broncode wordt contractueel vastgelegd, en de code kan volledig van u zijn, inclusief documentatie en tests.

Onderdeel van ons werk aan blockchain-handtekeningen. Zie ook blind signing voorkomen.

Voeg meta-transacties toe aan uw app

Vertel ons over uw contracts en de wallets van uw gebruikers. Wij vertellen u of ERC-2771 de juiste route is en bouwen de contracts en de relayer om het veilig te draaien.

Plan een vrijblijvend gesprek over meta-transacties