<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[DeFi Developer]]></title><description><![CDATA[DeFi Developer]]></description><link>https://defideveloper.xyz</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 00:12:15 GMT</lastBuildDate><atom:link href="https://defideveloper.xyz/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Historia de Uniswap de v1 a v4]]></title><description><![CDATA[Hace tiempo que quería empezar a escribir esta serie de artículos y ahora con todo lo que está haciendo Uniswap en LATAM parece el mejor momento posible. No recuerdo donde escuché “Si quieres entender DeFi, empieza por entender a fondo Uniswap y AAVE...]]></description><link>https://defideveloper.xyz/historia-de-uniswap-de-v1-a-v4</link><guid isPermaLink="true">https://defideveloper.xyz/historia-de-uniswap-de-v1-a-v4</guid><category><![CDATA[uniswap v4]]></category><category><![CDATA[uniswap]]></category><category><![CDATA[defi]]></category><category><![CDATA[español]]></category><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 25 Jun 2025 06:03:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750824071703/0d975a81-ca57-4648-9ef3-132f0d1fcbf4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hace tiempo que quería empezar a escribir esta serie de artículos y ahora con todo lo que está haciendo Uniswap en LATAM parece el mejor momento posible. No recuerdo donde escuché “Si quieres entender DeFi, empieza por entender a fondo Uniswap y AAVE” y eso es lo que quiero lograr con esta serie. Haremos un deep dive de Uniswap v4, aprenderemos teoría, matemáticas y código en el camino. Aprenderemos sobre la arquitectura de Uniswap, liquidez concentrada, dynamic fees, MEV y por supuesto el tema más 🔥🔥 de v4, hooks 🪝!  </p>
<p>Esta serie está basada en dos recursos principales: El curso de Atrium Academy sobre Uniswap v4 y la documentación oficial del protocolo. Mi objetivo aquí no es (por ahora) enseñar algo original, sino aportar recursos en español, explicados de la manera más sencilla posible, a la vez que aprendo y construyo en púbico para que más builders latinos puedan sumarse a DeFi.</p>
<p>Finalmente, las imágenes utilizadas también fueron tomadas de Atrium Academy y la documentación oficial a menos que indique lo contrario. Ahora sí, empecemos a aprender Uniswap 🚀🦄!</p>
<h2 id="heading-como-empezo-todo">Cómo empezó todo</h2>
<p>La historia de Uniswap es bastante interesante, aquí va en unas cuantas líneas: Hayden Adams, fundador de Uniswap se había perdido su primer trabajo después de salir de la universidad. Desempleado, su ex-compañero de escuela <a target="_blank" href="https://karl.tech/">Karl Floersch</a> (quien ahora es CEO de OP Labs) lo anima a meterse en el mundo de web3 y Ethereum. Hayden practicamente no sabía programar, pero poco a poco empezó a ir a conferencias y entender DeFi a fondo. En algún momento, el paper con la idea original de un DEX desarrollada por <a target="_blank" href="https://www.linkedin.com/pulse/martin-koppelman-defi-visionary-who-sparked-paul-mcolaka-mscfe-usmhf/">Martin Koppelman</a> y luego expandida por Vitalik, cae en sus manos y se pone manos a la obra, gracias a una beca de la Ethereum Foundation.</p>
<p>Uniswap v1 se lanza en noviembre de 2018. Dato curioso 🤓☝️, se iba a llamar UniPeg pero Vitalik les aconsejó pivotear a Uniswap 😆. En algún punto después del lanzamiento, Hayden se da cuenta que para escalar esta idea, necesitará gente muy talentosa, así que en Abril de 2019 levantan capital, en una ronda liderada por <a target="_blank" href="https://www.paradigm.xyz/">Paradigm</a> y así comienza el crecimiento exponencial del DEX más grande de web3.</p>
<p>Ahora que ya conocemos los comienzos de Uniswap, hagamos un repaso rápido de las principales innovaciones técnicas de cada una de las versiones del protocolo</p>
<h2 id="heading-uniswap-v1">Uniswap v1</h2>
<p>Uniswap v1 es bastante sencillo de entender. Estos son los puntos principales:</p>
<ul>
<li><p>Consistía de un solo Factory Contract, cualquiera podía desplegar una pool</p>
</li>
<li><p>Solo podían hacerse swaps de ETH a un token ERC-20.</p>
</li>
<li><p>Es la primera implementación de un <em>Automated Market Maker</em> (AMM), más especificamente un <em>Constant Product Market Maker</em> (CPMM), lo que da paso a la famosa fórmula para explicar Uniswap: <code>xy = k</code> (no te preocupes, explicaremos todo esto con detalle más adelante)</p>
</li>
<li><p>El problema principal de v1 es que no podías swappear de ERC-20 a ERC-20 (esto implicaba una UX mala, y costos de gas innecesarios)</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750829172144/06664bbf-0dbf-4a48-bc03-68dadb8a631c.png" alt class="image--center mx-auto" /></p>
<p>Uniswap v1 explicado en un diagrama: Si querías hacer algo tan simple como swappear DAI por USDC, tenías qué swappear DAI por ETH, y luego ETH por USDC, esto significaba clicks y firmas por todos lados y costos de gas altos (recuerda, era 2018 y todo se hacía sobre Ethereum mainnet)</p>
<h2 id="heading-uniswap-v2">Uniswap v2</h2>
<p>A mediados de 2020 se lanzó Uniswap v2 con algunas innovaciones técnicas geniales pero que sobre todo representó el hito más grande de DeFi, 🎯 hasta el momento y hasta donde sé, es el protocolo más forkeado de la historia.</p>
<p>Uniswap v2 introdujo 3 innovaciones super importantes:</p>
<ol>
<li><p>Ya se puede hacer swaps de ERC-20 a ERC-20 usando un contrato <em>router</em> 🥳</p>
</li>
<li><p>Se introduce el <em>TWAP Oracle</em> 👁️, no muy usado en estos tiempos, pero una gran innovación en su momento</p>
</li>
<li><p>Se introducen los Flash Swapas (como Flash Loans, pero para swaps)</p>
</li>
</ol>
<p>Ya sé, seguramente te quedaste pensando, qué diablos es TWAP Oracle? Culpa mía, pues bueno TWAP significa <strong>Time-Weighted Average Price Oracle</strong> y basicamente es un oráculo on-chain (un contrato) que calcula el precio medio de un activo promediando su valor a lo largo de un intervalo de tiempo. Así, si alguien trataba de manipular el precio subitamente haciendo un trade muuuy largo, el TWAP Oracle sacaba un promedio y no se podían hacer cosas raras con esos oráculos! 👮🏻</p>
<p>Diagramas de Atrium para explicarlo mejor 🤓:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750829765173/ca54b475-fa26-41f2-b0a4-1e4ca44ba74f.png" alt class="image--center mx-auto" /></p>
<p>Ahora, nuevas soluciones generalmente traen nuevos problemas, en Uniswap v2 estos eran:</p>
<ul>
<li><p>Los proveedores de liquidez sufrían mucha <em>impermanent loss</em> debido a la manera en que funciona la curva <code>xy = k</code></p>
</li>
<li><p>Provoca ineficiencias de precio ya que muchos tokens realmente no van a ser tradeados en los extremos de la curva</p>
</li>
</ul>
<p>Pero de ¿qué curva me hablas? Veamos 🤓</p>
<h2 id="heading-uniswap-v3">Uniswap v3</h2>
<p>Uniswap v3 fue lanzado en 2021 trayendo consigo una gran innovación 👨‍🔬: Liquidez concentrada 🌊. Ahora, los LPs pueden decidir en qué rango de la curva quieren proveer su liquidez. Esto tiene una parte mala y una parte buena: La mala es que si el precio del activo sale del rango de liquidez donde estás proveyendo dejas de ganar fees. La buena es que el capital ahora es más eficiente que nunca.</p>
<p>En la siguiente imagen solo es necesario aprender una cosa:</p>
<p>En la v2 (izquierda) la curva de precio no toca los ejes, es continua, se expande infinitamente ya que recuerda (por nuestra querida fórmula <code>xy = k</code> ), entre más escaso es un activo más caro es, hasta que su precio tienda al infinito pero nunca se acaba.</p>
<p>En v3 (derecha) es todo lo contrario. La curva tiene un punto muy específico donde empieza y donde termina (es discreta). Esto quiere decir, un LP provee liquidez en un cierto rango, o….🥁🥁🥁 Liquidez Concentrada 🌊!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750830084087/f203e120-29f9-4231-9ae8-df0389dfc143.png" alt class="image--center mx-auto" /></p>
<p>Pero otra vez, nuevas soluciones traen nuevos problemas, como estos 🥸:</p>
<ul>
<li><p>Demasiados forks resultaban en una mala experiencia para tod@s, ya que la liquidez quedaba fragmentada y brincando de protocolo en protocolo</p>
</li>
<li><p>Muchos forks no eran auditados por lo que hubo muchos hackeos y rugpulls</p>
</li>
<li><p>Los usuarios finales quedaban también confundidos sin saber que DEX les convenía usar</p>
</li>
</ul>
<p>Así que después de un arduo proceso de debate y construcción comunitaria y en público…llega Uniswap v4 al rescate 🦄!</p>
<h2 id="heading-uniswap-v4">Uniswap v4</h2>
<p>Uniswap v4 fue lanzado en enero de 2025, después de un largo camino de recopilación de ideas y construcción en público. Su feature más sonado, son sin duda los hooks 🪝, que nos permiten crear funcionalidades nuevas sobre Uniswap sin necesidad de crear un fork nuevo del DEX!</p>
<p>Pero no solo eso, v4 trae muchas más innovaciones 🤓:</p>
<ul>
<li><p>Nuevo sistema de contabilidad para liquidar saldos entre <em>maker</em> y <em>taker</em></p>
</li>
<li><p>Se utiliza por primera vez <strong>Transient Storage (EIP-1153)</strong> para optimización de gas</p>
</li>
<li><p><strong>Flash Accounting</strong>, permite liquidar saldos pendientes al final de la transancción</p>
</li>
<li><p>Usuarios pueden no retirar sus tokens de las pools para ahorrar fees</p>
</li>
</ul>
<p>Todas estas nuevas herramientas en v4 dan lugar a un espacio de diseño muy muy grande, se pueden construir muchísimas cosas 👷!</p>
<p>Algunas ideas que da Uniswap:</p>
<ul>
<li><p>Libros de órdenes onchain</p>
</li>
<li><p>Curvas de precios personalizadas para crear mercados más eficientes para ciertos tokens (por ejemplo, stablecoins)</p>
</li>
<li><p>Menos MEV tóxico</p>
</li>
<li><p>Comisiones dinámicas que reaccionan ante situaciones del mundo real</p>
</li>
<li><p>Depositar de liquidez fuera de rango en protocolos de lending, para que los LPs ganen rendimiento incluso cuando no se generan fees por swaps</p>
</li>
<li><p>Auto-compounding de comisiones para reinvertir automáticamente en la posición de LP</p>
</li>
<li><p>Creación de DEXes empresariales con pools que cumplen con KYC</p>
</li>
</ul>
<p>Si te emociona construir estas ideas o las tuyas propias con hooks, quédate en los siguientes artículos para que aprendamos la arquitectura técnica de v4, algo más de teoría y matemáticas DeFi y empecemos a crear nuestros propios hooks, LFB el DeFi latinoamericano 🚀🫡!</p>
]]></content:encoded></item><item><title><![CDATA[Morpho: Liquidation and Oracle-Agnostic pricing]]></title><description><![CDATA[Last time we learned a lot about the Morpho product from their documentation, in a nutshell:

Morpho is a lending protocol that puts the emphasis in permissionless and effective lending: minimum governance constraints, anyone can deploy their own iso...]]></description><link>https://defideveloper.xyz/morpho-liquidation-and-oracle-agnostic-pricing</link><guid isPermaLink="true">https://defideveloper.xyz/morpho-liquidation-and-oracle-agnostic-pricing</guid><category><![CDATA[defi]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Liquidation ]]></category><category><![CDATA[lending and borrowing ]]></category><category><![CDATA[Morpho]]></category><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Thu, 27 Feb 2025 16:54:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1740675217023/e40be24f-0047-4822-ba5d-3e6fce5c83c7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last time we learned a lot about the Morpho product from their documentation, in a nutshell:</p>
<ul>
<li>Morpho is a lending protocol that puts the emphasis in permissionless and effective lending: minimum governance constraints, anyone can deploy their own isolated lending market, and with additional layers like Morpho Vaults, capital is rotated to where it is most needed and accrues more yield.</li>
</ul>
<p>Let’s keep learning from the Morpho docs and dive deeper into the next 2 topics: Liquidation and the Oracle-Agnostic model.</p>
<h2 id="heading-liquidation">Liquidation</h2>
<p>First, we have two concepts that we need to understand:</p>
<ul>
<li><p>Loan-To-Value (LTV)</p>
</li>
<li><p>Liquidation Loan-To-Value (LLTV)</p>
</li>
</ul>
<h3 id="heading-loan-to-value">Loan-To-Value</h3>
<p>LTV is a metric used in tradfi to determine the risk involved in a loan. Here in DeFi, it represents the value of the loaned amount relative to the value of the collateral. For example, if a user deposits <strong>$10,000</strong> worth of ETH as collateral and the lending platform allows an <strong>LTV of 50%</strong>, they can borrow up to <strong>$5,000</strong> in stablecoins or another asset.</p>
<p>To calculate the LTV of a position in Morpho, we use a simple formula:</p>
<p><code>LTV = (BORROWED_AMOUNT ORACLE_PRICE) / (COLLATERAL_AMOUNT) (ORACLE_PRICE_SCALE)</code></p>
<p>where <code>ORACLE_PRICE_SCALE = 1e36</code>.</p>
<h3 id="heading-liquidation-loan-to-value">Liquidation Loan-To-Value</h3>
<p>If LTV is a metric to determine how much the amount to borrow is worth, relative to the collateral, LLTV is a metric that determines how much an entity can borrow before being liquidated. In other words, LLTV is a risk parameter that defines <strong>at what LTV ratio</strong> (Loan-To-Value) a loan becomes undercollateralized and subject to liquidation. The formula is very simple: <code>LLTV = LOAN_AMOUNT / COLLATERAL_VALUE</code>.</p>
<p>Example: Let’s say a market in Morpho sets an 85% LLTV liquidation threshold. Alice deposits $1,000 worth of ETH and borrows $800 worth of USDC. Her initial LLTV is 80% which is relatively safe, but if the price of ETH falls and her LTV reaches 85%, liquidation occurs.</p>
<h2 id="heading-how-liquidations-work-in-morpho">How Liquidations work in Morpho</h2>
<p>Liquidations are simple: a liquidator can liquidate up to 100% of the amount owed and received the corresponding collateral value, plus the relative incentive.</p>
<p>No fee is taken by the Morpho protocol at this level. The entire <em>Liquidation Incentive Factor (LIF)</em> goes to the liquidator. I will not try to disect the formula to calculate the LIF at this point, but if you’re curious you can check the <a target="_blank" href="https://docs.morpho.org/morpho/concepts/liquidation">Morpho docs</a>.</p>
<p>To continue with their example, if a borrower provided $1000 of collateral in a market that has a LLTV of 80%, and their debt reaches just above $800, the position is liquidatable.</p>
<p>In this case the formula would be: SEIZABLE_ASSETS = DEBT_AMOUNT <em>LIF = 800</em> 1.06 = 848.</p>
<p>The liquidator would seize up to $848 of collateral and the borrower would keep $152 of the collateral they provided initially.</p>
<p>TLDR for LIF: The lower the LLTV, the higher the LIF. The more difficult it is to get liquidated, the higher percentage the liquidator can take.</p>
<h2 id="heading-oracle-agnostic-pricing">Oracle-Agnostic Pricing</h2>
<p>Finally, let’s look at how Morpho approaches oracles. First, a lending protocol obviously needs to know the price of the assets lended and collateralized. Oracles are the primary method for querying such prices.</p>
<p>Determining a price without using oracles requires a lending protocol to have internal trading markets, which makes the whole system less gas efficient, more complex and prone to new attack vectors.</p>
<p>Morpho uses an oracle-agnostic rather than oracle-less approach. The protocol has no oracle or trading mechanism built into it. When you create a market you are responsible for providing an address for a working oracle be it from Chainlink, Pyth, Uniswap or whichever.</p>
<p>Morpho mentions markets may also have prices hardcoded or use a mechanism like the one <a target="_blank" href="https://www.ajna.finance/">Ajna</a> uses, we will explore that later.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>With that, we’ve covered two very important pieces of the Morpho architecture: Liquidations and Oracles. In the following articles we will keep exploring more of their architecture to become through lending experts. Let’s keep building 🚀.</p>
]]></content:encoded></item><item><title><![CDATA[Understanding Morpho: A New Approach to Decentralized Lending]]></title><description><![CDATA[I've recently started collaborating on a DeFi project that was developed during a hackathon and utilizes Morpho. Before this, I had no prior knowledge of Morpho, so I had to dive into its documentation to understand how this lending protocol operates...]]></description><link>https://defideveloper.xyz/understanding-morpho-a-new-approach-to-decentralized-lending</link><guid isPermaLink="true">https://defideveloper.xyz/understanding-morpho-a-new-approach-to-decentralized-lending</guid><category><![CDATA[Web3]]></category><category><![CDATA[defi]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[defi lending]]></category><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Thu, 27 Feb 2025 05:43:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1740594980320/39b0bb13-6288-412b-a1b1-3313a57b603d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've recently started collaborating on a DeFi project that was developed during a hackathon and utilizes Morpho. Before this, I had no prior knowledge of Morpho, so I had to dive into its documentation to understand how this lending protocol operates. After a few hours of research, I became fascinated with what I was learning and decided to create a series of articles to explore Morpho's mechanics and how it differentiates itself from other lending protocols like AAVE and Compound. I will analyze every concept of their documentation that will help us understand better lending primitives and explain it with examples and code. Let’s dive into it!</p>
<h2 id="heading-what-is-morpho">What is Morpho?</h2>
<p>Morpho follows this paradigm of having a ‘Labs’ as a regular entity that built the original tech, a DAO and a protocol. Morpho Labs was co-founded by Paul Frambot, Merlin Egalite, Julien Thomas, and Mathis Gontier Delauney. Frambot, the CEO, secured a $1 million seed round during his final year as an engineering student, followed by a $20 million investment from Andreessen Horowitz and Variant. The protocol launched on Ethereum mainnet in July 2022.</p>
<p>From their docs, Morpho showcases 6 main products or topics:</p>
<ul>
<li><p>Morpho</p>
</li>
<li><p>Morpho Vaults</p>
</li>
<li><p>Bundlers</p>
</li>
<li><p>Public Allocator</p>
</li>
<li><p>Rewards</p>
</li>
<li><p>Morpho Optimizers (deprecated)</p>
</li>
</ul>
<p>Let’s take a look at the main product: the Morpho protocol. Morpho is a decentralized lending and borrowing protocol designed to be more efficient and flexible than traditional DeFi lending platforms. In Morpho you can deploy a minimal and isolated lending market by specifying:</p>
<ul>
<li><p>One collateral asset</p>
</li>
<li><p>One loan asset</p>
</li>
<li><p>A Liquidation Loan-To-Value (LLTV)</p>
</li>
<li><p>An Interest Rate Model (IRM)</p>
</li>
<li><p>An oracle</p>
</li>
</ul>
<p>We will see what all these means through the series.</p>
<p>Unlike traditional lending protocols that require governance approval for asset listings and parameter changes, Morpho allows for permissionless market creation. Anyone can create a market with different collateral tokens, borrowable tokens, and oracles, and for the LLTV and IRM you have to choose between the options pre-approved by the Morpho DAO governance.</p>
<p>The following LLTVs have been DAO-approved: [0%; 38.5%; 62.5%; 77.0%; 86.0%; 91.5%; 94.5%; 96.5%; 98%].</p>
<p>The only <strong>Interest Rate Model (IRM)</strong> that has been DAO-approved is the <em>AdaptiveCurveIRM</em>, which we will cover in another article.</p>
<p>In Morpho, markets are named in the following format:</p>
<p><code>CollateralAsset/LoanAsset (LLTV, ORACLE, IRM)</code></p>
<p>so a market named <code>wstETH/WETH (94.5%, ChainlinkOracle, AdaptiveCurveIRM)</code> is very simple to read: the collateral asset is <code>wstETH</code>, the asset to loan is <code>WETH</code>, the LLTV is 94.5%, the oracle to be used is from Chainlink and the interest rate model that will be used is <code>AdaptiveCurveIRM</code>. Simple.</p>
<h3 id="heading-key-features-of-morpho">Key Features of Morpho</h3>
<ul>
<li><p><strong>Overcollateralized lending</strong>: Borrowers must provide more collateral than the value of their borrowed assets.</p>
</li>
<li><p><strong>Immutable protocol</strong>: Once deployed, Morpho will function in perpetuity without governance interference, provided the blockchain where it is deployed keeps functioning.</p>
</li>
<li><p><strong>Permissionless market creation</strong>: Each market has fixed parameters, ensuring stability and predictability.</p>
</li>
<li><p><strong>Externalized risk management</strong>: Users, rather than protocol governance, determine risk exposure.</p>
</li>
<li><p><strong>Oracle-agnostic pricing</strong>: Rather than being oracle-less, Morpho allows market creators to choose their preferred price oracle.</p>
</li>
</ul>
<h2 id="heading-governance-and-risk-management">Governance and Risk Management</h2>
<p>Traditional platforms centralize risk management through governance voting. For example, AAVE token holders vote on whether an asset like SHIB can be used as collateral and determine its risk parameters. This approach limits scalability and forces users into a single risk model.</p>
<p>Morpho decentralizes risk management, allowing users to create and interact with any deployed market. This enables:</p>
<ul>
<li><p>Customizable risk profiles</p>
</li>
<li><p>Greater asset diversity</p>
</li>
<li><p>Scalable and autonomous lending markets</p>
</li>
</ul>
<p>For example, Morpho Labs created Morpho Vaults, which is a product built on top of Morpho which facilitates the creation of lending vaults on top of Morpho markets. This is how they work in a nutshell:</p>
<ul>
<li><p>A "Vault" is a smart contract that aggregates funds from multiple lenders.</p>
</li>
<li><p>A "Curator" manages the vault’s risk parameters and strategy.</p>
</li>
<li><p>The Vault then supplies funds across different Morpho markets in an optimized way.</p>
</li>
</ul>
<p>This allows passive lenders to supply their assets and forget about assessing which markets have the appropriate collateral, LLTV, oracle, and IRM, the vault does it on their behalf.</p>
<p>In the following articles we will keep dissecting key Morpho concepts like understanding how their liquidation mechanism works, how they interest rate model works and, much more.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Morpho is a very interesting DeFi lego which introduces a new paradigm in decentralized lending by enabling immutable, permissionless markets with user-controlled risk management. Unlike traditional lending platforms like AAVE and Compound, Morpho removes governance bottlenecks and empowers users with greater flexibility. Many more products can be built on top of this like their Morpho Vaults, flash loans and more. We will cover more of these topics in upcoming articles. Keep building 🚀</p>
]]></content:encoded></item><item><title><![CDATA[It's not time to go home yet]]></title><description><![CDATA[Two months ago, I wanted to start this project, but I didn't know what to put here. I’ve been quietly following my learning path for more than six months now—participating in hackathons and contributing to open-source projects—but on days like today,...]]></description><link>https://defideveloper.xyz/its-not-time-to-go-home-yet</link><guid isPermaLink="true">https://defideveloper.xyz/its-not-time-to-go-home-yet</guid><category><![CDATA[Web3]]></category><category><![CDATA[Blockchain]]></category><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Tue, 25 Feb 2025 15:08:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1740495029115/a909505f-46d2-40d6-a80c-7166daf2c9ec.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two months ago, I wanted to start this project, but I didn't know what to put here. I’ve been quietly following my learning path for more than six months now—participating in hackathons and contributing to open-source projects—but on days like today, the landscape looks more challenging than usual.</p>
<p>A few days ago, Argentine President Javier Milei had a fiasco promoting (or rather, broadcasting) a crypto scam on his personal account. Two days ago, we witnessed the biggest hack in crypto history—Lazarus Group tricked the ByBit team and made off with $1.4 billion in ETH and other tokens. People are arguing and fighting all day over culprits, solutions, an Ethereum rollback, criticizing Vitalik as a leader, the Ethereum Foundation, and Ethereum as a project. Others are disappointed because Solana and <a target="_blank" href="http://pump.fun">pump.fun</a> wiped out their savings. Meanwhile, "leaders" and "builders" are busy creating the <a target="_blank" href="http://pump.fun">pump.fun</a> of X blockchain, the <a target="_blank" href="http://pump.fun">pump.fun</a> of derivatives, NFTs, undercollateralized loans... It all seems like absolute chaos.</p>
<p>And when you’re trying to finally break into the industry—not just as a user or a spectator from the sidelines—even more questions and complexities arise. What course should I take? Which ecosystem, which vertical, which language? Vyper, Solidity, or Cairo? Which chain should I focus on? Base launched a bootcamp, Scroll, Abstract, Mantle... The sheer overload feels like waking up after a brutal hangover, questioning your life decisions. Extending the party, going full-time crypto. But here we are, markets keep bleeding, week is still young and may bring along some more disappointing news but it feels like its not time to go home yet.</p>
<p>There’s so much left to learn and so many things to explore still. If you’re curious, if you have a legitimate passion to build cool stuff and solve real problems, and have a high risk-high reward mentality, its not time for us to go home yet.</p>
]]></content:encoded></item><item><title><![CDATA[Mappings anidados en Solidity]]></title><description><![CDATA[Los nested mappings (mapeos anidados) son una poderosa herramienta en Solidity para trabajar con estructuras de datos más complejas de claves y valores. En este artículo, exploraremos cómo usarlos de manera efectiva y algunas de sus peculiaridades.

...]]></description><link>https://defideveloper.xyz/mappings-anidados-en-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/mappings-anidados-en-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 11 Dec 2024 16:01:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733932554414/8ec490b8-46b4-4b79-8da2-d4f72821785c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Los <strong>nested mappings</strong> (mapeos anidados) son una poderosa herramienta en Solidity para trabajar con estructuras de datos más complejas de claves y valores. En este artículo, exploraremos cómo usarlos de manera efectiva y algunas de sus peculiaridades.</p>
<hr />
<h2 id="heading-que-son-los-nested-mappings">¿Qué Son los Nested Mappings?</h2>
<p>Un nested mapping es simplemente un mapping cuyo valor es otro mapping. Esto te permite almacenar datos en estructuras jerárquicas, como una matriz de datos indexados por múltiples claves.</p>
<h3 id="heading-ejemplo-basico">Ejemplo Básico</h3>
<p>Aquí un ejemplo de cómo declarar y usar un nested mapping en Solidity:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">NestedMappings01</span> </span>{

    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>)) <span class="hljs-keyword">public</span> nestedMap;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setNestedMap</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span> key1,
        <span class="hljs-keyword">uint256</span> key2,
        <span class="hljs-keyword">uint256</span> finalValue
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        nestedMap[key1][key2] <span class="hljs-operator">=</span> finalValue;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getNestedMap</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span> key1,
        <span class="hljs-keyword">uint256</span> key2
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> nestedMap[key1][key2];
    }
}
</code></pre>
<p>En este ejemplo:</p>
<ul>
<li><p><code>nestedMap</code> asocia una clave <code>key1</code> a otro mapping, que a su vez asocia <code>key2</code> con un valor final.</p>
</li>
<li><p><code>setNestedMap</code> permite establecer un valor en el mapping anidado.</p>
</li>
<li><p><code>getNestedMap</code> recupera el valor almacenado en las claves <code>key1</code> y <code>key2</code>.</p>
</li>
</ul>
<hr />
<h2 id="heading-visualizacion-de-nested-mappings">Visualización de Nested Mappings</h2>
<p>Supongamos que llamamos a <code>setNestedMap(1, 2, 100)</code>. El resultado se vería así en pseudocódigo:</p>
<pre><code class="lang-javascript">{
  <span class="hljs-number">1</span>: {
    <span class="hljs-number">2</span>: <span class="hljs-number">100</span>
  }
}
</code></pre>
<p>Aquí, <code>1</code> es la clave del primer mapping, que apunta a un segundo mapping. En ese segundo mapping, <code>2</code> es la clave que apunta al valor <code>100</code>.</p>
<hr />
<h2 id="heading-restricciones-y-peculiaridades-de-los-nested-mappings">Restricciones y Peculiaridades de los Nested Mappings</h2>
<h3 id="heading-1-los-nested-mappings-publicos-no-funcionan-como-esperas">1. <strong>Los Nested Mappings Públicos No Funcionan Como Esperas</strong></h3>
<p>Si declaras un mapping como <code>public</code>, Solidity genera automáticamente una función getter para acceder a sus valores. Sin embargo, en el caso de nested mappings, el getter requiere que proporciones <strong>todas las claves necesarias</strong> para recuperar un valor.</p>
<p>Por ejemplo, con el nested mapping <code>nestedMap</code>, el getter generado automáticamente permite llamar a <code>nestedMap(1, 2)</code> para obtener el valor asociado. No puedes acceder al mapping interno completo.</p>
<h4 id="heading-solucion-usa-funciones-envolventes">Solución: Usa Funciones Envolventes</h4>
<p>Para mayor control, puedes declarar el mapping como <code>private</code> y crear funciones públicas que manejen el acceso:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">NestedMappings02</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>)) <span class="hljs-keyword">private</span> nestedMap;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setNestedMap</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> key1, <span class="hljs-keyword">uint256</span> key2, <span class="hljs-keyword">uint256</span> finalValue</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        nestedMap[key1][key2] <span class="hljs-operator">=</span> finalValue;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getNestedMap</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> key1, <span class="hljs-keyword">uint256</span> key2</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> nestedMap[key1][key2];
    }
}
</code></pre>
<hr />
<h3 id="heading-2-no-puedes-iterar-sobre-nested-mappings">2. <strong>No Puedes Iterar Sobre Nested Mappings</strong></h3>
<p>Al igual que con los mappings simples, Solidity no permite iterar sobre los keys de un nested mapping. Esto se debe a que todas las claves posibles son válidas y retornan su valor predeterminado si no han sido definidas.</p>
<hr />
<h2 id="heading-casos-de-uso-de-nested-mappings">Casos de Uso de Nested Mappings</h2>
<p>Los nested mappings son muy útiles para modelar relaciones complejas. Algunos ejemplos comunes incluyen:</p>
<ol>
<li><p><strong>Sistemas de Permisos</strong>: Un mapping puede asociar direcciones de usuarios con permisos específicos.</p>
<pre><code class="lang-solidity"> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">string</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">bool</span>)) <span class="hljs-keyword">private</span> permissions;
</code></pre>
</li>
<li><p><strong>Balances Detallados</strong>: Puedes almacenar balances separados por categorías para cada usuario.</p>
<pre><code class="lang-solidity"> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">string</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>)) <span class="hljs-keyword">private</span> balances;
</code></pre>
</li>
<li><p><strong>Datos Jerárquicos</strong>: Estructuras como tablas relacionales se pueden modelar fácilmente con nested mappings.</p>
</li>
</ol>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Los nested mappings son una herramienta versátil en Solidity para manejar datos complejos. Aunque tienen limitaciones, como la imposibilidad de iterar sobre las claves o acceder a mappings internos completos a través de getters automáticos, estas restricciones se pueden manejar con buenas prácticas de diseño.</p>
<p>Si estás modelando relaciones jerárquicas o estructuras multi-clave, los nested mappings pueden ser tu mejor aliado. ¡Prueba los ejemplos en Remix para experimentar con estas ideas! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Explorando Mappings en Solidity]]></title><description><![CDATA[En Solidity, los mappings son estructuras de datos esenciales que permiten almacenar pares clave-valor, similares a los hashmaps o mapas en otros lenguajes. Aunque son simples de usar, tienen características únicas y algunas restricciones que debemos...]]></description><link>https://defideveloper.xyz/explorando-mappings-en-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/explorando-mappings-en-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 11 Dec 2024 15:49:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733931319823/1b54f396-28b7-4ffc-8e3a-7802c3653a0a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En Solidity, los <strong>mappings</strong> son estructuras de datos esenciales que permiten almacenar pares clave-valor, similares a los hashmaps o mapas en otros lenguajes. Aunque son simples de usar, tienen características únicas y algunas restricciones que debemos entender. ¡Vamos a ello!</p>
<hr />
<h2 id="heading-introduccion-a-los-mappings">Introducción a los Mappings</h2>
<p>Un <strong>mapping</strong> en Solidity asocia una clave de un tipo específico con un valor de otro tipo específico. Aquí un ejemplo básico:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Mappings01</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> myMapping;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setMapping</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> key, <span class="hljs-keyword">uint256</span> value</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        myMapping[key] <span class="hljs-operator">=</span> value;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getValue</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> key</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> myMapping[key];
    }
}
</code></pre>
<p>En este contrato:</p>
<ul>
<li><p><code>setMapping</code> almacena un valor asociado con una clave.</p>
</li>
<li><p><code>getValue</code> recupera el valor asociado con una clave.</p>
</li>
</ul>
<h3 id="heading-valor-predeterminado">Valor Predeterminado</h3>
<p>Si accedes a un mapping con una clave que no ha sido definida, no obtendrás un error. En su lugar, el mapping retornará el <strong>valor predeterminado</strong> del tipo de datos del valor:</p>
<ul>
<li><p>Para <code>uint256</code>: <code>0</code>.</p>
</li>
<li><p>Para <code>bool</code>: <code>false</code>.</p>
</li>
<li><p>Para <code>address</code>: <code>0x0000000000000000000000000000000000000000</code>.</p>
</li>
</ul>
<p>Ejemplo:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Mappings02</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">bool</span>) <span class="hljs-keyword">public</span> mapToBool;
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> mapToUint;
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">address</span>) <span class="hljs-keyword">public</span> mapToAddress;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getDefaultValues</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> key</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span>, <span class="hljs-keyword">uint256</span>, <span class="hljs-keyword">address</span></span>) </span>{
        <span class="hljs-keyword">return</span> (mapToBool[key], mapToUint[key], mapToAddress[key]);
    }
}
</code></pre>
<hr />
<h2 id="heading-casos-de-uso-comunes">Casos de Uso Comunes</h2>
<h3 id="heading-uso-en-tokens-erc-20">Uso en Tokens ERC-20</h3>
<p>Los tokens ERC-20 utilizan mappings para almacenar balances de usuarios. Por ejemplo:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ERC20Token</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balances;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setBalance</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> owner, <span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        balances[owner] <span class="hljs-operator">=</span> amount;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transfer</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> sender, <span class="hljs-keyword">address</span> receiver, <span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        balances[sender] <span class="hljs-operator">-</span><span class="hljs-operator">=</span> amount;
        balances[receiver] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> amount;
    }
}
</code></pre>
<p>En este caso:</p>
<ul>
<li><p><code>balances</code> mapea una dirección a un saldo.</p>
</li>
<li><p>La función <code>transfer()</code> permite ajustar los saldos de los usuarios.</p>
</li>
</ul>
<p>Nota: Esta implementación carece de restricciones de seguridad; cualquiera puede transferir tokens. Esto es solo un ejemplo simplificado.</p>
<hr />
<h2 id="heading-restricciones-de-los-mappings">Restricciones de los Mappings</h2>
<h3 id="heading-1-solo-pueden-declararse-en-storage">1. <strong>Solo Pueden Declararse en Storage</strong></h3>
<p>Los mappings deben ser declarados como variables de estado (en <strong>storage</strong>). No puedes declararlos dentro de funciones o como parámetros:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BrokenContract</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">wontWork</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> </span>{
        <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) someMap; <span class="hljs-comment">// Esto no compilará</span>
    }
}
</code></pre>
<h3 id="heading-2-no-pueden-ser-iterados">2. <strong>No Pueden Ser Iterados</strong></h3>
<p>No hay manera de iterar sobre las claves de un mapping porque técnicamente todas las claves posibles son válidas y simplemente retornan el valor predeterminado si no han sido definidas.</p>
<p>Esto significa que si necesitas iterar sobre datos, deberías usar un array en combinación con el mapping.</p>
<h3 id="heading-3-no-pueden-ser-retornados">3. <strong>No Pueden Ser Retornados</strong></h3>
<p>Los mappings no son un tipo de datos válido para ser retornado por funciones públicas o externas:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BrokenContract</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint256</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> someMap;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">wontWork</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">mapping</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> =&gt; <span class="hljs-keyword">uint256</span></span>)</span>) </span>{
        <span class="hljs-keyword">return</span> someMap; <span class="hljs-comment">// Esto no compilará</span>
    }
}
</code></pre>
<hr />
<h2 id="heading-buenas-practicas-con-mappings">Buenas Prácticas con Mappings</h2>
<ol>
<li><p><strong>Combínalos con Arrays</strong>: Si necesitas iterar sobre datos, guarda las claves en un array separado.</p>
</li>
<li><p><strong>Define Acceso Público Cuidadosamente</strong>: Aunque puedes declarar un mapping como <code>public</code>, ten cuidado al permitir acceso público para evitar exponer datos sensibles.</p>
</li>
<li><p><strong>Usa Valores Predeterminados con Precaución</strong>: Asegúrate de manejar correctamente los valores predeterminados para evitar errores lógicos.</p>
</li>
</ol>
<hr />
<h2 id="heading-ejemplo-completo-pop-and-swap-con-mappings-y-arrays">Ejemplo Completo: Pop and Swap con Mappings y Arrays</h2>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleWithMappingAndArray</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balances;
    <span class="hljs-keyword">address</span>[] <span class="hljs-keyword">public</span> users;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addUser</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> user, <span class="hljs-keyword">uint256</span> balance</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        balances[user] <span class="hljs-operator">=</span> balance;
        users.<span class="hljs-built_in">push</span>(user);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">removeUser</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> user</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint256</span> index <span class="hljs-operator">=</span> findUserIndex(user);
        balances[user] <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        users[index] <span class="hljs-operator">=</span> users[users.<span class="hljs-built_in">length</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>];
        users.<span class="hljs-built_in">pop</span>();
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">findUserIndex</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> user</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&lt;</span> users.<span class="hljs-built_in">length</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            <span class="hljs-keyword">if</span> (users[i] <span class="hljs-operator">=</span><span class="hljs-operator">=</span> user) {
                <span class="hljs-keyword">return</span> i;
            }
        }
        <span class="hljs-keyword">revert</span>(<span class="hljs-string">"User not found"</span>);
    }
}
</code></pre>
<p>Este contrato:</p>
<ul>
<li><p>Usa un array para almacenar las claves del mapping.</p>
</li>
<li><p>Permite iterar indirectamente sobre los usuarios.</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Los mappings son herramientas poderosas para almacenar y acceder a datos en Solidity, especialmente cuando no necesitas iterar sobre ellos. Aunque tienen restricciones, su simplicidad y eficiencia los hacen esenciales para muchos casos de uso, incluidos los tokens ERC-20.</p>
<p>¡Prueba estos ejemplos en Remix para familiarizarte con sus conceptos y limitaciones! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Manipulación avanzada de arrays]]></title><description><![CDATA[En Solidity, los arrays almacenados en storage tienen un comportamiento especial que permite manipularlos directamente en la blockchain. Esto incluye agregar, eliminar, y modificar elementos. Estas operaciones se vuelven cruciales cuando los arrays s...]]></description><link>https://defideveloper.xyz/manipulacion-avanzada-de-arrays</link><guid isPermaLink="true">https://defideveloper.xyz/manipulacion-avanzada-de-arrays</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 11 Dec 2024 15:00:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733928809035/ee4653a4-cf61-4c97-a8fa-739766f60665.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En Solidity, los arrays almacenados en <strong>storage</strong> tienen un comportamiento especial que permite manipularlos directamente en la blockchain. Esto incluye agregar, eliminar, y modificar elementos. Estas operaciones se vuelven cruciales cuando los arrays son persistidos en el estado de nuestro smart contract.</p>
<p>¡Vamos a explorar cómo funciona todo esto! 🚀</p>
<hr />
<h2 id="heading-operaciones-basicas-en-arrays-de-storage">Operaciones Básicas en Arrays de Storage</h2>
<p>Aquí tienes un ejemplo básico de cómo trabajar con arrays almacenados en <strong>storage</strong>:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ArraysInStorage01</span> </span>{
    <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">public</span> myArray;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setMyArray</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">calldata</span> newArray</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        myArray <span class="hljs-operator">=</span> newArray; <span class="hljs-comment">// Asigna el contenido de newArray a myArray</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addToArray</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> newItem</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        myArray.<span class="hljs-built_in">push</span>(newItem); <span class="hljs-comment">// Agrega un elemento al final</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">removeFromArray</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        myArray.<span class="hljs-built_in">pop</span>(); <span class="hljs-comment">// Elimina el último elemento</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getLength</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArray.<span class="hljs-built_in">length</span>; <span class="hljs-comment">// Devuelve la longitud del array</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getEntireArray</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArray; <span class="hljs-comment">// Devuelve el array completo</span>
    }
}
</code></pre>
<h3 id="heading-interaccion-en-remix">Interacción en Remix</h3>
<ol>
<li><p><code>setMyArray</code>: Establece un nuevo array, por ejemplo, <code>[1, 2, 3]</code>.</p>
</li>
<li><p><code>addToArray</code>: Agrega un nuevo número al final, como <code>4</code>. El array se convierte en <code>[1, 2, 3, 4]</code>.</p>
</li>
<li><p><code>removeFromArray</code>: Elimina el último elemento. El array ahora es <code>[1, 2, 3]</code>.</p>
</li>
<li><p><code>getLength</code>: Devuelve <code>3</code>, la longitud del array.</p>
</li>
<li><p><code>getEntireArray</code>: Retorna <code>[1, 2, 3]</code>.</p>
</li>
</ol>
<hr />
<h2 id="heading-acceso-publico-a-arrays">Acceso Público a Arrays</h2>
<p>Cuando un array es declarado como <code>public</code>, Solidity genera automáticamente una función getter que permite acceder a sus valores. Sin embargo, este getter solo devuelve elementos individuales, no el array completo.</p>
<p>Por ejemplo, al llamar <code>myArray(0)</code> obtendrás el primer elemento, pero si necesitas todo el array, debes usar una función como <code>getEntireArray</code>.</p>
<h3 id="heading-que-pasa-con-pop">¿Qué pasa con <code>pop()</code>?</h3>
<p>La función <code>pop()</code> elimina el último elemento del array y reduce su longitud, pero <strong>no retorna el valor eliminado</strong> como es común en otros lenguajes de programación.</p>
<hr />
<h2 id="heading-eliminando-elementos-del-array">Eliminando Elementos del Array</h2>
<p>Solidity no permite eliminar un elemento en el medio de un array y ajustar automáticamente su longitud. Si intentas hacerlo, el valor será <strong>reemplazado por cero</strong>, pero la longitud del array no cambiará.</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleContract</span> </span>{
    <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">public</span> myArray;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">removeAt</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> index</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">delete</span> myArray[index]; <span class="hljs-comment">// El elemento se convierte en 0</span>
    }
}
</code></pre>
<h3 id="heading-pop-and-swap-una-solucion-comun">Pop and Swap: Una Solución Común</h3>
<p>Si necesitas eliminar un elemento y reducir la longitud del array, puedes usar el patrón <strong>pop and swap</strong>. Este método reemplaza el elemento a eliminar con el último elemento y luego utiliza <code>pop()</code> para reducir la longitud:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleContract</span> </span>{
    <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">public</span> myArray;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">popAndSwap</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> index</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint256</span> valueAtTheEnd <span class="hljs-operator">=</span> myArray[myArray.<span class="hljs-built_in">length</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>];
        myArray[index] <span class="hljs-operator">=</span> valueAtTheEnd; <span class="hljs-comment">// Reemplaza con el último elemento</span>
        myArray.<span class="hljs-built_in">pop</span>(); <span class="hljs-comment">// Reduce la longitud</span>
    }
}
</code></pre>
<p>Este enfoque no preserva el orden original del array, pero es eficiente en términos de gas.</p>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Trabajar con arrays en <strong>storage</strong> te brinda una gran flexibilidad para manejar datos en la blockchain. Desde agregar y eliminar elementos hasta manipular arrays completos, estas herramientas son esenciales para desarrollar smart contracts robustos.</p>
<p>Sin embargo, es importante tener en cuenta las limitaciones, como la falta de soporte para eliminar elementos en medio del array mientras se preserva su orden.</p>
<p>¡Experimenta con estos conceptos en Remix y observa cómo puedes usarlos en tus próximos proyectos de Solidity! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Variables de estado, visibilidad y mutabilidad]]></title><description><![CDATA[Las variables de estado o state variables son una característica esencial de Solidity que te permite almacenar datos directamente en la blockchain. Hasta ahora, hemos trabajado principalmente con funciones puras que no interactúan con el estado de la...]]></description><link>https://defideveloper.xyz/variables-de-estado-visibilidad-y-mutabilidad</link><guid isPermaLink="true">https://defideveloper.xyz/variables-de-estado-visibilidad-y-mutabilidad</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 11 Dec 2024 05:28:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733893188615/c0b710c5-f179-4982-912c-9cdab8fd5d17.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Las <strong>variables de estado</strong> o state variables son una característica esencial de Solidity que te permite almacenar datos directamente en la blockchain. Hasta ahora, hemos trabajado principalmente con funciones puras que no interactúan con el estado de la blockchain. Sin embargo, si necesitas guardar información <em>on-chain</em> como puntajes en un juego o saldos financieros, tendrás que usar state variables. ¡Vamos a explorarlas!</p>
<hr />
<h2 id="heading-que-son-las-variables-de-estado">¿Qué Son las Variables de Estado?</h2>
<p>En Solidity, las variables de estado son aquellas que se declaran <strong>fuera de las funciones</strong> y quedan guardadas en la blockchain después de que una transacción finaliza. Ejemplo:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">StateVariables01</span> </span>{
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">internal</span> x; <span class="hljs-comment">// Variable de estado x</span>

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setX</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> newValue</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        x <span class="hljs-operator">=</span> newValue;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getX</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> x;
    }
}
</code></pre>
<p>En este ejemplo:</p>
<ul>
<li><p><code>x</code> es una variable de estado que almacena un valor entero.</p>
</li>
<li><p><code>setX()</code> modifica el valor de <code>x</code>. Nota que como ésta función cambia el estado de la blockchain, no tiene el modificador <code>view</code> o <code>pure</code>.</p>
</li>
<li><p><code>getX()</code> lee el valor de <code>x</code>. Tiene el modificador <code>view</code> porque lee la blockchain pero no la modifica.</p>
</li>
</ul>
<hr />
<h2 id="heading-visibilidad-quien-puede-acceder-a-estas-variables">Visibilidad: ¿Quién Puede Acceder a Estas Variables?</h2>
<p>Cuando declaras una variable de estado, puedes definir su visibilidad con palabras clave como <code>public</code>, <code>internal</code> o <code>private</code>.</p>
<h3 id="heading-opciones-de-visibilidad">Opciones de Visibilidad</h3>
<ul>
<li><p><code>public</code>:</p>
<ul>
<li><p>Cualquier contrato o cuenta externa puede leer la variable.</p>
</li>
<li><p>El compilador genera automáticamente una función getter.</p>
</li>
</ul>
</li>
<li><p><code>internal</code>:</p>
<ul>
<li>Accesible solo dentro del contrato y en contratos que lo heredan.</li>
</ul>
</li>
<li><p><code>private</code>:</p>
<ul>
<li>Similar a <code>internal</code>, pero no accesible desde contratos derivados.</li>
</ul>
</li>
</ul>
<p>Por ejemplo, al cambiar la visibilidad de una variable a <code>internal</code> o <code>private</code>, notarás que los botones para interactuar con esa variable desaparecen en Remix.</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">HelloWorld</span> </span>{
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">private</span> text;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) </span>{
        text <span class="hljs-operator">=</span> <span class="hljs-string">"Hello World"</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">helloWorld</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> text;
    }
}
</code></pre>
<h3 id="heading-diferencia-entre-internal-y-private">Diferencia entre <code>internal</code> y <code>private</code></h3>
<p>La visibilidad <code>internal</code> permite que contratos heredados accedan a la variable o función, mientras que <code>private</code> restringe el acceso únicamente al contrato original.</p>
<hr />
<h2 id="heading-modificadores-de-mutabilidad-pure-view-y-mas">Modificadores de Mutabilidad: <code>pure</code>, <code>view</code>, y más</h2>
<p>Los modificadores como <code>pure</code> y <code>view</code> definen si una función puede leer o modificar el estado de la blockchain.</p>
<h3 id="heading-tipos-de-mutabilidad">Tipos de Mutabilidad</h3>
<ul>
<li><p><code>pure</code>: No lee ni modifica el estado. Estas funciones son las más eficientes en términos de gas.</p>
<pre><code class="lang-solidity">  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addNumbers</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> a, <span class="hljs-keyword">uint256</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
      <span class="hljs-keyword">return</span> a <span class="hljs-operator">+</span> b;
  }
