Tópicos populares
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
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
Top
Classificação
Favoritos
