Ir al contenido principal

Llamar a un contrato inteligente desde JavaScript

transacciones
frontend
JavaScript
web3.js
Principiante
jdourlens
19 de abril de 2020
3 minuto leído

En este tutorial veremos cómo llamar a una función de un contrato inteligente desde JavaScript. Primero, leeremos el estado de un contrato inteligente (p. ej., el saldo de un titular de ERC20); después, modificaremos el estado de la blockchain realizando una transferencia de tokens. Ya debería estar familiarizado con cómo configurar un entorno de JS para interactuar con la blockchain.

Para este ejemplo, trabajaremos con el token DAI. A efectos de prueba, bifurcaremos la blockchain con ganache-cli y desbloquearemos una dirección que ya tenga muchos DAI:

ganache-cli -f https://mainnet.infura.io/v3/[SU CLAVE DE INFURA] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Para interactuar con un contrato inteligente, necesitaremos su dirección y su 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

Para este proyecto, hemos simplificado la ABI de ERC20 completa para mantener solo las funciones balanceOf y transfer, pero puede encontrar la ABI de ERC20 completa aquíopens in a new tab.

Luego, necesitamos instanciar nuestro contrato inteligente:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)

También configuraremos dos direcciones:

  • la que recibirá la transferencia y
  • la que ya hemos desbloqueado que la enviará:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

En la siguiente parte, llamaremos a la función balanceOf para obtener la cantidad actual de tokens que poseen ambas direcciones.

Llamada: leer un valor de un contrato inteligente

El primer ejemplo llamará a un método «constante» y ejecutará su método de contrato inteligente en la EVM sin enviar ninguna transacción. Para esto, leeremos el saldo de ERC20 de una dirección. Lea nuestro artículo sobre los tokens ERC20.

Puede acceder a los métodos de un contrato inteligente instanciado para el que proporcionó la ABI de la siguiente manera: yourContract.methods.methodname. Al usar la función call, recibirá el resultado de la ejecución de la función.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("Ocurrió un error", err)
4 return
5 }
6 console.log("El saldo es: ", res)
7})

Recuerde que el DAI ERC20 tiene 18 decimales, lo que significa que necesita eliminar 18 ceros para obtener la cantidad correcta. Los valores uint256 se devuelven como cadenas, ya que JavaScript no maneja valores numéricos grandes. Si no está seguro de cómo manejar números grandes en JS, consulte nuestro tutorial sobre bignumber.jsopens in a new tab.

Envío: enviar una transacción a la función de un contrato inteligente

Para el segundo ejemplo, llamaremos a la función de transferencia del contrato inteligente de 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 tokens a transferir:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("Ocurrió un error", err)
6 return
7 }
8 console.log("Hash de la transacción: " + res)
9 })
Mostrar todo

La llamada a la función devuelve el hash de la transacción que se minará en la blockchain. En Ethereum, los hashes de las transacciones son predecibles; así es como podemos obtener el hash de la transacción antes de que se ejecute (aprenda aquí cómo se calculan los hashesopens in a new tab).

Como la función solo envía la transacción a la blockchain, no podemos ver el resultado hasta que sepamos cuándo se mina y se incluye en la blockchain. En el próximo tutorial, aprenderemos cómo esperar a que se ejecute una transacción en la blockchain conociendo su hashopens in a new tab.

Última actualización de la página: 21 de octubre de 2025

¿Le ha resultado útil este tutorial?