SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
1
Desenvolvimento em
Blockchain Ethereum
Edilson Osorio Junior
3
Geth - Instalando
MAC
# brew update
# brew upgrade
# brew tap ethereum/ethereum
# brew install ethereum
4
Geth - Instalando
Windows
https://build.ethdev.com/builds/Windows%20Go%20master%2
0branch/
# cd <dir da instalação>
# open geth.exe
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
Geth - Rodando
Todas plataformas
# geth console
ou
# geth attach
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
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
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
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
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
Greeter - Rodando
Dentro do console
# greeter
# greeter.address
# eth.getCode(greeter.address)
# greeter.greet()
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
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
Exercício
● Utilizar o Browser Solidity para estimar o gas de uma
aplicação ou função
15
Ethereum background
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
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
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
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
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
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
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
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
Requerimentos de cliente
Geth
- Depende de mineração
- Roda contratos complexos
- Maior controle sobre accounts (fixos)
24
Truffle - Instalação
No terminal
# mkdir projeto1
# cd projeto1
# truffle init
app/
contracts/
migrations/
test/
truffle.js
25
Truffle - Primeiro Projeto
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
Migrations
# truffle migrate
# truffle migrate --reset
Arquivos em migrations/
27
Truffle - Deploying
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
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
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
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
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
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(){})
Roda um script externo durante a migração
deployer.exec("../caminho/para/arquivo/demo_data.js");
34
Truffle - Função exec(arquivo)
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
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
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
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
Console similar ao geth
# truffle console
truffle(default)>
39
Truffle - console
Diretamente do prompt
# truffle exec <path/to/file.js>
De dentro do console
exec <path/to/file.js>
40
Truffle - Rodando scripts externos
# 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
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
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
http://truffle.readthedocs.io/en/latest/
44
Truffle - Manual atualizado
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.
47

Mais conteúdo relacionado

Mais procurados

Primeiro Meetup Bitcoin de Joinville
Primeiro Meetup Bitcoin de JoinvillePrimeiro Meetup Bitcoin de Joinville
Primeiro Meetup Bitcoin de Joinville
emoneta
 
Treinamento em criptomoeda
Treinamento em criptomoedaTreinamento em criptomoeda
Treinamento em criptomoeda
Cesario Romeiro
 

Mais procurados (20)

Blockchain Simplificado
Blockchain SimplificadoBlockchain Simplificado
Blockchain Simplificado
 
Bitcoin e o Conceito de CriptoMoeda
Bitcoin e o Conceito de CriptoMoedaBitcoin e o Conceito de CriptoMoeda
Bitcoin e o Conceito de CriptoMoeda
 
Ethereum - Guia Básico:
Ethereum - Guia Básico:Ethereum - Guia Básico:
Ethereum - Guia Básico:
 
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticas
 
Blockchain e Aplicações Corporativas - CoinBR Summit 2016
Blockchain e Aplicações Corporativas - CoinBR Summit 2016Blockchain e Aplicações Corporativas - CoinBR Summit 2016
Blockchain e Aplicações Corporativas - CoinBR Summit 2016
 
Gerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMPGerência de Redes - 2.Modelo SNMP
Gerência de Redes - 2.Modelo SNMP
 
PHP Experience 2018 - Blockchain e PHP
PHP Experience 2018 - Blockchain e PHPPHP Experience 2018 - Blockchain e PHP
PHP Experience 2018 - Blockchain e PHP
 
TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...
 
Persistência com Realm.io
Persistência com Realm.ioPersistência com Realm.io
Persistência com Realm.io
 
Um Pouco da História Bitcoin:
Um Pouco da História Bitcoin:Um Pouco da História Bitcoin:
Um Pouco da História Bitcoin:
 
API PHP para blockchain
API PHP para blockchainAPI PHP para blockchain
API PHP para blockchain
 
JavaScript Hacks
JavaScript HacksJavaScript Hacks
JavaScript Hacks
 
TDC 2018 - Boas práticas no desenvolvimento de Smart Contracts
TDC 2018 - Boas práticas no desenvolvimento de Smart ContractsTDC 2018 - Boas práticas no desenvolvimento de Smart Contracts
TDC 2018 - Boas práticas no desenvolvimento de Smart Contracts
 