</code></pre>
</li>
<li><p><code>view</code>: Puede leer el estado, pero no modificarlo. Llamar estas funciones directamente es gratuito.</p>
<pre><code class="lang-solidity">  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getX</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
      <span class="hljs-keyword">return</span> x;
  }
</code></pre>
</li>
<li><p><code>payable</code>: Permite que la función reciba Ether.</p>
<pre><code class="lang-solidity">  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
      <span class="hljs-comment">// código para manejar depósitos</span>
  }
</code></pre>
</li>
<li><p><strong>Sin modificador o non-payable (default)</strong>: Puede leer y modificar el estado de la blockchain.</p>
<pre><code class="lang-solidity">  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setX</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> newValue</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
      x <span class="hljs-operator">=</span> newValue;
  }
</code></pre>
</li>
</ul>
<hr />
<h2 id="heading-ejemplo-practico-variables-de-estado-y-modificadores">Ejemplo Práctico: Variables de Estado y Modificadores</h2>
<p>Aquí tienes un contrato que combina variables de estado con diferentes visibilidades y modificadores de mutabilidad:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleContract</span> </span>{
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> balance; <span class="hljs-comment">// Accesible externamente gracias a `public`</span>

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        balance <span class="hljs-operator">+</span><span class="hljs-operator">=</span> amount; <span class="hljs-comment">// Modifica el estado</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> balance; <span class="hljs-comment">// Solo lee el estado</span>
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateBonus</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> baseAmount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> baseAmount <span class="hljs-operator">*</span> <span class="hljs-number">10</span> <span class="hljs-operator">/</span> <span class="hljs-number">100</span>; <span class="hljs-comment">// Operación pura</span>
    }
}
</code></pre>
<hr />
<h2 id="heading-buenas-practicas-y-consideraciones">Buenas Prácticas y Consideraciones</h2>
<ol>
<li><p><strong>Sé explícito con la visibilidad</strong>: Declara siempre la visibilidad de tus variables y funciones (<code>public</code>, <code>internal</code>, etc.) para evitar errores y mejorar la legibilidad.</p>
</li>
<li><p><strong>Recuerda que todo es público en la blockchain</strong>: Aunque declares una variable como <code>private</code>, cualquier persona puede acceder a ella al analizar la blockchain.</p>
</li>
</ol>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Las variables de estado son esenciales para almacenar datos en la blockchain. Junto con las opciones de visibilidad y los modificadores de mutabilidad, ofrecen una manera robusta y flexible de manejar el estado en tus contratos inteligentes.</p>
<p>¿List@ para experimentar con todo lo que hemos aprendido hasta ahora? ¡Prueba a implementar y desplegar algunos ejemplos en Remix! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Strings (cadenas) en Solidity]]></title><description><![CDATA[Los strings en Solidity comparten muchas características con los arrays, ya que bajo el capó son arrays de bytes. Sin embargo, trabajar con strings tiene sus propias particularidades en Solidity. ¡Vamos a explorarlas!

Uso Básico de Strings
En Solidi...]]></description><link>https://defideveloper.xyz/strings-cadenas-en-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/strings-cadenas-en-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 11 Dec 2024 04:53:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733892123631/0440906b-34b5-463b-81d8-4537c4c2fbb9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Los <strong>strings</strong> en Solidity comparten muchas características con los arrays, ya que bajo el capó son arrays de bytes. Sin embargo, trabajar con strings tiene sus propias particularidades en Solidity. ¡Vamos a explorarlas!</p>
<hr />
<h2 id="heading-uso-basico-de-strings">Uso Básico de Strings</h2>
<p>En Solidity, puedes definir una función que reciba un string como entrada y lo retorne como salida:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleContract</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">echo</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">calldata</span> input</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> input;
    }
}
</code></pre>
<p>Este tipo de funciones es útil cuando necesitas procesar o retornar información textual.</p>
<hr />
<h2 id="heading-concatenacion-de-strings">Concatenación de Strings</h2>
<p>Una curiosidad de Solidity, es que no soportaba concatenación de strings hasta febrero de 2022, cuando salió la versión 0.8.12. A partir de esta versión, puedes usar <code>string.concat</code>:</p>
<pre><code class="lang-solidity"><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.12;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ExampleContract</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">greetUser</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">calldata</span> user</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">string</span>.concat(<span class="hljs-string">"Hello, "</span>, user);
    }
}
</code></pre>
<p>Esta es una pequeña muestra de que Solidity está optimizado para manejar números más que texto.</p>
<hr />
<h2 id="heading-limitaciones-de-los-strings">Limitaciones de los Strings</h2>
<h3 id="heading-no-se-pueden-indexar">No se pueden indexar</h3>
<p>A diferencia de lenguajes como JavaScript o Python, no puedes acceder a un carácter específico en un string mediante indexación:</p>
<pre><code class="lang-solidity"><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.12;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BadContract</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getFirstCharacter</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">calldata</span> input</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> input[<span class="hljs-number">0</span>]; <span class="hljs-comment">// Esto producirá un error</span>
    }
}
</code></pre>
<h3 id="heading-sin-length">Sin <code>.length</code></h3>
<p>Solidity no permite obtener la longitud de un string directamente con <code>.length</code>. Esto se debe a que los strings son representados como bytes y pueden incluir caracteres Unicode, lo que complica la medición.</p>
<hr />
<p>Los strings en Solidity tienen algunas limitaciones que dan cuenta de que los smart contracts fueron concebidos en primera instancia para trabajar principalmente con números, no texto. Sin embargo, entender cómo manejarlos te será útil para casos específicos, como mensajes descriptivos o identificadores únicos. 🚀</p>
<p>Ahora ya dominamos los arrays y los strings, y estamos listos para aplicar estas estructuras de datos y aprender más en nuestro camino como blockchain devs, ¡sigamos explorando!</p>
]]></content:encoded></item><item><title><![CDATA[Introducción a los Arrays en Solidity]]></title><description><![CDATA[Los arrays son una de las estructuras de datos más fundamentales. Permiten almacenar colecciones de elementos del mismo tipo y trabajar con ellos de manera eficiente. Aunque los arrays en Solidity tienen similitudes con otros lenguajes, hay caracterí...]]></description><link>https://defideveloper.xyz/introduccion-a-los-arrays-en-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/introduccion-a-los-arrays-en-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 07 Dec 2024 06:51:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733550967086/300e455d-aa05-42e4-8595-04d4a97fb454.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Los <strong>arrays</strong> son una de las estructuras de datos más fundamentales. Permiten almacenar colecciones de elementos del mismo tipo y trabajar con ellos de manera eficiente. Aunque los arrays en Solidity tienen similitudes con otros lenguajes, hay características únicas que vamos a explorar ahora. ¡Comencemos!</p>
<hr />
<h2 id="heading-declaracion-y-uso-basico-de-arrays">Declaración y Uso Básico de Arrays</h2>
<p>En Solidity, se puede declarar un array de dos maneras: de tamaño fijo y dinámico. Un array de tamaño fijo es cuando sabes cuantos elementos va a tener tu array de antemano, y un array dinámico es cuando no lo sabes.</p>
<p>Para declarar un array dinámico de números en Solidity, usamos la notación <code>uint256[]</code>. Aquí hay un ejemplo de una función que toma un array como entrada y simplemente lo retorna:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arrays01</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">useArrayForUint256</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">calldata</span> input
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> input;
    }
}
</code></pre>
<p>En <strong>Remix</strong>, tienes qué ingresar el input en este formato: <code>[1,2,3,4]</code> al llamar esta función. También puedes declrar arrays de cualquier otro tipo, como <code>bool[]</code> o <code>address[]</code> pero los elementos del array siempre tienen qué ser del mismo tipo:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arrays02</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">booleanArrayExample</span>(<span class="hljs-params">
        <span class="hljs-keyword">bool</span>[] <span class="hljs-keyword">calldata</span> myArr
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span>[] <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArr;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addressArrayExample</span>(<span class="hljs-params">
        <span class="hljs-keyword">address</span>[] <span class="hljs-keyword">calldata</span> myArr
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">address</span>[] <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArr;
    }
}
</code></pre>
<hr />
<h2 id="heading-storage-locations-calldata-y-memory">Storage locations: <code>calldata</code> y <code>memory</code></h2>
<p>¡Felicidades por haber llegado hasta aquí! Ahora vamos a ver el primer concepto que es 100% de desarrollo blockchain. Si has estado escribiendo tú mism@ el código ya habrás notado esas palabras clave <code>public</code>, <code>pure</code>, <code>calldata</code>, <code>memory</code> que no hemos explicado. Las primeras dos las vamos a explicar más adelante y por ahora vamos a hablar un poco sobre las últimas dos.</p>
<p>Estoy seguro que sabes lo que es la EVM, es la <strong>Ethereum Virtual Machine</strong>, el <em>ambiente</em> en donde corre el código que escribimos en Solidity, compilamos a <em>bytecode</em> y desplegamos a la blockchain. Bueno pues la EVM tiene este concepto llamado <strong>storage locations</strong>, que es justamente los diferentes lugares donde se puede almacenar la data que usan nuestros smart contracts. Las principales <em>storage locations</em> son <code>memory</code>, <code>storage</code> y <code>calldata</code> y tienen diferentes casos de uso para hacer nuestro código más eficiente. Más adelante veremos este concepto de <em>storage locations</em> mucho más a fondo, por ahora agrégalos a tu código para que compile correctamente.</p>
<hr />
<h2 id="heading-propiedades-y-metodos-de-arrays">Propiedades y Métodos de Arrays</h2>
<h3 id="heading-indexacion">Indexación</h3>
<p>Los arrays son <strong>indexados desde cero</strong>, como en otros lenguajes de programación. Si intentas acceder a una posición que no existe, la transacción revertirá:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arrays03</span> </span>{
    <span class="hljs-keyword">uint256</span>[] myArray <span class="hljs-operator">=</span> [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>];

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getElementAtIndex</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> index</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArray[index];
    }
}
</code></pre>
<h3 id="heading-longitud">Longitud</h3>
<p>Puedes obtener la longitud de un array con <code>.length</code> y usarla para recorrer el array:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arrays04</span> </span>{
    <span class="hljs-keyword">uint256</span>[] myArray <span class="hljs-operator">=</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>];

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sumOfArrayElements</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">uint256</span> sum <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&lt;</span> myArray.<span class="hljs-built_in">length</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            sum <span class="hljs-operator">+</span><span class="hljs-operator">=</span> myArray[i];
        }
        <span class="hljs-keyword">return</span> sum;
    }
}
</code></pre>
<hr />
<h2 id="heading-arrays-de-tamano-fijo">Arrays de Tamaño Fijo</h2>
<p>Supongamos que quieres crear un array para un juego donde habrá 4 participantes. Si sabes que solo necesitarás un arreglo con 4 elementos, es mejor declararlo de antemano:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arrays05</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getLast</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span>[<span class="hljs-number">5</span>] <span class="hljs-keyword">calldata</span> myArray
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> myArray[<span class="hljs-number">4</span>]; <span class="hljs-comment">// Aquí estamos declarando un array de 4 elementos</span>
    }
}
</code></pre>
<p>Si proporcionas como argumento un array de tamaño incorrecto obtendrás un error.</p>
<hr />
<h2 id="heading-arrays-anidados">Arrays Anidados</h2>
<p>Aunque son muy raros en la práctica, Solidity permite declarar <strong>arrays anidados</strong>. Aquí hay un ejemplo que busca un número <code>3</code> en un array anidado:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">NestedArrayExample01</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">containsAThree</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span>[][] <span class="hljs-keyword">calldata</span> nestedArray
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&lt;</span> nestedArray.<span class="hljs-built_in">length</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> j <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; j <span class="hljs-operator">&lt;</span> nestedArray[i].<span class="hljs-built_in">length</span>; j<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
                <span class="hljs-keyword">if</span> (nestedArray[i][j] <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">3</span>) {
                    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
                }
            }
        }
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }
}
</code></pre>
<p>Puedes probarlo en Remix con este input:<br /><code>[[1,2,4], [5,6,7], [8,9,10]]</code><br />Por supuesto, deberias obtener false.</p>
<p>También puedes declarar arrays anidados con tamaños fijos:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">NestedArrayExample02</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getLast</span>(<span class="hljs-params">
        <span class="hljs-keyword">uint256</span>[<span class="hljs-number">2</span>][<span class="hljs-number">3</span>] <span class="hljs-keyword">calldata</span> nestedArray
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> nestedArray[<span class="hljs-number">2</span>][<span class="hljs-number">1</span>];
    }
}
</code></pre>
<hr />
<p>Los arrays son estructuras de datos esenciales en Solidity. Más adelante verás que los usaremos muchísimo en los proyectos que vamos a construir. Mientras tanto, ¡sigamos explorando Solidity! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Control de Flujo en Solidity: If Statements y For Loops]]></title><description><![CDATA[En Solidity como en cualquier lenguaje de programación, es fundamental entender cómo manejar el flujo de ejecución de nuestros smart contracts. Afortunadamente, if statements y for loops funcionan de manera similar a otros lenguajes. Sin embargo, hay...]]></description><link>https://defideveloper.xyz/control-de-flujo-en-solidity-if-statements-y-for-loops</link><guid isPermaLink="true">https://defideveloper.xyz/control-de-flujo-en-solidity-if-statements-y-for-loops</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 07 Dec 2024 05:50:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733549733831/a8b1cf44-8950-49a7-b12a-0cc3c65727bd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En Solidity como en cualquier lenguaje de programación, es fundamental entender cómo manejar el flujo de ejecución de nuestros smart contracts. Afortunadamente, <strong>if statements</strong> y <strong>for loops</strong> funcionan de manera similar a otros lenguajes. Sin embargo, hay algunas peculiaridades que vale la pena conocer. Vamos a explorar estas estructuras y sus casos de uso más comunes.</p>
<hr />
<h2 id="heading-if-statements-en-solidity">If Statements en Solidity</h2>
<p>En Solidity, los <strong>if statements</strong> son casi idénticos a otros lenguajes como JavaScript o Python. Sin embargo, debido a que Solidity es un lenguaje estáticamente tipado, no permite evaluar condiciones dinámicamente.</p>
<p>Por ejemplo, el siguiente código <strong>no funcionará</strong>:</p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isNotZero</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> x</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
    <span class="hljs-keyword">if</span> (x) {
        <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }
}
</code></pre>
<p>En Solidity, las condiciones deben ser expresiones booleanas explícitas. Para solucionar este problema, deberías escribir algo como:</p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isNotZero</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> x</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
    <span class="hljs-keyword">if</span> (x <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>) {
        <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }
}
</code></pre>
<hr />
<h3 id="heading-else-if">Else If</h3>
<p>Solidity también soporta el uso de <strong>else if</strong>, lo que permite manejar múltiples condiciones:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ElseIfExample</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">max</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> a, <span class="hljs-keyword">uint256</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">if</span> (a <span class="hljs-operator">&gt;</span> b) {
            <span class="hljs-keyword">return</span> a;
        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (b <span class="hljs-operator">&gt;</span> a) {
            <span class="hljs-keyword">return</span> b;
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; <span class="hljs-comment">// En caso de que sean iguales</span>
        }
    }
}
</code></pre>
<p>¿Puedes ver lo que está haciendo el código de arriba?</p>
<p>Solidity <strong>no tiene una declaración switch</strong> como otros lenguajes.</p>
<hr />
<h2 id="heading-for-loops-en-solidity">For Loops en Solidity</h2>
<p>Los <strong>for loops</strong> en Solidity funcionan como en cualquier lenguaje de programación. Puedes utilizarlos para iterar sobre valores numéricos o estructuras de datos (como arrays, que veremos más adelante).</p>
<h3 id="heading-ejemplo-suma-de-numeros">Ejemplo: Suma de Números</h3>
<p>Aquí un smart contract que suma los números del 1 al 99:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ForLoopExample</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addNumbers</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">uint256</span> sum <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">1</span>; i <span class="hljs-operator">&lt;</span> <span class="hljs-number">100</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            sum <span class="hljs-operator">+</span><span class="hljs-operator">=</span> i;
        }
        <span class="hljs-keyword">return</span> sum;
    }
}
</code></pre>
<h3 id="heading-ejercicio-es-un-numero-primo">Ejercicio: ¿Es un Número Primo?</h3>
<p>¿Te gustaría saber si un número es primo? Aquí tienes un ejercicio para implementarlo:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">IsPrime</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isNumberPrime</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> num</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
        <span class="hljs-keyword">if</span> (num <span class="hljs-operator">&lt;</span> <span class="hljs-number">2</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;

        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">2</span>; i <span class="hljs-operator">*</span> i <span class="hljs-operator">&lt;</span><span class="hljs-operator">=</span> num; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            <span class="hljs-keyword">if</span> (num <span class="hljs-operator">%</span> i <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>) {
                <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
            }
        }
        <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
    }
}
</code></pre>
<hr />
<h3 id="heading-curiosidades-y-limitaciones">Curiosidades y Limitaciones</h3>
<p>Aunque Solidity maneja los for loops naturalmente, hay algunas cosas a tener en cuenta:</p>
<ul>
<li><p><strong>Costos de Gas:</strong> Los loops largos pueden consumir demasiado gas, lo que puede hacer que las transacciones fallen. Por ejemplo, evaluar si un número grande como <code>7877</code> es primo puede tomar varios segundos debido a los cálculos.</p>
</li>
<li><p><strong>While y Do While</strong>: Estas estructuras de iteración también existen en Solidity pero como practicamente no se usan en el desarrollo real de smart contracts, no las cubriremos aquí.</p>
</li>
</ul>
<hr />
<p>Los <strong>if statements</strong> y <strong>for loops</strong> son herramientas esenciales en Solidity que ofrecen flexibilidad para manejar el flujo lógico de tus smart contracts. Sigamos aprendiendo la sintáxis con paciencia que ya viene lo más interesante.</p>
<p>La práctica nos hace mejores. ¿Qué esperas para probar estos ejemplos en Remix? Intenta agregar edge cases, encontrar maneras de romper el código y casos raros que no hayamos visto. ¡Sigamos explorando! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Aritmética en Solidity: Más de lo que parece]]></title><description><![CDATA[Cuando trabajamos en Solidity, la aritmética funciona un poco diferente a otros lenguajes de programación. Veamos cuales son las diferencias.
Operaciones Básicas
En Solidity, las operaciones básicas como suma, resta, multiplicación y el uso del módul...]]></description><link>https://defideveloper.xyz/aritmetica-en-solidity-mas-de-lo-que-parece</link><guid isPermaLink="true">https://defideveloper.xyz/aritmetica-en-solidity-mas-de-lo-que-parece</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 07 Dec 2024 05:07:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733545825045/ff35487a-34d9-4e15-ba8d-56a05b63926c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cuando trabajamos en Solidity, la aritmética funciona un poco diferente a otros lenguajes de programación. Veamos cuales son las diferencias.</p>
<h2 id="heading-operaciones-basicas">Operaciones Básicas</h2>
<p>En Solidity, las operaciones básicas como suma, resta, multiplicación y el uso del módulo (<code>%</code>) se comportan de la forma esperada.</p>
<h3 id="heading-ejemplos">Ejemplos</h3>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint256</span> suma <span class="hljs-operator">=</span> <span class="hljs-number">10</span> <span class="hljs-operator">+</span> <span class="hljs-number">5</span>; <span class="hljs-comment">// Resultado: 15</span>
<span class="hljs-keyword">uint256</span> resta <span class="hljs-operator">=</span> <span class="hljs-number">20</span> <span class="hljs-operator">-</span> <span class="hljs-number">10</span> <span class="hljs-comment">// Resultado: 10</span>
<span class="hljs-keyword">uint256</span> multiplicacion <span class="hljs-operator">=</span> <span class="hljs-number">5</span> <span class="hljs-operator">*</span> <span class="hljs-number">10</span> <span class="hljs-comment">// Resultado: 50</span>
<span class="hljs-keyword">uint256</span> exponente <span class="hljs-operator">=</span> <span class="hljs-number">5</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> <span class="hljs-number">3</span>; <span class="hljs-comment">// Resultado: 125</span>
<span class="hljs-keyword">uint256</span> modulo <span class="hljs-operator">=</span> <span class="hljs-number">10</span> <span class="hljs-operator">%</span> <span class="hljs-number">4</span>; <span class="hljs-comment">// Resultado: 2</span>
</code></pre>
<p>¿Quieres probarlo? Aquí hay un contrato con estas operaciones para que lo ejecutes en Remix:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Arithmetic01</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sumFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">10</span> <span class="hljs-operator">+</span> <span class="hljs-number">5</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">substractionFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">20</span> <span class="hljs-operator">-</span> <span class="hljs-number">5</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">multiplicationFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">5</span> <span class="hljs-operator">*</span> <span class="hljs-number">10</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">divisionFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">50</span> <span class="hljs-operator">/</span> <span class="hljs-number">2</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">exponentiationFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">5</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> <span class="hljs-number">3</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">moduloFunction</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">10</span> <span class="hljs-operator">%</span> <span class="hljs-number">4</span>;
    }
}
</code></pre>
<hr />
<h2 id="heading-aritmetica-de-enteros-aqui-no-hay-decimales">Aritmética de Enteros: Aquí no hay decimales</h2>
<p>Una característica crucial de Solidity es que no tiene números de punto flotante (decimales). Esto significa que si intentas dividir <code>5 / 2</code>, en las versiones recientes de Solidity el compilador te marcará un error:</p>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint256</span> division <span class="hljs-operator">=</span> <span class="hljs-number">5</span> <span class="hljs-operator">/</span> <span class="hljs-number">2</span>;
<span class="hljs-comment">// Error: TypeError: Return argument type rational_const 5 / 2 is not </span>
<span class="hljs-comment">// implicitly convertible to expected type (type of first return variable) </span>
<span class="hljs-comment">// uint256.</span>
</code></pre>
<p>Si necesitas trabajar con porcentajes o fracciones, debes encontrar alternativas. Por ejemplo, para calcular el 15% de 200, no puedes simplemente hacer <code>200 * .15</code>. En su lugar, puedes escalar el porcentaje y luego dividir:</p>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint256</span> porcentaje <span class="hljs-operator">=</span> (<span class="hljs-number">200</span> <span class="hljs-operator">*</span> <span class="hljs-number">15</span>) <span class="hljs-operator">/</span> <span class="hljs-number">100</span>; <span class="hljs-comment">// porcentaje == 30</span>
</code></pre>
<p>Otro ejemplo con decimales. ¿Cómo obtendrias el 7.5% de 200?:</p>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint256</span> porcentaje <span class="hljs-operator">=</span> (<span class="hljs-number">200</span> <span class="hljs-operator">*</span> <span class="hljs-number">75</span>) <span class="hljs-operator">/</span> <span class="hljs-number">1000</span>; <span class="hljs-comment">// porcentaje == 15</span>
</code></pre>
<p>Como trivia, esto es así porque la blockchain debe ser determinística, no puede permitir interpretaciones. Por ejemplo si divides <code>5 / 3</code> algunas máquinas dirán <code>1.666666</code>, otras <code>1.6666667</code> y esto causaría problemas de consenso en los nodos.</p>
<hr />
<h2 id="heading-overflow-y-underflow">Overflow y underflow</h2>
<p>Overflow es cuando una variable trata de contener un número más grande del que puede guardar, y underflow cuando trata de contener un número más pequeño del que puede guardar. Por ejemplo si tenemos <code>uint8 num = 5</code> sabemos que un <code>uint</code> no puede guardar un número menor a 0, que pasaría si a <code>num</code> le restamos 10? ¡Eso es underflow!</p>
<p>En versiones modernas de Solidity (&gt;= 0.8.0), las operaciones que resultan en underflow u overflow solamente se revierten.</p>
<p>Por ejemplo:</p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">subtract</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> x, <span class="hljs-keyword">uint256</span> y</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
    <span class="hljs-keyword">return</span> x <span class="hljs-operator">-</span> y; <span class="hljs-comment">// Revertirá si por ejemplo x = 2, y = 5</span>
}
</code></pre>
<p>Si <code>x</code> es 2 y <code>y</code> es 5, el programa no retornará <code>-3</code>. En lugar de eso, detendrá su ejecución (hará un revert).</p>
<hr />
<h2 id="heading-overflowunderflow-controlado-usando-unchecked">Overflow/underflow controlado: Usando <code>unchecked</code></h2>
<p>Si realmente necesitas permitir overflow o underflow, puedes usar un bloque <code>unchecked</code>:</p>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint256</span> x <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
<span class="hljs-keyword">uint256</span> y <span class="hljs-operator">=</span> <span class="hljs-number">5</span>;

