Dependencias de Terceros
Las dependencias de terceros son módulos externos con los que interactúa un módulo controlado. Típicamente, estos módulos externos existen bajo diferentes cuentas.
Ejemplo de router multi-DEX
Sección titulada «Ejemplo de router multi-DEX»Un router multi-DEX utiliza activamente dependencias de terceros. En lugar de enviar múltiples transacciones para interactuar con diferentes DEXs y sus funciones de entrada individuales dentro de una ruta de intercambio, un módulo (o script) puede consolidar todas las invocaciones independientes de DEX en una sola transacción atómica. El router multi-DEX referencia y llama a funciones presentes en cada uno de los módulos DEX de terceros para lograr esto.
Fuentes
Sección titulada «Fuentes»Las dependencias de terceros tendrán diferentes cantidades de confiabilidad e información disponible basándose en de dónde se obtienen. Específicamente, la documentación para algunas instancias será inexistente, así como la lógica potencialmente siendo refactorizada.
El código fuente que está verificado contra el módulo desplegado en la cadena, como el Repositorio Git y Código Fuente Local, siempre debería ser preferido. Si ninguno de esos está disponible, hay otras opciones para depender de código utilizable, como código descompilado, bytecode, y código creado con ABI.
Repositorio Git
Sección titulada «Repositorio Git»El Move.toml
por defecto incluye AptosFramework
como una dependencia de repositorio git:
[dependencies.AptosFramework] git = "<https://github.com/aptos-labs/aptos-framework.git>" rev = "mainnet" subdir = "aptos-framework"
Cuando se ejecutan comandos de Aptos CLI, las actualizaciones a la dependencia se recuperan y compilan automáticamente.
Código Fuente Local
Sección titulada «Código Fuente Local»El código fuente de terceros puede ser incluido en el directorio sources
. Esencialmente tratándolo igual que el código personalizado.
Directorythird_party_dependency_project/
Directorysource/
{ControlledCode}.move
{ThirdPartyCode}.move
- Move.toml
Código descompilado
Sección titulada «Código descompilado»El código Move puede ser reconstruido usando el Compilador Revela contra el bytecode de un paquete:
aptos move decompile --package-path ./bytecode_modules
Los archivos {ModuleName}.mv.move
correspondientes serán generados en bytecode_modules
.
Directorythird_party_dependency_project/
Directorybyte_modules/
{ModuleName}.mv
{ModuleName}.mv.move
- Move.toml
Referéncialo como un archivo de fuente local después de cambiar el tipo de archivo a {ModuleName}.move
y colocarlo en el directorio sources
del workspace.
Directorythird_party_dependency_project/
Directorysources/
{ModuleName}.move
- Move.toml
Bytecode
Sección titulada «Bytecode»El Aptos CLI permite descargar el bytecode de un paquete.
aptos move download --account {account_addr} --bytecode --package {package_name}
Cada dependencia de bytecode requiere su propio paquete, con una estructura de:
- Archivo
Move.toml
, con la dirección del paquete pre-definida. - Directorio
build/{ModuleName}/bytecode_modules
con el bytecode dentro. - Directorio de sources vacío.
El módulo controlado puede entonces referenciar la dependencia, tras su inclusión en el Move.toml
del paquete controlado.
Ejemplo de Aptos Token
Un módulo controlado invoking_code.move
interactúa con el módulo externo aptos_token
:
module invoker::invoking_code { use aptos_token_objects_addr::aptos_token;
public entry fun wrapper_add_property(): u64 { aptos_token::add_property(...); }}
El siguiente comando recupera el bytecode necesario del paquete AptosTokenObjects desde la Mainnet.
aptos move download --account 0x4 \--bytecode --package AptosTokenObjects \--output-dir ./aptos_token_bytecode_output/
Directoryinvoking_code/
Directoryaptos_token_bytecode_output/
Directorybyte_modules/
- aptos_token.mv
Directorysources/
- invoking_code.move
- Move.toml
La estructura y contenido del paquete de dependencia creado para aptos_token
es:
Directoryaptos_token_objects_addr/
Directorybuild/
Directoryaptos_token/
Directorybytecode_modules/
- aptos_token.mv
Directorysources/
- …
- Move.toml
Directoryinvoking_code/
Directoryaptos_token_bytecode_output/
Directorybyte_modules/
- aptos_token.mv
- aptos_token.mv.move
- …
Directorysources/
- invoking_code.move
- Move.toml
[package]name = "aptos_token"version = "0.0.0"[addresses]aptos_token_module_addr = "0x4"
La lista de dependencias del módulo controlado invoking_code.move
incluirá una referencia local al paquete de bytecode, permitiendo la compilación.
[package]name = "invoking_code"[addresses]invoker = "_"[dependencies]aptos_token = { local = "../aptos_token_objects_addr" }
El código de interfaz Move puede ser elaborado manualmente leyendo el ABI de un paquete. Notablemente, mientras que el encabezado de la función es requerido para ser exacto, la lógica dentro no lo es.
Después, el código de interfaz se trata equivalente al código de fuente local.
Ejemplo de Aptos Token
A continuación, se muestra una parte del ABI de AptosTokenObjects
, recopilado de la Aptos Explorer:
{"address": "0x4","name": "aptos_token","friends": [],"exposed_functions": [ { "name": "add_property", "visibility": "public", "is_entry": true, "is_view": false, "generic_type_params": [ { "constraints": [ "key" ] } ], "params": [ "&signer", "0x1::object::Object<T0>", "0x1::string::String", "0x1::string::String", "vector<u8>" ], "return": [] }, ...]}
Un archivo de interfaz Move puede ser escrito a mano y tratado como un archivo de fuente. Pareciendo a:
module 0x4::aptos_token { // ... public entry fun add_property<T: key>( creator: &signer, token: Object<T>, key: String, type: String, value: vector<u8>, ) acquires AptosCollection, AptosToken { abort 0 }}
Directorythird_party_dependency_project/
Directorysource/
{ControlledCode}.move
- aptos_token.move
- Move.toml