⚠️ ¡Advertencia! El siguiente artículo es un resumen sobre Mastering Ethereum, en consecuencia, me tomé la libertad de quitar las partes que no me parecieron relevantes y profundizar en lo que sí. Si tenés alguna sugerencia o corrección, no dudes en contactarme.
Ethereum introducción a los smart-contracts
En el capítulo anterior, creamos una wallet con Metamask, solicitamos ether de prueba en un faucet y enviamos una transacción.
En este capítulo vamos a explorar un smart-contract simple, vamos a hacer el proceso de deploy en testnet e interactuar con él.
Los smart-contracts son programas de computadora que son ejecutados por la Ethereum Virtaul Machine
(EVM).
Diferencias entre las Extrenally Owned Accounts (EOAs) y las cuentas de contrato
La cuenta que creamos en el capítulo pasado se les denomina EOAs, son cuentas las cuales tienen una clave privada y, por lo tanto, tener el control de esa clave privada implica el acceso a los fondos y control de la cuenta. En el caso de las cuentas de contrato, estas tienen algunas diferencias concretas cuando las comparamos con las EOAs.
La primera diferencia es que la cuenta de contrato no cuenta con una clave privada, la segunda es que la cuenta de contrato contiene el código del smart-contract, el control de esta cuenta y cómo funciona su lógica se encuentra especificado en el código.
Otro punto a tomar en cuenta es que cuando el destino de una transacción es una dirección de contrato, provoca que ese contrato se ejecute utilizando la transacción y los datos de la transacción como su entrada. Pero esto ya lo vamos a ver en acción en el ejemplo de más adelante.
Además de ether, las transacciones pueden contener datos que indican qué función específica en el contrato se debe ejecutar y qué parámetros pasar a esa función (en el data
de la transacción). De esta manera, las transacciones pueden llamar funciones dentro de los contratos.
NOTA: Como una cuenta de contrato no tiene una clave privada, no puede iniciar una transacción. Solo las EOAs pueden iniciar transacciones, pero los contratos pueden reaccionar a las transacciones llamando a otros contrato.
Contrato: Faucet de ether
Vamos a generar el código de un contrato de faucet, el cual tiene una funcionalidad similar al que usamos el capítulo anterior, necesitamos que el contrato envíe determinada cantidad de ether a la cuenta que lo solicita, en este caso y para simplificar no vamos a poner ninguna condición para esto, cualquiera que llame a la función va a recibir los fondos, deseablemente se podría hacer una versión un poco más refinada la cual tenga algún tipo de mecanismo antispam.
El código sería el siguiente (ejemplo extraído del libro):
// SPDX-License-Identifier: CC-BY-SA-4.0
// Version of Solidity compiler this program was written for
pragma solidity ^0.6.4;
// Our first contract is a faucet!
contract Faucet {
// Accept any incoming amount
receive() external payable {}
// Give out ether to anyone who asks
function withdraw(uint withdraw_amount) public {
// Limit withdrawal amount
require(withdraw_amount <= 100000000000000000);
// Send the amount to the address that requested it
msg.sender.transfer(withdraw_amount);
}
}
Desglosando el contrato
1.pragma solidity ^0.6.4;: Esta línea especifica la versión del compilador de Solidity para el cual está escrito el contrato. En este caso, el contrato es compatible con versiones de Solidity iguales o superiores a 0.6.4.
2.contract Faucet {…}: Aquí se define el contrato Faucet, el cual representa un Objeto. Un contrato en Ethereum es un conjunto de código que se ejecuta en la blockchain cuando se invoca mediante una transacción.
3.receive() external payable {}: Esta función es un “punto de entrada” especial que se llama cuando el contrato recibe ether. Si no recibe ningún otro parámetro en la transacción esta es la función que va a ejecutar. Es external para permitir que se llame desde fuera del contrato, y payable para que pueda recibir ether.
4.function withdraw(uint withdraw_amount) public {…}: Esta función permite a cualquier persona retirar ether del contrato. Toma como argumento el monto a retirar (withdraw_amount) y utiliza la función transfer() para enviar ese monto de ether a la dirección del remitente (msg.sender), es decir, la persona que llama a esta función.
5.require(withdraw_amount <= 100000000000000000);: Antes de realizar el retiro, se realiza una verificación para asegurarse de que el monto a retirar no exceda un cierto límite. En este caso, el límite es 100000000000000000 (0.1 ether).
Ahora que hicimos un repaso rápido de qué hace el contrato, vamos a hacer el deploy de este en testnet, para eso vamos a usar una herramienta llamada remix el cual es un IDE para Ethereum.
Deploy del contrato
-
Primero vamos a crear un nuevo archivo, y vamos a pegar el código en este, lo vamos a nombrar
faucet.sol
. -
En segundo lugar, vamos a tener que cambiar la versión del compilador para que coincida con la del código, tenemos que ir a la pestaña de Solidity compiler y cambiarlo a la versión
0.6.4
. -
Con la versión correcta de compilador ahora tenemos que compilar el código, hacemos clic en compilar
facet.sol
-
Ahora que tenemos el contrato compilado vamos a registrarlo en la blockchain o hacer un deploy de este contrato, registrar un contrato en la blockchain involucra un tipo de transacción especial que se envía a la
Zero Addres
o0x0000000000000000000000000000000000000000
Llegó el momento de mandar esa transacción, vamos a ir a la pestaña de Deploy and run transactions, y una vez ahí queremos seleccionar la opción de injected providers - Metamask, esto va a conectar la plataforma de remix con nuestra wallet de metamask. -
Debemos poner el password para ingresar a metamask, y nos va a preguntar si queremos conectar la wallet con ese sitio, vean que muestra la URL al momento de verificar, siempre es bueno revisar que la URL es correcta y que nos estamos conectando al sitio que esperamos.
-
Hecha la conexión, hacemos clic en deploy, esto nos lleva nuevamente a Metamask, ya que tenemos que formar la transacción de deploy, firmamos la transacción y revisamos que todo es correcto.
-
Perfecto, si todo salió bien van a ver una confirmación en remix, si quieren pueden revisar el contrato en el etherscan.
-
Ahora vamos a probar interactuar con el contrato, primero tenemos que depositarle un poco de ether, para luego retirar la mitad con el método
withdraw
. Vamos a copiar la dirección del contrato y hacer la transacción, para hacer la transacción simplemente seguimos los pasos iguales al capítulo anterior, pero cambiamos la dirección. -
Yo en este caso voy a enviar al
faucet
0.05 EHT
-
Si vamos a etherscan vamos a ver cómo el balance del contrato aumento, recibiendo los ethers que le había enviado.
-
Ahora llegó el momento de interactuar con el contrato. Siempre que interactuemos con contratos tenemos que hacer la conversión de ehters a weis (que es la mínima unidad de representación en Ethereum). En nuestro caso queremos retirar
25000000000000000
weis. -
Una vez que hacemos clic en
withdraw
tenemos que firmar la transacción en metamask. -
Listo ahora podemos ver como la transacción fue exitosa. El balance del contrato se redujo a
0.25
y la transacción se confirma en la consola de remix. -
Por último vamos a verificar las transacciones en etherscan, podemos ver el historial de las transacciones, la primera transacción es la de deploy, la segunda es la transacción de fondeo, y la tercera es nuestra transacción de retiro, podemos ver como el balance de la cuenta de contrato bajó. Y si vamos a internal transactions vemos la transacción que hace el contrato para mandarnos los
0.25 ETH
. Entonces, para el caso de interactuar con el contrato, en realidad tenemos 2 transacciones, la primera que iniciamos nosotros llamando al métodowithdraw
y esta desencadena una transacción adicional del contrato hacia nosotros para enviarnos los fondos.
Felicitaciones, en este capítulo logramos hacer un deploy de un contrato en testnet y luego nos conectamos a ese contrato e interactuamos con él. Los veo en el próximo capítulo que vamos a estar profundizando en el concepto de clientes.
Referencias
- Antonopoulos, A. M., & Wood, G. (2018). “Mastering Ethereum: Building Smart Contracts and DApps.” O’Reilly Media.