<span class="hljs-keyword">unchecked</span> {
    <span class="hljs-keyword">uint256</span> z <span class="hljs-operator">=</span> x <span class="hljs-operator">-</span> y; <span class="hljs-comment">// No hará revert</span>
}
</code></pre>
<p>Esto no hará revert, y se puede usar en casos muy específicos para ahorrar gas. Como principiante, es bueno que sepas que existe, pero no estarás usandolo pronto.</p>
<hr />
<p>La próxima vez que escribas un smart contract, recuerda estas reglas. ¡La seguridad y precisión son esenciales en blockchain! Sigamos explorando. 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Tipos de Datos en Solidity]]></title><description><![CDATA[¡Continuemos aprendiendo! En Solidity, cada variable y función tiene un tipo definido explícitamente. Si conoces lenguajes como Python o JavaScript sabrás que puedes declarar una variable y asignarle un string y después asignarle un número u otro val...]]></description><link>https://defideveloper.xyz/tipos-de-datos-en-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/tipos-de-datos-en-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 07 Dec 2024 03:42:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733540988894/6ab76cd2-629b-45b1-8952-20bc95562bf1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>¡Continuemos aprendiendo! En Solidity, cada variable y función tiene un tipo definido explícitamente. Si conoces lenguajes como Python o JavaScript sabrás que puedes declarar una variable y asignarle un string y después asignarle un número u otro valor. Si conoces Java o Typescript sabrás que acá tienes qué declarar si tu variable va a ser string, boolean u otra. Si no conoces ninguno de estos lenguajes no te preocupes, estamos aquí para aprender.</p>
<p>Por lo pronto, recuerda que en Solidity cada variables es de cierto <em>tipo</em>, vamos a ver los más usados.</p>
<h2 id="heading-tipos-de-datos-mas-usados">Tipos de Datos Más Usados</h2>
<ol>
<li><p><strong>Unsigned Integer (</strong><code>uint256</code><strong>):</strong> Números enteros sin signo. Es decir solo podemos guardar el 0 y números positivos (<code>-300</code> sería un número negativo).</p>
</li>
<li><p><strong>Boolean (</strong><code>bool</code><strong>):</strong> Variables que almacenan valores <code>true</code> o <code>false</code>.</p>
</li>
<li><p><strong>Address (</strong><code>address</code><strong>):</strong> Tipo que almacena direcciones de wallets o contratos inteligentes en Ethereum.</p>
</li>
</ol>
<p>Además de estos, Solidity incluye otros tipos como arrays, cadenas (strings) y estructuras (structs), que exploraremos más adelante.</p>
<h3 id="heading-ejemplo-funciones-con-diferentes-tipos-de-retorno">Ejemplo: Funciones con Diferentes Tipos de Retorno</h3>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">DataTypes01</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getANumber</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">uint256</span> x <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
        <span class="hljs-keyword">return</span> x;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getABoolean</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
        <span class="hljs-keyword">bool</span> y <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">return</span> y;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getAnAddress</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">address</span></span>) </span>{
        <span class="hljs-comment">// La wallet de Vitalik Buterin</span>
        <span class="hljs-keyword">address</span> z <span class="hljs-operator">=</span> <span class="hljs-number">0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045</span>;
        <span class="hljs-keyword">return</span> z;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getAnotherAddress</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">address</span></span>) </span>{
        <span class="hljs-comment">// Dirección del contrato de USDC</span>
        <span class="hljs-keyword">address</span> z2 <span class="hljs-operator">=</span> <span class="hljs-number">0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48</span>;
        <span class="hljs-keyword">return</span> z2;
    }
}
</code></pre>
<p>Observa el código anterior (recuerda intentar escribir tú mism@ el código en Remix y probarlo). En este ejemplo, tenemos 4 funciones, cada una de ellas hace una cosa muy sencilla: guarda un valor hardcodeado en una variable y retorna esta variable.</p>
<p>Nota que siempre tienes qué poner en la firma de la función el tipo de dato que va a retornar tu función. Por ejemplo, intenta agregar esta función a tu código:</p>
<pre><code class="lang-solidity">    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getAddressFail</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48</span>;
    }
