WEB3DEV Español

Cover image for Cómo publicar un contrato inteligente en la testnet de Ethereum
Hector
Hector

Posted on

Cómo publicar un contrato inteligente en la testnet de Ethereum

Este artículo es una traducción de Dimitri Rusin, hecha por Héctor Botero. Puedes encontrar el artículo original aquí.
Sería genial escucharte en nuestro Discord, puedes contarnos tus ideas, comentarios, sugerencias y dejarnos saber lo que necesitas.
Si prefieres puedes escribirnos a @web3dev_eshttps://twitter.com/web3dev_es en Twitter.

¡Contratos inteligentes! Supuestamente, son las nuevas aplicaciones web. Muy bien, hagamos una.

Básicamente, un contrato inteligente es una aplicación web que no está alojada en un servidor controlado por cierta compañía como DigitalOcean o Google Cloud. En su lugar, esta aplicación web está alojada en todos los nodos de Ethereum a la vez, mientras que las compañías que las controlan son muchas. Pero las compañías se revisan entre sí para asegurarse que cada compañía tiene la aplicación web original en vez de una versión de ella.

De esta forma, podemos publicar una aplicación web que seguramente no será modificada por el publicador, como un editor de libros que vaya a revisar el texto de un libro de un autor. Además, la aplicación web, una vez publicada, no puede ser no publicada. Cada compañía se asegura que cada otra compañía aún aloje esa aplicación web sin modificar.

¡Basta de hablar! ¿Cómo podemos crear un contrato inteligente para Ethereum y publicarlo?

(Una pequeña nota: todos los códigos de a continuación, técnicamente, no tienen las garantías enumeradas anteriormente porque la red de Ethereum que usamos es sólo para propósitos de prueba. En el Ethereum real, necesitarías pagar dinero real [desde el 06/05/2023: un pago único alrededor de 2,000$USD de acuerdo con este tipo] para que el contrato inteligente se mantenga vivo, sin modificar, para siempre.)

Creando y Publicando un contrato inteligente en Ethereum

Publicaremos un contrato inteligente en la testnet ETH llamado Sepolia. El contrato inteligente solo almacenará un mensaje y una dirección con el siguiente: Solo el dueño de la cartera, de la dirección almacenada, puede alterar el mensaje. Todos pueden leer el mensaje. Es eso.

Para crear nuestro contrato inteligente, ejecuta el siguiente script:

mkdir hardhat-contract
cd hardhat-contract

npm install \
   hardhat \
   dotenv \
   @nomiclabs/hardhat-ethers \
   @nomiclabs/hardhat-etherscan

npx hardhat
Enter fullscreen mode Exit fullscreen mode

El HardHat CLI te pedirá una serie de preguntas para configurar el proyecto. Selecciona Create an empty hardhat.config.js para crear un archivo de configuración vacío.

Para publicar nuestro contrato inteligente, necesitaremos, como mencionamos, usar la testnet ETH llamada Sepolia. Para eso, vamos a editar el camino: hardhat-contract/hardhat.config.js:

require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-etherscan");
require("dotenv").config();

const INFURA_API_KEY = process.env.INFURA_API_KEY;
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY;
const SEPOLIA_PRIVATE_KEY = process.env.SEPOLIA_PRIVATE_KEY;

