WEB3DEV

Cover image for Usando o Truffle com a C-Chain da Avalanche
Fatima Lima
Fatima Lima

Posted on

Usando o Truffle com a C-Chain da Avalanche

Aprenda como usar o Truffle com a C-Chain

O tutorial original pode ser encontrado na documentação da AVA Labs aqui.

Introdução

O Truffle Suite é um conjunto de ferramentas para lançar aplicações descentralizadas (dapps) na EVM (máquina virtual da Ethereum). Com o Truffle você pode escrever e compilar contratos inteligentes, construir objetos, executar migrações e interagir com os contratos implantados. Este tutorial ilustra como o Truffle pode ser usado com o C-Chain da Avalanche, que é uma instância da EVM.

Requisitos

Você criou uma conta Avalanche DataHub e está familiarizado com a arquitetura da Avalanche. Você também realizou uma troca de cadeia cruzada através do tutorial da Transferência da AVAX entre a X-Chain e a C-Chain para obter fundos para seu endereço C-Chain.

Dependências

  • Avash é uma ferramenta para operar uma rede local Avalanche. É semelhante ao Ganache do Truffle.
  • NodeJS versão 8.9.4 ou mais recente.
  • O Truffle, que você pode instalar com o npm install -g truffle

Iniciar uma rede local Avalanche

Avash permite girar a rede de testes privados com até 15 nós AvalancheGo fora da caixa. O Avash suporta a automação de tarefas regulares através de scripts lua. Isto permite testes rápidos frente a uma grande variedade de configurações. A primeira vez que você usar o avash, você precisará instalá-lo e baixá-lo.

Iniciar uma rede local de cinco nós Avalanche:

cd /path/to/avash
// construa o avast se você ainda não o fez
go build
// inicie o Avash
./avash
// inicie uma rede staking de cinco nós 
runscript scripts/five_node_staking.lua
Enter fullscreen mode Exit fullscreen mode

Uma rede de cinco nós Avalanche está funcionando em sua máquina. Quando você quiser sair da Avash, execute exit, mas não faça isso agora e não feche esta aba do terminal.

Criar diretório truffle e instale as dependências

Abra uma nova aba de terminal para que possamos criar um diretório truffle e instale algumas dependências adicionais.

Primeiro, navegue até o diretório dentro do qual você pretende criar seu diretório de trabalho truffle:

cd /path/to/directory
Enter fullscreen mode Exit fullscreen mode

Crie e entre no novo diretório chamado truffle:

mkdir truffle; cd truffle
Enter fullscreen mode Exit fullscreen mode

Use npm para instalar web3, que é uma biblioteca através da qual podemos falar com a EVM:

npm install web3 -s
Enter fullscreen mode Exit fullscreen mode

Usaremos a web3 para definir um Provedor HTTP, que é como a web3 falará com a EVM. Finalmente, crie um projeto truffle boilerplace:

truffle init
Enter fullscreen mode Exit fullscreen mode

Atualize o truffle-config.js

Um dos artigos criados quando você executa truffle inité truffle-config.js. Acrescente o seguinte ao truffle-config.js.

const Web3 = require('web3');
const protocol = "http";
const ip = "localhost";
const port = 9650;
module.exports = {
  networks: {
   development: {
     provider: function() {
      return new Web3.providers.HttpProvider(`${protocol}://${ip}:${port}/ext/bc/C/rpc`)
     },
     network_id: "*",
     gas: 3000000,
     gasPrice: 470000000000
   }
  }
};
Enter fullscreen mode Exit fullscreen mode

Observe que você pode mudar o protocol, o ip e o port se você quiser direcionar as chamadas API para um nó AvalancheGo diferente. Observe também que estamos definindo o gasPrice e o gas para valores adequados à C-Chain da Avalanche.

Adicione Storage.sol

No diretório contracts, adicione um novo arquivo chamado Storage.sol e acrescente o seguinte bloco de código:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;

/**
 * @title Storage
 * @dev Armazena e recupera o valor em uma variável
 */
