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.
Top comments (0)