Truffle es una herramienta nueva que nos ayuda a compilar y deployar smart contracts en el blockchain. En este blog escribiremos un "Hola mundo!" en Solidity para introducirnos al desarrollo de aplicaciones decentralizadas.
Antes de iniciar asegurate de instalar node (te recomiendo que lo instales via nvm) y creamos nuestra carpeta de proyecto e instalamos las dependencias.
Antes de iniciar creamos nuestra carpeta de proyecto e instalamos las dependencias.
mkdir MyHardhatProject
cd MyHardhatProject
npm install --save-dev hardhat
1. Compilar un contrato
Primero inicializamos HardHat. Usamos este comando y apretamos enter un par de veces para mantener los valores predeterminados.
npx hardhat
Ahora podemos borrar el contrato que viene por defecto Greeter.sol
y escribimos nuestro nuevo en la carpeta contracts/
.
contracts/MyContract.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
contract MyContract {
string public hello;
constructor()
{
hello = "Hola mundo!";
}
function setHello(string memory _hello) public {
hello = _hello;
}
}
Antes de compilar, necesitamos indicarle a HardHat que vamos a usar la versión 0.8.4
de solidity.
hardhat.config.js
[...]
module.exports = {
solidity: "0.8.4",
};
[...]
Ahora podemos compilar nuestro contrato.
npx hardhat compile
2. Deploy local
Levantamos un servidor de blockchain de prueba local.
npx hardhat node
Modificamos el script de deploy de ejemplo para ajustarlo a nuestro contrato.
scripts/sample_script.js
const hre = require("hardhat");
async function main() {
const MyContract = await hre.ethers.getContractFactory("MyContract");
const my_contract = await MyContract.deploy("Hello, Hardhat!");
await my_contract.deployed();
console.log("MyContract deployed to:", my_contract.address);
}
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
Ahora sí podemos deployar nuestro contrato en el blockchain local de HardHat.
npx hardhat run --network localhost scripts/sample-script.js
Interactuamos con el contracto mediante la consola de HardHat. Que imprimirá el address del contrato.
npx hardhat console --network localhost
Una vez dentro de la consola de HardHat podemos leer variables y ejecutar funciones. Asegurate de colocar el address de tu contrato que se mostró cuando hiciste deploy.
const MyContract = await ethers.getContractFactory("MyContract")
const my_contract = await MyContract.attach("0x5FbDB2315678afecb367f032d93F642f64180aa3")
await my_contract.hello()
await my_contract.setHello("Probando...")
await my_contract.hello()
3. Deploy en un testnet
Asegúrate de tener lo siguiente:
- Una wallet instalada, mi recomendación es metamask
- Fondos de Kovan testnet que puedes conseguir gratis en el faucet
- Una llave para Kovan en Infura
En nuestro archivo de configuración de HardHat agregamos la opción kovan
dentro de networks
como se indica a continuación. Asegurate de pegar tu infura Project ID en la variable infuraKey
.
hardhat.config.js
require("@nomiclabs/hardhat-waffle");
task("accounts", "Prints the list of accounts", async () => {
const accounts = await ethers.getSigners();
for (const account of accounts) {
console.log(account.address);
}
});
const infuraKey = "a3e70735b....";
const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();
module.exports = {
solidity: "0.8.4",
networks: {
kovan: {
url: `https://kovan.infura.io/v3/${infuraKey}`,
accounts: {mnemonic: mnemonic}
}
},
};
⚠️⚠️⚠️ Ahora copia tu mnemonic
o seed pharase
desde Metamask (Settings > Security & Privacy > Reveal Seed Phrase). Pero ten mucho cuidado y nunca mostrar esto a nadie porque esta es la llave privada de tus fondos.⚠️⚠️⚠️
⚠️⚠️⚠️Copia tu seed pharase
en un archivo vacío y llámalo .secret
. Agregalo a tu .gitignore
. ¡No olvides agregarlo a tu .gitignore!⚠️⚠️⚠️
De nuevo, recuerda agregar este archivo a tu .gitignore.
.gitignore
.secret
Ahora deployamos en Kovan e ingresamos en la consola, muy similar a como lo hicimos antes. Esto mostrará el address de tu contrato. Cópialo porque lo usaremos más adelante.
npx hardhat run --network kovan scripts/sample-script.js
npx hardhat console --network kovan
Podemos interactuar con el contrato de la misma manera que lo hicimos anteriormente. Asegurate de agregar el address de tu contrato cuando ejecutes la funcion attach
.
const MyContract = await ethers.getContractFactory("MyContract")
const my_contract = await MyContract.attach("0x5FbDB2315678....")
await my_contract.hello()
await my_contract.setHello("Probando...")
await my_contract.hello()
El siguiente paso será conectar esto con un frontend web pero será en otro post para no seguir alargando.
Gracias por ver este tutorial!
Sígueme en dev.to y en Youtube para todo lo relacionado al desarrollo en Blockchain en Español.
Top comments (2)
TypeError: no matching function (argument="key", value="deployed", code=INVALID_ARGUMENT, version=6.6.7)
at makeError (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:670:21)
at assert (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:694:25)
at assertArgument (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:706:5)
at Interface.getFunctionName (C:\prypc01\node_modules\ethers\src.ts\abi\interface.ts:542:23)
at buildWrappedMethod (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:342:34)
at BaseContract.getFunction (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:870:22)
at Object.get (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:768:39)
at main (C:\prypc01\scripts\sample.js:7:21)
at processTicksAndRejections (node:internal/process/task_queues:95:5) {
code: 'INVALID_ARGUMENT',
argument: 'key',
value: 'deployed'
}
Hello,
I'm getting this same error.
Have you been able to fix it?