contract Storage {

    uint256 number;

    /**
     * @dev Armazena um valor na variável
     * @param valor numérico para ser armazenado
     */
    function store(uint256 num) public {
        number = num;
    }

    /**
     * @dev Retorna um valor 
     * @return valor do 'number'
     */
    function retrieve() public view returns (uint256){
        return number;
    }
}
Enter fullscreen mode Exit fullscreen mode

Storage é um contrato inteligente Solidity que nos permite escrever um número para a blockchain através de uma função store e depois ler o número de volta da blockchain através de uma função retrieve.

Adicione nova migração

Crie um novo arquivo no diretório migrations chamado 2_deploy_contracts.js e adicione o seguinte bloco de código. Isto permite implantar o contrato inteligente Storage na blockchain.

const Storage = artifacts.require("Storage");

module.exports = function (deployer) {
  deployer.deploy(Storage);
};
Enter fullscreen mode Exit fullscreen mode

Compile Contratos com o Truffle

A qualquer momento que você fizer uma mudança em Storage.sol, precisará executar o truffle compile.

truffle compile
Enter fullscreen mode Exit fullscreen mode

Você deve ver:

Compiling your contracts...
===========================
> Compiling ./contracts/Migrations.sol
> Compiling ./contracts/Storage.sol
> Artifacts written to /path/to/build/contracts
> Compilado com sucesso usando:
   - solc: 0.5.16+commit.9c3226ce.Emscripten.clang
Enter fullscreen mode Exit fullscreen mode

Crie, deposite e desbloqueie uma conta na C-Chain

Ao implantar contratos inteligentes para a C-Chain, o truffle será enviado por default para a primeira conta disponível fornecida por seu cliente C-Chain como o endereço from, utilizado durante as migrações.

Crie uma conta

O Truffle possui um console muito útil que pode ser utilizado para interagir com a blockchain e o nosso contrato. Abra o console:

truffle console --network development
Enter fullscreen mode Exit fullscreen mode

Então, no console, crie uma conta::

truffle(development)> let account = await web3.eth.personal.newAccount()
Enter fullscreen mode Exit fullscreen mode

Isso retorna:

undefined
Enter fullscreen mode Exit fullscreen mode

Imprima a conta:

truffle(development)> account
Enter fullscreen mode Exit fullscreen mode

Isso imprime a conta

'0x090172CD36e9f4906Af17B2C36D662E69f162282'
Enter fullscreen mode Exit fullscreen mode

Desbloqueie sua conta:

truffle(development)> await web3.eth.personal.unlockAccount(account[0])
Enter fullscreen mode Exit fullscreen mode

Isto retorna:

true
Enter fullscreen mode Exit fullscreen mode

Saia do console truffle:

truffle(development)> .exit
Enter fullscreen mode Exit fullscreen mode

Deposite em sua conta

Siga os passos do tutorial Transferência da AVAX entre a X-Chain e a C-Chain para depositar na conta recém-criada. Você precisará enviar pelo menos 135422040 nAVAX para a conta para cobrir o custo de implantações contratuais.

Execute Migrações

Agora tudo está no lugar para realizar as migrações e implantar o contrato Storage:

truffle migrate --network development
Enter fullscreen mode Exit fullscreen mode

Você deve ver:

Compiling contracts...
===========================
> Everything is up to date, there is nothing to compile

Migrations dry-run (simulation)
===============================
> Network name:    'development-fork'
> Network id:      1
> Block gas limit: 99804786 (0x5f2e672)

1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > block number:        4
   > block timestamp:     1607734632
   > account:             0x34Cb796d4D6A3e7F41c4465C65b9056Fe2D3B8fD
   > balance:             1000.91683679
   > gas used:            176943 (0x2b32f)
   > gas price:           470 gwei
   > value sent:          0 ETH
   > total cost:          0.08316321 ETH

   -------------------------------------
   > Total cost:          0.08316321 ETH

2_deploy_contracts.js
=====================

   Deploying 'Storage'
   -------------------
   > block number:        6
   > block timestamp:     1607734633
   > account:             0x34Cb796d4D6A3e7F41c4465C65b9056Fe2D3B8fD
   > balance:             1000.8587791
   > gas used:            96189 (0x177bd)
   > gas price:           470 gwei
   > value sent:          0 ETH
   > total cost:          0.04520883 ETH

   -------------------------------------
   > Total cost:          0.04520883 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.13542204 ETH