</code></pre>
<p>Verás que nos da un error porque la firma de tu función dice que va a regresar un <code>bool</code> y está regresando un <code>address</code>.</p>
<hr />
<h2 id="heading-address-direccion">Address (Dirección)</h2>
<p>Recuerda que el tipo <code>address</code> representa una wallet o la dirección de un contrato. Siempre comienzan con <code>0x</code> más 40 caracteres entre <code>[0-9]</code> y <code>[a-f]</code> (hexadecimal).</p>
<p><strong>Checksum:</strong> Las direcciones deben usar un checksum válido para evitar errores. Por ejemplo:</p>
<ul>
<li><p>Dirección sin checksum: <code>0xd8da6bf26964af9d7eed9e03e53415d37aa96045</code></p>
</li>
<li><p>Dirección con checksum: <code>0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045</code></p>
</li>
</ul>
<p>Si intentas usar una dirección sin checksum en Remix, podrías obtener un error como este:</p>
<pre><code class="lang-plaintext">SyntaxError: This looks like an address but has an invalid checksum.
</code></pre>
<p>Por ahora no te preocupes mucho por esto pero es bueno que aprendas a leer los errores. Si por alguna razón no puedes compilar tu código por este error, nota que el mismo Remix te da la versión correcta de la dirección que debes usar, solo lee el mensaje de error y ahí estará la respuesta:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733542323340/7acb8853-f0a3-408d-b15f-fd442e068eff.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-uint256-entero-sin-signo">uint256 (Entero sin Signo)</h2>
<p>Un <code>uint256</code> es un entero sin signo que no puede almacenar números negativos. El número 256 indica que puede almacenar valores de hasta <strong>256 bits</strong>, es decir, entre <code>0</code> y <code>2^256 - 1</code>, es decir este numerotototote:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">DataTypes02</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBiggestNumber</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span>
            <span class="hljs-number">115792089237316195423570985008687907853269984665640564039457584007913129639935</span>;
    }
}
</code></pre>
<p>Si intentas aumentar el último dígito a <code>6</code>, obtendrás un error porque excede el límite permitido.</p>
<p>Como principiantes, siempre que queramos declarar un número vamos a usar <code>uint256</code>, pero es bueno saber que hay <code>uint8</code>, <code>uint16</code>, <code>uint32</code>, etc.</p>
<hr />
<h2 id="heading-boolean-bool">Boolean (bool)</h2>
<p>Un <code>bool</code> almacena únicamente dos valores posibles: <code>true</code> o <code>false</code>. Es un tipo de dato básico y muy similar al de otros lenguajes de programación.</p>
<hr />
<p>¡Ahora ya conoces los tipos de datos más comunes en Solidity! Recuerda practicar estos conceptos, probar el código en Remix y testear cualquier cosa que te dé curiosidad. Ahora sigamos explorando. 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Hola Mundo, Hola Solidity!]]></title><description><![CDATA[Al explorar el desarrollo en blockchain, uno de los primeros pasos es familiarizarte con Remix, un entorno de desarrollo en nuestro navegador diseñado específicamente para crear y probar contratos inteligentes en Solidity. Es sencillo de usar y no re...]]></description><link>https://defideveloper.xyz/hola-mundo-tu-primer-smart-contract-en-remix</link><guid isPermaLink="true">https://defideveloper.xyz/hola-mundo-tu-primer-smart-contract-en-remix</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 07 Dec 2024 02:39:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1733540143003/59dcc9ed-a2c6-43a3-af46-ea8f9bc9b4e6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Al explorar el desarrollo en blockchain, uno de los primeros pasos es familiarizarte con <strong>Remix</strong>, un entorno de desarrollo en nuestro navegador diseñado específicamente para crear y probar contratos inteligentes en <strong>Solidity</strong>. Es sencillo de usar y no requiere instalación, lo que lo hace perfecto para que hagamos nuestras primeras pruebas sin preocuparnos por instalar nada en nuestra computadora.</p>
<h2 id="heading-que-es-remix">¿Qué es Remix?</h2>
<p><a target="_blank" href="https://remix.ethereum.org">Remix</a> es una herramienta que nos permite <strong>escribir, compilar, y desplegar</strong> smart contracts directamente desde nuestro navegador. Tiene un editor de código integrado y herramientas como un compilador, una consola y un simulador de una blockchain virtual que nos permitirá aprender muchísimo sin siquiera tener qué conectar nuestra wallet. ¡Un entorno perfecto para nosotros que estamos comenzando!</p>
<hr />
<h2 id="heading-primeros-pasos-con-remix-escribiendo-tu-primer-contrato">Primeros Pasos con Remix: Escribiendo tu Primer Contrato</h2>
<p>¡Pongamos manos a la obra! Y como dictan las buenas costumbres, crearemos un contrato llamado <code>Hello World</code>, este contrato contendrá dos funciones que retornan datos básicos.</p>
<h3 id="heading-paso-1-crea-un-nuevo-archivo-sol">Paso 1: Crea un nuevo archivo <code>.sol</code></h3>
<ol>
<li><p>Ve a <a target="_blank" href="https://remix.ethereum.org">remix.ethereum.org</a>. Es muy importante que te asegures que estás en la dirección correcta. ¡Ten cuidado con estafas!</p>
</li>
<li><p>En el panel lateral izquierdo, haz clic en <strong>File Explorer</strong> y crea un archivo nuevo llamado <code>HelloWorld.sol</code>. La extensión <code>.sol</code> indica que es un archivo de Solidity.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733925956465/8f55dc1c-55dc-4025-a926-2c6afa0e74c2.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-paso-2-escribe-el-contrato">Paso 2: Escribe el Contrato</h3>
<p>Copia y pega el siguiente código dentro del archivo <code>HelloWorld.sol</code>:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">HelloWorld</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">helloWorld</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">100</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">returnsBool</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
    }
}
</code></pre>
<p>Verás una advertencia de que tengas cuidado con el código que pegues. Puedes leerla y aceptarla.</p>
<p>Este contrato define dos funciones simples:</p>
<ul>
<li><p><code>helloWorld()</code>: Retorna el número <code>100</code>.</p>
</li>
<li><p><code>returnsBool()</code>: Retorna el valor booleano <code>true</code>.</p>
</li>
</ul>
<hr />
<h2 id="heading-compilando-tu-contrato">Compilando tu Contrato</h2>
<h3 id="heading-paso-1-seleccionar-el-compilador">Paso 1: Seleccionar el Compilador</h3>
<ol>
<li><p>En el panel izquierdo de Remix, haz clic en la pestaña <strong>Solidity Compiler</strong>.</p>
</li>
<li><p>Asegúrate de que la versión del compilador coincida con la versión declarada en el contrato (<code>pragma solidity ^0.8.0;</code>), Normalmente Remix se encarga de esto en automático, pero para que sepas cualquier versión del compilador que empiece con <code>0.8.x</code> funcionará.</p>
</li>
<li><p>Haz clic en <strong>Compile HelloWorld.sol</strong>.</p>
</li>
</ol>
<p>Si todo está correcto, deberías ver un checkmark verde en el ícono del compilador.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733538521140/bb14fcbf-9a98-4d9b-99b0-aa1549165d80.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-desplegando-el-contrato-en-remix">Desplegando el Contrato en Remix</h2>
<p>Remix incluye una red virtual que simula el comportamiento de una blockchain real. Así puedes desplegar y probar tu contrato sin necesidad de usar dinero real, conectar tu wallet o buscar fondos de testnet en un faucet (si no entiendes estos términos, no te preocupes los veremos más adelante).</p>
<h3 id="heading-paso-1-acceder-al-desplegador">Paso 1: Acceder al Desplegador</h3>
<ol>
<li><p>Ve a la pestaña <strong>Deploy &amp; Run Transactions</strong> en el panel izquierdo.</p>
</li>
<li><p>Asegúrate de que el <strong>Environment</strong> esté configurado en "Remix VM" (no importa que diga Cancun o London o cualquier otra versión).</p>
</li>
</ol>
<h3 id="heading-paso-2-desplegar-el-contrato">Paso 2: Desplegar el Contrato</h3>
<ol>
<li><p>Bajo la sección "Deploy", selecciona el contrato <code>HelloWorld</code>.</p>
</li>
<li><p>Haz clic en el botón naranja <strong>Deploy</strong>.</p>
</li>
</ol>
<p>Una vez desplegado, verás el contrato listado bajo la sección "Deployed Contracts" y verás una palomita verde en la consola indicando que la transacción fue exitosa.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733538933651/81b7876f-a44f-4d73-b5ca-7bbd1225977a.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-probando-el-contrato">Probando el Contrato</h2>
<ol>
<li><p>Expande el contrato en "Deployed Contracts".</p>
</li>
<li><p>Haz clic en las funciones <code>helloWorld</code> y <code>returnsBool</code> para ejecutarlas.</p>
</li>
<li><p>Observa cómo retornan los valores <code>100</code> y <code>true</code>, respectivamente.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733539016786/09afe91f-d289-46fd-aadb-17d4f94ec577.png" alt class="image--center mx-auto" /></p>
<hr />
<p>¡Felicidades! Has dado tus primeros pasos como desarrollador/a blockchain, sigamos adelante. 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Introducción a HardHat 👷]]></title><description><![CDATA[Hoy vamos a ver una pequeña introducción a Hardhat explicada de manera sencilla para principiantes. El objetivo es que después de leer este tutorial entiendas mucho mejor esta herramienta y empieces tu camino hacia construir dapps de manera profesion...]]></description><link>https://defideveloper.xyz/introduccion-a-hardhat</link><guid isPermaLink="true">https://defideveloper.xyz/introduccion-a-hardhat</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sat, 30 Nov 2024 02:13:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732926613541/3863f787-bce0-4203-b8e6-4f36acfde597.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hoy vamos a ver una pequeña introducción a Hardhat explicada de manera sencilla para principiantes. El objetivo es que después de leer este tutorial entiendas mucho mejor esta herramienta y empieces tu camino hacia construir dapps de manera profesional, ¡comencemos!</p>
<h3 id="heading-que-es-hardhat-componentes-principales">¿Qué es Hardhat? Componentes principales</h3>
<p>Primero que nada, es importante saber que Hardhat es un grupo de herramientas con diferentes utilidades:</p>
<p><strong>Hardhat Runner:</strong> Es el componente principal de Hardhat, es un <em>task runner</em> que nos ayuda con todas las tareas relacionadas al desarrollo blockchain.</p>
<p><strong>Hardhat Network:</strong> Es un simulador de un nodo local de la red de Ethereum, nos permite emular la blockchain y hacer pruebas locales en nuestra computadora.</p>
<p><strong>Hardhat Ignition:</strong> Es un sistema nuevo para hacer más fluido el proceso de desplegar nuestros contratos.</p>
<p><strong>Extensión de VS Code:</strong> Hardhat creó una extensión de VS Code que es la más recomendada. Mírala en su <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity">página oficial</a>.</p>
<p><strong>Hardhat Chai Matchers:</strong> Chai es una librería de pruebas muy usada en el ecosistema de JavaScript. Hardhat añade funcionalidad específica de blockchain para que escribamos mejores tests de nuestros contratos.</p>
<p>Entonces, ya sabemos que Hardhat es un set de herramientas y la principal es su <em>task runner</em>. Un <em>"task runner"</em> es una herramienta que permite automatizar tareas repetitivas, como compilar código, ejecutar pruebas o desplegar contratos inteligentes. Todo en Hardhat gira en torno a los conceptos de tareas y plugins. Cuando compilamos o desplegamos nuestros contratos, estamos corriendo tareas. Hardhat nos permite crear nuestras propias tareas y crear flujos bastante avanzados con ellas.</p>
<h3 id="heading-instalando-hardhat">Instalando Hardhat</h3>
<p>Ahora sí viene lo bueno, ¡vamos a programar!</p>
<p>Empecemos creando un nuevo folder en una carpeta donde tengas tus proyectos de código:</p>
<p><code>mkdir hardhat-prueba   cd hardhat-prueba</code></p>
<p>Dentro de este folder, inicializamos un proyecto de npm corriendo:</p>
<p><code>npm init -y</code></p>
<p>A continuación instalamos Hardhat como dependencia de desarrollo (también puedes usar yarn, pero se recomienda usar npm 7 o posterior):</p>
<p><code>npm install --save-dev hardhat</code></p>
<p>Nota: La documentación de Hardhat recomienda que si estamos en Windows usemos WSL pero yo hice pruebas en el sistema normal de Windows y no tuve ningún problema.</p>
<p>Ahora iniciemos un proyecto muestra corriendo:</p>
<p><code>npx hardhat init</code></p>
<p>Seleccionemos <em>‘Create JavaScript project’</em> y demos Enter en las demás preguntas. (Para poder seleccionar necesitas una terminal interactiva, si estás en Windows, GitBash no te servirá para este paso, te recomiendo usar PowerShell):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732929433602/93ddef9c-29d8-424e-9051-59f36bfff6d4.png" alt class="image--center mx-auto" /></p>
<p>Como dijimos antes, el concepto principal en Hardhat son las tareas, así que corre <code>npx hardhat</code> y veras algunas de las tareas disponibles. Por ejemplo 3 de las tareas que vamos a usar muy seguido serán <code>compile</code>, <code>test</code> y <code>node</code>. Cuando instalemos algún plugin, éste nos hará disponibles nuevas tareas que podremos ver también en esta lista.</p>
<p>Nuestro flujo de trabajo será así: 1) Escribir un contrato inteligente, 2) Escribir tests para este contrato y 3) Desplegar nuestro contrato a una blockchain</p>
<h3 id="heading-escribiendo-y-compilando-el-smart-contract">Escribiendo y compilando el smart contract</h3>
<p>Cuando corrimos <code>npx hardhat init</code> se creó un contrato de prueba en <code>contracts/Lock.sol</code>. Te recomiendo que leas con detenimiento el código para que entiendas lo que hace y cómo lo hace:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.28;</span>

