Ir al contenido principal

Ejecutar un contrato inteligente desde JavaScript

transaccionesfrontendJavaScriptweb3.js
Principiante
jdourlens
EthereumDev(opens in a new tab)
19 de abril de 2020
3 minuto leído minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

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]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
Mostrar todo
Copiar

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")
2
3const 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 return
5 }
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.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occurred", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
Mostrar todo
Copiar

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

¿Le ha resultado útil este tutorial?