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