Ahora que has completado nuestro tutorial de solidity, ¿qué sigue?
Ahora tienes los conocimientos suficientes para construir cualquiera de los siguientes proyectos. El conocimiento se obtiene estudiando, pero la habilidad se adquiere con la práctica. ¡Necesitas tanto conocimiento como habilidad si quieres ser un desarrollador exitoso de Solidity! Aquí tienes algunas sugerencias sobre lo que puedes construir para aplicar todo lo que has aprendido hasta ahora.
Tienes todo lo que necesitas saber, así que ¡pon manos a la obra si hablas en serio sobre convertirte en ingeniero de Solidity!
Estos proyectos están ordenados aproximadamente del más fácil al más difícil, pero tienes todos los conocimientos previos que necesitas para construir cualquiera de ellos.
1. Comprar un NFT con tokens ERC20
Construye un NFT clásico que solo pueda ser acuñado (minteado) pagando con un token ERC20 particular.
2. Contrato ERC20 con desbloqueo por tiempo / contrato de vesting
Un pagador deposita una cierta cantidad de tokens en un contrato, pero el receptor solo puede retirar 1/n tokens a lo largo de n días.
3. Contrato de intercambio de NFT
Dos personas quieren intercambiar sus NFTs de manera trustless (sin necesidad de confianza). Un usuario crea un intercambio en el contrato, que consiste en un par de dirección y un identificador (ids), donde la dirección es la dirección del contrato inteligente del NFT y el id es el tokenId del NFT. Una persona solo puede depositar un NFT si el id coincide con la dirección y el id. La contraparte solo puede depositar si su NFT coincide con la dirección y el id del intercambio.
Una vez que ambos están depositados, cualquiera de las partes puede llamar a la función de intercambio.
Algunos casos extremos a tener en cuenta:
- ¿cuánto tiempo, si es que hay alguno, deberían los comerciantes estar obligados a mantener su NFT en el contrato?
4. Contrato ERC20 de financiamiento colectivo (Crowdfunding)
Tu contrato debe tener una función createFundraiser() con una meta y una fecha límite como argumentos. Los donantes pueden ejecutar donate() hacia un fundraiserId determinado. Si la meta se alcanza antes de la fecha límite, la billetera que llamó a createFundraiser() puede llamar a withdraw() para retirar todos los fondos asociados con esa campaña. De lo contrario, si pasa la fecha límite sin alcanzar la meta, los donantes pueden retirar su donación. Construye un contrato que soporte Ether y otro que soporte tokens ERC20.
Algunos casos extremos a tener en cuenta:
- ¿qué pasa si la misma dirección dona varias veces?
- ¿qué pasa si la misma dirección dona a múltiples campañas diferentes?
5. Contrato de subasta inglesa
Un vendedor llama a deposit() para depositar un NFT en un contrato junto con una fecha límite y un precio de reserva. Los compradores pueden pujar por ese NFT hasta la fecha límite, y la oferta más alta gana. Si no se alcanza el precio de reserva, el NFT no se vende. Pueden ocurrir múltiples subastas al mismo tiempo. Los compradores que no ganaron pueden retirar su oferta. El ganador no puede retirar su oferta y debe completar la transacción para comprar el NFT. El vendedor también puede finalizar la subasta llamando a sellerEndAuction(), lo cual solo funciona después del vencimiento, y si se cumple la reserva. Al ganador se le transferirá el NFT y el vendedor recibirá el ETH.
6. Marketplace de NFT simple
Los vendedores pueden ejecutar sell() sobre su NFT mientras especifican un precio y un vencimiento. En lugar de depositar el NFT en el contrato, le otorgan aprobación al contrato para retirarlo de su cuenta. Si llega un comprador y paga el precio especificado antes del vencimiento, entonces el NFT se transfiere del vendedor al comprador y el ether del comprador se transfiere al vendedor.
El vendedor puede llamar a cancel() para cancelar la venta en cualquier momento.
Casos extremos:
- ¿Qué pasa si el vendedor enlista el mismo NFT dos veces? Teóricamente, esto puede suceder, ya que no transfieren el NFT al marketplace.
7. Staking conjunto (Stake Together)
Un contrato posee 1,000,000 de cloud coins. Cualquiera que haga staking de cloud coin en el contrato a partir de la beginDate y lo mantenga durante 7 días recibirá una recompensa proporcional a su parte del stake total al momento del vencimiento. Por ejemplo, supongamos que Alice hace staking de 5,000 cloud coin, pero la cantidad total en stake al momento del vencimiento es de 25,000 cloud coin. Alice tendrá derecho entonces a 200,000 de las recompensas, porque ella representó el 20% de todos los usuarios.
Advertencia: es muy fácil calcular accidentalmente las recompensas de tal manera que un actor malicioso pueda abusar del sistema. ¡Piensa cuidadosamente en los casos extremos!
8. Lotería simple
Cualquier usuario puede llamar a createLottery y se creará una lotería con una ventana de compra de boletos para las siguientes 24 horas. Una vez pasadas las 24 horas, hay un retraso de 1 hora, luego la lotería termina. Generar números aleatorios de forma segura en Ethereum es complicado, pero para el propósito de este proyecto, depender de un blockhash futuro (que los jugadores no pueden predecir) es lo suficientemente bueno. Después de que se llama a createLottery, la gente puede llamar a purchaseTicket para un lotteryId particular. La lotería debe consistir en una fecha límite para cuando se detiene la compra de boletos, y un tiempo posterior en el que el blockhash futuro determina al ganador. El ganador debe reclamar luego las ganancias dentro de 256 bloques (el límite máximo de retrospectiva de la función blockhash), de lo contrario, todos pueden recuperar sus boletos.
9. Bingo ERC1155
Utiliza tokens ERC1155 para simular una baraja de cartas que pueda tomar cualquier valor del 1 al 25, ambos inclusive. Cada jugador comienza con un array 2D de 5x5 con los números del 1 al 25 dispuestos al azar. Cada n bloques, los jugadores pueden acuñar (mintear) una nueva carta que tiene un número aleatorio. El primero que consiga 5 seguidos (bingo) gana.
10. Blackjack on-chain
A diferencia del blackjack regular, es extremadamente difícil ocultar la carta del crupier (dealer), por lo que todos deben tener una mano completamente descubierta. El blackjack real suele jugarse con múltiples barajas para hacer que el conteo de cartas sea menos efectivo, por lo que puedes hacer que el generador de números aleatorios produzca un número aleatorio del [2-10], pero ten en cuenta que el diez, la jota (jack), la reina (queen) y el rey (king) valen 10, así que necesitas hacer que las probabilidades sean proporcionales. De manera similar, un as (Ace) puede ser un 1 o un 11. El crupier debe pedir cartas (hit) hasta tener al menos 21.
Debido a que los contratos inteligentes no pueden avanzar el estado por sí solos, cualquiera puede llamar a dealerNextMove() para mantener el juego en marcha si es el turno del crupier. En una aplicación real, necesitarías una computadora fuera de la cadena (offchain) para que el crupier siga jugando, pero no nos preocupemos por esto por ahora.
Debes obligar a los jugadores a hacer su movimiento dentro de 10 bloques para evitar que alguien retrase el juego.
La práctica hace al maestro
La razón por la que nuestro recurso para aprender solidity está acompañado de los ejercicios de Solidity, es porque aprender a programar puramente estudiando es una trampa. ¡Es más importante escribir código! Ahora puedes hacer algo un poco más desafiante que resolver ejercicios cortos.
De verdad, ¡deja de leer tutoriales y comienza a crear proyectos! Si te quedas atascado, contáctanos en nuestra comunidad de discord, busca en Google o pide ayuda a un chatbot moderno de IA.
Control de calidad: escribe pruebas unitarias y mide los costos de gas
Ya te hemos enseñado a usar el framework foundry para escribir pruebas unitarias en solidity. Simplemente no es aceptable desplegar código sin probar que maneja el dinero de otras personas. Aunque estos sean solo contratos educativos, deberías adquirir el hábito de escribir pruebas desde el principio de tu viaje.
Intenta pensar también como un atacante. ¿Qué tipo de entradas extrañas intentaría un atacante si tratara de alterar el sistema?
Finalmente, presta atención al costo de gas que reporta foundry. Puedes convertir las unidades de gas a un costo en dólares utilizando nuestra calculadora de precios de gas de Ethereum y aprender cómo funciona esa calculadora leyendo nuestro artículo sobre cómo convertir el gas de eth a dólares.
Luego considera aprender consejos de optimización de gas en Solidity y aplícalos a tu proyecto.
Si realmente quieres ir un paso más allá, construye una aplicación frontend sencilla para conectarte a estos contratos. Te sugerimos utilizar la biblioteca wagmi js para esto.
¿Y después qué?
¿Terminaste? Te sugerimos aprender cómo optimizar el gas de tus contratos leyendo nuestro libro de optimización de gas y tomando los cursos vinculados allí. ¡Luego intenta optimizar el gas de los contratos que has creado!
Aprende más con RareSkills
Si has completado todo lo anterior y buscas ir aún más lejos junto a una comunidad, quizás deberías considerar tomar nuestro bootcamp de Solidity avanzado.
Publicado originalmente el 10 de septiembre de 2023