# Simulador: Hola Mundo! en acción

WARNING

# Instalar extension Rust para VSC (Visual Studio Code)

Las Extensiones, en VSC, permiten ampliar las funciones y herramientas disponibles. Hoy recomendamos la extensión de Rust para tu mejor desempeño de la codificación de los 'BluePrints'.

# Crear nueva cuenta

TIP

  • Acostumbrate antes de empezar a trabajar con Scrypto a limpiar el simulador. En realidad muchas veces limpiar el simulador de datos nos permitirá resolver algunos problemas de ejecución. Realizaremos dicha limpieza ejecutando desde la linea de comandos (terminal):
resim reset

Para interactuar con el simulador, Radix ha creado un comando llamado resim. Con el comando resim de forma básica podemos crear cuentas para poder trabajar con ellas, estas cuentas nos permitirán entre otras cosas guardar recursos e interactuar con los componentes.

El sub-comando para crear una nueva cuenta es new-account:

PS C:\Users\<mi_usuario>\radixdlt-scrypto> resim new-account
A new account has been created!
Account component address: account_sim1qdcvymg8u83xdd8e03859627dswkcjk2tfq0a7mg4f2qn69w44
Public key: 02edfce918e2dc653049eaa8512738c0e527db1e849c176285d97fa262deeca1be
Private key: b2b7541d9d07ed7154e4536394eb1e30b454bc4f7f0ed38ce17fe6e33ec1c687
No configuration found on system. will use the above account as default.

Este es el resultado de ejecutar el comando resim new-account desde el terminal.

Nos fijamos en especial en: Account component address

Account component address: account_sim1qdcvymg8u83xdd8e03859627dswkcjk2tfq0a7mg4f2qn69w44

Esta dirección nos va permitir utilizar la nueva cuenta.

TIP

  • Si quieres ver el contenido de esta cuenta utiliza el comando: resim show [account address]

Podemos guardar la dirección, y cualquier otro dato, dentro de variables de sistema para que nos sea más fácil escribir los comandos:

Windows:

set account [tu numero de cuenta]
// ejemplo: set account account_sim1qdcvymg8u83xdd8e03859627dswkcjk2tfq0a7mg4f2qn69w44 (seguido de un intro)

Linux/macOs:

export account=[tu numero de cuenta]
// ejemplo: export account=account_sim1qdcvymg8u83xdd8e03859627dswkcjk2tfq0a7mg4f2qn69w44 (seguido de un intro)

(Nota: recuerda como se guardan las variables de sistema en linux: export nombre=valor, no vamos a repetirlo!)

Para reutilizar estas variables de sistema lo haremos utilizando el símbolo clave $ justo delante del nombre de la variable: (ej. resim show $account)

PS C:\Users\<mi_usuario>\radixdlt-scrypto>resim show $account
Component: account_sim1qdcvymg8u83xdd8e03859627dswkcjk2tfq0a7mg4f2qn69w44
Blueprint: { package_address: package_sim1qy4hrp8a9apxldp5cazvxgwdj80cxad4u8cpkaqqnhlsa3lfpe, blueprint_name: "Account" }
Access Rules
├─ Native(Method(Component(SetRoyaltyConfig))) => Group("royalty")
└─ Native(Method(Component(ClaimRoyalty))) => Group("royalty")
Default: AllowAll
├─ ScryptoMethod("balance") => AccessRule(AllowAll)
├─ ScryptoMethod("deposit") => AccessRule(AllowAll)
└─ ScryptoMethod("deposit_batch") => AccessRule(AllowAll)
Default: Protected(ProofRule(Require(StaticNonFungible(NormalResource[00b91737ee8a4de59d49dad40de5560e5754466ac84cf5432ea95d]:09d1670881c6a568b6c58749d17452fa130a2fcb527416113861))))
State: Tuple(KeyValueStore("b8f48a6841da8efa58d677cd12a5a6719c9eae28c0f96270250aff222d63895503040000"))
Key Value Store: AccountComponent[0370c26d07e1e266b4f97c4f42e95e6c1d6c4aca5a40fefb68aa54][184, 244, 138, 104, 65, 218, 142, 250, 88, 214, 119, 205, 18, 165, 166, 113, 156, 158, 174, 40, 192, 249, 98, 112, 37, 10, 255, 34, 45, 99, 137, 85, 3, 4, 0, 0]
├─ ResourceAddress("resource_sim1qzkcyv5dwq3r6kawy6pxpvcythx8rh8ntum6ws62p95sqjjpwr") => Vault("b8f48a6841da8efa58d677cd12a5a6719c9eae28c0f96270250aff222d63895505040000")
└─ ResourceAddress("resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj") => Vault("772f7d889f18d2e6d882fb955bd240eca5a3e78b1a6577f4f334b58dd8d7440406040000")
Resources:
├─ { amount: 1000, resource address: resource_sim1qzkcyv5dwq3r6kawy6pxpvcythx8rh8ntum6ws62p95sqjjpwr, 
name: "Radix", symbol: "XRD" }
└─ { amount: 1, resource address: resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj }   
   └─ NonFungible { id: NonFungibleId(1u32), immutable_data: Tuple(), mutable_data: Tuple() }

