Estrutura de Desenvolvimento Ethereum - Uso Básico de Trufa

Brigadeiro

Introdução à Trufa

O comando trufa unbox webpack leva cerca de 10
minutos para baixar muitos módulos necessários, então vamos dar uma olhada no Truffle primeiro.

Truffle é atualmente a estrutura de desenvolvimento de DApp Ethereum mais popular, (de acordo com o site oficial) um ambiente de desenvolvimento e estrutura de teste de classe
mundial , bem como um canal de gerenciamento de ativos para todos os blockchains que usam EVM. É baseado em JavaScript e está comprometido para tornar o Desenvolvimento no Ethereum mais fácil.

Trufa tem as seguintes características:

 内置的智能合约编译,链接,部署和二进制文件的管理。
 合约自动测试,方便快速开发。
 脚本化的、可扩展的部署与发布框架。
 可部署到任意数量公网或私网的网络环境管理功能
 使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
 可配的构建流程,支持紧密集成。
 在 Truffle 环境里支持执行外部的脚本。

Cliente trufado

Os contratos inteligentes que escrevemos posteriormente devem ser implantados na cadeia para teste, portanto, o DApp criado pela
trufa também deve selecionar uma cadeia para implantação. Podemos optar por implantar em algumas cadeias de teste públicas, como Rinkeby ou Ropsten. A desvantagem é que o tempo de implantação e teste é relativamente longo e leva um certo tempo para ganhar tokens falsos para evitar falta de gás. Obviamente, para o processo formal de liberação do DApp, o staging (ambiente de simulação) ainda deve ser usado para testar a cadeia pública.

Outra maneira é implantar em uma cadeia privada, que é a escolha usual durante a fase de desenvolvimento. Truffle
recomenda oficialmente os dois clientes a seguir:
 Ganache
 trufa desenvolver

trufa desenvolver é um cliente interno do trufa, que é basicamente
semelhante à versão de linha de comando do Ganache. Digite bash no diretório de trufas:

>truffle develop

O cliente pode ser aberto e, como o ganache, ele gerará automaticamente 10 contas para nós.
A única coisa a notar é que ao executar o comando trufa no desenvolvimento de trufas, você precisa omitir o
"trufa" anterior. Por exemplo, "compilar trufas" só precisa digitar "compilar".

Instalar Trufa

Inicie o geth, então vamos instalar o trufa. trufa é uma estrutura de desenvolvimento de dapps que
facilita muito a criação e o gerenciamento de dapps.

Você pode instalar usando o npm assim truffle: >npm install -g truffle
Então criamos um diretório vazio e criamos o projeto trufa abaixo:

>mkdir simple_voting_by_truffle_dapp
>cd simple_voting_by_truffle_dapp
>npm install -g webpack
>truffle unbox webpack

trufa init: inicializa um novo projeto trufa vazio no diretório atual (os arquivos de projeto têm apenas
trufa-config.js e trufa.js; apenas Migrations.sol no diretório de contratos; apenas 1_initial_migration.js no diretório de migrações)

trufa unbox: Baixe uma caixa de trufas diretamente, ou seja, um projeto de trufas pré-construído;
o processo de unboxing é relativamente longo e você deve ver este prompt após a conclusão:

insira a descrição da imagem aqui
O webpack aqui é uma estrutura oficial do projeto (truffe box) baseado no processo de construção do webpack . Para
mais caixas de trufas, consulte https://truffeframework.com/boxes

Criar projeto

Quando um projeto de trufas é inicializado, ele cria todos os arquivos
e diretórios necessários para executar um dapp completo. Baixamos diretamente a caixa de trufas do webpack, e o diretório nela é semelhante:

>ls
README.md contracts node_modules test 
webpack.config.js truffle.js app migrations 
package.json
>ls app/
index.html javascripts stylesheets
>ls contracts/
ConvertLib.sol MetaCoin.sol Migrations.sol
>ls migrations/
1_initial_migration.js 2_deploy_contracts.js

 app/ - o diretório padrão onde os arquivos do aplicativo serão executados. Isso inclui diretórios recomendados para arquivos javascript
