
La technologie Ontology Wasm réduit le coût de migration des contrats intelligents dApp avec une logique commerciale complexe vers la blockchain, enrichissant ainsi considérablement l'écosystÚme dApp.
Actuellement prend en charge le développement simultané en Rust et en C++. Le langage Rust prend mieux en charge Wasm, et le bytecode généré est plus simple, ce qui peut encore réduire le coût des appels de contrat. Ainsi, comment utiliser Rust pour développer un contrat sur le réseau Ontology ?
Développement d'un contrat WASM avec Rust
Création de contrat
est un bon outil pour la création de projets et la gestion des packages lors du développement de programmes en Rust, qui aide les développeurs à mieux organiser l'interaction entre le code et les bibliothÚques tierces. Pour créer un nouveau contrat Ontology Wasm, exécutez simplement la commande suivante :
![]()
La structure du projet qu'elle génÚre :

Le fichier Cargo.toml est utilisĂ© pour configurer les informations de base du projet et les informations de la bibliothĂšque dĂ©pendante. La section [lib] dans le fichier doit ĂȘtre dĂ©finie Ă crate-type = [âcdylibâ]. Le fichier lib.rs est utilisĂ© pour Ă©crire la logique du contrat. De plus, vous devez ajouter les paramĂštres de dĂ©pendance dans la section [dependencies] du fichier de configuration Cargo.toml :

Avec cette dépendance, les développeurs peuvent appeler les interfaces interagissant avec la blockchain Ontology, ainsi que des outils tels que le paramÚtre de sérialisation.
Fonction d'entrée du contrat
Chaque programme a une fonction d'entrĂ©e, comme la fonction main que nous voyons gĂ©nĂ©ralement, mais un contrat n'a pas de fonction main. Lors du dĂ©veloppement d'un contrat Wasm avec Rust, la fonction invoke est utilisĂ©e par dĂ©faut comme fonction d'entrĂ©e pour utiliser le contrat. Le nom de la fonction en Rust sera obscur lors de la compilation du code source Rust en bytecode qui peut ĂȘtre exĂ©cutĂ© par la machine virtuelle. Pour empĂȘcher le compilateur de gĂ©nĂ©rer du code superflu et rĂ©duire la taille du contrat, la fonction invoke ajoute l'annotation #[no_mangle].
Comment la fonction invoke reçoit-elle des paramÚtres pour exécuter une transaction ?
La bibliothÚque ontio_std fournit la fonction runtime::input() pour obtenir les paramÚtres afin d'exécuter une transaction. Les développeurs peuvent utiliser ZeroCopySource pour désérialiser le tableau d'octets obtenu. Le premier tableau d'octets lu est le nom de la méthode invoke, suivi des paramÚtres de la méthode.
Comment le résultat de l'exécution du contrat est-il renvoyé ?
La fonction runtime::ret, fournie par la bibliothÚque ontio_std, renvoie le résultat de l'exécution de la méthode.
La fonction invoke complÚte se présente comme suit :