TIP

  • ¡Posiblemente te diste cuenta!, con la creación de una nueva cuenta se nos incluye como recurso (resource) unos cuantos XRD, ¡de mentiras 😅!

Una vez tenemos una cuenta, vamos a publicar el Package/Blueprint que creamos en la unidad anterior. Si seguiste los pasos, tu blueprint se encuentra dentro de la carpeta: miprimerBluePrint. Para acceder a la carpeta no olvides utilizar el comando cd seguido del nombre de la carpeta.

PS C:\Users\<mi_usuario>\radixdlt-scrypto> cd miprimerblueprint

Dentro del directorio que alberga nuestro blueprint en el terminal vamos a proceder a publicar el blueprint en el simulador. Este acto (publicar) lo que hace, explicado de forma muy burda, es traducir nuestro código a un idioma que entienda la red de Radix. Ojo que este paso no ha creado ningún Componente o contrato inteligente, solo ha publicado los planos de nuestro futuro componente dentro de la red.

El comando para publicar el blueprint es: resim publish . --owner-badge (fíjate que entre publish y punto hay un espacio!!!)

DANGER

¿Qué es --owner-badge? Es una credencial de propietario, del 'Package' que debe presentarse para obtener autorización para agregar/actualizar/eliminar metadatos del paquete. Y es que a partir de la version 0.7 de Scrypto se podrán agregar metadatos a los 'Packages' y con esta credencial podremos operan con ellas.

Para crear una una 'badge' o credencial que posteriormente le pasaramos al blueprint al publicarlo utilizaremos este comando de resim:

resim new-simple-badge

Esto nos retornara:

resim new-simple-badge
C:\Users\NombreUsuario\radixdlt-scrypto\ejemplo> resim new-simple-badge
NFAddress: resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj:U32#1
Resource: resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj
NFID: U32#1

Lo que hicimos no es más que crear un recurso no fungible con un suministro inicial de uno y sin metadatos. Generando la dirección no fungible del token que utilizaremos para el indicador de comando: resim publish . --owner-badge <owner_NFAddress>

Tal y como explicamos antes este owner_NFAddress lo podemos guardar en una variable de sistema.

Windows:

set badge [NFAddress]
// ejemplo: set badge resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj:U32#1 (seguido de un intro)

TIP

Algo a tener en cuenta que podemos indicar la dirección completa de un no fungible donde juntamos la dirección del recurso (resource) mas el Id del no fungible indicando el tipo. Para diferenciar la dirección del identificador pondremos entre medias dos puntos :. Para poder indicar el tipo de identificador y separarlo del id pondremos una almohadilla #. Quedando así ya que en este caso es un identificador numerico sin signo de 32-bit y el id es 1: resource_sim1qraa0zfy0nqrnydq9le8ndxy8wa6qrj6xh46vuh9lyuqmryfaj:U32#1

PS C:\Users\<mi_usuario>\radixdlt-scrypto\miprimerblueprint> resim publish . --owner-badge $badge
    Updating crates.io index
  Downloaded ryu v1.0.6
  Downloaded serde_json v1.0.72
  Downloaded syn v1.0.82
  Downloaded 3 crates (400.2 KB) in 2.35s
   Compiling proc-macro2 v1.0.32
   Compiling unicode-xid v0.2.2
            [...]
   Compiling scrypto v0.1.0 (C:\Users\IEUser\radixdlt-scrypto\scrypto)
   Compiling miprimerBluePrint v0.1.0 (C:\Users\IEUser\radixdlt-scrypto\miprimerblueprint)
    Compiling sha2 v0.9.9
   Compiling sbor-derive v0.3.0 (https://github.com/radixdlt/radixdlt-scrypto?tag=v0.3.0#7cb4af0b)
   Compiling sbor v0.3.0 (https://github.com/radixdlt/radixdlt-scrypto?tag=v0.3.0#7cb4af0b)
   Compiling scrypto-abi v0.3.0 (https://github.com/radixdlt/radixdlt-scrypto?tag=v0.3.0#7cb4af0b)
   Compiling scrypto-derive v0.3.0 (https://github.com/radixdlt/radixdlt-scrypto?tag=v0.3.0#7cb4af0b)
   Compiling scrypto v0.3.0 (https://github.com/radixdlt/radixdlt-scrypto?tag=v0.3.0#7cb4af0b)
   Compiling tutorial v0.1.0 (C:\Users\Andres\radixdlt-scrypto\tutorial)
    Finished release [optimized] target(s) in 37.20s
Success! New Package: 018e40a0a6dd954f296a26a0d849c7f1262bb8f9b61987c5f23d33

La red de Radix asigna una dirección al Package/Blueprint, la encontramos en la última línea bajo Package:

Success! New Package: 018e40a0a6dd954f296a26a0d849c7f1262bb8f9b61987c5f23d33

Guardaremos esta dirección en una variable de sistema, tal y como hicimos antes con account:

Windows:

set package [tu dirección del package]
//ejemplo: set package 018e40a0a6dd954f296a26a0d849c7f1262bb8f9b61987c5f23d33

Linux/macOs:

export package=[tu dirección del package]
//ejemplo: export package=018e40a0a6dd954f296a26a0d849c7f1262bb8f9b61987c5f23d33

Ahora ya estamos en disposición de crear nuestro primer componente 👏👏👏, si has llegado hasta aquí eres un/a VALIENTE!!!

Recordaras en Scrypto: Conceptos 1 ya vimos que un blueprint no era mas que los planos del componente, ahora que ya tenemos el 'plano' miprimerblueprint implementado en el libro mayor del Simulador, ahora ya podemos llamar a su función constructora la cual creara (instanciara) un nuevo componente a partir de los planos.
La estructura de la instrucción es la siguiente: resim call-function [package] [blueprint] [función]

resim call-function $package Hello instantiate_hello

El resultado:

Transaction Status: SUCCESS
Execution Time: 20 ms
Instructions:
├─ CallFunction { package_address: 018e40a0a6dd954f296a26a0d849c7f1262bb8f9b61987c5f23d33, blueprint_name: "Hello", function: "instantiate_hello", args: [] }
└─ CallMethodWithAllResources { component_address: 020d3869346218a5e8deaaf2001216dc00fcacb79fb43e30ded79a, method: "deposit_batch" }
Instruction Outputs:
├─ ComponentAddress("02fb3252c37ccf33f54b447f6a4f74580b36f375b6c232a5f7a8bd")
└─ ()
Logs: 0
New Entities: 2
└─ Component: 02fb3252c37ccf33f54b447f6a4f74580b36f375b6c232a5f7a8bd
└─ Resource: 0394a0e64bbd357867d9e4904a7011b9977fcbb01c87c80a908896

En esta ocasión al llamar a la función instantiate_hello ha dado como resultado dos nuevas entidades en el libro mayor del Simulador:

  • Resource: que hace referencia a un nuevo recurso creado, un token llamado 'HelloToken'
  • Component: que hace referencia al nuevo Componente 'Hello'
New Entities: 2
└─ Component: 02fb3252c37ccf33f54b447f6a4f74580b36f375b6c232a5f7a8bd
└─ Resource: 0394a0e64bbd357867d9e4904a7011b9977fcbb01c87c80a908896

Guardaremos la dirección del componente en una variable de sistema, tal y como hicimos antes con package:

set component [tu dirección del componente]
//ejemplo: set component 02fb3252c37ccf33f54b447f6a4f74580b36f375b6c232a5f7a8bd

Ya tenemos un Componente o contrato inteligente viviendo en el Simulador de Radix, ya solo nos queda comprobar que funciona, para ello vamos a llamar al método que tiene, ¿recuerdas de la lección pasada? free_token (Nota:seria bueno revisar el código de este Componente para refrescar la memoria):

pub fn free_token(&mut self) -> Bucket {
            info!("My balance is: {} HelloToken. Now giving away a token!", self.sample_vault.amount());
            // If the semi-colon is omitted on the last line, the last value seen is automatically returned
            // In this case, a bucket containing 1 HelloToken is returned
            self.sample_vault.take(1)
        }

Para ejecutarlo solo debes indicarlo de la siguiente manera, en el terminal:

resim call-method $component free_token
PS C:\Users\mi_usuario\radixdlt-scrypto\miprimerblueprint> resim call-method $component free_token
Transaction Status: SUCCESS
Execution Time: 26 ms
Instructions:
├─ CallMethod { component_address: 02a2a79aa613da237bcda37fd79af36e09eadd195976092cb24696, method: "free_token", args: [] }
└─ CallMethodWithAllResources { component_address: 0293c502780e23621475989d707cd8128e4506362e5fed6ac0c00a, method: "deposit_batch" }
Instruction Outputs:
├─ Bucket(1024u32)
└─ ()
Logs: 1
└─ [INFO ] My balance is: 1000 HelloToken. Now giving away a token!
New Entities: 0

¿Qué ha sucedido?

¡FELICIDADES!, ya has ejecutado tu primer Contrato Inteligente de Scrypto 🥳🎉🎉🎉🎉

Después de la alegría veamos en profundidad que sucedió, en realidad lo esperado: que nos devolvió un mensaje con el balance de 'HelloToken' y después tomo 1... ¿Pero quien lo tomo? fue depositado en la cuenta que creaste al inicio de esta unidad, escribe el comando:

resim show $account

Y nos devolverá:

Component: 020d3869346218a5e8deaaf2001216dc00fcacb79fb43e30ded79a
Blueprint: { package_address: 010000000000000000000000000000000000000000000000000003, blueprint_name: "Account" }
Authorization
├─ "deposit_batch" => AllowAll
└─ "deposit" => AllowAll
State: Struct(LazyMap("bc417218214859fbbf019072394c50cc53d5419f4acd7a660dc7c880f0cce31a02040000"))
Lazy Map: 020d3869346218a5e8deaaf2001216dc00fcacb79fb43e30ded79a(bc417218214859fbbf019072394c50cc53d5419f4acd7a660dc7c880f0cce31a, 1026)
├─ ResourceAddress("030000000000000000000000000000000000000000000000000004") => Vault("bc417218214859fbbf019072394c50cc53d5419f4acd7a660dc7c880f0cce31a03040000")
└─ ResourceAddress("0394a0e64bbd357867d9e4904a7011b9977fcbb01c87c80a908896") => Vault("42f0acd2c566ff28c2862de1c69cd5b6f2e38228dad9b789b543a650c4b070ef02040000")
Resources:
├─ { amount: 1000000, resource address: 030000000000000000000000000000000000000000000000000004, name: "Radix", symbol: "XRD" }
└─ { amount: 1, resource address: 0394a0e64bbd357867d9e4904a7011b9977fcbb01c87c80a908896, name: "HelloToken", symbol: "HT" }

Si te fijas en los recursos, vemos que en nuestra cuenta ahora hay dos recursos asociados, el primero que ya teníamos al crear la cuenta (XRD) y ahora un el HelloToken.

Aclarar que por defecto el Simulador utiliza la primera cuenta creada de forma predefinida para llevar a cabo las transacciones (Nota: en próximas lecciones veremos como utilizar más de una cuenta)

Nuevamente enhorabuena... ya has podido crear y ejecutar tu primer contrato inteligente. En próximas lecciones vas a crear tus propios contratos/componentes, ¡Te atreves!

Importante:

  • Soy muy consciente que hay muchas que no has entendido, ¡TRANQUILO!, las entenderás...

# Bibliografía