e arquivos de estilo css, mas cabe a você decidir como usar esses diretórios.
 contract/ - Diretório de armazenamento de arquivos de contrato padrão do Truffle.  migrations/ - o diretório de armazenamento para arquivos de script de implantação
test/ - o diretório de arquivos de teste para testar aplicativos e contratos Exclua os arquivos ConvertLib.sol e MetaCoin.sol no diretório de contratos no projeto.

>rm contracts/ConvertLib.sol contracts/MetaCoin.sol

Além disso, procure um arquivo de configuração chamado trufa.js no diretório do seu projeto. Ele contém
uma configuração para desenvolver a rede. Altere o número da porta de 7545 para 8545, pois nossa cadeia privada e ganache serão executados nessa porta por padrão.

Migração

O conceito
de migração É importante entender o conteúdo do diretório de migrações. Esses arquivos de migração são usados ​​para implantar contratos
no blockchain.

No projeto anterior, o contrato de votação foi implantado no blockchain chamando VotingContract.new no console do nó. No futuro, não precisaremos mais fazer isso, o trufa será implantado e rastreará todas as implantações.

As migrações são arquivos JavaScript responsáveis ​​por preparar nossas tarefas de implantação, assumindo que as necessidades de implantação mudarão com o tempo. À medida que o projeto cresce, devemos criar novos scripts de migração para alterar o estado do contrato na cadeia. Todos os registros do histórico de migração de execução serão registrados na cadeia por meio de um contrato de migração especial.

A primeira migração 1_initial_migration.js implanta um
contrato chamado Migrações para o blockchain e é usado para armazenar o contrato mais recente que você implantou. Toda vez que você executa uma migração, o trufa consulta o blockchain para os contratos implantados mais recentes e, em seguida, implanta todos os contratos que ainda não foram implantados.

Em seguida, ele atualiza o campo last_completed_migration no contrato de Migrações para apontar para o contrato implantado mais recente. Você pode simplesmente pensar nisso como uma tabela de banco de dados com uma coluna
last_completed_migration que está sempre atualizada.

A nomenclatura dos arquivos de migração tem requisitos especiais: o prefixo é um número (obrigatório), que é usado para marcar
se a migração foi bem sucedida; o sufixo é uma palavra descritiva, apenas para melhorar a legibilidade e facilitar o entendimento.

artefatos.require()

No início do script, usamos o método artifacts.require() para informar ao trufa qual contrato queremos implantar e migrar
, que é muito semelhante ao require em node. No entanto, deve-se notar que a documentação oficial mais recente avisa que você deve passar o nome do contrato definido, não o nome do arquivo - porque um arquivo .sol pode conter vários contratos.

funções de exportação

A função export no migration js precisa receber um objeto deployer como primeiro
parâmetro. Esse objeto é usado principalmente para fornecer suporte a sintaxe clara no processo de implantação e publicação, além de fornecer algumas responsabilidades comuns de implantação de contrato, como salvar arquivos implantados para uso posterior.

objeto implantador

O objeto implantador é a interface principal para tarefas de implantação de preparo.
Como todos os outros códigos no Truffle, o Truffle fornece
abstrações de contrato para nosso próprio código e é inicializado para que você possa interagir facilmente com a rede Ethereum. Essas interfaces abstratas fazem parte do processo de implantação.

Atualizar arquivos de migração

Atualize o conteúdo de 2_deploy_contracts.js com as seguintes informações:

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
    
    
deployer.deploy(Voting, ['Alice', 'Bob', 'Cary'], {
    
    gas:
290000});
};

Como você pode ver acima, o implantador espera que o primeiro parâmetro seja o nome do contrato, seguindo o parâmetro do construtor.

No nosso caso, há apenas um parâmetro, que é uma matriz de candidatos. O terceiro parâmetro é um hash que usamos para especificar o gás necessário para implantar o código. A quantidade de gás irá variar de acordo com o tamanho do seu contrato. Para contratos de votação, 290.000 é suficiente.

Atualize o arquivo de configuração de trufas

Atualize o conteúdo de trufa.js assim:

