Questo articolo richiede un livello di conoscenza avanzato, abbiamo pubblicato anche una guida introduttiva.

Introduzione all’Account Abstraction

Benvenuti alla seconda parte della nostra esplorazione del rivoluzionario protocollo di Account Abstraction ERC-4337 di Ethereum. Dopo aver esplorato le basi teoriche nella nostra guida precedenteora ci concentriamo sul lato pratico di questa innovazione. In questa guida, vi accompagneremo nel complesso processo di creazione e lancio di uno smart contract conforme a ERC-4337, con un focus sull’utilizzo della piattaforma Stackup. Questo articolo vi fornirà le conoscenze pratiche necessarie per sfruttare efficacemente le capacità di ERC-4337, aprendo la strada a una gestione degli account migliorata sulla rete Ethereum.

Componenti Essenziali di ERC-4337

  • UserOperations: Considerateli come la checklist del vostro account Ethereum, che comprende compiti come trasferimenti di denaro, interazioni con smart contract o una combinazione di azioni. A differenza dell’attuale sistema Ethereum, dove eseguite ogni compito separatamente, UserOperations di ERC-4337 vi permette di raggruppare varie azioni in un’unica operazione. Firmate questa operazione combinata e la rete Ethereum se ne occupa. UserOperations mantengono una struttura simile alle attuali transazioni Ethereum, ma incorporano una logica aggiuntiva specifica per ERC-4337.

  • Bundlers: Dopo aver preparato il vostro UserOperation, i Bundlers sono quelli che lo inseriscono nella rete Ethereum. Agiscono come intermediari, raccogliendo più UserOperations, raggruppandoli e poi inviandoli alla rete. Questi possono essere validatori o ricercatori di MEV.

  • EntryPoint: Questo smart contract funge da portiere della rete Ethereum. Quando i Bundlers inviano UserOperations, l’EntryPoint li spacchetta ed esegue. Se trova un’operazione che non funziona, può annullare le azioni di quell’operazione, mantenendo l’integrità e l’affidabilità della transazione.

  • Contract Account: Pensate a questo come al vostro aiutante automatizzato nella rete Ethereum. Diversamente dagli account standard che richiedono l’iniziativa manuale, i Contract Accounts possono eseguire autonomamente azioni secondo le istruzioni ricevute, come quelle di un UserOperation. Possono interagire con altri contratti, gestire asset e prendere decisioni basate sulla loro logica programmata, automatizzando e semplificando complesse transazioni Ethereum.

  • Paymaster: Un componente opzionale che può coprire le spese di transazione per conto della vostra transazione. Si impegna a rimborsare il Bundler per i costi del gas. Le condizioni per questo rimborso sono delineate nello smart contract.

  • Aggregators: Questi smart contract opzionali lavorano con il Contract Account per convalidare collettivamente le firme da più UserOperations.

In sostanza, ERC-4337 introduce nuovi elementi all’interno dell’ecosistema Ethereum, ognuno con un ruolo specifico per facilitare transazioni più flessibili e sicure.

Requisiti

  • Software Yarn installato sul tuo sistema

  • Accesso alla chiave API di Stackup:
    https://app.stackup.sh/

  • Configurazione del repository Stackup
    https://github.com/stackup-wallet/erc-4337-examples

  • VScode o qualsiasi altro editor di codice.

  • Una finestra di terminale operativa per eseguire comandi

SimpleAccount.sol: Un Esempio Base di Contratto ERC-4337

Il team principale di Ethereum ha sviluppato un esempio semplice e minimale di un contratto conforme all’ERC-4337, chiamato SimpleAccount.sol.

https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol

Dedicheremo del tempo all’esame del codice fornito di seguito. Anche se non è necessario replicare questo codice in un file, la sua revisione ci aiuterà a comprendere meglio le sue funzionalità.


Com’è fatto un contratto ERC-4337? Vediamo i dettagli del SimpleAccount

