dev-resources.site
for different kinds of informations.
Interactuar con contratos en Ethereum
En el blog anterior describ铆 como crear un token ERC20 de forma sencilla usando OpenZepellin. Este contrato nos brindaba la posibilidad de acu帽ar tokens (mint), quemar tokens (burnable) y pausar la transferencia de los tokens (pausable), sin embargo aun no mostr茅 como se puede llamar a las funciones del contrato con estas propiedades. Hoy aprenderemos a hacerlo.
Antes de empezar debemos entender la diferencia entre una call y una transacci贸n.
Call
Cuando hacemos una call ejecutamos c贸digo que la blockchain, pero esta ejecuci贸n no cambiara ning煤n dato en la blockchain. Por lo tanto las calls no cuestan ETH, es decir que el principal uso de las calls es para leer datos de la blockchain. En general las calls nos retornan un valor.
Transacci贸n
Por otro lado, las transacciones cambian el estado de la blockchain, es decir, escriben (o cambian) datos de la red. Por lo tanto; las transacciones tienen un costo de gas. En general las transacciones nos retornan una id de transacci贸n.
Es vital conocer esta diferencia tanto cuando programamos contratos inteligentes como cuando queremos obtener o escribir datos en la blockchain.
Interactuar con contratos usando truffle.
Truffle nos brinda la posibilidad de interactuar con los contratos a trav茅s de sus abstracciones. Podemos crear estas abstracciones tanto en la consola de desarrollo como creando scripts usando JavaScript.
Consola
Primeramente necesitamos ingresar a la consola de desarrollador esp茅cificando la red en la que hicimos el deploy del contrato.
truffle console --network kovan
La consola de truffle nos permite interactuar con nuestros contratos usando JavaScript. Ahora necesitamos obtener la abstracci贸n de nuestro contrato, si seguiste el tutorial anterior recordaras que el nombre del contrato de mi token ERC20 es Moonify.
truffle(kovan)> let instance = await Moonify.deployed()
Ahora por ejemplo, si llamamos a nuestra variable instance observaremos como nos devuelve la abstracci贸n de nuestro contrato.
truffle(kovan)> instance
Como podr谩s notar la abstracci贸n del contrato contiene tanto las funciones, variables, eventos y address de nuestro token. Con la abstracci贸n lista ya podemos empezar a usar las funciones de nuestro contrato.
Probemos pausar las transferencias de nuestro token, para esto habiamos creado una funci贸n pause que no recibe ning煤n parametro pero que solo puede ser llamada por el due帽o del contrato.
function pause() public onlyOwner {
_pause();
}
Para llamarla basta con escribir el siguiente comando:
truffle(kovan)> instance.pause()
Ahora por ejemplo si queremos enviar nuestros tokens a otra cuenta usando metamask, veremos que nuestra transacci贸n tendr谩 un error. De hecho, podemos revisar nuestra transacci贸n fallida en Etherscan y observar que la transacci贸n ha sido revertida y nuestro ETH devuelto.
Por supuesto, para volver a activar las transacciones de nuestro token basta con correr:
truffle(kovan)> instance.unpause()
Como habr谩s notado hemos llamado solo a funciones que no requiren de par谩metros. Nuestra funci贸n mint, por ejemplo, require de una address y de una cantidad. Esto tranquilamente lo podr铆amos hacer desde la consola, pero esto trae muchos incovenientes como andar copiando y pegando distintas address, como tambi茅n, que una vez cerrado la consola tendriamos que repetir todo este procedimiento. 驴Soluci贸n? Crear un script y ejectuarlo con Truffle.
Scripts
Como acabo de mencionar, los scripts nos traen muchas ventajas. Empezemos creado una carpeta llamada scripts, donde hubicaremos los scripts para ser reutilizados.
mkdir scripts
Ahora creemos r谩pidamente un script que nos permita acu帽ar tokens para una cuenta. El nombre del script ser谩 mint.js, recuerda guardarlo dentro de la carpeta de scripts.
const web3 = require("web3")
var cantidad = 100
var address = "0x8A7320D4E9bcA258E73f8ec61F4e4149f22f6F96"
module.exports = async function main(callback){
try {
// Obtenemos la abstracci贸n del contrato
const contrato = await artifacts.require("Moonify").deployed()
// Convertimos la cantidad a acu帽ar en Big Number
const value = web3.utils.toBN(cantidad * 1e18)
// Llamamos a nuestra funci贸n mint con una address y valor a acu帽ar
await contrato.mint(address, value.toString());
callback(0);
} catch (error) {
console.error(error);
callback(1);
}
}
El script es bastante sencillo y es una buena base para crear otros scripts para otras funciones. De todas formas he dejado comentarios explicando las lineas mas importantes.
Finalmente, para ejectuar nuestro script:
truffle exec mint.js --network kovan
Si todo ha salido bien habremos acu帽ado 100 tokens a la cuenta especificada en la variable address.
Conclusiones
Como lo acabamos de observar, interactuar con nuestros contrato es bastante sencillo usando truffle. Cabe aclarar que hemos interactuado con un Token creado por nosotros. Para interactuar con contratos de terceros necesitaremos la ABI del contrato y hacer uso del paquete @truffle/contract. Tambi茅n te invito a estudiar los contratos de OpenZepellin para que puedas llamar a muchas otras funciones, por ejemplo, owner() es una call que nos permite saber el address del due帽o del contrato.
Featured ones: