CursosEmpresasBlogLiveConfPrecios

Métodos payables y promises

Clase 20 de 24 • Curso de Desarrollo en NEAR Blockchain con Rust

Clase anteriorSiguiente clase

Contenido del curso

Introducción a NEAR
  • 1
    Bienvenida al desarrollo con NEAR

    Bienvenida al desarrollo con NEAR

    01:58
  • 2
    ¿Por qué NEAR?

    ¿Por qué NEAR?

    03:56
  • 3
    De la web2 a la web3 con NEAR

    De la web2 a la web3 con NEAR

    03:27
  • 4
    ¿Qué es una cuenta en NEAR?

    ¿Qué es una cuenta en NEAR?

    06:14
  • 5
    Access keys

    Access keys

    04:46
  • 6
    Conozcamos la NEAR Wallet

    Conozcamos la NEAR Wallet

    16:14
  • 7
    Data Storage y Storage Staking

    Data Storage y Storage Staking

    06:43
Gestión de contratos en NEAR
  • 8
    Métodos view y change

    Métodos view y change

    03:51
  • 9
    Gas

    Gas

    07:17
  • 10
    Redes en NEAR

    Redes en NEAR

    05:22
  • 11
    Runtime, transacciones y ciclo de una transacción

    Runtime, transacciones y ciclo de una transacción

    06:00
Ambiente de desarrollo en Rust para NEAR
  • 12
    Montar ambiente de WebAssembly en Rust

    Montar ambiente de WebAssembly en Rust

    05:48
  • 13
    Explorando la NEAR CLI

    Explorando la NEAR CLI

    11:55
  • 14
    Un vistazo al NEAR Explorer

    Un vistazo al NEAR Explorer

    09:58
Desarrollo en NEAR con Rust
  • 15
    Desplegar y testear el proyecto del curso

    Desplegar y testear el proyecto del curso

    05:58
  • 16
    Estructura de un contrato inteligente

    Estructura de un contrato inteligente

    08:20
  • 17
    Colecciones de datos en NEAR

    Colecciones de datos en NEAR

    08:00
  • 18
    Módulo env de NEAR

    Módulo env de NEAR

    05:25
  • 19
    Mutabilidad de un contrato

    Mutabilidad de un contrato

    16:12
  • 20
    Métodos payables y promises

    Métodos payables y promises

    17:44
Desplegando el contrato
  • 21
    Desplegando contrato en testnet con dev-accounts

    Desplegando contrato en testnet con dev-accounts

    05:55
  • 22
    Invocando al contrato con el NEAR CLI

    Invocando al contrato con el NEAR CLI

    13:22
Ve mas allá
  • 23
    Aurora la EVM de NEAR

    Aurora la EVM de NEAR

    08:31
  • 24
    Conclusión

    Conclusión

    01:10
    Ariela Wenner

    Ariela Wenner

    student•
    hace 3 años

    Solución equivalente un poquito más concisa :3

    pub fn obtener_memes_museo(&self, nombre_museo: String) -> Vec<Meme> { // con map_or_else evitamos alojar un nuevo vector de no ser necesario self.museos.get(&nombre_museo).map_or_else(Vec::new, |m| { // filtramos y mapeamos en una sola llamada los memes existentes // es decir, si self.memes.get(...) devuelve None, esto no se incluye m.iter().filter_map(|id| self.memes.get(id)).collect() }) }
    Jean Nuñez

    Jean Nuñez

    student•
    hace 3 años

    yoctonear 1a la 24

      Cristian Alexis Zambrano Badillo

      Cristian Alexis Zambrano Badillo

      teacher•
      hace 3 años

      Y es muy útil para tener un numero super exacto, aunque aveces es difícil de escribirlo en la consola jajaja :grin:

    Jean Nuñez

    Jean Nuñez

    student•
    hace 3 años

    Un vector para añadir datos usamos el push

    Ariela Wenner

    Ariela Wenner

    student•
    hace 3 años

    Pregunta, según la definición de un Meme, sería posible que se haga más de una llamada al método crear_meme en un mismo bloque?

    Y de ser así, no puede pasar que ese ID entonces deje de ser único ya que se usa el número de bloque como tal, y se sobreescriban Memes?

      Cristian Alexis Zambrano Badillo

      Cristian Alexis Zambrano Badillo

      teacher•
      hace 3 años

      Si así es 🙌🏻 super bien analizado! Pensando en que esta fuera una dApp muy demandada podría pasar. Ya que si hubieran 2 transacciones en un mismo bloque todas estas tomarían como referencia el mismo número de bloque.

      El tema de la aleatoriedad es compleja en blockchain en general ya que estos son sistemas deterministas.

      Para un ejemplo como este es útil, pero para una aplicación compleja podríamos utilizar oráculos o llevar un contador como id :fire:

    Eber Laurente Lliuyacc

    Eber Laurente Lliuyacc

    student•
    hace 3 años

    Profesor, me sale error en la obención del account_id desde &meme.creado_por

    Promise::new(String::from(&meme.creado_por)) .transfer(env::attached_deposit());
    Imagen1.png
      Eduwin Celiano Ricardo Chavarro

      Eduwin Celiano Ricardo Chavarro

      student•
      hace 3 años

      tambien me sale el mismo error

      lo pudiste resolver?

      Sergio Martinez Marin

      Sergio Martinez Marin

      student•
      hace 2 años

      De premio de consolación: Temporalmente, si se deja la versión del near-dsk en 3.1.0 funciona.

      Con la version 4.1.1 o superiores toca ver como dejar la estructura creado por como AccountID y no un string o buscar como pasar Strings a AccountID ( un cast o conversión)

    Edward Rodriguez

    Edward Rodriguez

    student•
    hace 2 años

    28/01/2024

    Bueno bebés hermosos, presten atención, para aquellos compas que les esté dando problema el cargo build, mas específicamente lo siguiente:

    error: no matching package named parity-secp256k1 found location searched: registry crates-io required by package near-crypto v0.14.0 ... which satisfies dependency `near-crypto = "^0.14"` of package `near-sdk v4.1.1`

    Deben agregar lo siguiente al cargo.toml [package]

    name = "museo_memes"

    version = "0.1.0"

    edition = "2021"

    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

    [lib]

    crate-type = ["cdylib", "rlib"] # más para rust que para near

    [dependencies]

    near-sdk = "3.1.0"

    [patch.crates-io]

    parity-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1/", version = "0.7.0" }

    y para el lib.rs: use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};use near_sdk::collections::UnorderedMap;use near_sdk::serde::{Deserialize, Serialize};use near_sdk::{env, near_bindgen, setup_alloc, Promise}; setup_alloc!(); //alocar dirección de memoria /*Clases necesarias para el contratoimplementamos serde cuando necesitamos retornar la estructuracli y frontend. En este caso se usan ambas serializaciones yaque la serialización y desearializacipon del contrato en la blockchain de near usar los borsh para optimizacion y los normales para parsear jsons*/ #[derive(Serialize, Deserialize, BorshSerialize, BorshDeserialize)]#[serde(crate = "near_sdk::serde")]pub struct Meme {    pub id: u64,    pub creado_por: String,    pub titulo: String,    pub museo: String,    pub url: String,    pub donaciones: u128,} //implementación del trait Default para inicializar la estructuraimpl Default for Meme {    fn default() -> Self {        Meme {            id: 0,            creado_por: String::from(""),            titulo: String::from(""),            museo: String::from(""),            url: String::from(""),            donaciones: 0,        }    }} //implementación del método new que permitirá crear nuevos memesimpl Meme {    pub fn new(titulo: String, url: String, museo: String) -> Self {        Self {            id: env::block_index(), // env::block_height(), //env::block_index(), //id:0            creado_por: env::signer_account_id().to_string(),            titulo,            museo,            url,            donaciones: 0,        }    }} //1. estructura, state del contrato e inicialización de variables#[near_bindgen]#[derive(BorshDeserialize, BorshSerialize)] pub struct SimpleMemeMuseum {    //Guardamos solo los ID para evitar tener que editar en ambos    museos: UnorderedMap<String, Vec<u64>>,    memes: UnorderedMap<u64, Meme>,} //inicializamos el state del contratoimpl Default for SimpleMemeMuseum {    fn default() -> Self {        Self {            //Inicializamos las colecciones            museos: UnorderedMap::new(b"u".to_vec()),            memes: UnorderedMap::new(b"e".to_vec()),        }    }} //Métodos impl SimpleMemeMuseum {    pub fn <u>crear_meme</u>(&mut <u>self</u>, titulo: String, url: String, nombre_museo: String) {        //crear el objeto meme:        let meme = Meme::new(            String::from(&titulo),            String::from(&url),            String::from(&nombre_museo),        );         //Lo guardamos en la colección de memes        <u>self</u>.memes.<u>insert</u>(&meme.id, &meme);         //Buscamos si el museo eiste para despues añadir el meme en el. La función get        //El valor de un key dado como un Option<Vec<u64>> como el vector de museos         let museo = <u>self</u>.museos.get(&nombre_museo);        //si eiste el museo entonces is_some() retornará true  y agregamos el nuevo Id de ese museo         if museo.is_some() {            //m almacena el valor del some() del option<> o da un panic en caso de ser nulo            let mut <u>m</u> = museo.unwrap();            //m al ser un vector hacemos un push para almacenar el dato            <u>m</u>.<u>push</u>(meme.id);             //insertamos en la colección de museos el museo y el meme ligado a él.            <u>self</u>.museos.<u>insert</u>(&nombre_museo, &<u>m</u>);        }        //si no existe, creamos un nuevo museo, le agregamos el meme y lo guardamos.        else {            let mut <u>nuevo_museo</u> = Vec::new();            <u>nuevo_museo</u>.<u>push</u>(meme.id);            <u>self</u>.museos.<u>insert</u>(&nombre_museo, &<u>nuevo_museo</u>);        }         //Manda un mensaje a la terminal al ejecutar el método:        env::log(            format!(                "Nuevo meme añadido con éito, Museo: {}, Id Meme: {}",                &nombre_museo, meme.id            )            .as_bytes(),        );    }    pub fn obtener_meme(&self, id: u64) -> Option<Meme> {        //el option retorna un some o null, entonces con este método veremos si eiste o no        self.memes.get(&id)    }    pub fn obtener_lista_memes(&self) -> Vec<(u64, Meme)> {        self.memes.to_vec()    }    pub fn obtener_lista_museos(&self) -> Vec<String> {        self.museos.keys_as_vector().to_vec()    }    pub fn obtener_memes_museo(&self, nombre_museo: String) -> Vec<Meme> {        let museo = self.museos.get(&nombre_museo);        //Si el museo existe:        if museo.is_some() {            let mut <u>lista_memes</u> = Vec::new();             //el for recorre cada elemento en el museo:            for meme in &museo.unwrap() {                //obtenemos el meme mediante su id                let m = self.memes.get(meme);                 //si el meme existe                if m.is_some() {                    //mandamos el meme al vector de la lista de memes                    <u>lista_memes</u>.<u>push</u>(m.unwrap());                }            }            //retornamos la lista de memes            <u>lista_memes</u>            //si no existe el museo        } else {            //creamos el vector vacio de memes            Vec::new()        }    }     //#[payable]    pub fn <u>donar_a_meme</u>(&mut <u>self</u>, id: u64) -> bool {        assert!(            env::attached_deposit() > 0,            "Debes agregar NEAR para hacer una donación."        );         //Buscamos el meme        match <u>self</u>.memes.get(&id) {            //analizamos si el meme eiste y mandamos el valor mutable de la colección            Some(mut <u>meme</u>) => {                //si eiste guardamos la donación en el registro                <u>meme</u>.donaciones <u>+=</u> env::attached_deposit();                <u>self</u>.memes.<u>insert</u>(&<u>meme</u>.id, &<u>meme</u>);                //y le transferimos al creador del meme lo que donaron                Promise::new(String::from(&<u>meme</u>.creado_por)).transfer(env::attached_deposit());                true            }            None => false,        }    }}

    y voila, salu2.

    Juan David Díaz Pastrana

    Juan David Díaz Pastrana

    student•
    hace 3 años
    const NEAR: u128 = 10u128.pow(24); // Yocto-near

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads