Ferramentas para desenvolvimento no blockchain Ethereum

197 visualizações

Publicada em

Apresentamos o desenvolvimento para blockchain Ethereum utilizando:

- Solidity Browser
- Geth
- Mist
- Trufffle

Utilizando o Mercado Pokémon como plataforma de exemplo.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
197
No SlideShare
0
A partir de incorporações
0
Número de incorporações
0
Ações
Compartilhamentos
0
Downloads
9
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Ferramentas para desenvolvimento no blockchain Ethereum

  1. 1. 1
  2. 2. Desenvolvimento em Blockchain Ethereum Edilson Osorio Junior
  3. 3. 3 Geth - Instalando MAC # brew update # brew upgrade # brew tap ethereum/ethereum # brew install ethereum
  4. 4. 4 Geth - Instalando Windows https://build.ethdev.com/builds/Windows%20Go%20master%2 0branch/ # cd <dir da instalação> # open geth.exe
  5. 5. 5 Geth - Instalando Linux # sudo apt-get install software-properties-common # sudo add-apt-repository -y ppa:ethereum/ethereum # sudo apt-get update # sudo apt-get install ethereum
  6. 6. 6 Geth - Rodando Todas plataformas # geth console ou # geth attach
  7. 7. 7 Instalando a Private Testnet # mkdir -p private_net/keystore # cp <chave_privada_demo> private_net/keystore # geth --datadir ./private_net init private_genesis.json # geth --fast --cache 512 -ipcpath ~/Library/Ethereum/geth.ipc --networkid 1234 --datadir ./private_net --unlock 0 --rpc --rpccorsdomain="*" --rpcaddr "0.0.0.0" (pass: ABCD para unlock) # geth attach (em outro terminal) # miner.start(1) // inicia mineração usando apenas 1 core
  8. 8. 8 Conectando a outros nodes Dentro do console No seu node: # admin.nodeInfo.NodeUrl Nos clientes que desejam se conectar ao seu node: # admin.addPeer("NodeUrl") ou dentro de arquivo 'static-nodes.json' na raiz do blockchain Ex.: ["enode://ac8413a322270877c0a634c10f23db1de490c96d994cb81ad12a4eb65600153033da6 826b00c6420571e00b3b9ae7ba9736a0ead54eb8fce6bbeaec0364908f1@<IP>:51515?discport =0"] // Não esquecer o IP
  9. 9. 9 Contas: Dentro do console # personal.newAccount("<passphrase forte>") # web3.eth.accounts # web3.eth.accounts[0] # web3.eth.getBalance(web3.eth.accounts[0]) # personal.unlockAccount(eth.accounts[0]) # personal.unlockAccount(eth.accounts[0], 'abcd', 0)
  10. 10. 10 Verificação de saldo em ether: Dentro do console # web3.eth.sendTransaction({from: web3.eth.accounts[0], to: web3.eth.accounts[1], value: web3.toWei(20, 'ether')}) # web3.eth.getBalance(web3.eth.getBalance(web3.eth.accounts[1]))
  11. 11. 11 Greeter - Rodando Dentro do console 1) Copiar o código do greeter no Solidity 2) Copiar e colar o código web3 gerado pelo Solidity em um notepad 3) Editar a variável _greeting a) # var _greeting = "ola mundo" ; 4) Copiar e colar o conteúdo no console
  12. 12. 12 Greeter - Rodando Dentro do console # greeter # greeter.address # eth.getCode(greeter.address) # greeter.greet()
  13. 13. Lendo e escrevendo dados Transações: ● Custa gas ● Muda o estado da rede ● Não são processadas imediatamente ● Não mostra um retorno (somente o transaction id) Chamadas (leitura): ● Gratuitas (sem custo de gas) ● Não mudam o estado da rede ● São processadas imediatamente ● Retornam um valor 13 Ethereum background
  14. 14. Gas ● Quantidade de processamento ou poder computacional necessário para rodar uma função ou aplicação GasPrice ● Valor do gas que o mercado está cobrando em média ● Quanto maior o gasPrice, mais você pagará de fee para o minerador ● Quanto maior o fee, maior a prioridade da sua transação 14 Ethereum background
  15. 15. Exercício ● Utilizar o Browser Solidity para estimar o gas de uma aplicação ou função 15 Ethereum background
  16. 16. 16 Greeter - Carregando Dentro do console # var greeter2 = eth.contract([{constant:false,inputs:[],name:'kill',outputs:[],type: 'function'},{constant:true,inputs:[],name:'greet',outputs:[{name:'', type:'string'}],type:'function'},{inputs:[{name:'_greeting',type:'string'}], type:'constructor'}]).at(greeter.address);
  17. 17. 17 Greeter - Matando Dentro do console # greeter.kill.sendTransaction({from:eth.accounts[0]}) # eth.getCode(greeter.address) Mas morreu mesmo? # eth.getTransaction('txid') Copiar e colar o bytecode (input) no rapidtables e converter de hex para ascii http://www.rapidtables.com/convert/number/hex-to-ascii.htm
  18. 18. 18 Instalando o Mist: No seu browser predileto https://github.com/ethereum/mist/releases/tag/v0.8.9 ● Rodar como Testnet ● Criar primeira conta com senha 'simples' (de teste) ● Quando chegar na última tela, deixar carregando um pouco e depois clicar para entrar
  19. 19. 19 Mist - Instalando Depois de carregado ● Fechar o Mist ● Entrar na private com o Geth ● Abrir o Mist (estará conectado na Private net) Exercício: Rodar o Greeting pelo Mist e carregar no console
  20. 20. 20 Mist - Rodando Depois de carregado Exercício: Carregar o contrato PokeCoin no Mist e distribuir as moedas entre contas Exercício2: Acessar o contrato PokeCoin pelo console e distribuir moedas pelo console Exercício3: Carregar o contrato PokeCoin pelo console e depois interagir através do Mist
  21. 21. 21 Truffle: Plataforma para desenvolvimento e teste de smart-contracts ● Compilação, linking, deployment e gerenciamento de smart-contracts ● Testes automatizados (Mocha e Chai) ● Pipeline de build configurável ● Deploy por scripts ● Gerenciamento de redes (deploy em mainnet e testnet) ● Rebuild automático ● Executa scripts externos ● Suporta Javascript, SASS, ES6 e JSX
  22. 22. Requerimentos NodeJS 5.0+ (recomendado) Windows, Linux ou OS X # npm install -g truffle Recomendações para Windows: utilizar via powershell ou git bash ( baixar exemplo: https://github.com/eddieoz/truffle-mercado-pokemon ) 22 Truffle - Instalação
  23. 23. Requerimentos de cliente EthereumJS TestRPC: https://github.com/ethereumjs/testrpc - Mineração imediata de bloco - Ambiente randômico - Demora muito para responder os watchers - Da erro de 'invalid JUMP' em contratos mais complexos mesmo aumentando o gasLimit 23 Truffle - Instalação
  24. 24. Requerimentos de cliente Geth - Depende de mineração - Roda contratos complexos - Maior controle sobre accounts (fixos) 24 Truffle - Instalação
  25. 25. No terminal # mkdir projeto1 # cd projeto1 # truffle init app/ contracts/ migrations/ test/ truffle.js 25 Truffle - Primeiro Projeto
  26. 26. Nomes de contrato como nomes de arquivo # MyContract.sol contract MyContract { ... } // ou library MyContract { ... } Dependências usando import do Solidity http://solidity.readthedocs.io/en/latest/layout-of-source-files.html#importing-other-source-files Artifacts em build/contracts para uso interno do truffle e não devem ser alterados 26 Truffle - Convenções
  27. 27. Migrations # truffle migrate # truffle migrate --reset Arquivos em migrations/ 27 Truffle - Deploying
  28. 28. Deployer // Stage deploying A before B deployer.deploy(A); deployer.deploy(B); // Deploy A, then deploy B, passing in A's newly deployed address deployer.deploy(A).then(function() { return deployer.deploy(B, A.address); }); 28 Truffle - Deploying
  29. 29. Deploy em um contrato simples deployer.deploy(A); Deploy um contrato simples com argumentos deployer.deploy(A, arg1, arg2, ...); ● Deploy múltiplos contratos, com argumentos ou não ● Mais rápido que escrever vários 'deployer.deploy()' ● Faz deploy em batch deployer.deploy([ [A, arg1, arg2, ...], B, [C, arg1] ]); 29 Truffle - Deploying
  30. 30. module.exports = function(deployer, network) { // Adiciona demo data se não estiver rodando live if (network != "live") { deployer.exec("add_demo_data.js"); } } 30 Truffle - Network
  31. 31. Deploy biblioteca LibA, então linka LibA ao contrato B deployer.deploy(LibA); deployer.link(LibA, B); Link LibA a vários contratos deployer.link(LibA, [B, C, D]); 31 Truffle - Link
  32. 32. Assume que A depende de LibB e LibC deployer.deploy([LibB, LibC]); deployer.autolink(A); Link *all* libraries to all available contracts deployer.autolink(); 32 Truffle - AutoLink
  33. 33. deployer.then(function() { // Cria uma nova versão de A return A.new(); }).then(function(instance) { // Seta a nova instância do end A's em B. var b = B.deployed(); return b.setA(instance.address); }); 33 Truffle - Função then(function(){})
  34. 34. Roda um script externo durante a migração deployer.exec("../caminho/para/arquivo/demo_data.js"); 34 Truffle - Função exec(arquivo)
  35. 35. Exemplo: contract('Mercado Pokemon', function(accounts) { var account1Demo = '0x616d18096ce6e1038b5c3ded080cef8ab17b3843'; var account2Demo = '0x2f33f148b5ff5f76e63460e14228a671923de628'; it("creating 10000 pokecoins", function(){ var pokecoin = PokeCoin.deployed(); return pokecoin.totalSupply().then(function(totalSupply) { assert.equal(totalSupply.toNumber(), 10000, "10000 pokecoins wasn't created"); }); }); }); # truffle test # truffle test <arq.js> 35 Truffle - Testando contratos
  36. 36. Exemplo: var account_one = "0x1234..."; // an address var account_two = "0xabcd..."; // another address var meta = MetaCoin.deployed(); meta.sendCoin(account_two, 10, {from: account_one}).then(function(tx_id) { // Se esse callback for chamado é porque a transação foi processada alert("Transaction successful!") }).catch(function(e) { // Houve um erro }) 36 Truffle - Transações
  37. 37. Exemplo: var account_one = "0x1234..."; // an address var meta = MetaCoin.deployed(); meta.getBalance.call(account_one, {from: account_one}).then(function(balance) { // Se o callback foi chamado é porque a transação foi processada // Retorna informação imediatamente // Mostra o valor console.log(balance.toNumber()); }).catch(function(e) { // Houve um erro. }) ● Executamos .call() para dizer ao Ethereum que a não queremos fazer alterações na rede ● Recebemos um retorno ao invés do txid ● Às vezes recebe um BigNumber e precisa converter 37 Truffle - Fazendo Call
  38. 38. Exemplo: var meta = MetaCoin.deployed(); var transfers = meta.Transfer({fromBlock: "latest"}); transfers.watch(function(error, result) { // Recebe todos eventos de Transfer if (error == null) { console.log(result.args); } } É possível capturar os eventos disparados pelos contratos com este método. 38 Truffle - Lendo eventos
  39. 39. Console similar ao geth # truffle console truffle(default)> 39 Truffle - console
  40. 40. Diretamente do prompt # truffle exec <path/to/file.js> De dentro do console exec <path/to/file.js> 40 Truffle - Rodando scripts externos
  41. 41. # truffle watch Lê o filesystem por alterações em arquivos e recompila automaticamente os que sofreram alteração # truffle serve Lê o filesystem por alterações em arquivos e recompila automaticamente os que sofreram alteração e abre um server em http://localhost:8080 ● Para 'buildar' o projeto use: # truffle build 41 Truffle - outros comandos
  42. 42. truffle.js (ou truffle-config.js no windows) rpc: { host: "localhost", port: 8545, gas: 4712388, gasPrice: 200000000000, from: 'address' (default web3.eth.accounts[0]) } mocha: { useColors: true } 42 Truffle - Configurando RPC e Mocha
  43. 43. networks: { "live": { network_id: 1, // Ethereum public network // host - defaults to "localhost" // port - defaults to 8545 // gas // gasPrice // from - default address to use for any transaction Truffle makes during migrations }, "morden": { network_id: 2, // Official Ethereum test network host: "178.25.19.88", // Random IP for example purposes (do not use) port: 80 }, "staging": { network_id: 1337 // custom private network // use default rpc settings }, "development": { network_id: "default" } } # truffle migrate --network live 43 Truffle - Deploying em redes
  44. 44. http://truffle.readthedocs.io/en/latest/ 44 Truffle - Manual atualizado
  45. 45. A transfer of trust in a trustless world Desenvolvimento em Blockchain Ethereum Ethereum Básico para Desenvolvedores - Fev/2017 www.originalmy.com contato at originalmy.com @originalmycom fb.com/originalmycom Edilson Osorio Jr.
  46. 46. 47

×