Ejecutar un contrato inteligente desde JavaScript
En este tutorial veremos cómo llamar a una función de un contrato inteligente desde JavaScript. Lo primero es conocer el estado de un contrato inteligente (p. ej., el saldo de una cuenta ERC20). A continuación, modificaremos el estado de la cadena de bloques haciendo una transferencia de tókenes. Debería estar familiarizado con cómo configurar un entorno JS para interactuar con la cadena de bloques.
Para estos ejemplos jugaremos con el token DAI. Para las pruebas haremos una copia de la cadena de bloques usando ganache-cli y desbloquearemos una dirección que tiene muchos DAI:
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81
Para interactuar con un contrato inteligente necesitaremos su dirección y una interfaz ABI:
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Mostrar todoCopiar
Para este proyecto, hemos simplificado toda la interfaz ABI de ERC20 manteniendo solo las funciones balanceOf
y transfer
. Puede encontrar la interfaz ABI ERC20 completa aquí(opens in a new tab).
A continuación tenemos que instanciar nuestro contrato inteligente:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Copiar
También configuraremos dos direcciones:
- quién recibirá la transferencia y
- la que ya hemos desbloqueado que la enviará:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"Copiar
A continuación, recurriremos a la función balanceOf
para recuperar la cantidad actual de tókenes que tienen ambas direcciones.
Consulta: Obtener el valor de una variable de un contrato inteligente
El primer ejemplo recurrirá a un método «constante» y lo ejecutará en la EVM sin realizar ninguna transacción. Para ello, leeremos el balance ERC20 de una dirección. Lea nuestro artículo sobre los tókenes ERC20.
Puede acceder a los métodos de un contrato inteligente mediante la interfaz ABI de la siguiente manera: yourContract.methods.methodname
. Utilizando la función call
comprobará el resultado de ejecutar la función.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("An error occurred", err)4 return5 }6 console.log("The balance is: ", res)7})Copiar
Recuerde que DAI ERC20 tiene 18 decimales, lo que significa que necesita eliminar 18 ceros para obtener la cantidad correcta. uint256 aparecen como cadenas, ya que JavaScript no gestiona grandes valores numéricos. Si no está seguro de cómo tratar con números grandes en JS, revise nuestro tutorial bignumber.js(opens in a new tab).
Enviar: Enviar una transacción a una función de un contrato inteligente
Para el segundo ejemplo, recurriremos a la función de transferencia del contrato inteligente DAI para enviar 10 DAI a nuestra segunda dirección. La función de transferencia acepta dos parámetros: la dirección del destinatario y la cantidad de token por transferir:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occurred", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })Mostrar todoCopiar
La función de ejecución da como resultado la inclusión del hash de la transacción en la cadena de bloques. En Ethereum, los hash de la transacción son predecibles: así es como podemos obtener el hash de la transacción antes de que se ejecute (cómo se calculan los hash(opens in a new tab)).
No se podrá ver el resultado hasta que la transacción se incluya en la cadena de bloques. En el siguiente tutorial, aprenderemos cómo esperar a que una transacción se ejecute en la cadena de bloques conociendo su hash(opens in a new tab).
Última edición: @pettinarip(opens in a new tab), 23 de noviembre de 2023