Il contratto SimpleAccount presentato è configurato per essere gestito da un indirizzo proprietario esterno. È adattato per l’interazione con un contratto EntryPoint, aderendo alle linee guida dell’ERC-4337. Questa configurazione permette al proprietario di avviare transazioni senza incorrere personalmente in spese di gas. Il contratto impiega le librerie di OpenZeppelin per funzionalità avanzate, come la validazione della firma crittografica (ECDSA) e il supporto per modelli di contratti aggiornabili (UUPSUpgradeable e Initializable). Inoltre, incorpora BaseAccount e un gestore di callback. BaseAccount è fondamentale, mantenendo il nonce dello smart contract, verificando il payload di UserOperation, facilitando le interazioni con EntryPoint, gestendo i pagamenti dell’esecuzione (tramite payPrefund()), e fornendo un framework per implementazioni su misura di funzioni come _validateSignature(), _validateNonce(), e _payPrefund().

Una variabile di stato chiave, owner, conserva l’indirizzo del proprietario dell’account. _entryPoint è un collegamento immutabile a un contratto esterno, designato come EntryPoint.

Due funzioni principali, execute ed executeBatch, sono integrali a questo contratto. Consentono al proprietario o al EntryPoint del sistema di relay di inviare transazioni individuali o raggruppate. Queste funzioni includono salvaguardie, verificando che l’iniziatore sia o l’EntryPoint o il proprietario, prima di eseguire qualsiasi processo.

L’aggiornabilità è una caratteristica notevole di questo contratto, consentendo il passaggio a un nuovo proprietario. Tuttavia, qualsiasi modifica a EntryPoint (come cambiamenti a _entryPoint) richiede il dispiegamento di un nuovo account di smart contract.

Per l’applicazione pratica, utilizzeremo il SDK di Stackup, che semplifica il dispiegamento di un contratto compatibile con l’ERC-4337. Questo ci permette di eseguire efficientemente operazioni come l’approvazione di token ERC-20 e la gestione di trasferimenti di ETH e token.

Come Creare Contratti ERC-4337 Utilizzando Stackup

