47
1

Ferramentas para desenvolvimento no blockchain Ethereum

Embed Size (px)

Citation preview

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

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

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 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

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 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

Console similar ao geth# truffle console

truffle(default)>

39

Truffle - console

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.

47