Tutorial de Argumentos en JSON
Información del paquete
Sección titulada «Información del paquete»Esta sección hace referencia al paquete de ejemplo CliArgs
, que contiene el siguiente manifiesto:
[package]name = "CliArgs"version = "0.1.0"upgrade_policy = "compatible"
[addresses]test_account = "_"
[dependencies]AptosFramework = { git = "https://github.com/aptos-labs/aptos-framework.git", rev = "mainnet", subdir = "aptos-framework" }
Aquí, el paquete se despliega bajo la dirección nombrada test_account
.
Desplegando el paquete
Sección titulada «Desplegando el paquete»Comienza minando una dirección vanity para Ace, quien desplegará el paquete:
aptos key generate \ --vanity-prefix 0xace \ --output-file ace.key
Salida
{ "Result": { "Account Address:": "0xacef1b9b7d4ab208b99fed60746d18dcd74865edb7eb3c3f1428233988e4ba46", "PublicKey Path": "ace.key.pub", "PrivateKey Path": "ace.key" }}
Almacena la dirección de Ace en una variable de shell, para que puedas llamarla inline más tarde:
# Tu dirección exacta variaráace_addr=0xacef1b9b7d4ab208b99fed60746d18dcd74865edb7eb3c3f1428233988e4ba46
Financia la cuenta de Ace con el faucet (solo funciona en devnet):
aptos account fund-with-faucet --account $ace_addr
Salida
{ "Result": "Added 100000000 Octas to account acef1b9b7d4ab208b99fed60746d18dcd74865edb7eb3c3f1428233988e4ba46"}
Ahora publica el paquete bajo la cuenta de Ace:
aptos move publish \ --named-addresses test_account=$ace_addr \ --private-key-file ace.key \ --assume-yes
Funciones de entrada
Sección titulada «Funciones de entrada»El único módulo en el paquete, cli_args.move
, define un recurso Holder
simple con campos de varios tipos de datos:
module test_account::cli_args { use std::signer; use aptos_std::type_info::{Self, TypeInfo}; use std::string::String;
struct Holder has key, drop { u8_solo: u8, bytes: vector<u8>, utf8_string: String, bool_vec: vector<bool>, address_vec_vec: vector<vector<address>>, type_info_1: TypeInfo, type_info_2: TypeInfo, }
Una función de entrada pública con vectores multi-anidados puede usarse para establecer los campos:
/// Establecer valores en un `Holder` bajo `account`.public entry fun set_vals<T1, T2>( account: signer, u8_solo: u8, bytes: vector<u8>, utf8_string: String, bool_vec: vector<bool>, address_vec_vec: vector<vector<address>>,) acquires Holder { let account_addr = signer::address_of(&account); if (exists<Holder>(account_addr)) { move_from<Holder>(account_addr); }; move_to(&account, Holder { u8_solo, bytes, utf8_string, bool_vec, address_vec_vec, type_info_1: type_info::type_of<T1>(), type_info_2: type_info::type_of<T2>(), });}
Después de que el paquete ha sido publicado, aptos move run
puede usarse para llamar set_vals()
:
aptos move run \ --function-id $ace_addr::cli_args::set_vals \ --type-args \ 0x1::account::Account \ 0x1::chain_id::ChainId \ --args \ u8:123 \ "hex:0x1234" \ "string:hello, world\! ♥" \ "bool:[false, true, false, false]" \ 'address:[["0xace", "0xbee"], ["0xcad"], []]' \ --private-key-file ace.key \ --assume-yes
Funciones de vista
Sección titulada «Funciones de vista»Una vez que los valores en un Holder
han sido establecidos, la función de vista reveal()
puede usarse para verificar los primeros tres campos, y para comparar argumentos de tipo contra los últimos dos campos:
struct RevealResult has drop { u8_solo: u8, bytes: vector<u8>, utf8_string: String, bool_vec: vector<bool>, address_vec_vec: vector<vector<address>>, type_info_1_match: bool, type_info_2_match: bool}
#[view]/// Empaquetar en un `RevealResult` los primeros tres campos en el/// `Holder` del host, así como dos banderas `bool` denotando si `T1` & `T2`/// respectivamente coinciden con `Holder.type_info_1` & `Holder.type_info_2`,/// luego devolver el `RevealResult`.public fun reveal<T1, T2>(host: address): RevealResult acquires Holder { let holder_ref = borrow_global<Holder>(host); RevealResult { u8_solo: holder_ref.u8_solo, bytes: holder_ref.bytes, utf8_string: holder_ref.utf8_string, bool_vec: holder_ref.bool_vec, address_vec_vec: holder_ref.address_vec_vec, type_info_1_match: type_info::type_of<T1>() == holder_ref.type_info_1, type_info_2_match: type_info::type_of<T2>() == holder_ref.type_info_2 }}
Esta función de vista puede llamarse con argumentos especificados ya sea desde el CLI o desde un archivo JSON:
aptos move view \ --function-id $ace_addr::cli_args::reveal \ --type-args \ 0x1::account::Account \ 0x1::account::Account \ --args address:$ace_addr
aptos move view --json-file view_function_arguments.json