图片

Nesta série de três partes, revelaremos conquistas técnicas que podem melhorar significativamente o processamento de dados em aplicativos executados no Internet Computer Protocol (ICP).

Esta atualização é um marco no roteiro do ICP para o Stellarator, atualmente sendo promovido em toda a rede. O Stellarator é um avanço em termos de persistência de dados na cadeia, melhorando significativamente a escalabilidade e capacidade de processamento do armazenamento de dados, trazendo novas oportunidades para aplicativos complexos que antes eram limitados por restrições do sistema.

Esse avanço capacita os desenvolvedores a construir aplicativos complexos que exigem processamento de dados em larga escala, trazendo novos níveis de utilidade à tecnologia blockchain.

Na segunda parte desta série, Luc Bläser nos guiará através da persistência ortogonal aprimorada do Motoko; se você perdeu a primeira parte sobre persistência de dados, pode encontrá-la aqui.

Simples, seguro e rápido: A persistência ortogonal aprimorada do Motoko

O Motoko introduziu uma persistência ortogonal aprimorada, que é uma característica única projetada para aliviar a carga dos programadores ao lidar com memória estável, oferecendo um mecanismo de atualização simples, seguro e rápido.

O Motoko sempre foi capaz de manter automaticamente o estado do programa durante o processo de atualização, sem necessidade de qualquer código adicional para lidar com a persistência; infelizmente, a implementação anterior dessa funcionalidade não conseguiu escalar para dados grandes ou profundamente aninhados.

Essa funcionalidade agora foi significativamente aprimorada em segurança, desempenho e escalabilidade; a inovação chave é evitar a transferência de estado para a memória estável simplesmente mantendo a memória principal em vez de apagá-la.

O sistema de tempo de execução agora garante a consistência dos dados durante a atualização de maneira muito eficiente, independentemente do tamanho da memória; no final, nós mudamos de 32 bits para 64 bits de memória principal, expandindo finalmente para grandes quantidades de dados persistentes.

Contexto

As atualizações de contêiner são um desafio no Internet Computer, geralmente envolvendo uma complexidade considerável, sobrecarga e algum risco de perda de dados; embora a memória principal do contêiner (também conhecida como memória WebAssembly) seja persistente entre transações, no passado ela era apagada durante as atualizações, o que era uma etapa bastante artificial, uma vez que a memória já tinha backups de arquivos no Internet Computer.

O motivo para esse comportamento é que as implementações das linguagens de programação mainstream não consideraram a persistência em seu design: elas reorganizam a estrutura de memória de maneira não controlada durante a recompilação ou execução e não podem simplesmente usar a memória anterior para recuperar a execução do programa modificado.

Portanto, os programadores devem explicitamente usar a API da memória estável ou estruturas de dados estáveis especiais para salvar dados durante o processo de atualização, semelhante a arquiteturas de computadores tradicionais que oferecem memória principal volátil e armazenamento auxiliar persistente, mas à custa de uma complexidade de desenvolvimento de software aumentada (pense em mapeadores de banco de dados de objetos etc.).

Diferente disso, no Motoko, podemos ter controle total sobre o compilador e o sistema de tempo de execução, permitindo também o controle total sobre o layout da memória, o que permite o suporte à persistência ortogonal e a continuidade de uso mesmo após atualizações.

Assim, os programadores do Motoko podem convenientemente desenvolver qualquer estrutura de dados (tipos de primeira ordem) dentro de conceitos de linguagem padrão, sem usar memória estável explícita, estruturas de dados estáveis dedicadas ou outras abstrações semelhantes a bancos de dados, com o sistema de tempo de execução mantendo automaticamente os objetos necessários.

Anteriormente, o sistema de tempo de execução do Motoko implementava persistência ortogonal serializando e desserializando o gráfico de objetos persistentes na memória estável, o que resultou em sérios problemas de escalabilidade e desempenho, pois o processo de serialização/desserialização é muito caro e pode até exceder os limites de instrução, dificultando a atualização; essas falhas tornaram impraticável para aplicativos maiores, e é por isso que redesenhamos o suporte à persistência ortogonal no Motoko.

Através da mudança no Internet Computer e no sistema de tempo de execução do Motoko, conseguimos realizar atualizações escaláveis sem a necessidade de caro processo de serialização e desserialização na memória estável auxiliar, em vez disso, mantemos a persistência da memória principal durante o processo de atualização; ao mesmo tempo, expandimos o espaço de endereçamento da persistência ortogonal para 64 bits, para que no futuro possamos expandir para a mesma capacidade fornecida pela memória estável de 64 bits.

Persistência ortogonal aprimorada

Nosso objetivo é simplificar o desenvolvimento de software no Internet Computer e aliviar a carga dos programadores ao lidar com memória estável; para isso, o Motoko foi otimizado para a persistência no Internet Computer, ao mesmo tempo em que oferece uma atualização simples, segura e rápida:

  • Simples: através da persistência ortogonal (variáveis estáveis no Motoko), qualquer estrutura alcançável de tipo de primeira ordem será automaticamente persistente durante o processo de atualização, sem necessidade de memória estável ou estruturas de dados estáveis.

  • Segurança: O sistema de tempo de execução verifica rigorosamente a compatibilidade de tipos durante a atualização e suporta várias alterações de dados através de migrações implícitas; quaisquer migrações mais complexas podem ser implementadas através de código personalizado, o que pode prevenir qualquer corrupção ou mal-entendido de dados em nível de memória.

  • Rápido: A atualização se torna super rápida porque a memória principal é mantida durante a atualização, sem necessidade de cópia para a memória estável ou de cópia a partir da memória estável; a memória principal foi expandida para 64 bits, permitindo futura expansão para o mesmo tamanho da memória estável.

