Pular para o conteúdo principal

Ajude a atualizar esta página

🌏

Há uma nova versão desta página mas, no momento, ela está apenas em inglês. Ajude-nos a traduzir a última versão.

Traduzir página
Visualizar em inglês

Não há bugs aqui!🐛

Esta página não está sendo traduzida. Ela foi intencionalmente deixada em inglês, por enquanto.

Chamando um contrato inteligente a partir do JavaScript

transações
front-end
JavaScript
web3.js
page-tutorial-undefined
✍jdourlens
📚EthereumDev
📆19 de abril de 2020
⏱️3 minutos de leitura
Autor da dica 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

Neste tutorial, veremos como chamar uma função do contrato inteligente a partir do JavaScript. Primeiro vamos ler o estado de um contrato inteligente (por exemplo, o saldo de um titular do ERC20) e logo vamos modificar o estado da blockchain fazendo uma transferência de token. Você já deve estar familiarizado com configurando um ambiente JavaScript para interagir com a blockchain.

Para esses exemplos, vamos usar o token DAI. Para fins de teste, vamos fazer um fork do blockchain usando ganache-cli e desbloquear um endereço que já possui muitos DAI:

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

Para interagir com um contrato inteligente, precisaremos do seu endereço e 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"
47
Exibir tudo
📋 Copiar

Para este projeto, nós removemos parte do ERC20 ABI para manter apenas as funções balanceOf e transfer, mas você pode encontrar aqui o ERC20 ABI completo.

Precisamos então instanciar nosso contrato inteligente:

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

Também vamos configurar dois endereços:

  • quem receberá a transferência e
  • o que nós já desbloqueamos que irá enviá-lo:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CB3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
3
📋 Copiar

Na próxima parte, chamaremos a função balanceOf para recuperar a quantidade atual de tokens que os dois endereços possuem.

Chamada: valor de leitura de um contrato inteligente

O primeiro exemplo chamará um método "constant" e executará seu método de contrato inteligente na EVM sem enviar qualquer transação. Para isso, vamos ler o saldo do ERC20 de um endereço. Leia o nosso artigo sobre tokens ERC20.

Você pode acessar um método instanciado do contrato inteligente para o qual forneceu o ABI. Exemplo: yourContract.methods.methodname. Usando a função call você receberá o resultado da execução da função.

1daiToken.methods.balanceOf(senderAddress).call(função (err, res) {
2 if (err) {
3 console.log("Um erro ocorreu", err)
4 return
5 }
6 console.log("O saldo é: ", res)
7})
8
📋 Copiar

Lembre-se que DAI ERC20 tem 18 decimais, o que significa que você precisa remover 18 zeros para obter o valor correto. uint256 are returned as strings as JavaScript does not handle big numeric values. Se não tiver certeza de como lidar com grandes números em JS, verifique nosso tutorial sobre bignumber.js.

Enviar: enviando transação para uma função de contrato inteligente

Para o segundo exemplo, chamaremos a função de transferência do contrato inteligente DAI para enviar 10 DAI para o nosso segundo endereço. A função de transferência aceita dois parâmetros: o endereço do destinatário e a quantidade de token para transferências:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occured", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
10
Exibir tudo
📋 Copiar

A função de chamada retorna o hash da transação que será minerada no blockchain. No Ethereum, hashes de transação são previsívei. É assim que podemos obter o hash da transação antes de ela ser executada (saiba aqui como os hashes são calculados).

Como função só envia a transação para a blockchain, não podemos ver o resultado até sabermos quando ela é minerada e incluída na blockchain. No próximo tutorial, aprenderemos como aguardar por uma transação que será executada na blockchain com base no hash dela.

Última edição: , Invalid DateTime
Editar Página

Esta página foi útil?