Apresentamos o desenvolvimento para blockchain Ethereum utilizando:
- Solidity Browser
- Geth
- Mist
- Trufffle
Utilizando o Mercado Pokémon como plataforma de exemplo.
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
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
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
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.