Skip to content

Usando o Truffle com a C-Chain da Avalanche

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

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

Crie e entre no novo diretório chamado truffle:

mkdir truffle; cd truffle

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

npm install web3 -s

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

truffle init

###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
   }
  }
};

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;
    }
}

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);
};

###Compile Contratos com o Truffle

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

truffle compile

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

###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

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

truffle(development)> let account = await web3.eth.personal.newAccount()

Isso retorna:

undefined

Imprima a conta:

truffle(development)> account

Isso imprime a conta

'0x090172CD36e9f4906Af17B2C36D662E69f162282'

####Desbloqueie sua conta:

truffle(development)> await web3.eth.personal.unlockAccount(account[0])

Isto retorna:

true

Saia do console truffle:

truffle(development)> .exit

####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

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

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

Error: Expected parameter 'from' not passed to function.

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

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

Error:  *** Deployment Failed ***

"Migrations" -- Returned error: authentication needed: password or unlock.

###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

Obtenha um exemplo do contrato Storage implantado:

truffle(development)> let instance = await Storage.deployed()

Isto retorna:

undefined

####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)

Se você vir este erro:

Error: Returned error: authentication needed: password or unlock

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: []
}

####Lendo um número da blockchain

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

truffle(development)> let i = await instance.retrieve()

Isto deve retornar:

undefined

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()

Você deve ver o número que armazenou.

1234

##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.