<span class="hljs-comment">// Uncomment this line to use console.log</span>
<span class="hljs-comment">// import "hardhat/console.sol";</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Lock</span> </span>{
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> unlockTime;
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> <span class="hljs-keyword">public</span> owner;

    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">Withdrawal</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> amount, <span class="hljs-keyword">uint</span> when</span>)</span>;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _unlockTime</span>) <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        <span class="hljs-built_in">require</span>(
            <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">&lt;</span> _unlockTime,
            <span class="hljs-string">"Unlock time should be in the future"</span>
        );

        unlockTime <span class="hljs-operator">=</span> _unlockTime;
        owner <span class="hljs-operator">=</span> <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-comment">// Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal</span>
        <span class="hljs-comment">// console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp);</span>

        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> unlockTime, <span class="hljs-string">"You can't withdraw yet"</span>);
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> owner, <span class="hljs-string">"You aren't the owner"</span>);

        <span class="hljs-keyword">emit</span> Withdrawal(<span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>, <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>);

        owner.<span class="hljs-built_in">transfer</span>(<span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>);
    }
}
</code></pre>
<p>El siguiente paso es compilar nuestro contrato, para esto corremos npx hardhat compile. Si todo salió bien veremos este output:</p>
<p><code>Compiled 1 Solidity file successfully (evm target: paris).</code></p>
<h3 id="heading-testeando-nuestro-contrato">Testeando nuestro contrato</h3>
<p>Hardhat ya viene con Mocha, Chai y una versión especial de Ethers.js para probar todo lo que necesitamos. En otro artículo vamos a aprender más sobre crear pruebas para nuestros contratos pero por ahora, puedes ver que ya tenemos un archivo con varias pruebas en <code>test/Lock.js</code>. Te recomiendo que le eches un vistazo para que te familiarices con cómo se ve un archivo de pruebas de un smart contract en JavaScript.</p>
<p>A continuación, corre las pruebas: <code>npx hardhat test</code> y verás un mensaje de que todas las pruebas pasaron correctamente.</p>
<h3 id="heading-desplegando-con-hardhat-ignition">Desplegando con Hardhat Ignition</h3>
<p>¡Genial! Ya que escribimos y probamos a fondo nuestros contratos inteligentes, estamos listos para desplegarlos a una red. Por ahora vamos a usar Ignition y en otro artículo vamos a ver a fondo todas las opciones para customizar nuestros despliegues.</p>
<p>Si vas a la carpeta <code>ignition/modules/Lock.js</code> verás este código:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// This setup uses Hardhat Ignition to manage smart contract deployments.</span>
<span class="hljs-comment">// Learn more about it at https://hardhat.org/ignition</span>