Primeiro Meetup Bitcoin de Joinville
Primeiro Meetup Bitcoin de JoinvillePrimeiro Meetup Bitcoin de Joinville
Primeiro Meetup Bitcoin de Joinville
 
Gerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMPGerenciamento de Servidores Linux utilizando SNMP
Gerenciamento de Servidores Linux utilizando SNMP
 
Treinamento em criptomoeda
Treinamento em criptomoedaTreinamento em criptomoeda
Treinamento em criptomoeda
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
 
Coroutines tech summit
Coroutines  tech summitCoroutines  tech summit
Coroutines tech summit
 
Começando com Quorum - versão 2.6
Começando com Quorum - versão 2.6Começando com Quorum - versão 2.6
Começando com Quorum - versão 2.6
 
Blockchain e Aplicações Descentralizadas
Blockchain e Aplicações DescentralizadasBlockchain e Aplicações Descentralizadas
Blockchain e Aplicações Descentralizadas
 

Destaque

A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud” A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
Fabrício Vargas Matos
 

Destaque (17)

As pessoas, os dados e a privacidade
As pessoas, os dados e a privacidadeAs pessoas, os dados e a privacidade
As pessoas, os dados e a privacidade
 
Blockchain e Aplicações Descentralizadas - Fev/2017
Blockchain e Aplicações Descentralizadas - Fev/2017Blockchain e Aplicações Descentralizadas - Fev/2017
Blockchain e Aplicações Descentralizadas - Fev/2017
 
Por trás do Bitcoin - O Blockchain
Por trás do Bitcoin - O BlockchainPor trás do Bitcoin - O Blockchain
Por trás do Bitcoin - O Blockchain
 
Os Cartórios e a nova Era Tecnológica
Os Cartórios e a nova Era TecnológicaOs Cartórios e a nova Era Tecnológica
Os Cartórios e a nova Era Tecnológica
 
A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud” A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
A tecnologia blockchain (cryptoledger) e ecossistema disruptivo “pós-cloud”
 
Registro de Informações no Blockchain da rede Bitcoin
Registro de Informações no Blockchain da rede BitcoinRegistro de Informações no Blockchain da rede Bitcoin
Registro de Informações no Blockchain da rede Bitcoin
 
Crowdsourcing, Crowdfunding & Outros tópicos
Crowdsourcing, Crowdfunding & Outros tópicosCrowdsourcing, Crowdfunding & Outros tópicos
Crowdsourcing, Crowdfunding & Outros tópicos
 
140916 Conferência Blockchain RTM - Maurício Alban-Salas - Itaú Unibanco
140916 Conferência Blockchain RTM - Maurício Alban-Salas - Itaú Unibanco140916 Conferência Blockchain RTM - Maurício Alban-Salas - Itaú Unibanco
140916 Conferência Blockchain RTM - Maurício Alban-Salas - Itaú Unibanco
 
A influência da tecnologia na compra de imóveis
A influência da tecnologia na compra de imóveisA influência da tecnologia na compra de imóveis
A influência da tecnologia na compra de imóveis
 
Workshop Bitcoin 101 - Links
Workshop Bitcoin 101 - LinksWorkshop Bitcoin 101 - Links
Workshop Bitcoin 101 - Links
 
Meetup Bitcoin Vitoria 2 - Como a blockchain funciona
Meetup Bitcoin Vitoria 2 - Como a blockchain funcionaMeetup Bitcoin Vitoria 2 - Como a blockchain funciona
Meetup Bitcoin Vitoria 2 - Como a blockchain funciona
 
140916 Conferência Blockchain RTM - Marcelo Yared - Banco Central do Brasil
140916 Conferência Blockchain RTM - Marcelo Yared - Banco Central do Brasil140916 Conferência Blockchain RTM - Marcelo Yared - Banco Central do Brasil
140916 Conferência Blockchain RTM - Marcelo Yared - Banco Central do Brasil
 
140916 Conferência Blockchain RTM - Edilson Osório Júnior - Original MY
140916 Conferência Blockchain RTM - Edilson Osório Júnior - Original MY140916 Conferência Blockchain RTM - Edilson Osório Júnior - Original MY
140916 Conferência Blockchain RTM - Edilson Osório Júnior - Original MY
 
