eip-8032 (e eip-2926 per quel che riguarda) comportano un processo di conversione. Mi è stato fatto notare che questo processo è poco compreso, anche dagli sviluppatori principali. In vista del prossimo ACDE, sto scrivendo una breve spiegazione.
Alla base, non è altro che un semplice iteratore, che scorre sugli account e conta le foglie. Quando tutte le foglie sono state contate, quel conteggio viene aggiunto come campo all'account. Ad ogni blocco, l'iteratore avanza di N posizioni. La conversione si ferma quando si raggiunge l'ultima posizione.
Qui, "posizione" significa sia un account che uno slot, ovunque l'iteratore possa "fermarsi". A causa della quantità di dati, è importante che l'iterazione si fermi in un punto "sicuro" e riprenda al blocco successivo.
Esaminiamo il seguente esempio semplificato. Ci sono molti meno dati nello stato rispetto alla vita reale, e l'albero è un albero binario, ma l'esempio è altrimenti accurato. Il simbolo ∅ significa un account senza storage. Se mancante, allora l'account ha un albero di storage.
Inizialmente, l'iteratore è impostato su 0, cioè. - posizione dell'hash dell'account = 0 - posizione dell'hash dello slot = 0 È rappresentato con una freccia rossa.
In questo esempio, prendiamo il passo dell'iteratore N = 2 (in pratica, N > 10_000). Al blocco di fork, l'iteratore si sposta di due posizioni. La prima posizione è un account senza storage, quindi non viene fatto nulla.
Ancora al blocco fork, l'iteratore si sposta nella 2ª posizione, che è uno slot (cioè l'iteratore si ferma nella memoria di un account prima di fermarsi all'account stesso). Il contatore degli slot è impostato su 1, e poiché l'iteratore ha completato il suo intero passo per il blocco fork, si ferma.
Nel blocco successivo, l'iteratore copre ancora due posizioni: - La 1ª è il 2° slot del 2° account, per il quale il contatore è stato incrementato - La 2ª è il 2° account stesso. Il valore del contatore viene aggiunto come campo dell'account e il contatore viene azzerato.
Nel blocco seguente (fork + 2), l'iteratore passa attraverso i due slot del 3° account, ma il suo passo viene raggiunto prima che l'account stesso (prossima posizione) venga aggiornato con il contatore (che è 2).
Ultimo blocco della conversione, al 3° account viene dato un contatore, e poi l'ultimo account viene controllato per lo stato (che non ha, quindi non è necessaria alcuna aggiornamento).
Poiché non ci sono ulteriori conti, l'iteratore termina e la conversione è completa.
Cosa succede se lo storage viene aggiunto all'account A dopo che l'iteratore ha superato l'account A? Il contatore all'interno di A viene semplicemente aumentato.
Cosa succede se lo storage viene aggiunto all'account in fase di conversione? - prima dell'iteratore: nulla da fare poiché l'iteratore lo conterà quando arriverà lì - dopo che l'iteratore è passato: memorizzarlo nell'account, aggiungerlo al contatore dell'iteratore dopo che la enumerazione degli slot è terminata
Quando si applicano i costi del gas? Quando l'account è stato convertito.
Quanto durerà la conversione? A seconda del passo, fino a un mese. Il valore è scelto in modo che il calcolo aggiuntivo sia trascurabile rispetto all'operazione normale del blocco. 10_000 è ereditato da verkle e richiederebbe un mese. I benchmark troverebbero sicuramente un valore più veloce.
E questo è tutto, grazie per aver letto fino alla fine 🫶
302