ink! 3.0: Importanti news per il linguaggio Rust-Based di Parity dedicato agli Smart Contract Wasm
ink!, il linguaggio di programmazione Rust-Based di Parity consente agli sviluppatori dell'ecosistema Polkadot e Substrate di sviluppare Smart Contract efficienti e ad alte prestazioni e applicazioni decentralizzate per le macchine virtuali Wasm, che rappresentano un'alternativa ai sistemi di Smart Contract basati su Ethereum (EVM/Solidity).
Substrate, il framework per la costruzione e personalizzazione di blockchain "standalone" e compatibili con Polkadot, rende lo sviluppo di una chain più semplice e veloce grazie alla presenza di tasselli modulari per i tipici componenti di una blockchain. Questi tasselli sono noti come pallet. Per incorporare le funzionalità degli Smart Contract basati su Wasm, gli sviluppatori possono utilizzare il pallet Contracts
, incluso nella libreria dei pallet di Substrate. ink!, un’estensione al linguaggio di programmazione Rust, è ciò che consente agli sviluppatori di scrivere questi Smart Contract per le blockchain che utilizzano il Pallet Contract.
Quest'ultima versione di ink! comprende la riscrittura di tutti i principali componenti che costituivano il suo predecessore, ink! 2.0. Grazie ai contributi e ai feedback di molti team che hanno scritto Smart Contract Wasm utilizzando ink! in questo periodo, il progetto si è evoluto in modo significativo rispetto alle versioni precedenti.
Oltre al rilascio di ink! 3.0, abbiamo anche perfezionato il pallet Contracts per aumentare le prestazioni delle Parachain e rendere molto più semplice per gli sviluppatori scrivere logiche complesse, aggiungendo alcune nuove funzionalità per migliorare le chiamate e le prestazioni dei cross-contract. Infine, sono state apportate alcune modifiche agli strumenti per gli sviluppatori grazie al rilascio della versione 1.0 di cargo-contract
.
Perché Rust e Wasm?
Noi di Parity siamo grandi fan di Rust e lo abbiamo utilizzato per scrivere la prima implementazione di Polkadot. Rust è un linguaggio di programmazione avanzato ed efficiente che dà priorità alla correttezza e aiuta a prevenire i bug del software, con una solida community intorno e il supporto di aziende importanti come Mozilla, Google, Microsoft e Amazon.
L'utilizzo di Rust per la creazione di ink! assicura la correttezza del suo rigoroso compilatore e permette di usufruire di tutti i miglioramenti dell'ecosistema Rust, come l'ottimizzazione del compilatore o l'utilizzo di librerie di terze parti.
Per saperne di più sul perché Rust è ideale per gli Smart Contract, cliccate qui.
Per diversi motivi, Wasm è un'altra tecnologia che svolge un ruolo fondamentale nella progettazione di Polkadot. Essendo il più possibile simile al codice macchina, Wasm è veloce, sicuro, leggero, ad alte prestazioni ed efficiente nell'esecuzione. È eseguibile nei browser web, favorendo così l'innovazione nelle applicazioni decentralizzate. concepite per massimizzare la user experience e la loro diffusione.
Wasm si aggiunge ai linguaggi con cui gli Smart Contract possono essere scritti, tra cui Go, C/C++ e naturalmente, Rust. Alla luce di tutti i benefici che Wasm fornisce, noi di Parity riteniamo che esso rappresenti il futuro dell'infrastruttura e delle applicazioni per gli Smart Contract e che rappresenti un miglioramento rispetto ai sistemi di scorsa generazione.
Per saperne di più sul perché Wasm è adatto per gli Smart Contract, cliccate qui.
Ink! 3.0
L'idea principale di ink! 3.0 è che appare e sembra Rust. La sintassi di Ink3.0 è leggermente cambiata per mappare meglio da Ink!. Quello che gli utenti vedono è per lo più ciò che verrà generato da ink!. La sintassi è praticamente identica a quella del linguaggio di programmazione Rust e di conseguenza tutti gli strumenti che gli sviluppatori di Rust conoscono e amano, come rust-analyzer e Clippy, funzionano immediatamente.
Oltre alla somiglianza con Rust, esaminiamo i cambiamenti più significativi apportati a ink! dalla sua versione 3.0:
- Supporto dei Trait - Si tratta di una delle caratteristiche più attese di ink! 3.0 e viene descritta come un'esperienza di sviluppo più “Rustica”. Grazie alla nuova macro procedurale
#[ink::trait_definition]
è ora possibile definire i propri trait che sono poi implementabili dagli Smart Contract di ink!. Questo consente la definizione di interfacce condivise di Smart Contract con diverse implementazioni concrete ed è utile per creare dei “contract” standard definiti dalla comunità. Da notare come questa definizione trait di ink! può essere definita ovunque, anche in un altro crate! - Dimensioni ridotte dei contratti - La riduzione delle dimensioni dei contratti significa migliori prestazioni e minori costi di gas. Gli Smart Contract generati precedentemente da ink! erano di grandi dimensioni in termini di codice Wasm, e questo comportava che il throughput delle transazioni parachain fosse limitato dalla larghezza di banda piuttosto che dalla complessità computazionale.
- Chiamata delegata - L'introduzione della
delegate_call
consente ai contratti di inoltrare una chiamata ricevuta a un altro contratto. Un caso d'uso per questo è l'implementazione di un modello di aggiornamento proxy per gli Smart Contract. - Estensioni della Chain - Questa funzionalità permette agli sviluppatori di chiamare i pallet Substrate direttamente dai loro contratti, consentendo loro di attingere al ricco ecosistema di sviluppo di Substrate.
cargo-contract 1.0
Parallelamente al rilascio di ink! 3.0 abbiamo anche rilasciato cargo-contract
1.0, uno strumento pratico per gli sviluppatori che permette di costruire, testare e fare il deployment dei contratti di ink! Alcuni aggiornamenti degni di nota di questa versione sono:
- Nuovi comandi CLI per interagire con gli Smart Contract sulla chain: caricare, istanziare e chiamare!
Gli utenti non dovranno più utilizzare l'interfaccia utente del browser per interagire con il loro contratti su una chain, bensì potranno utilizzare la riga di comando. Questo spiana anche la strada allo scripting e alle integrazioni negli ambienti di Continuous Integration. - Regole di linting per gli Smart Contract di ink!
Gli sviluppatori di ink! ricevono avvertimenti sugli errori più comuni grazie al controllo automatico del codice sorgente per verificare la presenza di errori di programmazione e battitura. Intendiamo costruire successivamente una collezione di regole di linting per i contratti di ink! In particolare, intendiamo definire regole che guidino l'utente a ridurre i costi del gas, a ridurre il footprint dei contratti, a correggere i modelli di utilizzo delle API e a evidenziare le vulnerabilità di sicurezza.
Il Contracts Pallet di Substrate
Il Contracts pallet è l'ambiente di esecuzione di Substrate per gli Smart Contract Wasm. Può eseguire Smart Contract in qualsiasi linguaggio di programmazione compilabile in Wasm, purchè siano implementate le API di Contracts pallet. ink! è un linguaggio che fa questo servizio per Rust.
Le versioni precedenti del pallet utilizzavano lo "state rent"[1] come meccanismo per far fronte allo "state bloat"[2]. Nella più recente implementazione, lo "state rent" è stato sostituito dall’automatic deposit collection (o raccolta automatica dei depositi). In precedenza, un contratto doveva assicurarsi di avere un saldo sufficiente per pagare la propria memorizzazione. In caso contrario, veniva disattivato fino a quando qualcuno non lo riattivava. Questo aggiungeva molto lavoro e memorizzazione per la scrittura del contract.
In base al sistema chiamato “automatic deposit collection”, il costo viene pagato automaticamente dal chiamante di un contratto e non dal contratto stesso. Il chiamante versa un deposito per ogni contratto dove è stato necessario creare un nuovo spazio di archiviazione a seguito della chiamata eseguita. In modo analogo, il chiamante riceve un rimborso da tutti i contratti da cui la chiamata ha rimosso lo spazio di archiviazione.
Questo nuovo sistema esclude completamente la possibilità che i contratti vengano messi in uno stato inattivo. In ogni caso, al fine di mantenere bassi i costi di utilizzo del contract, gli autori dei contratti preferiscono utilizzare il minor storage e creare modalità di rimozione dello spazio di memorizzazione quando non è più necessario.
Grazie alla community di ink!
Nel corso degli anni e delle varie versioni, ink! si è evoluto fino a raggiungere l'obiettivo di assomigliare sempre di più a Rust. Al momento, esso possiede tutte le caratteristiche che i programmatori Rust riconoscono e necessitano per migliorare ulteriormente la loro capacità di scrivere, aggiornare e ragionare su Smart Contract complessi. Nonostante ink! sia ora un linguaggio completo, rimane un linguaggio in fase di sviluppo e soprattutto, un progetto incentrato sulla community.
Grazie al contributo della community di ink!, ink! si è sviluppato fino a diventare un linguaggio che risponde alle esigenze del nostro futuro comune.
Seguite ciò che sta accadendo
Allora, cosa state aspettando? Date un’occhiata a cosa sta succedendo e scoprite cosa vi piace di ink!
Per gli sviluppatori interessati a saperne di più sulla creazione di Smart Contract Wasm, potete visitare quanto successo durante la prima conferenza sugli Smart Contract Wasm che si è svolta il 31 maggio 2022.
Potete trovare aggiornamenti periodici sotto la sezione Parity Smart Contract qui, e scoprire il Repo di ink! qui. È inoltre possibile seguire un tutorial guidato per muovere i primi passi con ink!, consultare la documentazione di ink! e assistere ad alcune presentazioni dal vivo dedicate a ink! (video 1, video 2).
Ulteriori informazioni sullo sviluppo nell'ecosistema di Substrate sono disponibili all'indirizzo substrate.dev, iscrivetevi alla Newsletter per gli sviluppatori di Substrate, unitevi alle community call di Substrate Seminar e seguite Substrate su Twitter.
[1] Il recupero dello spazio di archiviazione occupato dagli account inutilizzati
[2] Eccessiva richiesta di archiviazione della rete e conseguente rallentamento della computazione