
La tecnología Ontology Wasm reduce el costo de transferir contratos inteligentes dApp con lógica empresarial compleja a la blockchain, enriqueciendo significativamente el ecosistema dApp.
Actualmente admite simultáneamente el desarrollo en Rust y C++. Rust ofrece un mejor soporte para Wasm, y el código de bytes generado es más simple, lo que puede reducir aún más el costo de las llamadas a contratos. Así que ¿cómo utilizar Rust para desarrollar un contrato en la red de Ontology?
Desarrollo de contrato WASM utilizando Rust
Creación de contrato
es una buena herramienta para crear proyectos y gestionar paquetes en el desarrollo de programas en Rust, que ayuda a los desarrolladores a organizar mejor la interacción entre el código y las bibliotecas externas. Para crear un nuevo contrato Ontology Wasm, simplemente ejecuta el siguiente comando:
![]()
La estructura del proyecto que genera:

El archivo Cargo.toml se utiliza para configurar la información básica del proyecto y la información de la biblioteca dependiente. La sección [lib] en el archivo debe establecerse en crate-type = ["cdylib"]. El archivo lib.rs se usa para escribir la lógica del contrato. Además, necesitas agregar parámetros de dependencia en la sección [dependencies] del archivo de configuración Cargo.toml:

Con esta dependencia, los desarrolladores pueden invocar interfaces que interactúan con la blockchain de Ontology, así como herramientas como el parámetro de serialización.
Función de entrada del contrato
Cada programa tiene una función de entrada, como la función main que normalmente vemos, pero los contratos no tienen una función main. Cuando se desarrolla un contrato Wasm utilizando Rust, la función invoke se utiliza por defecto como función de entrada para utilizar el contrato. El nombre de la función en Rust no será claro al compilar el código fuente de Rust en código de bytes que puede ser ejecutado por la máquina virtual. Para evitar que el compilador genere código redundante y reducir el tamaño del contrato, la función invoke añade la anotación #[no_mangle].
¿Cómo recibe la función invoke los parámetros para ejecutar la transacción?
La biblioteca ontio_std proporciona la función runtime::input() para obtener parámetros para la ejecución de transacciones. Los desarrolladores pueden utilizar ZeroCopySource para deserializar el array de bytes recibido. El primer array de bytes leído es el nombre del método invoke, seguido de los parámetros del método.
¿Cómo se devuelve el resultado de la ejecución del contrato?
La función runtime::ret, que se proporciona en la biblioteca ontio_std, devuelve el resultado de la ejecución del método.
La función invoke completada se ve de la siguiente manera:

Serialización y deserialización de datos del contrato
En el proceso de desarrollo de contratos, los desarrolladores siempre se enfrentan a problemas de serialización y deserialización, específicamente sobre cómo almacenar un tipo de dato struct en una base de datos y cómo deserializar un array de bytes leído de la base de datos para obtener un tipo de dato struct.
La biblioteca ontio_std proporciona interfaces de decodificador y codificador para la serialización y deserialización de datos. Los campos de la estructura struct también implementan interfaces de decodificador y codificador, de modo que la estructura puede ser serializada y deserializada. Se requieren instancias de la clase Sink cuando se serializan diferentes tipos de datos. Una instancia de la clase Sink tiene un campo tipo set buf, que almacena datos de tipo byte, y todos los datos serializados se almacenan en buf.
Para datos de longitud fija (por ejemplo: byte, u16, u32, u64, etc.), los datos se convierten directamente en un array de bytes y luego se almacenan en buf; para datos de longitud variable, primero se debe serializar la longitud y luego los datos (como enteros sin signo de tamaño desconocido, incluyendo u16, u32 o u64, etc.).
La deserialización es la contraparte directa. Para cada método de serialización hay un método correspondiente de deserialización. La deserialización requiere el uso de instancias de la clase Source. Esta instancia de clase tiene dos campos: buf y pos. Buf se utiliza para almacenar los datos que se van a deserializar, y pos se utiliza para almacenar la posición de lectura actual. Al leer un tipo específico de dato, si conoces su longitud, puedes leerlo directamente; para datos de longitud desconocida, primero lee la longitud y luego lee el contenido.
Acceso y actualización de datos en la cadena
Ontology-wasm-cdt-rust — encapsuló el método operativo para trabajar con datos en la cadena, que es conveniente para los desarrolladores para realizar operaciones como agregar, eliminar, modificar y consultar datos en la cadena de la siguiente manera:
- database::get(key) — se utiliza para solicitar datos de la cadena, y key solicita la implementación de la interfaz AsRef;
- database::put(key, value) — se utiliza para almacenar datos en la red. Key solicita la ejecución de la interfaz AsRef, y value solicita la implementación de la interfaz Encoder;
- database::delete(key) — se utiliza para eliminar datos de la cadena, y key solicita la implementación de la interfaz AsRef.
Pruebas del contrato
Cuando se implementan los métodos del contrato, necesitamos acceso a los datos en la cadena y necesitamos una máquina virtual correspondiente para ejecutar el bytecode del contrato, por lo que generalmente es necesario desplegar el contrato en la cadena para realizar pruebas. Pero este método de prueba es problemático. Para facilitar a los desarrolladores la prueba de contratos, la biblioteca ontio_std proporciona un módulo mock para las pruebas. Este módulo simula datos en la cadena, facilitando a los desarrolladores la prueba unitaria de los métodos en el contrato. Pueden encontrarse ejemplos específicos. .
Depuración del contrato
console::debug(msg) imprime información de depuración durante la depuración del contrato. La información msg se registrará en el archivo de registro del nodo. Es obligatorio establecer el nivel de registro en modo de depuración cuando se ejecuta un nodo de prueba local de Ontology.
runtime::notify(msg) imprime información de depuración relevante durante la depuración del contrato. Este método almacenará la información ingresada en la cadena y puede ser consultado desde la cadena usando el método getSmartCodeEvent.
El artículo fue traducido por el equipo de Hashrate&Shares especialmente para OntologyRussia.
¿Eres desarrollador? Únete a nuestra comunidad técnica en . Además, echa un vistazo al en nuestro sitio, allí puedes encontrar herramientas para desarrolladores, documentación y mucho más.
Ontology
- /
- Telegram /
- /
Fuente: habr.com
