80% użytkowników portfeli nie musi zmieniać adresu, aby ich konto zyskało funkcje smart kontraktu. To efekt nowego podejścia do transakcji, które pozwala EOA delegować wykonanie do logiki kontraktu bez utraty oryginalnego adresu.
EIP-7702 w praktyce daje użytkownikom możliwość podpisania authorization (np. w viem z executor: 'self’ i contractAddress) i wykonania zadań jak batching czy sponsorowane opłaty, przy zachowaniu tego samego msg.sender w kontekście EOA.
W eksploratorze bloków pojawia się wtedy sekcja Authorizations (Authority = EOA, Contract = adres logiki). To otwiera drogę do programowalnych reguł działania portfela i lepszego UX bez migracji konta.
W dalszych częściach artykułu pokazane zostanie, jak przygotować authorizationList, jak działa chainId: 0 i jakie są różnice między self-execution a sponsored execution. Czytelnik dowie się też, jak bezpiecznie podpisywać autoryzacje i czego unikać.
Najważniejsze wnioski
- Nowy proposal umożliwia EOA działanie jak smart account bez zmiany adresu.
- Pojedynczy podpis authorization otwiera batching i sponsorowane opłaty.
- W eksploratorze widać Authorizations: Authority = EOA, Contract = adres logiki.
- chainId: 0 ułatwia multichain, ale wymaga zsynchronizowanych nonce.
- Warto poznać przykłady implementacji (np. viem) i sprawdzić bezpieczeństwo przed podpisem.
- Aby zrozumieć różne portfele, przeczytaj także przewodnik o rodzajach portfeli: rodzaje portfeli kryptograficznych.
Dlaczego EIP-7702 powstało i co rozwiązuje w UX portfeli
Główną motywacją projektu była poprawa doświadczeń użytkowników podczas typowych operacji w portfelach. Dziś wiele prostych akcji wymaga kilku podpisów i oddzielnych opłat, co zniechęca nowych użytkowników.
Użytkownicy często muszą mieć ETH na gas, nawet gdy operują wyłącznie stablecoinami. To blokuje płynne wejście do ekosystemu.
Ryzyko związane z pojedynczą frazą seed lub prywatnym kluczem też jest duże. Błędy są trudne do naprawienia, co podnosi wymagania dotyczące security.
Most między EOAs a smart accounts
Rozwiązanie pozwala eoas delegować wykonanie do logiki kontraktu, zachowując swój adres. Dzięki temu users nie muszą migrować środków ani tracić historii i reputacji.
Portfele przejmą kontrolę nad autoryzacjami, a dAppy będą korzystać ze standardów takich jak ERC-5792 i ERC-7710/7715. To wspiera kierunek abstraction i upraszcza flow dla accounts.
- Mniej kliknięć i mniej podpisów przy pojedynczym transaction.
- Niższe tarcie onboardingowe, bo nie trzeba trzymać ETH wyłącznie na gas.
- Lepsza kontrola bezpieczeństwa: logika ogranicza zakres operacji zamiast polegać tylko na surowym kluczu.
eip-7702 wyjaśnienie: jak EOA “zyskuje” kod smart contract
Ten rozdział pokazuje, jak new transaction type przenosi kod kontraktu do payloadu i pozwala EOA tymczasowo zyskać zachowania smart account.
Nowy transaction type rozszerza standardowy payload o pole authorizations. To tam trafia contract_code oraz podpis EOA. Dzięki temu klient może ustawić code dla wskazanego account tylko na czas wykonania transakcji.
W praktyce RLP zawiera dodatkową listę autorizacji, np. rlp([chain_id, nonce, …, [[contract_code, y_parity, r, s], …], signature_y_parity, signature_r, signature_s]).
Sieć widzi, że przy wywołaniu użyto specjalnego znacznika 0xef0100 || address. To informuje węzeł, do jakiego contract delegowana jest egzekucja.
Różnice wobec EIP-3074 i zgodność z AA
- Brak invokerów i AUTH/AUTHCALL — prostszy model nonce i tenant.
- Zgodność z smart contract accounts w roadmapie ERC-4337; UserOps są mniej złożone.
- Kluczowa korzyść UX: nie trzeba migrować konta ani wdrażać oddzielnego kontraktu dla każdego adresu.
Jak to działa pod maską: delegacja, msg.sender i znacznik 0xef0100
Pod maską mechanizm działa jak lekka warstwa delegation, która przekierowuje execution do logiki contract, nie zmieniając tożsamości nadawcy. W trakcie call msg.sender pozostaje EOA, co utrzymuje kompatybilność z istniejącymi dAppami.
Deweloper widzi w kodzie konta postać 0xef0100 || address. Prefiks 0xef0100 jest stały, a kolejne 20 bajtów wskazuje docelowy contract. Wywołanie getCode zwróci ten zapis i pozwoli szybko wykryć aktywną delegację.
SetCode i „delegation designation”
Klient tymczasowo ustawia code konta (SetCode), aby EVM odczytał, do jakiego contract kierować wykonanie. To nie zmienia eoa address — podpisy i uprawnienia pozostają ważne.
- Delegation nie zmienia tożsamości — msg.sender to EOA.
- getCode ujawnia 0xef0100 || address — proste narzędzie do inspekcji.
- Call odbywa się w kontekście EOA, więc integracje dAppów działają bez zmian.
Element | Co pokazuje | Dlaczego to ważne |
---|---|---|
0xef0100 || address | Prefiks + adres kontraktu | Umożliwia szybkie wykrycie delegacji przez getCode |
SetCode (tymczasowy) | Ustawia wskazanie wykonawcze | Pozwala delegować execution bez migracji konta |
msg.sender = EOA | Tożsamość nadawcy zachowana | Kompatybilność z whitelistami i podpisami |
Przygotowanie portfela i środowiska: krok po kroku
Przed wysłaniem pierwszej transakcji trzeba skonfigurować klienta portfela i przygotować listę autoryzacji. W Viem zaczyna się od createWalletClient, potem wywołuje się signAuthorization z parametrami takimi jak executor: 'self’ i wskazanym contractAddress.
Po podpisaniu authorization można użyć sendTransaction kierowanego do własnego account i dołączyć authorizationList. W jednym kroku następuje broadcast i wykonanie logiki kontraktu, a msg.sender pozostaje EOA.
Najważniejsze praktyczne uwagi
- W obiekcie authorization widoczne są pola: address, chainId, nonce, r, s, v/yParity — to ułatwia audyt i debug.
- chainId: 0 tworzy signature ważny na wielu chains, ale działa tylko gdy nonce są zsynchronizowane na tych łańcuchach.
- Dla trybu self-execution Viem automatycznie dopasowuje authorization.nonce, bo EOA zwiększa nonce przed wykonaniem logiki.
- Gdy transakcję nadaje relayer, authorization.nonce musi dokładnie odpowiadać bieżącemu nonce konta — to częsta przyczyna nieudanych walidacji.
- Developers powinni tworzyć testy e2e i monitorować implementacje, bo różne wallets i implementations mogą inaczej obsługiwać injection authorizationList.
„Dobra konfiguracja środowiska minimalizuje ryzyko błędów związanych z nonce i poprawia przewidywalność wdrożeń.”
Na koniec warto dodać monitoring węzłów i mapowanie wersji kontraktów. To daje kontrolę nad tym, do jakiej logiki deleguje się wykonanie i ułatwia szybką diagnostykę.
Self-execution: użytkownik ma ETH na gas i wykonuje batch
Self-execution pozwala użytkownikowi uruchomić wiele akcji za jednym podpisem, gdy ma ETH na opłaty. To wygodny sposób na konsolidację kilku calls w jednej transakcji.
Plan działania jest prosty. Najpierw użytkownik podpisuje authorization z parametrem executor: 'self’.
Plan działania
Następnie przygotowuje tablicę calls — wywołań do różnych kontraktów, np. transferów ERC‑20. Koduje function execute(calls) kontraktu BatchCallAndSponsor za pomocą ABI.
Potem broadcastuje transaction do własnego account, dołączając authorizationList. W rezultacie kontrakt agreguje calls i uruchamia wszystkie operations atomowo.
Efekty i koszty
- Jeden atomowy transfer wielu tokenów zamiast kilku oddzielnych transakcji.
- AuthorizationList zwiększa zużycie gas, ale suma opłat zwykle bywa niższa niż suma oddzielnych transaction.
- msg.sender pozostaje EOA, więc allowances i polityki dostępu działają bez zmian.
- Przy dużych batchach warto szacować limit gas i rozmiar danych ABI, aby uniknąć przekroczeń.
- Emitowanie eventów w kontrakcie ułatwia późniejszą analizę, które calls zostały wykonane.
Jedna transakcja z poprawnie skomponowanym batch eliminuje ryzyko niekompletnych przepływów przy awarii i poprawia UX.
Sponsored execution: relayer pokrywa opłatę, użytkownik tylko podpisuje
W trybie sponsorowanym użytkownik tworzy i serializuje swoje calls, następnie buduje digest = keccak256(encodePacked(nonce, zpakowane wywołania)) i podpisuje go off‑chain jako toEthSignedMessageHash.
Kontrakt BatchCallAndSponsor udostępnia funkcję execute(calls, signature). Tam następuje ECDSA.recover, porównanie recovered z oczekiwanym adresem, inkrementacja nonce i atomowa realizacja calls.
Relayer (sponsor) transmituje transaction do sieci i pokrywa gas. AuthorizationList nie musi być dołączane każdorazowo, gdy delegacja została ustawiona wcześniej.
- Bezpieczeństwo: użytkownik musi podpisać dokładnie nonce + calls, które kontrakt odtwarza i sprawdza, aby zapobiec nieautoryzowanym replayom.
- Developers: dbają o spójność encodePacked i ABI, bo rozbieżności zmienią digest i unieważnią signature.
- Relayer monitoruje mempool i dobiera fee, by transaction trafiła do bloku efektywnie.
„Model sponsorowany obniża barierę wejścia — użytkownik zachowuje swoje account, ale nie musi mieć ETH na gas.”
Stan po transakcji: trwała delegacja, dezaktywacja i pułapki nonce
Po wykonaniu SetCode delegacja zwykle zostaje aktywna i nie znika automatycznie. Konto może zachowywać się jak smart account aż do momentu, gdy ktoś celowo zmieni code lub wyzeruje go.
Zmiana lub usunięcie logiki
Aby dezaktywować delegację, klient może ustawić SetCode na 0x000…000 lub podmienić docelowy contract na inny address. To prosty mechanizm, ale wymaga procedury operacyjnej i testów przed wdrożeniem.
Authorization nonce: różnice praktyczne
W trybie, gdy executor to użytkownik (EOA), platforma inkrementuje nonce przed wykonaniem autoryzacji. W takim wypadku warto ustawić authorization.nonce zgodnie z wartością po inkrementacji.
Gdy transakcję nadaje relayer, authorization.nonce powinien odpowiadać bieżącemu nonce EOA. Brak tej zgodności zwykle prowadzi do odrzucenia operacji.
„Miej przygotowany plan 'odcięcia’ (SetCode=0) na wypadek błędu w logice lub incydentu; to kluczowy element security.”
- Po wdrożeniu account działa jak smartne konto do czasu zmiany code.
- Zarządzanie zmianami kontraktu wymaga kontroli wersji i testów (canary release).
- Monitoring eventów i adresów docelowych zmniejsza ryzyko pomyłek.
- Dokumentacja polityk nonce redukuje błędy operacyjne.
Problem | Objaw | Rozwiązanie |
---|---|---|
Trwała delegacja | Account wykonuje delegowane wywołania | SetCode=0x0 lub podmiana contract |
Niezgodny nonce (EOA) | Authorization odrzucona przy self-execution | Użyć nonce po inkrementacji |
Niezgodny nonce (relayer) | Relayer nie może zrealizować tx | Authorization.nonce = bieżący nonce EOA |
Security incydent | Błąd w logice contract | Natychmiastowe SetCode=0 i audyt |
W praktyce zespoły powinny też zaplanować kontrolowane migracje i testy oraz śledzić zdarzenia na łańcuchu. Dobre procedury operacyjne poprawiają bezpieczeństwo i ułatwiają zarządzanie delegacjami. Dodatkowe informacje o mechanizmach płatności i delegacji można znaleźć w przewodniku o mikropłatnościach w blockchainie.
Co możesz robić dzięki EIP-7702 i czego nie zrobisz
Dzięki nowemu mechanizmowi można łączyć kilka działań w jeden bez migracji środków. eip 7702 otwiera praktyczne use‑case’y: batching, sponsorowanie opłat i programowalne uprawnienia, przy zachowaniu tego samego address.
Use-cases:
- Batch: approve + swap w jednej transakcji zmniejsza liczbę potwierdzeń i koszty.
- Gas sponsorship: relayer pokrywa opłatę, co upraszcza onboarding w aplikacjach masowych.
- Programowalne uprawnienia: sesyjne klucze i ograniczone prawa bez zmiany account.
Ograniczenia:
- Klucz EOA wciąż jest nadrzędny — nie da się zrealizować twardego multi‑sig ani time‑locka tylko przez tę warstwę.
- chainId: 0 i multichain działają tylko przy zsynchronizowanych nonce na różnych chains.
- Kontrolę nad autoryzacjami mają głównie wallets — aplikacje muszą współpracować z portfelem.
W praktyce to most między tradycyjnym account a smart accounts — dużo zyskujesz, ale nie wszystkie funkcje full smart account są dostępne.
Dla deweloperów: wzorce integracji i narzędzia
Ten rozdział koncentruje się na gotowych wzorcach integracyjnych i narzędziach dla zespołów developerskich. Opis pokazuje, jak aplikacja może delegować budowę sekwencji wywołań do portfela i jak zabezpieczyć operacje.
ERC-5792: wallet_sendCalls i prosty batching
wallet_sendCalls pozwala aplikacji przekazać zestaw calls do portfela, który sam zbuduje sekwencję i wykona batch. To najprostsza ścieżka dla developers, gdy chcą uniknąć złożonych implementacji po stronie serwera.
ERC-7710/7715: delegowanie uprawnień
Standardy te wprowadzają formalne żądanie i przyznawanie uprawnień (wallet_grantPermissions). Dzięki nim contracts mogą egzekwować ograniczone function i tworzyć warstwy uprawnień.
Companion accounts i Fusion Execution
Companion accounts dają aplikacji pełną kontrolę nad execution i operations, bez polegania na implementacjach portfeli. Fusion Execution (np. Biconomy) kompresuje instrukcje, by działać z portfelami bez wsparcia 7710/7715.
Tanie wdrożenia i narzędzia
EIP-7702 sprzyja tanim wdrożeniom — proxy kosztuje ~12 500 gas. AbstractJS (Biconomy) upraszcza wykrywanie możliwości portfela, wybiera ścieżkę (5792 vs 7710/7715 vs companion) i enkoduje calls oraz function.
„Dobre wzorce integracji redukują fragmentację i przyspieszają produkcyjne wdrożenia.”
Wzorzec | Zaleta | Kiedy stosować |
---|---|---|
wallet_sendCalls (ERC-5792) | Prosty batching sterowany przez portfel | Gdy developers chcą minimalnej integracji |
wallet_grantPermissions (ERC-7715) | Formalne żądanie i delegacja uprawnień | Gdy potrzebne są ograniczone permissions między contracts |
Companion accounts | Pełna kontrola nad execution | Gdy aplikacja wymaga spójnych operations niezależnie od implementations |
Fusion Execution | Kompatybilność z nieobsługującymi portfelami | Gdy fragmentacja portfeli blokuje wdrożenie |
Rekomendacja: developers powinni dokumentować contracts, audytować smart contracts i planować migracje. Integracja z account abstraction obniża vendor lock‑in i poprawia UX.
Wniosek
To ewolucyjny krok: użytkownicy otrzymują funkcje smart accounts bez przenoszenia środków.
Proposal łączy wygodę EOA z możliwościami smart contract — batching, sponsorowanie opłat i programowalne uprawnienia przy zachowaniu tego samego address i msg.sender.
W praktyce wdrożenia pokazują znacznik 0xef0100 || address, dwa tryby execution (self i sponsored) oraz rolę walletów w kontroli authorization i podpisów.
Deweloperzy powinni sięgać po standardy (ERC‑5792, ERC‑7710/7715), używać tanich proxy (~12 500 gas) i narzędzi jak AbstractJS, a użytkownicy muszą pamiętać o security, nonce i synchronizacji across chains.
Podsumowując: eip 7702 to most między tradycyjnymi accounts a account abstraction — mniej kliknięć, mniej transaction i większa kontrola w portfelu, przy zachowaniu tożsamości EOA.
Comments (No)