140916 Conferência Blockchain RTM - André Mello - RTM
140916 Conferência Blockchain RTM - André Mello - RTM140916 Conferência Blockchain RTM - André Mello - RTM
140916 Conferência Blockchain RTM - André Mello - RTM
 
Cloud Sha - 256, Scrypt, Cloud Folding, x11 - Português BR:
Cloud Sha - 256, Scrypt, Cloud Folding, x11 - Português BR:Cloud Sha - 256, Scrypt, Cloud Folding, x11 - Português BR:
Cloud Sha - 256, Scrypt, Cloud Folding, x11 - Português BR:
 
Bitknock Slides - Apresentação Oficial em Português
Bitknock Slides - Apresentação Oficial em PortuguêsBitknock Slides - Apresentação Oficial em Português
Bitknock Slides - Apresentação Oficial em Português
 
Bitcoin
BitcoinBitcoin
Bitcoin
 

Semelhante a Ferramentas para desenvolvimento no blockchain Ethereum

WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
João Moura
 

Semelhante a Ferramentas para desenvolvimento no blockchain Ethereum (20)

Workshop: Ethereum e Smart contracts
Workshop: Ethereum e Smart contractsWorkshop: Ethereum e Smart contracts
Workshop: Ethereum e Smart contracts
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - Ambientes
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Vamos falar de docker
Vamos falar de dockerVamos falar de docker
Vamos falar de docker
 
Engenharia reversa de uma transação via geth
Engenharia reversa de uma transação via gethEngenharia reversa de uma transação via geth
Engenharia reversa de uma transação via geth
 
Slide curso metasploit
Slide curso metasploitSlide curso metasploit
Slide curso metasploit
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015
 
Secomp 2018 - DO Ruby ao Elixir
Secomp 2018 - DO Ruby ao ElixirSecomp 2018 - DO Ruby ao Elixir
Secomp 2018 - DO Ruby ao Elixir
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
MRTG - SNMP na Prática
MRTG - SNMP na PráticaMRTG - SNMP na Prática
MRTG - SNMP na Prática
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
Formulario eletronico
Formulario eletronicoFormulario eletronico
Formulario eletronico
 
Formulario eletronico
Formulario eletronicoFormulario eletronico
Formulario eletronico
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
 
Palestra parse
Palestra parsePalestra parse
Palestra parse
 
Privilégios de processos no OpenSolaris
Privilégios de processos no OpenSolarisPrivilégios de processos no OpenSolaris
Privilégios de processos no OpenSolaris
 
Collectd
CollectdCollectd
Collectd
 
Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 

Último

Último (8)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 

Ferramentas para desenvolvimento no blockchain Ethereum

  • 1. 1
  • 3. 3 Geth - Instalando MAC # brew update # brew upgrade # brew tap ethereum/ethereum # brew install ethereum
  • 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 Geth - Rodando Todas plataformas # geth console ou # geth attach
  • 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 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 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 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 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 Greeter - Rodando Dentro do console # greeter # greeter.address # eth.getCode(greeter.address) # greeter.greet()
  • 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. 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. Exercício ● Utilizar o Browser Solidity para estimar o gas de uma aplicação ou função 15 Ethereum background
  • 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 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 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 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 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 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. 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. 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. Requerimentos de cliente Geth - Depende de mineração - Roda contratos complexos - Maior controle sobre accounts (fixos) 24 Truffle - Instalação
  • 25. No terminal # mkdir projeto1 # cd projeto1 # truffle init app/ contracts/ migrations/ test/ truffle.js 25 Truffle - Primeiro Projeto
  • 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. Migrations # truffle migrate # truffle migrate --reset Arquivos em migrations/ 27 Truffle - Deploying
  • 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. 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. 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. 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. 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. 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. Roda um script externo durante a migração deployer.exec("../caminho/para/arquivo/demo_data.js"); 34 Truffle - Função exec(arquivo)
  • 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. 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. 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. 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. Console similar ao geth # truffle console truffle(default)> 39 Truffle - console
  • 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. # 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. 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. 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
  • 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.
  • 47. 47