Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

A tecnoloxía Ontology Wasm reduce o custo da migración de contratos intelixentes de dApp cunha lóxica empresarial complexa á cadea de bloques, enriquecendo así moito o ecosistema dApp.

Agora Ontoloxía Wasm Soporta simultaneamente o desenvolvemento de Rust e C++. A linguaxe Rust admite Wasm mellor e o bytecode xerado é máis sinxelo, o que pode reducir aínda máis o custo das chamadas de contrato. Entón, como usar Rust para desenvolver un contrato na rede Ontology?

Desenvolvendo un contrato WASM con Rust

Crear un contrato

Carga é unha boa ferramenta de creación de proxectos e xestión de paquetes para o desenvolvemento de Rust, que axuda aos desenvolvedores a organizar mellor a interacción do código e as bibliotecas de terceiros. Para crear un novo contrato Ontology Wasm, simplemente execute o seguinte comando:

Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

A estrutura do proxecto que xera:

Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

O ficheiro Cargo.toml úsase para configurar a información básica do proxecto e a información da biblioteca dependente. A sección [lib] do ficheiro debe configurarse como crate-type = ["cdylib"]. O ficheiro lib.rs úsase para escribir o código lóxico do contrato. Ademais, cómpre engadir parámetros de dependencia á sección [dependencias] do ficheiro de configuración Cargo.toml:

Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

Con esta dependencia, os desenvolvedores poden chamar interfaces que interactúan coa cadea de bloques de Ontology e ferramentas como o parámetro de serialización.

Función de entrada de contrato

Cada programa ten unha función de entrada, como a función principal que adoitamos ver, pero o contrato non ten unha función principal. Cando se desenvolve un contrato Wasm usando Rust, a función de invocación predeterminada úsase como función de entrada para usar o contrato. O nome dunha función en Rust non estará claro ao compilar o código fonte de Rust en bytecode que pode ser executado por unha máquina virtual. Para evitar que o compilador xere código redundante e reducir o tamaño do contrato, a función de invocación engade a anotación #[no_mangle].

Como obtén a función de invocación os parámetros para executar unha transacción?

A biblioteca ontio_std proporciona unha función runtime::input() para obter os parámetros para executar unha transacción. Os desenvolvedores poden usar ZeroCopySource para deserializar a matriz de bytes resultante. Na que a primeira matriz de bytes lidos é o nome do método de invocación, seguido dos parámetros do método.

Como se devolve o resultado da execución do contrato?

A función runtime::ret proporcionada pola biblioteca ontio_std devolve o resultado da execución dun método.

A función de invocación completada é así:

Como escribir un contrato intelixente de WebAssembly na rede Ontology? Parte 1: ferruxe

Serialización e deserialización de datos do contrato

No proceso de desenvolvemento de contratos, os desenvolvedores sempre teñen problemas coa serialización e deserialización, concretamente con como almacenar un tipo de datos struct na base de datos e como deserializar unha matriz de bytes lida desde a base de datos para obter un tipo de datos struct.

A biblioteca ontio_std proporciona interfaces de descodificador e codificador para a serialización e deserialización de datos. Os campos dunha estrutura tamén implementan as interfaces do decodificador e do codificador para que a estrutura poida ser serializada e deserializada. As instancias da clase Sink son necesarias cando se serializan varios tipos de datos. Unha instancia da clase Sink ten un buf de campo de tipo set que almacena os datos de tipo byte e todos os datos serializados almacénanse en buf.

Para datos de lonxitude fixa (por exemplo: byte, u16, u32, u64, etc.), os datos convértense directamente nunha matriz de bytes e despois gárdanse en buf; para os datos de lonxitude non fixa, primeiro debe serializar a lonxitude e despois Ddata (por exemplo, enteiros sen signo de tamaño descoñecido, incluíndo u16, u32 ou u64, etc.).

A deserialización é exactamente o contrario. Para cada método de serialización, hai un método de deserialización correspondente. A deserialización require o uso de instancias da clase Source. Esta instancia de clase ten dous campos buf e pos. Buf úsase para almacenar os datos a deserializar e pos para almacenar a posición de lectura actual. Cando se está a ler un determinado tipo de datos, se coñece a súa lonxitude, pode lelo directamente, para os datos de lonxitude descoñecida; lea primeiro a lonxitude e despois lea o contido.

Acceso e actualización de datos na cadea

ontoloxía-wasm-cdt-ferruxe - encapsulouse un método operativo para traballar con datos na cadea, que é conveniente para que os desenvolvedores implementen operacións como engadir, eliminar, cambiar e consultar datos na cadea do seguinte xeito:

  • base de datos::get(clave) - úsase para solicitar datos da cadea, e as claves solicitan a implementación da interface AsRef;
  • base de datos::put(clave, valor) - úsase para almacenar datos na rede. Key solicita a implementación da interface AsRef e value solicita a implementación da interface Encoder;
  • base de datos::eliminar(clave) - utilízase para eliminar datos da cadea e a clave solicita a implementación da interface AsRef.

Probas de contrato

Cando se implementan os métodos dun contrato, necesitamos acceder aos datos da cadea e necesitamos unha máquina virtual adecuada para executar o bytecode do contrato, polo que xeralmente é necesario despregar o contrato na cadea para probalo. Pero este método de proba é problemático. Para facilitar aos desenvolvedores a proba de contratos, a biblioteca ontio_std ofrece un módulo simulado para probar. Este módulo proporciona unha simulación dos datos do circuíto, facilitando aos desenvolvedores a proba unitaria dos métodos do contrato. Pódense atopar exemplos específicos aquí.

Depuración de contratos

console::debug(msg) mostra información de depuración mentres se depura un contrato. A información do mensaxe engadirase ao ficheiro de rexistro do nodo. Un requisito previo é establecer o nivel do ficheiro de rexistro no modo de depuración cando se está a executar o nodo de proba de Ontoloxía local.

runtime::notify(msg) mostra a información de depuración adecuada mentres se depura o contrato. Este método almacenará a información introducida na cadea e pódese consultar desde a cadea mediante o método getSmartCodeEvent.

O artigo foi traducido polos editores de Hashrate&Shares especialmente para OntologyRussia. chorar

Vostede é un programador? Únete á nosa comunidade tecnolóxica en Discordia. Ademais, bótalle un ollo Centro de Desenvolvedores no noso sitio web, onde podes atopar ferramentas para desenvolvedores, documentación e moito máis.

Ontoloxía

Fonte: www.habr.com

Engadir un comentario