Enter fullscreen mode Exit fullscreen mode

Se você não criou uma conta na C-Chain, você verá este erro:

Error: Expected parameter 'from' not passed to function.
Enter fullscreen mode Exit fullscreen mode

Se você não depositou na conta, você verá este erro:

Error:  *** Deployment Failed ***

"Migrations" could not deploy due to insufficient funds
   * Account:  0x090172CD36e9f4906Af17B2C36D662E69f162282
   * Balance:  0 wei
   * Message:  sender doesn't have enough funds to send tx. The upfront cost is: 1410000000000000000 and the sender's account only has: 0
   * Try:
      + Using an adequately funded account
Enter fullscreen mode Exit fullscreen mode

Se você não desbloqueou a conta, você verá este erro:

Error:  *** Deployment Failed ***

"Migrations" -- Returned error: authentication needed: password or unlock.
Enter fullscreen mode Exit fullscreen mode

Interagindo com seu contrato

Agora o contrato Storage foi implantado. Vamos escrever um número para a blockchain e depois lê-lo de volta. Abra novamente o console do truffle:

truffle console --network development
Enter fullscreen mode Exit fullscreen mode

Obtenha um exemplo do contrato Storage implantado:

truffle(development)> let instance = await Storage.deployed()
Enter fullscreen mode Exit fullscreen mode

Isto retorna:

undefined
Enter fullscreen mode Exit fullscreen mode

Escrevendo um número para a blockchain

Agora que você tem um exemplo do contrato Storage, chame o método store e passe um número para ser escrito na blockchain.

truffle(development)> instance.store(1234)
Enter fullscreen mode Exit fullscreen mode

Se você vir este erro:

Error: Returned error: authentication needed: password or unlock
Enter fullscreen mode Exit fullscreen mode

Então, execute isso de novo: node web3_script.js

Você deve ver algo assim:

{
  tx: '0x10afbc5e0b9fa0c1ef1d9ec3cdd673e7947bd8760b22b8cdfe08f27f3a93ef1e',
  receipt: {
    blockHash: '0x8bacbce7c9d835db524bb856288e3a73a6afbe49ab34abd8cd8826db0240eb21',
    blockNumber: 9,
    contractAddress: null,
    cumulativeGasUsed: 26458,
    from: '0x34cb796d4d6a3e7f41c4465c65b9056fe2d3b8fd',
    gasUsed: 26458,
    logs: [],
    logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
    status: true,
    to: '0x0d507b0467baef742f9cc0e671eddbdf6df41d33',
    transactionHash: '0x10afbc5e0b9fa0c1ef1d9ec3cdd673e7947bd8760b22b8cdfe08f27f3a93ef1e',
    transactionIndex: 0,
    rawLogs: []
  },
  logs: []
}
Enter fullscreen mode Exit fullscreen mode

Lendo um número da blockchain

Para ler um número da blockchain, chame o método retrievedo exemplo do contrato Storage.

truffle(development)> let i = await instance.retrieve()
Enter fullscreen mode Exit fullscreen mode

Isto deve retornar:

undefined
Enter fullscreen mode Exit fullscreen mode

O resultado da chamada para o retrieveé um BN (número grande). Chame seu método .toNumber para ver o valor:

truffle(development)> i.toNumber()
Enter fullscreen mode Exit fullscreen mode

Você deve ver o número que armazenou.

1234
Enter fullscreen mode Exit fullscreen mode

Resumo

Agora você tem as ferramentas necessárias para lançar uma rede local Avalanche, criar um projeto truffle, bem como criar, compilar, implantar e interagir com contratos da Solidity.

Se você tiver alguma dificuldade para seguir este tutorial ou simplesmente quiser discutir a tecnologia da Avalanche conosco, você pode juntar-se à nossa comunidade.

Esse artigo é da Figment e foi traduzido por Fátima Lima. Seu original pode ser lido aqui.

Oldest comments (0)