O documento discute o desenvolvimento de aplicações descentralizadas na blockchain Ethereum. Ele aborda tópicos como interação entre contratos inteligentes, desenvolvimento de aplicações modulares e standalone, e aspectos de segurança. O documento também apresenta exemplos de como o blockchain poderia ser aplicado em um jogo como Pokémon Go para permitir a troca e venda de itens e Pokémons de forma descentralizada e segura.
2. 2
Agenda
Tópicos que serão abordados durante o workshop
Interação Infraestrutura Desenvolvimento Segurança
Interação entre Smart-Contracts
Aplicações modulares e descentralizadas,
conversando entre si
Avançando no desenvolvimento
Detalhes técnicos avançados, com técnicas,
abordagens e desenvolvimento para blockchains
Aplicações Standalone sem
Infraestrutura
Como conectar sua aplicação
diretamente no blockchain
Aspectos de segurança
Controle de acesso, redução de
custos e como o blockchain trata
seu código
4. 4
Problemas (!?) do Jogo
O que falta em Pokémon Go?
Não é possível trocar
Pokémons e outros itens
por coisas de interesse ou
Pokecoins
Trocar Pokémons
O jogo não permite que
os usuários coloquem
seus artigos a venda
Vender artigos e
PokémonsMercado
Pokémon
5. 5
O Blockchain em Pokémon Go
Segurança - Transparência - Contabilidade
Lançamento de
Pokémons
Permite o controle de
quantos pokémons são
disponibilizados e para
quem
Emissão de
(cripto)moeda
Utiliza uma moeda própria
(pokecoin) para as
transações de compra e
venda
Mercado Global
interno e secundário
Permite a compra e venda
de pokémons em um
marketplace dedicado ou
através de aplicativos
Reduz problemas
com infraestrutura
Infraestrutura utilizada seja
distribuída e
descentralizada,
desafogando o tráfego em
nós dedicados
6. 6
Aplicações modulares e descentralizadas
Aplicações monolíticas? Esqueça isso.
São o insumo da plataforma
Emissão de Pokecoins
Cada pokémon, com seus
atributos exclusivos
Pokémons
Cada treinador é
identificado, junto com seu
catálogo de pokémons
Treinadores
Local onde você compra e
vende os bichinhos virtuais
Mercado Pokémon
Garante que cada transação
aconteceu com transparência,
imutabilidade e
rastreabilidade
Blockchain
7. 7
Aplicações Standalone
P2P sem possibilidade de bloqueio
Dependendo do seu modelo de negócio, a sua
aplicação não precisa de infraestrutura além
da que o blockchain proporciona.
Aplicações que funcionam sozinhas
Economia com infraestrutura e
fornecimento de API's
HMTL, Javascript, CSS, Bootstrap,
Angular
Acompanhe todas as transações
Alcance global sem intermediários
Pode ajudar pequenos
negócios $$
Toda a comunicação intra-software
acontece diretamente no blockchain
e pode ser criptografada
Acesso em nível global,
sem risco de DoS ou
ataques de negação
A sua aplicação pode depender apenas de
um html ou uma aplicação mobile
compartilhada no P2P
9. Structs e Mappings
9
Sempre que possível acompanhe um Struct com um Mapping como índice
struct PokemonMaster {
address pokeMaster;
uint[] pokemons;
}
mapping (address => uint256) public pokeOwnerIndex;
10. Structs ou Mappings
10
É possível fazer um mapping de um struct.
Ex.: mapping(address => PokemonMaster) public pokemons
Struct permite alterar apenas um item do registro (array)
Mapping tem que recarregar o array inteiro para substituir um item
11. Arrays
11
O Blockchain NUNCA apaga uma informação, nem quando você manda excluir
um item de um array
array[] = [ 1, 2, 3, 4 ]
delete array[3];
array[] = [ 1, 2, 0, 4 ]
Possíveis soluções: reorganizar o array a custo de gas ou inserir novos dados no gap (0)
12. Índices de índices podem ser um problema
12
Criar índices de índices muitas vezes não funciona pois o primeiro item sempre é zero,
e o blockchain substitui itens de array por zero quando excluídos.
Então algumas vezes é necessário gravar algum dado descartável no primeiro item e
administrar o array a partir do item 1
13. Arrays
13
A função array.push nem sempre é a melhor alternativa
array[] = [ 1, 2, 3, 4 ]
array.push(5);
array[] = [ 1, 2, 3, 4, 0, 5 ]
Como contornar?
uint arrayLength = array.length++;
array[arrayLength] = novoItem;
14. Interação entre contratos
14
Prototipe no cabeçalho as funções dos outros contratos que você deseja chamar
contract pokeCoinContract { mapping (address => uint256) public balanceOf; function
transferFrom(address _from, address _to, uint256 _value){ } };
contract pokeCentralContract { mapping (uint256 => address) public pokemonToMaster; function
transferPokemon(address _from, address _to, uint256 _pokemonID) { } };
15. Interação entre contratos
15
Na área pública do contrato você prototipa as variáveis
pokeCoinContract public pokeCoin;
pokeCentralContract public pokeCentral;
E em uma chamada você aponta os endereços dos contratos
function pokeMarket(pokeCoinContract pokeCoinAddress, pokeCentralContract pokeCentralAddress) {
pokeCoin = pokeCoinContract(pokeCoinAddress);
pokeCentral = pokeCentralContract(pokeCentralAddress);
}
16. Modifiers
16
Funções que adicionam funcionalidades a outra função
modifier onlyOwner {
if (msg.sender != owner) throw;
_; }
function stopSale(address pokeSellerAddress, uint pokemonID) onlyOwner {
17. Oculte tudo aquilo que não é público
17
Se não é necessário que a variável seja pública, não a torne pública
O mesmo serve para funções
function cleanArray(uint[] pokeList) onlyOwner internal returns (uint[]) {
function addPokemonToSellingList(uint pokemonID) onlyOwner internal {
18. Eventos de Log as vezes são úteis
18
event Log1(uint number);
event Log2(string message);
19. Envio de transações
19
Sempre que possível determine a quantidade de gas e o preço
pokeMarket.newSale('0x'+accountAddress, pokeIDSell, pokePriceSell, {value: 0, gas: 290654, gasPrice: 20000000000}
Utilize o Mist ou Browser Solidity para calcular o gasto médio de gas
21. Browser Solidity
21
Muito bom para depurar transações
Mostra o custo da transação em gas
Conecta e lança contratos no blockchain
Não mostra conteúdo de array
22. Browser Solidity
22
Lento para contratos extensos
Ruim para trabalhar com múltiplos contratos simult.
Precisa rodar localmente para conectar no seu node
https://ethereum.github.io/browser-solidity/
23. Controle e acesso central ou por wallet
23
Depende do seu modelo de negócio
24. Controle de acesso sempre
24
contract accessControlled {
address public owner;
function owned() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
/* o caracter "_" é substituído pelo corpo da funcao onde o modifier é utilizado */
_
}
function transferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
}
contract pokeMarket is accessControlled {
if (pokeBuyerAddress == pokeCentral.pokemonToMaster(pokemonID)) throw;
25. Crie whitelists e/ou blacklists
25
mapping (address => bool) public frozenAccount;
/* Token Rules */
function freezeAccount(address target, bool freeze) onlyOwner {
frozenAccount[target] = freeze;
FrozenFunds(target, freeze);
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
// In case of whitelist instead of blacklist, change all frozen/freeze to approve
if (frozenAccount[msg.sender]) throw;
* contribuição com o Ethereum
26. 26
Não esqueça
Blockchain serve para muita coisa, mas não serve para tudo
1 Aplicações com volumes muito grandes de transações podem gerar alto
custo. Registros complexos também aumentam o preço
2 Tudo que você registrar no Blockchain se torna público
3 Criar aplicações para blockchain precisa de um novo mindset
4 Abuse dos controles de segurança e pesquise sempre
27. 27
Revisando o Workshop
Com os códigos e a plataforma apresentada você aprendeu a fazer:
Modelos de
negócio criativos
Dependem unicamente
da sua capacidade de
materializar ideias
Criar uma moeda própria
Essa moeda pode ser usada
livremente, dentro ou fora da
sua aplicação
Criar ativos únicos
Ativos únicos e exclusivos (ou
não) para a sua plataforma
Criar um marketplace/exchange
Você aprendeu a criar um
ambiente real para a livre
negociação dos seus ativos.
Criar e administrar contas/wallets
Como criar, identificar e
administrar seus usuários
através de contas no blockchain
Programação avançada no Ethereum
De um html standalone a diversas
abordagens avançadas para
desenvolver uma aplicação
descentralizada muito melhor
Redução de custos
Você aprendeu formas de analisar
os custos de desenvolvimento e
infraestrutura com blockchain,
além de como otimizá-los
28. Onde eu encontro os
códigos e exemplos
apresentados? https://github.com/eddieoz
truffle-mercado-pokemon
Licença MIT
29. A transfer of trust in a
trustless world
Workshop Ethereum Básico para Desenvolvedores
Fev/2017
Edilson Osorio Junior
originalmy.com osoriojr@originalmy.com @eddieoz fb.com/osoriojr github.com/eddieoz