module.exports = {
 solidity: "0.8.18",
 networks: {
   sepolia: {
     url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`,
     accounts: [SEPOLIA_PRIVATE_KEY]
   }
 },
 etherscan: {
   apiKey: ETHERSCAN_API_KEY,
 },
};
Enter fullscreen mode Exit fullscreen mode

Además, crea un nuevo archivo .env en el mismo directorio y escribe:

ETHERSCAN_API_KEY=XXX
INFURA_API_KEY=YYY
SEPOLIA_PRIVATE_KEY=ZZZ
Enter fullscreen mode Exit fullscreen mode

Encontrarás tu clave Etherscan, una vez que crees tu cuenta gratuita aquí. O de Infura, aquí. Y la clave de tu cartera, la cual es la clave privada de Sepolia, la retirarás en Metamask si vas a Account Details -> Export private key.

Si usas un administrador de carteras de cripto monedas que sea distinta a MetaMask, puedes preguntarle a ChatGPT cómo tener la clave privada de tu cartera. La clave privada, en el transcurso de este tutorial, estará siempre, técnicamente, bajo tu control, pero si mantienes mainnet ETH en el mismo, es recomendable no exportar su clave privada en tu disco duro. En MetaMask puedes crear, fácilmente, una nueva cartera con Create account y llenar los datos con el testnet ETH a través de esta página.

Ahora, definiremos un mensajero como la dirección del testnet, el cual, puede publicar un mensaje irrevocable como una cadena.

Por eso, crearemos un nuevo camino: contracts/UndeletableMessage.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

contract UndeletableMessage {
 string public message;
 address public messenger;

 constructor(string memory _message, address _messenger) {
   message = _message;
   messenger = _messenger;
 }

 modifier onlyMessenger() {
   require(msg.sender == messenger, "Only the messenger can call this function");
   _;
 }

 function setMessage(string memory newMessage) external onlyMessenger {
   message = newMessage;
 }
}
Enter fullscreen mode Exit fullscreen mode

Luego, desplegaremos este contrato en la testnet Ethereum bajo el camino scripts/deploy-contract.js

const hre = require("hardhat");

function sleep(ms) {
 return new Promise((resolve) => setTimeout(resolve, ms));
}

async function main() {
 const initialMessage = "Your initial important message";
 const [deployer] = await ethers.getSigners();
 const ownerAddress = deployer.address;

 const Token = await ethers.getContractFactory("UndeletableMessage");
 const token = await Token.deploy(initialMessage, ownerAddress);
 await token.deployed();
 console.log(`UndeletableMessage deployed to: https://sepolia.etherscan.io/address/${token.address}`);

 console.log("Waiting 30 seconds before verifying the contract...");
 await sleep(30 * 1000);

 console.log("Verifying contract on Etherscan...");
 await hre.run("verify:verify", {
   address: token.address,
   constructorArguments: [initialMessage, ownerAddress],
   network: "goerli",
 });
 console.log("Contract verified on Etherscan");
}

main()
 .then(() => process.exit(0))
 .catch((error) => {
   console.error(error);
   process.exit(1);
 });
Enter fullscreen mode Exit fullscreen mode

Ahora, compilaremos el contrato inteligente y ejecutaremos el script que referencia al contrato inteligente:

npx hardhat compile
npx hardhat run --network sepolia scripts/deploy-contract.js
Enter fullscreen mode Exit fullscreen mode

Es posible que obtengas el siguiente output:

Compiled 1 Solidity file successfully
UndeletableMessage deployed to: https://sepolia.etherscan.io/address/0x3cCe57Ef683ED3631B6EEA15312D35e38B4627b6
Waiting 30 seconds before verifying the contract...
Verifying contract on Etherscan...
Nothing to compile
Successfully submitted source code for contract
contracts/UndeletableMessage.sol:UndeletableMessage at 0x3cCe57Ef683ED3631B6EEA15312D35e38B4627b6
for verification on the block explorer. Waiting for verification result...

Successfully verified contract UndeletableMessage on Etherscan.
https://sepolia.etherscan.io/address/0x3cCe57Ef683ED3631B6EEA15312D35e38B4627b6#code
Contract verified on Etherscan
Enter fullscreen mode Exit fullscreen mode

¿El contrato inteligente ha sido desplegado? ¿Cómo podemos leer ese mensaje público? ¿Cómo podemos cambiar el mensaje público?

Si vas a ese link de Sepolia, llegarás a la página de contrato:

Image description

Desde aquí, puedes ir a la pestaña Contract y darle click a Read Contract

Image description

Como puedes ver, el mensaje por defecto es Your initial important message que fue especificado en el script deploy-contract.js.

Ve a Write Contract. Haz click en Connect to Web3 e inicia sesión con la cartera de la cual su llave privada está en el archivo .env. Ahora puedes enviar una transacción al testnet para que transmita un mensaje diferente:

Image description

Ahora, puedes revisar que la transacción pasó. En otras palabras: puedes revisar que has modificado el estado de este contrato:

Image description

Pero, ¿qué sucedería si te conectas a la Web3 usando otra cartera? Intenta crear una nueva cartera, coloca algún testnet usando este link en el mismo y, luego intenta escribir en el contrato de nuevo:

Image description

Si rastreas la misma transacción, se verá similar a esta:

Image description

Puedes ver el error Only the messenger can call this function que escribimos arriba en el modificador de nuestro contrato.
Aquí están todos los códigos de este artículo: Get code. Sólo tienes que clonar el repositorio y crear y llenar tu propio archivo .env. Luego ejecuta ./RUN. El repositorio también contiene un Dockerfile e instrucciones en cómo usarlo para ejecutar todo el código del que hablamos en un sistema operativo aislado.

Contratos inteligentes: ¿es éste el futuro?

Así que, ¿qué hemos hecho? Hemos publicado algún texto que, nunca será bajado del Internet (si hemos pagado 2.000$USD y haberlo hecho realmente en el mainnet en vez del testnet).

Esto no es realmente un logro obvio, ya que muchas páginas se caen con el tiempo y, todos los videos de YouTube, que no has descargado, puede que se pierdan algún día.

Pero, ya que la gente gana dinero haciendo validación de datos en Ethereum, este texto “I AM WHO I AM” (si lo hemos publicado en el mainnet) será, para siempre, accesible.

De esta forma, mientras que la humanidad use dinero, puedes pagar un contrato inteligente para preservar tu información.

Discussion (0)