In questa serie in tre parti, riveleremo i risultati tecnici in grado di migliorare significativamente l'elaborazione dei dati delle applicazioni in esecuzione sul protocollo Internet Computer (ICP).
Questo aggiornamento è una pietra miliare nel roadmap dell'ICP, attualmente viene promosso in tutta la rete; Stellarator è una svolta nella persistenza dei dati on-chain, aumentando notevolmente la scalabilità e la capacità di elaborazione dello storage dei dati, offrendo nuove opportunità per applicazioni complesse precedentemente limitate dai sistemi.
Questo progresso consente agli sviluppatori di costruire applicazioni complesse che richiedono l'elaborazione di grandi volumi di dati, portando a nuovi livelli di utilità per la tecnologia blockchain.
Nella seconda parte di questa serie, Luc Bläser ci porterà a conoscere la persistenza ortogonale avanzata di Motoko; se ti sei perso la prima parte sulla persistenza dei dati, puoi trovarla qui.
Semplice, sicuro, veloce: la persistenza ortogonale avanzata di Motoko
Motoko introduce una persistenza ortogonale avanzata, una funzionalità unica progettata per alleviare il carico sui programmatori nella gestione della memoria stabile, fornendo un meccanismo di aggiornamento semplice, sicuro e veloce.
Motoko è sempre in grado di mantenere automaticamente lo stato del programma durante il processo di aggiornamento, senza alcun codice aggiuntivo per gestire la persistenza; sfortunatamente, le precedenti implementazioni di questa funzionalità non erano scalabili per dati di grandi dimensioni o profondamente annidati.
Questa funzionalità è stata notevolmente migliorata in termini di sicurezza, prestazioni e scalabilità; l'innovazione chiave è stata quella di evitare di trasferire lo stato in memoria stabile semplicemente mantenendo la memoria principale invece di cancellarla.
Il sistema di runtime ora garantisce la coerenza dei dati durante l'aggiornamento in modo molto efficiente, indipendentemente dalla dimensione della memoria; infine, siamo passati da 32 bit a 64 bit di memoria principale, espandendoci infine a un ampio volume di dati persistenti.
Contesto
Gli aggiornamenti dei contenitori sono una sfida sull'Internet Computer, spesso comportando una notevole complessità, sovraccarico e alcuni rischi di perdita di dati; sebbene la memoria principale del contenitore (nota anche come memoria WebAssembly) sia persistente tra le transazioni, in passato veniva cancellata durante l'aggiornamento, un passaggio piuttosto artificiale poiché la memoria ha già un backup file sull'Internet Computer.
Il motivo per cui questo comportamento si verifica è che le implementazioni dei linguaggi di programmazione mainstream non considerano la persistenza durante il design: riorganizzano le strutture di memoria in modo incontrollato durante la ricompilazione o l'esecuzione e non possono semplicemente ripristinare la memoria della versione precedente per eseguire programmi modificati.
Pertanto, i programmatori devono esplicitamente utilizzare le API di memoria stabile o strutture dati stabili speciali per preservare i dati durante il processo di aggiornamento, simile all'architettura dei computer tradizionali che forniscono memoria principale volatile e storage ausiliario persistente, ma a costo di una maggiore complessità dello sviluppo software (pensa a mapper di database ad oggetti, ecc.).
A differenza di altri, in Motoko possiamo controllare completamente il compilatore e il sistema di runtime, quindi possiamo anche controllare completamente il layout di memoria, il che consente il supporto della persistenza ortogonale in Motoko e la sua continua utilizzabilità anche dopo gli aggiornamenti.
Pertanto, i programmatori di Motoko possono comodamente sviluppare qualsiasi struttura dati (tipi di primo ordine) all'interno di concetti di linguaggio standard, senza dover utilizzare memoria stabile esplicita, strutture dati stabili dedicate o altre astrazioni simili a database; il sistema di runtime mantiene automaticamente gli oggetti necessari.
In passato, il sistema di runtime Motoko otteneva la persistenza ortogonale serializzando e deserializzando un grafo di oggetti persistenti in memoria stabile, il che ha portato a gravi problemi di scalabilità e prestazioni, poiché il processo di serializzazione/deserializzazione è molto costoso e potrebbe persino superare i limiti delle istruzioni, ostacolando infine l'aggiornamento; questi difetti lo rendevano impraticabile per applicazioni di grandi dimensioni, ed è per questo che abbiamo ridisegnato il supporto per la persistenza ortogonale in Motoko.
Attraverso le modifiche al sistema di runtime di Internet Computer e Motoko, abbiamo realizzato aggiornamenti scalabili senza la necessità di costose operazioni di serializzazione e deserializzazione nello spazio di memoria stabile ausiliario; al contrario, manteniamo semplicemente la persistenza della memoria principale durante l'aggiornamento, mentre espandiamo lo spazio degli indirizzi della persistenza ortogonale a 64 bit, per consentire la futura espansione alla stessa capacità fornita dalla memoria stabile a 64 bit.
Persistenza ortogonale avanzata
Il nostro obiettivo è semplificare lo sviluppo software sull'Internet Computer e alleviare il carico sui programmatori nella gestione della memoria stabile; a tal fine, Motoko è stato ottimizzato per la persistenza sull'Internet Computer, realizzando aggiornamenti semplici, sicuri e rapidi:
Semplice: attraverso la persistenza ortogonale (variabili stabili in Motoko), qualsiasi struttura raggiungibile di tipo di primo ordine sarà automaticamente persistente durante l'aggiornamento, senza necessità di memoria o strutture dati stabili.
Sicurezza: il sistema di runtime controlla rigorosamente la compatibilità dei tipi durante l'aggiornamento e supporta modifiche ai dati tramite migrazioni implicite, qualsiasi migrazione più complessa può essere realizzata tramite codice personalizzato, impedendo così qualsiasi corruzione o malinteso dei dati a livello di memoria.
Velocità: l'aggiornamento è diventato super veloce, poiché la memoria principale viene semplicemente mantenuta durante l'aggiornamento, senza necessità di copiarla in memoria stabile o viceversa; la memoria principale è stata estesa a 64 bit, per consentire in futuro una scalabilità equivalente alla memoria stabile.
Panoramica del design
Come prerequisito per la persistenza ortogonale avanzata, il protocollo Internet Computer è stato ampliato per supportare la conservazione della memoria principale attraverso gli aggiornamenti e la memoria principale a 64 bit basata sulla proposta WebAssembly Memory64.
Attraverso un design personalizzato del compilatore e del sistema di runtime, Motoko definisce un layout di memoria invariabile durante la compilazione, in cui tutti gli oggetti sono allocati nell'heap dinamico e accompagnati da metadati sufficienti, consentendo alla nuova versione del programma di accedere in modo sicuro allo stato delle versioni precedenti.
Pertanto, i segmenti di dati passivi di WebAssembly si sono rivelati utili, poiché consentono di ritardare l'allocazione di dati statici del programma (come testo) all'interno del sistema di runtime, senza dover mantenere un intervallo di indirizzo statico.
Conserviamo persino lo stato del garbage collector (GC) incrementale durante l'aggiornamento, il che significa che l'aggiornamento può avvenire in qualsiasi momento, senza dover attendere il completamento dell'esecuzione del GC.
Per garantire una rigorosa sicurezza della memoria e dei tipi, il sistema di runtime memorizza i tipi della versione corrente del programma e utilizza queste informazioni per controllare la compatibilità della memoria quando si tenta di aggiornare a una nuova versione del programma.
Poiché questo controllo dipende solo dal numero di tipi e non dal numero di oggetti, la velocità di aggiornamento è estremamente rapida e può espandersi a qualsiasi dimensione della memoria; alcune migrazioni di dati (come l'aggiunta o la rimozione di variabili stabili, l'elevazione dei tipi, l'aggiunta di opzioni di variante, ecc.) saranno supportate automaticamente, mentre qualsiasi migrazione più complessa può essere programmata manualmente, proteggendo nel contempo la sicurezza dei tipi.
Motoko ha implementato una migrazione automatica dei dati dalla persistenza tradizionale obsoleta alla persistenza ortogonale avanzata; per consentire future potenziali variazioni radicali nel layout di memoria (ci aspettiamo che ciò accada raramente), Motoko include anche un meccanismo di persistenza ausiliaria basato sulla serializzazione della memoria stabile e un algoritmo di copia grafica, oltre a un tempo di slicing di determinismo illimitato non soggetto a limiti di istruzione del protocollo Internet Computer.
Puoi trovare maggiori dettagli sulla persistenza ortogonale avanzata, sul suo design, implementazione, scenari di migrazione dei dati e valutazione delle prestazioni nel nostro recente articolo (Implementare aggiornamenti dei contratti più intelligenti utilizzando la persistenza ortogonale).
Crescita in produzione
Il primo passo, la persistenza ortogonale avanzata può essere utilizzata come funzionalità opzionale, attivabile tramite l'opzione del compilatore '--enhanced-orthogonal-persistence'; i parametri corrispondenti possono essere specificati in dfx.json come segue:
Motoko migra automaticamente dalla vecchia persistenza classica a 32 bit alla persistenza ortogonale avanzata, ma tieni presente che non supporta l'operazione inversa di downgrade da EOP a persistenza classica a 32 bit.
Nell'attuale versione, sebbene siamo passati a 64 bit, Internet Computer offre solo 4 GB di memoria principale; questo è solo un passo conservativo, seguiamo un approccio alla pubblicazione che evita il rischio, iniziando in piccolo e aumentando gradualmente la capacità nel tempo.
Infatti, a causa del passaggio a 64 bit e del limite iniziale di 4 GB, si prevede che l'utilizzo netto della memoria nella fase iniziale sarà inferiore a quello a 32 bit (poiché la dimensione dei puntatori è raddoppiata), e il costo delle istruzioni per l'accesso alla memoria a 64 bit è stato anche aumentato per coprire conservativamente i costi hardware, riducendosi in futuro.
Ma soprattutto, gli aggiornamenti diventeranno estremamente rapidi e non raggiungeranno più i limiti delle istruzioni dell'Internet Computer, anche con il tasso di utilizzo massimo dell'heap (considerando anche che non sarà più necessario un hook per l'aggiornamento).
Il prossimo passo, dopo aver raccolto feedback e potenzialmente migliorato il sistema e ampliato la capacità della memoria, è pianificare di rendere la persistenza ortogonale avanzata la modalità predefinita.
Conclusione
La persistenza ortogonale avanzata di Motoko consente ai programmatori dell'Internet Computer di concentrarsi sulle loro applicazioni core, senza doversi preoccupare della memoria stabile.
Questo non solo consente una persistenza semplice e sicura, ma riduce anche significativamente i costi di aggiornamento e accesso ai dati dell'Internet Computer.
La persistenza ortogonale avanzata può essere raggiunta solo attraverso compilatori e sistemi di runtime personalizzati, proprio come abbiamo per Motoko.
Ulteriori informazioni
Luc Bläser, Claudio Russo, Gabor Greif, Ryan Vandersmith e Jason Ibrahim, implementare aggiornamenti più intelligenti dei contratti tramite persistenza ortogonale, VMIL 2024:
https://dl.acm.org/doi/10.1145/3689490.3690401
Post del forum DFINITY - Beta testing della persistenza ortogonale avanzata:
https://forum.dfinity.org/t/beta-testing-motoko-s-enhanced-orthogonal-persistence-eop/35787
Documentazione - La persistenza ortogonale avanzata di Motoko:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/orthogonal-persistence/enhanced
Documentazione - Variabili stabili, aggiornamenti e migrazione dei dati in Motoko:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/upgrades
Siamo lieti di ricevere il tuo feedback; ti preghiamo di condividere le tue idee nel canale DFINITY Developers X o nel repository GitHub di Motoko.
Unisciti a noi domani per la parte 3 del nostro viaggio Stellarator, con Kamil Popielarz e Yvonne-Anne Pignolet, per scoprire come aumentare il throughput dei messaggi in entrata.
Contenuti IC che ti interessano
Progressi tecnici | Informazioni sul progetto | Eventi globali
Segui il canale IC su Binance
Rimani aggiornato