ferramentas para desenvolvimento no blockchain ethereum
Post on 11-Jan-2017
111 Views
Preview:
TRANSCRIPT
3
Geth - Instalando
MAC# brew update# brew upgrade# brew tap ethereum/ethereum# brew install ethereum
4
Geth - Instalando
Windowshttps://build.ethdev.com/builds/Windows%20Go%20master%20branch/
# 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
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 blockchainEx.: ["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 dadosTransaçõ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 carregadoExercício: Carregar o contrato PokeCoin no Mist e distribuir as moedas entre contasExercício2: Acessar o contrato PokeCoin pelo console e distribuir moedas pelo consoleExercí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
RequerimentosNodeJS 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 clienteEthereumJS 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 clienteGeth
- 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.js25
Truffle - Primeiro Projeto
Nomes de contrato como nomes de arquivo# MyContract.solcontract MyContract { ...}// oulibrary MyContract { ...}
Dependências usando import do Solidityhttp://solidity.readthedocs.io/en/latest/layout-of-source-files.html#importing-other-source-files
Artifactsem build/contracts para uso interno do truffle e não devem ser alterados 26
Truffle - Convenções
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 simplesdeployer.deploy(A);
Deploy um contrato simples com argumentosdeployer.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çãodeployer.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
Diretamente do prompt# truffle exec <path/to/file.js>
De dentro do consoleexec <path/to/file.js>
40
Truffle - Rodando scripts externos
# truffle watchLê o filesystem por alterações em arquivos e recompila automaticamente os que sofreram alteração
# truffle serveLê 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 EthereumEthereum Básico para Desenvolvedores - Fev/2017
www.originalmy.com contato at originalmy.com @originalmycom fb.com/originalmycom
Edilson Osorio Jr.
top related