Visão geral do design

Como pré-requisito para a persistência ortogonal aprimorada, o protocolo do Internet Computer foi expandido para suportar a retenção da memória principal através de atualizações e a memória principal de 64 bits baseada na proposta de Memory64 do WebAssembly.

Com o design de um compilador e sistema de tempo de execução personalizados, o Motoko define um layout de memória imutável, onde todos os objetos são alocados na pilha dinâmica e acompanhados de metadados adequados para que a nova versão do programa possa acessar com segurança o estado das versões anteriores.

Assim, os segmentos de dados passivos do WebAssembly se mostraram úteis, pois permitem a alocação de dados estáticos do programa (como textos) no sistema de tempo de execução de forma atrasada, sem precisar reter um intervalo de endereços estáticos.

Nós até manteremos o estado do coletor de lixo incremental (GC) durante o processo de atualização, o que significa que a atualização pode ocorrer a qualquer momento, sem precisar esperar a conclusão da execução do GC.

Para garantir segurança rigorosa de memória e tipos, o sistema de tempo de execução armazena os tipos da versão atual do programa e usa essas informações para verificar a compatibilidade de memória ao tentar atualizar para uma nova versão do programa.

Como essa verificação depende apenas do número de tipos e não do número de objetos, a velocidade da atualização é extremamente rápida e pode ser escalada para qualquer tamanho de memória; certas migrações de dados (como adicionar ou remover variáveis de memória estável, elevar tipos, adicionar opções de variantes, etc.) são suportadas automaticamente, enquanto qualquer migração mais complexa pode ser programada manualmente, mantendo a proteção da segurança de tipos.

O Motoko implementou a migração automática de dados da persistência tradicional antiga para a persistência ortogonal aprimorada; para permitir mudanças drásticas no layout da memória que podem ocorrer no futuro (embora esperemos que isso aconteça raramente), o Motoko também inclui um mecanismo de persistência auxiliar baseado em serialização de memória estável e algoritmos de cópia gráfica, além de um fatiamento de tempo de determinação infinita que não está sujeito a limites de instrução do Internet Computer Protocol.

Você pode encontrar mais detalhes sobre a persistência ortogonal aprimorada, seu design, implementação, cenários de migração de dados e avaliações de desempenho em nosso artigo publicado recentemente (Implementando atualizações de contrato mais inteligentes usando persistência ortogonal).

Promoção de produção

Na primeira etapa, a persistência ortogonal aprimorada pode ser usada como uma funcionalidade opcional, ativada através da opção do compilador '--enhanced-orthogonal-persistence'; os parâmetros correspondentes podem ser especificados em dfx.json da seguinte forma:

图片

O Motoko migrará automaticamente da antiga persistência clássica de 32 bits para a persistência ortogonal aprimorada, mas observe que a operação reversa de rebaixamento de EOP para a persistência clássica de 32 bits não é suportada.

Na versão atual, embora tenhamos feito a transição para 64 bits, o Internet Computer oferece apenas 4GB de memória principal, o que é uma medida conservadora para este primeiro passo; seguimos uma abordagem de lançamento que evita riscos, começando pequeno e aumentando a capacidade ao longo do tempo.

Na verdade, devido à transição para 64 bits e ao limite inicial de 4GB, espera-se que o uso líquido de memória na fase inicial seja menor do que 32 bits (pois o tamanho do ponteiro aumentou para o dobro); o custo das instruções de acesso à memória de 64 bits também foi aumentado para cobrir conservadoramente os custos de hardware, podendo ser reduzido no futuro.

Mas, mais importante, as atualizações se tornarão muito rápidas e não estarão mais sujeitas aos limites de instrução do Internet Computer, mesmo com a máxima utilização da pilha (também considerando que não há mais necessidade de ganchos de atualização).

Na próxima etapa, após coletar feedback e potencialmente melhorar o sistema e expandir a capacidade de memória, planejamos tornar a persistência ortogonal aprimorada o modo padrão.

Conclusão

A persistência ortogonal aprimorada do Motoko permite que os desenvolvedores do Internet Computer se concentrem em seus aplicativos centrais, sem se preocupar com a memória estável.

Isso não só possibilita uma persistência simples e segura, mas também reduz significativamente o custo de atualizações e acesso a dados no Internet Computer.

A persistência ortogonal aprimorada só pode ser alcançada através de um compilador e sistema de tempo de execução personalizados, como o que temos atualmente para o Motoko.

Mais informações

Luc Bläser, Claudio Russo, Gabor Greif, Ryan Vandersmith e Jason Ibrahim, implementando atualizações de contrato mais inteligentes com persistência ortogonal, VMIL 2024:

  • https://dl.acm.org/doi/10.1145/3689490.3690401

Postagem do fórum DFINITY - Teste Beta da persistência ortogonal aprimorada:

  • https://forum.dfinity.org/t/beta-testing-motoko-s-enhanced-orthogonal-persistence-eop/35787

Documentação - A persistência ortogonal aprimorada do Motoko:

  • https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/orthogonal-persistence/enhanced

Documentação - Variáveis estáveis, atualizações e migração de dados no Motoko:

  • https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/upgrades

Estamos ansiosos para receber seu feedback; compartilhe seus pensamentos no canal DFINITY Developers X ou no repositório do Motoko no GitHub.

Junte-se a nós amanhã para a terceira parte de nossa jornada Stellarator, com Kamil Popielarz e Yvonne-Anne Pignolet, para aprender como melhorar a taxa de transferência de mensagens de entrada.

图片

#Motoko #ICP #DFINITY

Conteúdo IC que você se importa

Avanços técnicos | Informações do projeto | Eventos globais

Colecione e siga o canal IC Binance

Fique por dentro