require('babel-register')
module.exports = {
    
    
networks: {
    
     
development: {
    
     
host: 'localhost', 
port: 8545, 
network_id: '*', 
gas: 470000 
} } }

Você notará que a única diferença entre o trufa.js anterior e nosso arquivo atualizado é a opção de gás.
Esta é uma variável global que se aplica a todas as migrações. Por exemplo, se você não especificar
um valor de gás de 290.000 em 2_deploy_contracts.js, o padrão de migração será 470.000.

O código de contrato Voting.sol
foi codificado anteriormente e pode ser usado para trufas sem alterações adicionais. Basta copiar os arquivos do
simple_voting_dapp para o diretório de contratos.

Crie uma conta (você pode usar a transferência de conta na metamask)

Antes de podermos implantar o contrato, precisamos de uma conta com algum ether. Quando usamos o
ganache, ele cria 10 contas de teste com 100 éteres de teste em cada conta
. Mas para testnet e mainnet, temos que criar nossa própria conta e colocar um pouco de ether nela.

No aplicativo ganache anterior, iniciamos um console de nó único e inicializamos
o objeto web3. Quando executamos o console do trufa, o trufa faz tudo por nós e temos um objeto web3 pronto para uso. Agora temos uma conta com o endereço
'0x95a94979d86d9c32d1d2ab5ace2dcc8d1b446fa1' (você obterá um endereço diferente) com saldo 0.

 >truffle console