In questo segmento, ci concentriamo sulla costruzione di un contratto conforme all’ERC-4337 utilizzando Stackup (https://docs.stackup.sh/). Questo particolare contratto serve come un eccellente template di base per gli sviluppatori che si avventurano nell’Astrazione degli Account con Stackup.

Impostazioni per gli Sviluppatori

  1. Inizia aprendo la finestra del terminale ed eseguendo i seguenti comandi:
  • Impostare una copia locale di un progetto ERC-4337 di esempio da Stackup. Ecco una spiegazione di ogni comando:

git clone https://github.com/stackup-wallet/erc-4337-examples.git:

  • Questo comando utilizza Git per clonare il repository. Il repository contiene codice di esempio per progetti ERC-4337 sviluppati da Stackup.
cd erc-4337-examples:
  • Dopo aver clonato il repository, questo comando cambia la directory corrente nel terminale alla nuova directory ‘erc-4337-examples’ creata. Questa directory contiene i file del progetto clonato.
yarn install:
  • Questo comando utilizza Yarn, un gestore di pacchetti per JavaScript, per installare tutte le dipendenze richieste per il progetto ERC-4337. Queste dipendenze sono specificate in un file chiamato ‘package.json’ nella directory del progetto. Eseguendo yarn install ti assicuri di avere tutti i pacchetti necessari e le loro versioni corrette per eseguire e lavorare sul progetto.
  1. Andando avanti, procederemo con l’impostazione del nostro contratto ERC-4337. Questo viene realizzato utilizzando il comando di inizializzazione fornito da Yarn:
yarn run init
  • Questo comando è un passaggio cruciale nel processo di configurazione. Inizializza la configurazione del progetto per il tuo contratto ERC-4337. Essenzialmente, quando esegui yarn run init, viene eseguito uno script predefinito nel file package.json del progetto. Questo script è progettato per configurare vari aspetti dell’ambiente ERC-4337, come parametri predefiniti, impostazioni di rete e altre configurazioni necessarie affinché il contratto funzioni correttamente all’interno del framework Ethereum. Garantisce che il tuo ambiente di sviluppo sia correttamente allineato con i requisiti dello standard ERC-4337, facilitando un processo di sviluppo più fluido mentre inizi a costruire e personalizzare il tuo smart contract.

All’esecuzione del comando di inizializzazione viene generato un file config.json. Questo file contiene importanti valori di configurazione per il tuo contratto ERC-4337, come:

  • rpcUrl: Questo campo specifica l’URL della Remote Procedure Call (RPC), essenziale per supportare i metodi invocati dal contratto ERC-4337. Per popolare correttamente questo campo, avrai bisogno di una chiave API da Stackup.

  • signingKey: Questa chiave è fondamentale per creare firme per le UserOperations. Gioca un ruolo doppio essendo utilizzata anche dall’account contratto per la validazione delle transazioni.

  • paymaster.rpcUrl: Questo URL è specifico per il componente Paymaster del contratto ERC-4337. È cruciale affinché il Paymaster interagisca con la rete e svolga le sue funzioni.

  • paymaster.context: Questo è un campo flessibile che varia a seconda del Paymaster specifico con cui stai lavorando. È progettato per contenere qualsiasi informazione contestuale necessaria per l’operazione del Paymaster all’interno del contratto.

Ciascuno di questi campi gioca un ruolo specifico nella configurazione del contratto ERC-4337, garantendo che operi correttamente all’interno della rete Ethereum e interagisca efficacemente con altri componenti come UserOperations e Paymasters.

Generare una Chiave API per Stackup

  1. Una volta che il file config.json è a posto, è il momento di inserire dettagli specifici come l’URL RPC. Inizia visitando https://app.stackup.sh/sign-in e registrati per un account. Dopo la registrazione, ti verrà chiesto di scegliere una rete blockchain. Per questo tutorial, scegli la blockchain Ethereum Sepolia. Clicca su ‘Avanti’ per procedere. Successivamente, accedi alla tua nuova istanza bundler creata e seleziona l’opzione ‘Chiave API’ per ottenere la tua chiave. Copia questa Chiave API e torna al tuo file config.json, dove inserirai questa chiave nei campi rpcUrl pertinenti.

Il file config.json completato dovrebbe avere la seguente struttura:

{
  "rpcUrl": "https://api.stackup.sh/v1/node/b58...ad16",
  "signingKey": "0xc3e72...17bc",
  "paymaster": {
    "rpcUrl": "https://api.stackup.sh/v1/paymaster/8f92...84d74",
    "context": {}
  }
}

Creazione dell’indirizzo dello Smartcontract

  1. Ora che la nostra configurazione è stabilita, è il momento di generare un account smart contract, come specificato nel nostro file di configurazione. Per fare ciò, esegui il seguente comando nel tuo terminale:

yarn run simpleAccount address

  • Questo comando produrrà un indirizzo, che è l’identificativo per l’account smart contract che stai per creare. È importante notare che, a questo stadio, l’account smart contract non è ancora stato dispiegato sulla rete Ethereum. Tuttavia, generare questo indirizzo è un passaggio cruciale, in quanto ci permette di conoscere in anticipo l’indirizzo del nostro account smart contract. Questo passaggio preliminare è essenziale per organizzare e preparare il successivo processo di dispiegamento dello smart contract.

Dopo aver eseguito il comando, il tuo terminale dovrebbe visualizzare un output simile al seguente:

$ ts-node scripts/simpleAccount/index.ts address
Indirizzo SimpleAccount: 0x37662167966c7d2566b28ed8d4bea9d1d09d3ffd
 Completato in 1.75s.

Questo output indica che il comando per generare l’indirizzo per il tuo SimpleAccount è stato eseguito con successo. L’indirizzo visualizzato (0x37662167966c7d2566b28ed8d4bea9d1d09d3ffd) è un indirizzo Ethereum generato casualmente, che funge da segnaposto per l’effettivo indirizzo che verrà assegnato al tuo account smart contract. Viene anche indicato il tempo di completamento del processo, dimostrando l’efficienza e la rapidità dell’operazione.

  • Nella sezione successiva, ci concentreremo sull’aggiungere fondi all’indirizzo SimpleAccount appena creato. È importante ricordare, tuttavia, che lo smart contract stesso non è ancora stato dispiegato.

Aggiungere Fondi all’Account Smart Contract Utilizzando un Faucet

Procediamo con l’aggiungere fondi all’indirizzo del nostro account smart contract (per esempio, SimpleAccount) che abbiamo generato in precedenza.

Per fare ciò, potresti utilizzare il QuickNode Multi-Chain Faucet (https://faucet.quicknode.com/drip). Questo ti permette di ottenere un po’ di ETH testnet, che puoi inizialmente inviare al tuo portafoglio personale. Da lì, puoi trasferirlo all’indirizzo di SimpleAccount. È importante essere consapevoli del fatto che il Faucet richiede un saldo mainnet nell’indirizzo che deve essere finanziato. In alternativa, se possiedi già ETH di test in un diverso portafoglio, puoi trasferirlo direttamente all’indirizzo del tuo smart contract (SimpleAccount), evitando la necessità di utilizzare inizialmente il Faucet.

Avviare una Transazione da SimpleAccount a un Diverso Indirizzo

Ora che il nostro account smart contract, come SimpleAccount, è sufficientemente finanziato, è il momento di effettuare un trasferimento da questo account. Suggeriamo di assicurarti di avere almeno 0.01 ETH disponibili per testare un trasferimento di ETH, tenendo in mente le ulteriori spese di gas. Per iniziare, inserisci il seguente comando nel tuo terminale. Assicurati di sostituire i termini segnaposto come {address} e {eth} con i valori effettivi che intendi utilizzare.
yarn run simpleAccount transfer --to {address} --amount {eth}

Il comando fornito viene utilizzato per avviare un trasferimento di Ethereum (ETH) dal tuo account smart contract (in questo caso, SimpleAccount) a un altro indirizzo Ethereum. Ecco una spiegazione dei suoi componenti:

  • yarn run simpleAccount transfer: Questa parte del comando indica a Yarn di eseguire la funzione transfer all’interno dello script simpleAccount. Lo script simpleAccount fa parte del tuo progetto ed è progettato per interagire con lo smart contract SimpleAccount.

  • --to {address}: Questo flag specifica l’indirizzo Ethereum del destinatario per il trasferimento. Devi sostituire {address} con l’indirizzo Ethereum effettivo del destinatario a cui vuoi inviare ETH.

  • --amount {eth}: Qui, {eth} dovrebbe essere sostituito con la quantità di Ethereum che desideri trasferire. Questo valore è in ETH (la criptovaluta nativa di Ethereum). Ad esempio, se vuoi trasferire 0.02 ETH, sostituiresti {eth} con 0.02.

È importante assicurarsi che il SimpleAccount abbia abbastanza ETH per coprire sia l’importo che intendi trasferire sia le spese di gas associate alla transazione. Questo comando avvierà una transazione sulla rete Ethereum, trasferendo la quantità specificata di ETH dal tuo SimpleAccount all’indirizzo del destinatario fornito.

Il processo include:

  • Accettare l’indirizzo di destinazione (t) e la quantità di ether (amt) come input nella funzione principale.
  • Eseguire una verifica per qualsiasi middleware, particolarmente rilevante se è coinvolto un paymaster.
  • Inizializzare un contratto SimpleAccount utilizzando le impostazioni specificate nel file config.json.
  • Analizzare ed elaborare i valori forniti di indirizzo e quantità.
  • Firmare la transazione e invocare la funzione execute con i valori sopra menzionati.
  • Generare e restituire sia l’hash dell’UserOperation sia l’hash della transazione come output.

Il Processo di Transazione di uno Smart Contract Account

In una panoramica generale, quando viene avviato un trasferimento da un account smart contract, si svolge un processo complesso in background. Inizia con la creazione di un oggetto UserOperation, che delinea la transazione desiderata. Questo oggetto viene poi inviato a un gruppo di Bundlers, entità responsabili della gestione di queste operazioni. I Bundlers, dopo aver ricevuto l’UserOperation, creano una transazione che interagisce con un contratto specifico, comunemente noto come il contratto EntryPoint. Questo contratto svolge un ruolo fondamentale nell’esecuzione delle UserOperations raggruppate. È presso questo EntryPoint che la transazione viene elaborata, eseguendo il trasferimento secondo le istruzioni nell’UserOperation. Questo processo coinvolge vari trasferimenti, chiamate a contratti e la gestione delle spese di gas, tutti orchestrati per facilitare l’esecuzione fluida del trasferimento dall’account smart contract alla destinazione specificata.

Conclusione

Hai configurato con successo un account smart contract utilizzando ERC-4337 e Stackup, e hai anche realizzato un trasferimento di fondi da questo account a un diverso indirizzo. Anche se questa procedura potrebbe sembrare semplice e realizzabile con o senza ERC-4337, è importante riconoscere la più ampia gamma di opportunità che ERC-4337 porta. Questo include la capacità di avere transazioni con spese di gas sponsorizzate e la capacità di gestire transazioni raggruppate, aprendo un nuovo regno di funzionalità ed efficienze nelle tue interazioni con gli smart contract.