<span class="hljs-keyword">const</span> { buildModule } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@nomicfoundation/hardhat-ignition/modules"</span>);

<span class="hljs-keyword">const</span> JAN_1ST_2030 = <span class="hljs-number">1893456000</span>;
<span class="hljs-keyword">const</span> ONE_GWEI = <span class="hljs-number">1</span>_000_000_000n;

<span class="hljs-built_in">module</span>.exports = buildModule(<span class="hljs-string">"LockModule"</span>, <span class="hljs-function">(<span class="hljs-params">m</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> unlockTime = m.getParameter(<span class="hljs-string">"unlockTime"</span>, JAN_1ST_2030);
  <span class="hljs-keyword">const</span> lockedAmount = m.getParameter(<span class="hljs-string">"lockedAmount"</span>, ONE_GWEI);

  <span class="hljs-keyword">const</span> lock = m.contract(<span class="hljs-string">"Lock"</span>, [unlockTime], {
    <span class="hljs-attr">value</span>: lockedAmount,
  });

  <span class="hljs-keyword">return</span> { lock };
});
</code></pre>
<p>Así que ahora corre el siguiente comando:</p>
<p><code>npx hardhat ignition deploy ./ignition/modules/Lock.js</code></p>
<p>y verás algo así:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732931685874/a5ddc2e0-2ad7-483c-b9ad-155ee8aea87d.png" alt class="image--center mx-auto" /></p>
<p>Como te diste cuenta, este despliegue se hizo a una red local simulada que Hardhat creó ‘<em>en el instante</em>’ para hacer el proceso de despliegue.</p>
<h3 id="heading-conclusion-y-proximos-pasos">Conclusión y próximos pasos</h3>
<p>Así que ahora ya sabes cómo crear un proyecto de Hardhat, compilar contratos inteligentes, testearlos con JavaScript y desplegarlos a una red local, ¡gran trabajo!</p>
<p>En el siguiente artículo de esta serie te mostraré cómo desplegar a cualquier red de prueba (testnet) y mainnet de manera segura ¡vamos!</p>
]]></content:encoded></item><item><title><![CDATA[How to become a top blockchain developer]]></title><description><![CDATA[A couple of years ago, I read a great article by Patrick Collins about the path to becoming a blockchain developer. The article was simple and straightforward, but I believe it’s now behind a paywall. So yesterday, while chatting with ChatGPT, I aske...]]></description><link>https://defideveloper.xyz/how-to-become-a-top-blockchain-developer</link><guid isPermaLink="true">https://defideveloper.xyz/how-to-become-a-top-blockchain-developer</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Mon, 25 Nov 2024 19:45:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732563325373/59924dec-b62e-48ee-b536-deb38ced35a6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A couple of years ago, I read a great article by Patrick Collins about the path to becoming a blockchain developer. The article was simple and straightforward, but I believe it’s now behind a paywall. So yesterday, while chatting with ChatGPT, I asked what it thought was the best path to becoming a top blockchain developer. I really liked its response, so I’m sharing it here with a few edits and some resources at the end to help you start your journey toward becoming a great blockchain developer.</p>
<h2 id="heading-1-master-the-fundamentals"><strong>1. Master the Fundamentals</strong></h2>
<p>Before diving into advanced topics, build a strong foundation:</p>
<ul>
<li><p><strong>Blockchain Basics:</strong></p>
<ul>
<li><p>Understand how blockchains work (consensus mechanisms, cryptography, smart contracts, and decentralization).</p>
</li>
<li><p>Study the history and principles of Bitcoin and Ethereum.</p>
</li>
</ul>
</li>
<li><p><strong>Core Programming Skills:</strong></p>
<ul>
<li><p>Proficiency in <strong>JavaScript/TypeScript</strong> for web development.</p>
</li>
<li><p>Learn <strong>Solidity</strong> (the primary language for Ethereum smart contracts).</p>
</li>
<li><p>Explore other blockchain languages like <strong>Rust</strong> (for Solana) or <strong>Go</strong>.</p>
</li>
</ul>
</li>
<li><p><strong>Key Tools and Frameworks:</strong></p>
<ul>
<li><p>Familiarize yourself with <strong>Foundry</strong>, <strong>Hardhat</strong>, and <strong>Remix</strong> for Ethereum development.</p>
</li>
<li><p>Explore libraries like <strong>viem</strong> for interacting with the blockchain.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-2-specialize-in-key-blockchain-areas"><strong>2. Specialize in Key Blockchain Areas</strong></h2>
<p>Being a generalist is valuable, but becoming an expert in a niche area can set you apart.</p>
<h4 id="heading-specialization-options">Specialization Options:</h4>
<ul>
<li><p><strong>Smart Contract Development:</strong></p>
<ul>
<li><p>Learn advanced Solidity topics (gas optimization, security, DeFi protocols).</p>
</li>
<li><p>Master ERC standards (ERC-20, ERC-721, ERC-1155).</p>
</li>
<li><p>Build and audit smart contracts.</p>
</li>
</ul>
</li>
<li><p><strong>DeFi and Financial Protocols:</strong></p>
<ul>
<li><p>Study AMMs (e.g., Uniswap), lending protocols (e.g., Aave), and derivatives.</p>
</li>
<li><p>Understand tokenomics and stablecoins.</p>
</li>
<li><p>Experiment with flash loans and on-chain arbitrage.</p>
</li>
</ul>
</li>
<li><p><strong>Layer 2 Solutions:</strong></p>
<ul>
<li><p>Study Optimistic Rollups (e.g., Arbitrum) and zkRollups (e.g., zkSync, StarkNet).</p>
</li>
<li><p>Learn how to deploy contracts on Layer 2 chains.</p>
</li>
</ul>
</li>
<li><p><strong>NFTs and Gaming:</strong></p>
<ul>
<li><p>Explore the ERC-721 and ERC-1155 standards.</p>
</li>
<li><p>Build marketplaces, NFT minting platforms, or play-to-earn games.</p>
</li>
</ul>
</li>
<li><p><strong>Blockchain Infrastructure:</strong></p>
<ul>
<li><p>Dive into consensus mechanisms, nodes, and validators.</p>
</li>
<li><p>Contribute to core protocol development or create custom chains with <strong>Substrate</strong> or <strong>Cosmos SDK</strong>.</p>
</li>
</ul>
</li>
<li><p><strong>Privacy and Zero-Knowledge Proofs:</strong></p>
<ul>
<li><p>Learn about zk-SNARKs, zk-STARKs, and their applications.</p>
</li>
<li><p>Experiment with zk-friendly programming languages (e.g., Circom).</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-3-build-projects-and-gain-practical-experience"><strong>3. Build Projects and Gain Practical Experience</strong></h2>
<p>Practical experience is crucial to becoming a top developer:</p>
<ul>
<li><p><strong>Start Small:</strong></p>
<ul>
<li><p>Build simple decentralized applications (dApps) like token wallets or crowdfunding platforms.</p>
</li>
<li><p>Gradually increase complexity by creating DeFi or NFT projects.</p>
</li>
</ul>
</li>
<li><p><strong>Open Source Contributions:</strong></p>
<ul>
<li><p>Contribute to popular blockchain projects (e.g., Ethereum, Uniswap, OpenZeppelin).</p>
</li>
<li><p>Get involved in the community by solving issues and adding features.</p>
</li>
</ul>
</li>
<li><p><strong>Hackathons:</strong></p>
<ul>
<li>Participate in blockchain hackathons (e.g., EthGlobal, Encode Club) to build real-world projects and network with other developers.</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-4-deepen-your-theoretical-knowledge"><strong>4. Deepen Your Theoretical Knowledge</strong></h2>
<p>To truly stand out, develop a deep understanding of the underlying technology:</p>
<ul>
<li><p><strong>Cryptography:</strong></p>
<ul>
<li>Study elliptic curve cryptography, hashing algorithms, and digital signatures.</li>
</ul>
</li>
<li><p><strong>Distributed Systems:</strong></p>
<ul>
<li><p>Learn about consensus algorithms (e.g., Proof of Work, Proof of Stake, PBFT).</p>
</li>
<li><p>Understand the challenges of scalability, latency, and fault tolerance.</p>
</li>
</ul>
</li>
<li><p><strong>Tokenomics:</strong></p>
<ul>
<li><p>Dive into game theory and incentive mechanisms.</p>
</li>
<li><p>Study successful token models and experiment with creating your own.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-5-stay-updated-with-industry-trends"><strong>5. Stay Updated with Industry Trends</strong></h2>
<p>Blockchain is a fast-evolving field. Stay current with the latest developments:</p>
<ul>
<li><p><strong>Read Whitepapers:</strong></p>
<ul>
<li>Analyze whitepapers of key protocols (e.g., Ethereum, Solana, Polkadot).</li>
</ul>
</li>
<li><p><strong>Follow Thought Leaders:</strong></p>
<ul>
<li>Follow Vitalik Buterin, Balaji Srinivasan, and other blockchain pioneers on Twitter.</li>
</ul>
</li>
<li><p><strong>Engage in the Community:</strong></p>
<ul>
<li><p>Join forums, Discords, and DAOs related to blockchain development.</p>
</li>
<li><p>Attend conferences like Devcon or ETHDenver.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-6-build-your-personal-brand"><strong>6. Build Your Personal Brand</strong></h2>
<p>Being recognized as an authority in the space can open doors:</p>
<ul>
<li><p><strong>Share Knowledge:</strong></p>
<ul>
<li><p>Write blogs, create YouTube tutorials, or publish guides on blockchain topics.</p>
</li>
<li><p>Teach others through workshops or bootcamps.</p>
</li>
</ul>
</li>
<li><p><strong>Create a Portfolio:</strong></p>
<ul>
<li><p>Showcase your projects on GitHub with detailed READMEs.</p>
</li>
<li><p>Build a personal website to display your blockchain expertise.</p>
</li>
</ul>
</li>
<li><p><strong>Network Actively:</strong></p>
<ul>
<li><p>Collaborate with other developers and join blockchain communities.</p>
</li>
<li><p>Seek mentorship from experienced blockchain engineers.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-7-develop-a-long-term-vision"><strong>7. Develop a Long-Term Vision</strong></h2>
<p>Think beyond just writing code:</p>
<ul>
<li><p><strong>Innovate:</strong></p>
<ul>
<li>Identify gaps in the blockchain ecosystem and build solutions to address them.</li>
</ul>
</li>
<li><p><strong>Leadership:</strong></p>
<ul>
<li><p>Start your own blockchain project, protocol, or company.</p>
</li>
<li><p>Mentor junior developers and contribute to growing the blockchain ecosystem.</p>
</li>
</ul>
</li>
<li><p><strong>Continuous Learning:</strong></p>
<ul>
<li>Blockchain technology evolves rapidly. Stay curious and committed to learning new tools, frameworks, and protocols.</li>
</ul>
</li>
</ul>
<p>Aquí está una versión editada y pulida del texto:</p>
<hr />
<h2 id="heading-resources">Resources</h2>
<ul>
<li><p><a target="_blank" href="https://www.cyfrin.io/updraft"><strong>Cyfrin Updraft</strong></a><strong>:</strong> I highly recommend starting with this platform, as it contains everything you need to begin your journey.</p>
</li>
<li><p><a target="_blank" href="https://www.rareskills.io/learn-solidity"><strong>RareSkills Solidity Course</strong></a><strong>:</strong> A free collection of articles ranging from basic concepts to in-depth studies on advanced topics.</p>
</li>
<li><p><a target="_blank" href="https://solidity-by-example.org/"><strong>Solidity by Example</strong></a><strong>:</strong> Great for reinforcing your theoretical understanding of the language.</p>
</li>
<li><p><a target="_blank" href="https://soliditylang.org/"><strong>Solidity Docs</strong></a><strong>:</strong> There’s nothing better than reading the official documentation and using it as your primary reference.</p>
</li>
</ul>
<p>Finally, here are some tips I’ve received from people who have already walked this path:</p>
<ol>
<li><p>Start learning the basics with Remix—it’s a great environment for beginners.</p>
</li>
<li><p>If you’re deciding between Hardhat and Foundry, choose <strong>Foundry</strong>.</p>
</li>
<li><p>If you need to use Hardhat, opt for <strong>viem</strong> over <strong>Ethers.js</strong> or <strong>Web3.js</strong>.</p>
</li>
<li><p>Don’t wait too long to start building projects and joining hackathons. EthGlobal hackathons are amazing if you can attend one in person, but there are plenty of online hackathons too.</p>
</li>
<li><p>Two great Layer 2 solutions to focus on and learn are <strong>Arbitrum</strong> and <strong>Base</strong>.</p>
</li>
</ol>
<p>And most importantly, take it one step at a time. This is a multi-year journey, and as the saying goes: <em>"The path to mastering the craft is long, and life is short."</em> But we must strive to be the best at what we’re passionate about. Let’s keep exploring the frontier!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo convertirse en un top blockchain developer]]></title><description><![CDATA[Hace un par de años leí un buen artículo de Patrick Collins sobre el camino para convertirse en un desarrollador blockchain. El artículo era más sencillo y creo que ahora está detrás de un paywall, así que ayer, mientras hablaba con chatGPT le pregun...]]></description><link>https://defideveloper.xyz/como-convertirse-en-un-top-blockchain-developer</link><guid isPermaLink="true">https://defideveloper.xyz/como-convertirse-en-un-top-blockchain-developer</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Mon, 25 Nov 2024 19:34:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732561427244/2bbca3b3-0157-4a87-a63f-cbd8eeac0f30.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hace un par de años leí un buen artículo de Patrick Collins sobre el camino para convertirse en un desarrollador blockchain. El artículo era más sencillo y creo que ahora está detrás de un paywall, así que ayer, mientras hablaba con chatGPT le pregunté cual creía que era el mejor camino para convertirse en un top blockchain developer. Su respuesta me gustó mucho así que la comparto aquí con unas cuanta ediciones y recursos al final para que comiences tu carrera hacia ser un gran blockchain developer.</p>
<h2 id="heading-1-domina-los-fundamentos">1. Domina los Fundamentos 🔗</h2>
<p>Antes de adentrarte en temas avanzados, construye una base sólida:</p>
<ul>
<li><p><strong>Conceptos Básicos de Blockchain:</strong></p>
<ul>
<li><p>Aprende cómo funcionan las blockchains (mecanismos de consenso, criptografía, contratos inteligentes, descentralización).</p>
</li>
<li><p>Estudia la historia y principios de Bitcoin y Ethereum.</p>
</li>
</ul>
</li>
<li><p><strong>Habilidades de Programación Esenciales:</strong></p>
<ul>
<li><p>Domina <strong>JavaScript/TypeScript</strong> para desarrollo web.</p>
</li>
<li><p>Aprende <strong>Solidity</strong>, el lenguaje principal para contratos inteligentes en Ethereum.</p>
</li>
<li><p>Explora otros lenguajes como <strong>Rust</strong> (para Solana) o <strong>Go</strong></p>
</li>
</ul>
</li>
<li><p><strong>Herramientas y Frameworks Clave:</strong></p>
<ul>
<li>Familiarízate con <strong>Foundry</strong>, <strong>Hardhat</strong> y <strong>Remix</strong> para el desarrollo en Ethereum.</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-2-especializate-en-areas-clave-de-blockchain">2. Especialízate en Áreas Clave de Blockchain 🔍</h2>
<p>Ser generalista es útil, pero convertirte en un experto en un área específica puede diferenciarte.</p>
<h4 id="heading-opciones-de-especializacion"><strong>Opciones de Especialización:</strong></h4>
<ul>
<li><p><strong>Desarrollo de Contratos Inteligentes:</strong></p>
<ul>
<li><p>Aprende temas avanzados de Solidity (optimización de gas, seguridad, protocolos DeFi).</p>
</li>
<li><p>Domina los estándares ERC (ERC-20, ERC-721, ERC-1155).</p>
</li>
<li><p>Construye y audita contratos inteligentes.</p>
</li>
</ul>
</li>
<li><p><strong>DeFi y Protocolos Financieros:</strong></p>
<ul>
<li><p>Estudia AMMs (ej. Uniswap), protocolos de préstamos (ej. Aave) y derivados.</p>
</li>
<li><p>Aprende sobre tokenomics y stablecoins.</p>
</li>
<li><p>Experimenta con flashloans y arbitraje en la blockchain.</p>
</li>
</ul>
</li>
<li><p><strong>Soluciones de Capa 2:</strong></p>
<ul>
<li><p>Investiga rollups optimistas (ej. Arbitrum) y zkRollups (ej. zkSync, StarkNet).</p>
</li>
<li><p>Aprende a desplegar contratos en cadenas de Capa 2.</p>
</li>
</ul>
</li>
<li><p><strong>NFTs y Gaming:</strong></p>
<ul>
<li><p>Explora los estándares ERC-721 y ERC-1155.</p>
</li>
<li><p>Construye marketplaces, plataformas de minteo de NFTs o juegos play-to-earn.</p>
</li>
</ul>
</li>
<li><p><strong>Infraestructura Blockchain:</strong></p>
<ul>
<li><p>Aprende sobre nodos, validadores y mecanismos de consenso.</p>
</li>
<li><p>Contribuye al desarrollo de protocolos base o crea blockchains personalizadas con <strong>Substrate</strong> o <strong>Cosmos SDK</strong>.</p>
</li>
</ul>
</li>
<li><p><strong>Privacidad y Pruebas de Conocimiento Cero:</strong></p>
<ul>
<li><p>Estudia zk-SNARKs, zk-STARKs y sus aplicaciones.</p>
</li>
<li><p>Experimenta con lenguajes como Circom para programar pruebas de conocimiento cero.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-3-construye-proyectos-y-gana-experiencia-practica">3. Construye Proyectos y Gana Experiencia Práctica 👷</h2>
<p>La experiencia práctica es esencial.</p>
<ul>
<li><p><strong>Comienza con Proyectos Sencillos:</strong></p>
<ul>
<li><p>Construye aplicaciones descentralizadas simples (dApps) como wallets de tokens o plataformas de crowdfunding.</p>
</li>
<li><p>Aumenta la complejidad creando proyectos DeFi o NFTs.</p>
</li>
</ul>
</li>
<li><p><strong>Contribuciones Open Source:</strong></p>
<ul>
<li><p>Contribuye a proyectos blockchain populares (ej. Ethereum, Uniswap, OpenZeppelin).</p>
</li>
<li><p>Participa en las comunidades resolviendo problemas y añadiendo funcionalidades.</p>
</li>
</ul>
</li>
<li><p><strong>Participa en Hackathones:</strong></p>
<ul>
<li>Únete a hackathones blockchain (ej. EthGlobal, Encode Club) para desarrollar proyectos reales y hacer networking.</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-4-profundiza-en-el-conocimiento-teorico">4. Profundiza en el Conocimiento Teórico 📚</h2>
<p>Para ser verdaderamente destacado, comprende la tecnología subyacente:</p>
<ul>
<li><p><strong>Criptografía:</strong></p>
<ul>
<li>Estudia criptografía de curvas elípticas, algoritmos de hash y firmas digitales.</li>
</ul>
</li>
<li><p><strong>Sistemas Distribuidos:</strong></p>
<ul>
<li><p>Aprende sobre algoritmos de consenso (ej. Proof of Work, Proof of Stake, PBFT).</p>
</li>
<li><p>Comprende los desafíos de escalabilidad, latencia y tolerancia a fallos.</p>
</li>
</ul>
</li>
<li><p><strong>Tokenomics:</strong></p>
<ul>
<li><p>Sumérgete en la teoría de juegos y mecanismos de incentivos.</p>
</li>
<li><p>Analiza modelos de tokens exitosos y experimenta creando los tuyos.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-5-mantente-actualizado-con-las-tendencias">5. Mantente Actualizado con las Tendencias📈</h2>
<p>El mundo blockchain evoluciona rápidamente. Mantente al día:</p>
<ul>
<li><p><strong>Lee Whitepapers:</strong></p>
<ul>
<li>Analiza los whitepapers de protocolos clave (ej. Ethereum, Solana).</li>
</ul>
</li>
<li><p><strong>Sigue a Líderes de Opinión:</strong></p>
<ul>
<li>Sigue a Vitalik Buterin, Balaji Srinivasan y otros pioneros en Twitter.</li>
</ul>
</li>
<li><p><strong>Involúcrate en la Comunidad:</strong></p>
<ul>
<li><p>Únete a foros, grupos de Discord y DAOs relacionados con blockchain.</p>
</li>
<li><p>Asiste a conferencias como Devcon o ETHDenver.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-6-construye-tu-marca-personal">6. Construye tu Marca Personal 👨‍🎤</h2>
<p>Ser reconocido como una autoridad en el espacio abrirá muchas puertas:</p>
<ul>
<li><p><strong>Comparte Conocimiento:</strong></p>
<ul>
<li><p>Escribe blogs, crea tutoriales en YouTube o publica guías.</p>
</li>
<li><p>Enseña a otros a través de talleres o bootcamps.</p>
</li>
</ul>
</li>
<li><p><strong>Crea un Portafolio:</strong></p>
<ul>
<li><p>Muestra tus proyectos en GitHub con READMEs detallados.</p>
</li>
<li><p>Construye un sitio web personal para exhibir tu experiencia en blockchain.</p>
</li>
</ul>
</li>
<li><p><strong>Haz Networking Activo:</strong></p>
<ul>
<li><p>Colabora con otros desarrolladores y únete a comunidades blockchain.</p>
</li>
<li><p>Busca mentores entre ingenieros blockchain experimentados.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="heading-7-desarrolla-una-vision-a-largo-plazo">7. Desarrolla una Visión a Largo Plazo 🛣️</h2>
<p>Piensa más allá del código:</p>
<ul>
<li><p><strong>Innova:</strong></p>
<ul>
<li>Identifica brechas en el ecosistema blockchain y construye soluciones para abordarlas.</li>
</ul>
</li>
<li><p><strong>Liderazgo:</strong></p>
<ul>
<li><p>Lanza tu propio proyecto blockchain.</p>
</li>
<li><p>Mentorea a desarrolladores junior y contribuye al crecimiento del ecosistema blockchain.</p>
</li>
</ul>
</li>
<li><p><strong>Aprendizaje Continuo:</strong></p>
<ul>
<li>La tecnología blockchain evoluciona rápido. Mantente curioso y comprometido a aprender nuevas herramientas, frameworks y protocolos.</li>
</ul>
</li>
</ul>
<h2 id="heading-recursos">Recursos</h2>
<p>- <a target="_blank" href="https://www.cyfrin.io/updraft">Cyfrin Updraft</a>: Recomendaría empezar con esta plataforma que contiene todo lo que necesitas para empezar.<br />- <a target="_blank" href="https://www.rareskills.io/learn-solidity">RareSkills Solidity Course</a>: Esta es una colección gratuita de artículos desde cosas básicas hasta estudios a profundidad sobre temas muy avanzados.<br />- <a target="_blank" href="https://solidity-by-example.org/">Solidity by Example</a>: Bueno para reforzar tu conocimiento teórico del lenguaje.<br />- <a target="_blank" href="https://soliditylang.org/">Solidity Docs</a>: No hay nada que reemplace leer la documentación y consultarla siempre como referencia.</p>
<p>Por último, algunos consejos que me han dado personas que ya pasaron este camino:</p>
<ul>
<li><p>Empieza a aprender lo básico con Remix.</p>
</li>
<li><p>Si tienes qué elegir entre Hardhat o Foundry, elije Foundry.</p>
</li>
<li><p>Si tienes qué usar Hardhat, elije viem sobre Ethers.js o Web3.js.</p>
</li>
<li><p>No tardes mucho en empezar a crear proyectos y unirte a hackathones, los de EthGlobal son geniales si puedes ir a uno en persona, pero si no, hay muchísimos hackathones online.</p>
</li>
<li><p>Dos L2s buenas para enfocarse y aprender son Arbitrum y Base.</p>
</li>
</ul>
<p>Y finalmente, tómalo con calma, es un plan a varios años, <em>‘el camino de dominar el oficio es largo y la vida es breve’</em> pero debemos intentar ser las y los mejores en lo que nos apasiona. Sigamos explorando la frontera!</p>
]]></content:encoded></item><item><title><![CDATA[Una suave introducción a Arbitrum]]></title><description><![CDATA[Vamos a empezar a adentrarnos en el mundo de Arbitrum desde la pregunta más sencilla ¿Qué es Arbitrum? Lo primero interesante es que Arbitrum es una suite de tecnologías, no es una sola cosa, así que poco a poco vamos a entender la diferencia entre A...]]></description><link>https://defideveloper.xyz/una-suave-introduccion-a-arbitrum</link><guid isPermaLink="true">https://defideveloper.xyz/una-suave-introduccion-a-arbitrum</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Sun, 24 Nov 2024 05:20:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732425560828/60a01952-7b92-4743-8ee9-f2edf89fde6a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vamos a empezar a adentrarnos en el mundo de Arbitrum desde la pregunta más sencilla ¿Qué es Arbitrum? Lo primero interesante es que Arbitrum es una <em>suite de tecnologías</em>, no es una sola cosa, así que poco a poco vamos a entender la diferencia entre Arbitrum Nitro, Nova, One, Anytrust, Stylus y todos estos términos. Al final de esta aventura vamos a ser un@s cracks de Arbitrum, pero empecemos por lo básico.</p>
<p>Arbitrum entonces es una <strong>suite de tecnologías</strong> <strong>creadas para escalar Ethereum</strong>.</p>
<p>Como sabes, Ethereum es una gran tecnología pero tiene un problema muy grande: Solo puede procesar de 20 a 40 transacciones por segundo (TPS), lo cual no es suficiente para los miles de usuarios diarios que tiene, y menos si queremos que cientos de millones de personas la usen.</p>
<p>Aquí es donde entra el <em>blockchain trilema</em>, y las <em>Layer 2</em>, que son cadenas creadas para trabajar encima de una blockchain principal y hacerla más rápida, segura y/o eficiente (hacerla más escalable). Si quieres más información a detalle, te recomiendo leer <a target="_blank" href="https://ethereum.org/en/layer-2/">este artículo</a>.  </p>
<p>Como ya sabes entonces, los rollups son una de las principales tecnologías L2, y hay 2 tipos de rollups: <em>Optimistic</em> y <em>Zero-knowledge</em>.</p>
<p>Ahora, vamos a entender las diferencias entre Arbitrum One, Arbitrum Nova, Nitro y otros términos.</p>
<p>Seguramente sabes que para que Ethereum funcione, la gente necesita correr nodos, y para correr estos nodos utilizan un software especial, conocido como un <em>cliente</em>. Uno de los más conocidos en Ethereum se llama <a target="_blank" href="https://geth.ethereum.org/"><em>Geth</em></a>. De manera similar, para correr un nodo en Arbitrum se necesita un software especial llamado <em>Nitro</em>, que a su vez, está basado en <em>Geth</em>.</p>
<p>Después tenemos que Arbitrum tiene dos protocolos innovadores para diferentes necesidades de quienes construyen aplicaciones descentralizadas (<em>dapps</em>), el <a target="_blank" href="https://arbitrum.io/rollup">Arbitrum Rollup</a> Protocol y el <a target="_blank" href="https://arbitrum.io/anytrust">Arbitrum AnyTrust</a> Protocol.</p>
<p>El producto principal de Arbitrum se llama <em>Arbitrum Rollup,</em> es un optimistic rollup y más adelante vamos a ver todos los detalles sobre su funcionamiento. Por ahora, basta con saber que la arquitectura de Arbitrum Rollup lo hace una L2 sumamente segura e ideal para casos de uso como DeFi.</p>
<p>Por otro lado, algunas aplicaciones tienen otros casos de uso que requieren manejar muchas transacciones y pueden permitirse algunas concesiones de seguridad para ahorrar costos. Para estas aplicaciones, como juegos o redes sociales, existe <strong>Arbitrum AnyTrust</strong>, la cual también exploraremos a fondo en artículos posteriores.</p>
<p>Un ejemplo de implementación del Arbitrum Rollup Protocol es la cadena <strong>Arbitrum One</strong>, que es el producto bandera de Arbitrum. Y un ejemplo de implementación del protocolo AnyTrust es la cadena <strong>Arbitrum Nova</strong>.</p>
<p>Por si esto no fuera suficiente, cualquier developer puede lanzar su propia cadena L3 encima de Nova o de One, y para esto utilizarían <a target="_blank" href="https://docs.arbitrum.io/launch-orbit-chain/orbit-gentle-introduction">Arbitrum Orbit</a>.</p>
<p>Finalmente, una de las soluciones más esperadas por la comunidad se llama <a target="_blank" href="https://arbitrum.io/stylus">Stylus</a>, una herramienta que le permite a cualquier desarrollador/a escribir contratos inteligentes en cualquier lenguaje que compile a WebAssembly como por ejemplo, C, C++ y por supuesto Rust! ¿Muy cool, no? Personalmente, no puedo esperar a adentrarme más en estas tecnologías.</p>
<h3 id="heading-conclusion">Conclusión</h3>
<p>Espero que esta pequeña introducción te haya servido para entender mejor las diferencias entre Arbitrum One, Arbitrum Nova, Stylus y más soluciones de la suite de tecnología de Arbitrum. Si algo no te quedó muy claro <a target="_blank" href="https://x.com/garosan1">mándame un mensaje</a> en X y te puedo ayudar a aclararlo, mientras tanto ¡sigamos explorando y construyendo en Arbitrum!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo Instalar Foundry para Mac y Windows]]></title><description><![CDATA[Cómo Instalar Foundry para Mac y Windows
Foundry es un conjunto de herramientas avanzadas para el desarrollo de contratos inteligentes y aplicaciones descentralizadas en Ethereum. En esta guía, te mostramos cómo instalar Foundry en Mac y en Windows. ...]]></description><link>https://defideveloper.xyz/como-instalar-foundry-para-mac-y-windows</link><guid isPermaLink="true">https://defideveloper.xyz/como-instalar-foundry-para-mac-y-windows</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Tue, 15 Oct 2024 23:57:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1729035607812/c8e73923-ab24-4c19-8ed0-a7251f215cf4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h1 id="heading-como-instalar-foundry-para-mac-y-windows">Cómo Instalar Foundry para Mac y Windows</h1>
<p>Foundry es un conjunto de herramientas avanzadas para el desarrollo de contratos inteligentes y aplicaciones descentralizadas en Ethereum. En esta guía, te mostramos cómo instalar Foundry en Mac y en Windows. Para Windows, es necesario configurar el Subsistema de Windows para Linux (WSL) antes de la instalación. Este sistema nos permitirá tener un entorno de Linux de manera casi instantánea y la instalación de Foundry será mucho más sencilla.</p>
<h2 id="heading-instalacion-en-mac">Instalación en Mac</h2>
<h3 id="heading-1-instalar-homebrew-si-no-lo-tienes-instalado">1. Instalar Homebrew (si no lo tienes instalado)</h3>
<p>Homebrew es un gestor de paquetes para macOS que facilita la instalación de software. Para instalarlo, abre la terminal y ejecuta el siguiente comando:</p>
<pre><code class="lang-bash">/bin/bash -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)</span>"</span>
</code></pre>
<h3 id="heading-2-instalar-las-dependencias-de-foundry">2. Instalar las dependencias de Foundry</h3>
<p>Ejecuta el siguiente comando para instalar las herramientas necesarias, como <code>curl</code> y <code>git</code>:</p>
<pre><code class="lang-bash">brew install curl git
</code></pre>
<h3 id="heading-3-instalar-foundry">3. Instalar Foundry</h3>
<p>Para instalar Foundry, ejecuta el siguiente comando en la terminal:</p>
<pre><code class="lang-bash">curl -L https://foundry.paradigm.xyz | bash
</code></pre>
<p>Este comando descarga y ejecuta el script de instalación de Foundry. El script configurará la herramienta por ti.</p>
<h3 id="heading-4-configurar-foundry">4. Configurar Foundry</h3>
<p>Después de instalar Foundry, debes ejecutar el siguiente comando para inicializar las herramientas de Foundry:</p>
<pre><code class="lang-bash">foundryup
</code></pre>
<p>Este comando descargará e instalará las últimas versiones de Foundry, Forge y Cast.</p>
<h3 id="heading-5-verificar-la-instalacion">5. Verificar la instalación</h3>
<p>Para asegurarte de que Foundry esté instalado correctamente, ejecuta el siguiente comando:</p>
<pre><code class="lang-bash">forge --version
</code></pre>
<p>Si ves la versión de Foundry en la terminal, la instalación fue exitosa.</p>
<hr />
<h2 id="heading-instalacion-en-windows">Instalación en Windows</h2>
<h3 id="heading-1-instalar-el-subsistema-de-windows-para-linux-wsl">1. Instalar el Subsistema de Windows para Linux (WSL)</h3>
<p>Para usar Foundry en Windows, primero debes instalar WSL, lo que te permitirá usar un entorno de Linux dentro de Windows.</p>
<h4 id="heading-11-habilitar-wsl">1.1 Habilitar WSL</h4>
<p>Abre una terminal de PowerShell como administrador y ejecuta el siguiente comando:</p>
<pre><code class="lang-bash">wsl --install
</code></pre>
<p>Este comando instalará WSL 2 junto con Ubuntu como la distribución predeterminada. Si ya tienes WSL instalado, puedes actualizar a WSL 2 con el siguiente comando:</p>
<pre><code class="lang-bash">wsl --set-default-version 2
</code></pre>
<h4 id="heading-12-reiniciar-el-sistema">1.2 Reiniciar el sistema</h4>
<p>Una vez que WSL esté instalado, se te pedirá que reinicies tu computadora.</p>
<h4 id="heading-13-configurar-wsl">1.3 Configurar WSL</h4>
<p>Después de reiniciar, abre PowerShell nuevamente y ejecuta el siguiente comando para asegurarte de que Ubuntu sea tu distribución predeterminada:</p>
<pre><code class="lang-bash">wsl --set-default ubuntu
</code></pre>
<h3 id="heading-2-instalar-las-dependencias-en-wsl">2. Instalar las dependencias en WSL</h3>
<p>Abre la terminal de Ubuntu dentro de WSL e instala las dependencias necesarias para Foundry, como <code>curl</code> y <code>git</code>:</p>
<pre><code class="lang-bash">sudo apt update
sudo apt install curl git build-essential
</code></pre>
<h3 id="heading-3-instalar-foundry-1">3. Instalar Foundry</h3>
<p>Dentro de la terminal de Ubuntu, ejecuta el siguiente comando para instalar Foundry:</p>
<pre><code class="lang-bash">curl -L https://foundry.paradigm.xyz | bash
</code></pre>
<h3 id="heading-4-configurar-foundry-1">4. Configurar Foundry</h3>
<p>Después de la instalación, ejecuta el siguiente comando para configurar Foundry y sus herramientas:</p>
<pre><code class="lang-bash">foundryup
</code></pre>
<h3 id="heading-5-verificar-la-instalacion-1">5. Verificar la instalación</h3>
<p>Por último, verifica que Foundry esté instalado correctamente con el siguiente comando:</p>
<pre><code class="lang-bash">forge --version
</code></pre>
<p>Si todo salió bien, verás la versión de Forge en la terminal.</p>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Ya sea en macOS o Windows, con estos pasos podrás tener Foundry instalado y listo para usar. Esto nos permitirá usar las mismas librerías y software que utilizan los profesionales para desarrollar dapps a la vez que podremos trabajar en los ejercicios de <a target="_blank" href="https://www.rareskills.io/learn-solidity">la guía que estaremos siguiendo</a> y podremos verificar si los ejercicios están bien hechos. Para Windows, recuerda que primero debes configurar WSL para trabajar en un entorno Linux. Ahora puedes comenzar a desarrollar tus proyectos de contratos inteligentes con Foundry.</p>
]]></content:encoded></item><item><title><![CDATA[Hello Solidity!]]></title><description><![CDATA[No se puede empezar a aprender algo en programación sin hacer un Hello, world!  
Para aprender lo básico de Solidity hay una sola herramienta que nos permitirá hacer todo en línea sin preocuparnos de nada más. Esta herramienta se llama Remix:
remix.e...]]></description><link>https://defideveloper.xyz/hello-solidity</link><guid isPermaLink="true">https://defideveloper.xyz/hello-solidity</guid><dc:creator><![CDATA[DeFi Dev]]></dc:creator><pubDate>Wed, 09 Oct 2024 05:46:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1728452878110/c0ba04c6-c583-4cc2-848f-a0672e48a4b5.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>No se puede empezar a aprender algo en programación sin hacer un Hello, world!  </p>
<p>Para aprender lo básico de Solidity hay una sola herramienta que nos permitirá hacer todo en línea sin preocuparnos de nada más. Esta herramienta se llama Remix:</p>
<p><a target="_blank" href="http://remix.ethereum.org"><strong>remix.ethereum.org</strong></a>  </p>
<p>Asegúrate siempre de estar en esa URL y no en otra que esté tratando de hacerse pasar por Remix.  </p>
<p>Este será nuestro primer contrato inteligente:</p>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">HelloWorldContract</span> </span>{

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">helloWorld</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
            <span class="hljs-keyword">return</span> <span class="hljs-number">100</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">returnBool</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
            <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
    }
}
</code></pre>
<p>Adentro de Remix, haz click derecho en <code>contracts</code> y luego en <em>New File.</em> Todos los archivos de Solidity deben tener la extensión <code>.sol</code>, así que llamemos este archivo <code>HelloWorld.sol</code>. Ahora copia y pega el código de arriba, o trata de escribirlo tú mismo.  </p>
<p>El siguiente paso es compilar el código para lo cual solo tenemos qué hacer <code>CTRL + S</code>.</p>
<p>Ahora, hay qué dar click en el símbolo de Ethereum en el menú de la izquierda, y click en el botón naranja que dice <em>Deploy</em>.</p>
<p>Si hiciste todo bien, en la parte de abajo, justo debajo de donde dice <em>Deployed/Unpinned Contracts</em> encontrarás tu contrato desplegado en una blockchain virtual, y podrás interactuar con él.  </p>
<p>Verás un botón azul que dice <em>helloWorld</em> y otro que dice <em>returnBool</em>. Haz click en ellos y ve lo que resulta de darles click. Ahora haz hecho tu primer smart contract en Remix!</p>
<p><img src="https://www.rareskills.io/wp-content/uploads/2024/09/c0c19a_4776ae8f1f634e8ebb309e62ef0d8ebb~mv2.png" alt="Foto tomada de artículo de RareSkills" /></p>
<p><a target="_blank" href="https://remix.ethereum.org/">Fuente: Artículo</a> <a target="_blank" href="https://www.rareskills.io/learn-solidity/remix-solidity">de Rare Skills</a></p>
]]></content:encoded></item></channel></rss>