eip-8032 (e eip-2926, por sua vez) vêm com um processo de conversão. Percebi que este processo é mal compreendido, mesmo por desenvolvedores principais. Antes do próximo ACDE, estou escrevendo uma explicação rápida.
No cerne, não é nada mais do que um simples iterador, percorrendo contas e contando folhas. Quando todas as folhas foram contadas, essa contagem é adicionada como um campo à conta. A cada bloco, o iterador avança N posições. A conversão para quando a última posição é alcançada.
Aqui, "posição" significa ou uma conta ou um slot, onde quer que o iterador possa "parar". Devido à quantidade de dados, é importante que a iteração pare em um ponto "seguro" e retome no próximo bloco.
Vamos olhar para o seguinte exemplo simplificado. Há muito menos dados no estado do que na vida real, e a árvore é uma árvore binária, mas o exemplo é de outra forma preciso. O símbolo ∅ significa uma conta sem armazenamento. Se estiver ausente, então a conta tem uma árvore de armazenamento.
Inicialmente, o iterador é definido como 0, ou seja, - posição do hash da conta = 0 - posição do hash do slot = 0 É representado com uma seta vermelha.
Neste exemplo, tomamos o passo do iterador N = 2 (na prática, N > 10_000). No bloco de fork, o iterador move-se por duas posições. A primeira posição é uma conta sem armazenamento, portanto nada é feito.
Ainda no bloco de bifurcação, o iterador move-se para a 2ª posição, que é um slot (ou seja, o iterador para no armazenamento de uma conta antes de parar na própria conta). O contador de slots é definido como 1, e uma vez que o iterador completou todo o seu percurso para o bloco de bifurcação, ele para.
No próximo bloco, o iterador cobre mais uma vez duas posições: - A 1ª é o 2º slot da 2ª conta, para a qual o contador foi incrementado - A 2ª é a própria 2ª conta. O valor do contador é adicionado como um campo da conta, e o contador é redefinido.
No seguinte bloco (fork + 2), o iterador percorre os dois slots da 3ª conta, mas o seu passo é alcançado antes que a conta em si (próxima posição) seja atualizada com o contador (que é 2).
Último bloco da conversão, a 3ª conta recebe um contador, e depois a última conta é verificada quanto ao estado (que não possui, portanto não é necessária atualização).
Uma vez que não há mais contas, o iterador termina e a conversão está completa.
E se o armazenamento for adicionado à conta A depois que o iterador passou pela conta A? O contador dentro de A é simplesmente aumentado.
E se o armazenamento for adicionado à conta que está a ser convertida? - antes do iterador: nada a fazer, pois o iterador irá contá-lo quando chegar lá - depois do iterador ter passado: armazená-lo na conta, adicioná-lo ao contador do iterador após o término da enumeração de slots
Quando é que os custos de gás se aplicam? Quando a conta foi convertida.
Quanto tempo durará a conversão? Dependendo do passo, até um mês. O valor é escolhido de forma que o cálculo adicional seja negligenciável em comparação com a operação regular do bloco. 10_000 é herdado do verkle e levaria um mês. Os benchmarks certamente encontrariam um valor mais rápido.
E isso é tudo, obrigado por ler até ao fim 🫶
307