Sérialisation et désérialisation des données du contrat
Lors du développement de contrats, les développeurs rencontrent toujours des problÚmes de sérialisation et de désérialisation, en particulier sur la maniÚre de stocker les types de données struct dans la base de données et comment désérialiser un tableau d'octets lu depuis la base de données pour obtenir le type de données struct.
La bibliothÚque ontio_std fournit des interfaces de décodeur et d'encodeur pour la sérialisation et la désérialisation des données. Les champs de la structure struct implémentent également les interfaces de décodeur et d'encodeur, permettant ainsi de sérialiser et de désérialiser la structure. Les instances de la classe Sink sont nécessaires lors de la sérialisation de différents types de données. Une instance de la classe Sink a un champ de type set buf qui stocke les données de type octet, et toutes les données sérialisées sont conservées dans buf.
Pour les donnĂ©es de longueur fixe (par exemple : byte, u16, u32, u64, etc.), les donnĂ©es sont directement converties en tableau d'octets puis enregistrĂ©es dans buf ; pour les donnĂ©es de longueur variable, la longueur doit d'abord ĂȘtre sĂ©rialisĂ©e, suivie de Ddata (par exemple, des entiers non signĂ©s de taille inconnue, y compris u16, u32 ou u64, etc.).
La désérialisation est l'opposée directe. Pour chaque méthode de sérialisation, il existe une méthode de désérialisation correspondante. La désérialisation nécessite d'utiliser des instances de la classe Source. Cette instance de classe a deux champs buf et pos. Buf est utilisé pour stocker les données qui seront désérialisées, tandis que pos est utilisé pour garder la position actuelle de lecture. Lors de la lecture d'un type de données spécifique, si vous connaissez sa longueur, vous pouvez le lire directement ; pour les données de longueur inconnue, commencez par lire la longueur, puis lisez le contenu.
AccÚs et mise à jour des données sur la chaßne
Ontology-wasm-cdt-rust â a encapsulĂ© le mode opĂ©rationnel de travail avec les donnĂ©es dans la chaĂźne, ce qui est pratique pour les dĂ©veloppeurs afin de rĂ©aliser des opĂ©rations telles que l'ajout, la suppression, la modification et la demande de donnĂ©es dans la chaĂźne comme suit :
- database::get(key) â est utilisĂ© pour demander des donnĂ©es de la chaĂźne, et key demande l'implĂ©mentation de l'interface AsRef ;
- database::put(key, value) â est utilisĂ© pour stocker des donnĂ©es dans le rĂ©seau. Key demande l'exĂ©cution de l'interface AsRef, et value demande l'implĂ©mentation de l'interface Encoder ;
- database::delete(key) â est utilisĂ© pour supprimer des donnĂ©es de la chaĂźne, et key demande l'implĂ©mentation de l'interface AsRef.
Test de contrat
Lorsque les mĂ©thodes de contrat sont mises en Ćuvre, nous avons besoin d'accĂ©der aux donnĂ©es dans la chaĂźne et nous avons besoin d'une machine virtuelle appropriĂ©e pour exĂ©cuter le bytecode du contrat, il est donc gĂ©nĂ©ralement nĂ©cessaire de dĂ©ployer le contrat dans la chaĂźne pour les tests. Cependant, cette mĂ©thode de test est problĂ©matique. Pour faciliter le test des contrats pour les dĂ©veloppeurs, la bibliothĂšque ontio_std fournit un module de simulation pour les tests. Ce module assure la simulation des donnĂ©es dans la chaĂźne, facilitant ainsi le test unitaire des mĂ©thodes dans le contrat. Des exemples spĂ©cifiques peuvent ĂȘtre trouvĂ©s .
Débogage du contrat
console::debug(msg) affiche des informations de dĂ©bogage lors du dĂ©bogage du contrat. L'information msg sera enregistrĂ©e dans le fichier journal du nĆud. Il est impĂ©ratif de dĂ©finir le niveau du fichier journal en mode dĂ©bogage lorsque le nĆud de test local d'Ontology est en cours d'exĂ©cution.
runtime::notify(msg) affiche les informations de dĂ©bogage pertinentes lors du dĂ©bogage du contrat. Cette mĂ©thode enregistrera les informations ajoutĂ©es dans la chaĂźne et pourra ĂȘtre demandĂ©e Ă partir de la chaĂźne Ă l'aide de la mĂ©thode getSmartCodeEvent.
Cet article a été traduit par l'équipe de Hashrate & Shares spécialement pour OntologyRussia.
Vous ĂȘtes dĂ©veloppeur ? Rejoignez notre communautĂ© technique sur . De plus, jetez un coup d'Ćil Ă sur notre site, oĂč vous pouvez trouver des outils pour dĂ©veloppeurs, de la documentation et bien plus encore.
Ontology
- /
- Telegram /
- /
Source : habr.com
