Módulos y scripts

Módulos y scripts

Move tiene dos tipos diferentes de programas: Módulos y Scripts . Los módulos son bibliotecas que definen tipos de estructuras junto con funciones que operan en estos tipos. Los tipos de estructura definen el esquema del almacenamiento global de Move y las funciones del módulo definen las reglas para actualizar el almacenamiento. Los propios módulos también se almacenan en el almacenamiento global. Los scripts son puntos de entrada ejecutables similares a una mainfunción en un lenguaje convencional. Un script normalmente llama a funciones de un módulo publicado que realiza actualizaciones del almacenamiento global. Los scripts son fragmentos de código efímeros que no se publican en el almacenamiento global.

Un archivo fuente de Move (o unidad de compilación ) puede contener varios módulos y scripts. Sin embargo, publicar un módulo o ejecutar un script son operaciones de VM independientes.

Sintaxis

Guiones

:::tutorial de consejos Para aprender a publicar y ejecutar un script de Move, siga el ejemplo de scripts de Move. :::

Un script tiene la siguiente estructura:

Copiar

script {
    <use>*
    <constants>*st
    fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
}

Un scriptbloque debe comenzar con todas sus usedeclaraciones, seguidas de cualquier constante y (finalmente) la declaración de la función principal. La función principal puede tener cualquier nombre (es decir, no es necesario llamarla main), es la única función en un bloque de script, puede tener cualquier número de argumentos y no debe devolver un valor. A continuación se muestra un ejemplo con cada uno de estos componentes:

Copiar

script {
    // Import the debug module published at the named account address std.
    use std::debug;

    const ONE: u64 = 1;

    fun main(x: u64) {t
        let sum = x + ONE;
        debug::print(&sum)
    }
}

Los scripts tienen un poder muy limitado: no pueden declarar amigos, tipos de estructuras ni acceder al almacenamiento global. Su objetivo principal es invocar funciones del módulo.

Módulos

Un módulo tiene la siguiente sintaxis:

Copiar

module <address>::<identifier> {
    (<use> | <friend> | <type> | <function> | <constant>)*
}

donde <address>es una dirección nominal o literal válida.

Por ejemplo:

Copiar

module 0x42::test {
    struct Example has copy, drop { i: u64 }

    use std::debug;
    friend 0x42::another_test;

    const ONE: u64 = 1;

    public fun print(x: u64) {
        let sum = x + ONE;
        let example = Example { i: sum };
        debug::print(&sum)
    }
}

La module 0x42::testparte especifica que el módulo testse publicará con la dirección de la cuenta 0x42en el almacenamiento global.

Los módulos también se pueden declarar utilizando direcciones con nombre. Por ejemplo:

Copiar

module test_addr::test {
    struct Example has copy, drop { a: address }

    use std::debug;
    friend test_addr::another_test;

    public fun print() {
        let example = Example { a: @test_addr };
        debug::print(&example)
    }
}

Debido a que las direcciones con nombre solo existen en el nivel del idioma fuente y durante la compilación, las direcciones con nombre serán sustituidas completamente por su valor en el nivel de código de bytes. Por ejemplo si tuviéramos el siguiente código:

Copiar

script {
    fun example() {
        my_addr::m::foo(@my_addr);
    }
}

y lo compilamos con my_addrset to 0xC0FFEE, entonces operativamente sería equivalente a lo siguiente:

Copiar

script {
    fun example() {
        0xC0FFEE::m::foo(@0xC0FFEE);
    }
}

Sin embargo, a nivel de fuente, estos no son equivalentes : m::foo se debe acceder a la función a través de la my_addrdirección nombrada y no a través del valor numérico asignado a esa dirección.

Los nombres de los módulos pueden comenzar con letras ato zo letras Ato Z. Después del primer carácter, los nombres de los módulos pueden contener guiones bajos _, letras apara z, letras Apara Zo dígitos 0para 9.

Copiar

module my_module {}
module foo_bar_42 {}

Normalmente, los nombres de los módulos comienzan con una letra minúscula. Un módulo llamado my_moduledebe almacenarse en un archivo fuente llamado my_module.move.

Todos los elementos dentro de un modulebloque pueden aparecer en cualquier orden. Básicamente, un módulo es una colección de typesy functions. La usepalabra clave se utiliza para importar tipos de otros módulos. La friendpalabra clave especifica una lista de módulos confiables. La constpalabra clave define constantes privadas que se pueden utilizar en las funciones de un módulo.

Last updated