// Replace 'verystrongpassword' with a good strong password.
truffle(development)> 
web3.personal.newAccount('verystrongpassword') ' 0xbaeec91f6390a4eedad8729aea4bf47bf8769b15'
truffle(development)> 
web3.eth.getBalance('0xbaeec91f6390a4eedad8729aea4bf47bf8769b1
5')
{
    
     [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)> 
web3.personal.unlockAccount('0xbaeec91f6390a4eedad8729aea4bf47
bf8769b15', 'verystrongpassword', 15000)

implantar

Se já tivermos algum ether, podemos compilar e implantar o contrato no blockchain. Você
pode encontrar os comandos relevantes abaixo e, se tudo correr bem, a seguinte saída aparecerá.

>truffle compile
Compiling Migrations.sol...Compiling Voting.sol...Writing 
artifacts to ./build/contracts
>truffle migrate
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0x3cee101c94f8a06d549334372181bc5a7b3a8bee
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
Voting: 0xd24a32f0ee12f5e9d233a2ebab5a53d4d4986203
Saving successful migration to network...
Saving artifacts...

Se você tiver várias contas, verifique se as contas relacionadas não estão bloqueadas. Por padrão, a primeira conta
web3.eth.accounts[0] será usada para implantação.

Possíveis problemas e soluções

  1. Se a implantação falhar devido a gás insuficiente, tente
    aumentar a conta de gás em migrations/2_deploy_contracts.js para
    500.000. Por exemplo: deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'],
    {gas: 500000});
  2. Se você tiver várias contas e preferir escolher uma conta em vez de accounts[0], poderá especificar o endereço da conta que deseja usar em truffe.js.
    Adicione 'from: your address' após network_id e trufa usará o endereço que você especificar para implantar e interagir.

Se a implantação for bem, você pode interagir com o contrato por meio do console e da página da web

Crie um novo arquivo JavaScript app/scripts/index.js

   // Import the page's CSS. Webpack will know what to do with it.
import "../styles/app.css";
// Import libraries we need.
import {
    
     default as Web3} from 'web3';
import {
    
     default as contract } from 'truffle-contract'
import voting_artifacts from '../../build/contracts/Voting.json'
var Voting = contract(voting_artifacts);
let candidates = {
    
    "Alice": "candidate-1", "Bob": "candidate-2", 
"Cary": "candidate-3"}
window.voteForCandidate = function(candidate) {
    
     
    let candidateName = $("#candidate").val(); 
    try {
    
     
        $("#msg").html("Vote has been submitted. The vote count 
        will increment as soon as the vote is recorded on the blockchain. 
        Please wait.") 
        $("#candidate").val("");
        Voting.deployed().then(function(contractInstance) {
    
     
            contractInstance.voteForCandidate(candidateName, 
            {
    
    gas: 140000,
            from:web3.eth.accounts[0]})
            .then(function() {
    
     
                let div_id = candidates[candidateName]; 
                return

                contractInstance.totalVotesFor
                .call(candidateName).then(function(v) {
    
     
                $("#" + div_id).html(v.toString()); 
                $("#msg").html(""); 
                }); 
            }); 
        }); 
    } catch (err) {
    
     
        console.log(err); 
    } 
}

$( document ).ready(function() {
    
     
    if (typeof web3 !== 'undefined') {
    
     
        console.warn("Using web3 detected from external 
        source like Metamask") // Use Mist/MetaMask's provider 
        window.web3 = new Web3(web3.currentProvider); 
    } else {
    
     
        console.warn("No web3 detected. Falling back to 
        http://localhost:8545. You should remove this fallback when you 
        deploy live, as it's inherently insecure. Consider switching to 
        Metamask for development. More info here: 
        http://truffleframework.com/tutorials/truffle-and-metamask"); 
        // fallback - use your fallback strategy (local node / hosted node 
        + in-dapp id mgmt / fail) 
        window.web3 = new Web3(new
        Web3.providers
        .HttpProvider("http://localhost:8545")); 
    }
    Voting.setProvider(web3.currentProvider); 
    let candidateNames = Object.keys(candidates); 
    for (var i = 0; i < candidateNames.length; i++) {
    
     
        let name = candidateNames[i]; 

        Voting.deployed().then(function(contractInstance) {
    
     
            contractInstance.totalVotesFor
            .call(name).then(function(v) {
    
     
            $("#" + candidates[name])
            .html(v.toString()); 
            }); 
        }); 
    }
});

Linha 7: Ao compilar e implantar o contrato de votação, o trufa armazenará o abi e o endereço implantado
em um arquivo json no diretório de compilação. Já discutimos abi antes. Usaremos
essas informações para iniciar uma abstração de votação. Em seguida, usaremos essa abstração para criar uma instância do contrato Voting.

Linha 14: Voting.deployed() retorna uma instância de contrato. Cada chamada para trufa retorna
uma promessa, e é por isso que usamos then() em cada chamada de transação.

A interação do console requer a reabertura de um novo console

>truffle console
truffle(default)> 
Voting.deployed().then(function(contractInstance) 
{
    
    contractInstance.voteForCandidate('Alice').then(function(v) 
{
    
    console.log(v)})})
{
    
     blockHash: 
'0x7229f668db0ac335cdd0c4c86e0394a35dd471a1095b8fafb52ebd76714
33156',
blockNumber: 469628,
contractAddress: null,
....
....
truffle(default)> 
Voting.deployed().then(function(contractInstance) 
{
    
    contractInstance.totalVotesFor.call('Alice').then(function(v) 
{
    
    console.log(v)})})
{
    
     [String: '1'] s: 1, e: 0, c: [ 1] }

Você precisa esperar um pouco depois de chamar o método voteForCandidate, porque leva tempo para enviar
a transação; observe que todas as chamadas para trufa retornam uma promessa, e é por isso que você vê cada
resposta envolvida na função then(); também o totalVoteFor( ) também pode ser chamado diretamente sem .call()
, e nenhuma transação será enviada.

As transações de saída podem ser encontradas no arquivo de saída de log do geth; se estivermos conectados à rede de teste
, ela pode ser consultada em https://rinkeby.etherscan.io no etherscan.

Você pode ver que o gasPrice padrão da trufa é 100GWei. Se você se sentir angustiado, pode alterá-lo em trufa.js, adicionar gasPrice: 1000000000 para alterá-lo para 1GWei e reiniciar o console de trufas para entrar em vigor.

Interação com a Web
Inicie o servidor com webpack no console:

>npm run dev

A porta padrão é 8080. Você pode ver a página visitando localhost:8080 no navegador.
Se o metamask estiver instalado, o index.js detectará e usará automaticamente o metamask como
provedor web3; portanto, devemos prestar atenção para alternar o metamask para a rede à qual estamos conectados no momento.

Acho que você gosta

Origin blog.csdn.net/david2000999/article/details/120472092
Recomendado
Clasificación