30
Desenvolvendo aplicações reais para Blockchain Ethereum Edilson Osorio Junior OriginalMy.com Fev/2017

Workshop de desenvolvimento para blockchain Ethereum

Embed Size (px)

Citation preview

Page 1: Workshop de desenvolvimento para blockchain Ethereum

Desenvolvendo aplicações reais para Blockchain Ethereum

Edilson Osorio Junior OriginalMy.com

Fev/2017

Page 2: Workshop de desenvolvimento para blockchain Ethereum

2

AgendaTópicos que serão abordados durante o workshop

Interação Infraestrutura Desenvolvimento Segurança

Interação entre Smart-ContractsAplicações modulares e descentralizadas, conversando entre si

Avançando no desenvolvimentoDetalhes técnicos avançados, com técnicas, abordagens e desenvolvimento para blockchains

Aplicações Standalone sem InfraestruturaComo conectar sua aplicação diretamente no blockchain

Aspectos de segurançaControle de acesso, redução de custos e como o blockchain trata seu código

Page 3: Workshop de desenvolvimento para blockchain Ethereum
Page 4: Workshop de desenvolvimento para blockchain Ethereum

4Problemas (!?) do JogoO 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émons

Mercado Pokémon

Page 5: Workshop de desenvolvimento para blockchain Ethereum

5

O Blockchain em Pokémon GoSeguranç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árioPermite 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

Page 6: Workshop de desenvolvimento para blockchain Ethereum

6

Aplicações modulares e descentralizadasAplicações monolíticas? Esqueça isso.

São o insumo da plataformaEmissã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

Page 7: Workshop de desenvolvimento para blockchain Ethereum

7

Aplicações StandaloneP2P 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 criptografadaAcesso 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

Page 8: Workshop de desenvolvimento para blockchain Ethereum

Vamos falar de programação? 15 dicas de desenvolvimento

Page 9: Workshop de desenvolvimento para blockchain Ethereum

Structs e Mappings9

Sempre que possível acompanhe um Struct com um Mapping como índice

struct PokemonMaster { address pokeMaster; uint[] pokemons; }

mapping (address => uint256) public pokeOwnerIndex;

Page 10: Workshop de desenvolvimento para blockchain Ethereum

Structs ou Mappings10

É 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

Page 11: Workshop de desenvolvimento para blockchain Ethereum

Arrays11

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)

Page 12: Workshop de desenvolvimento para blockchain Ethereum

Índices de índices podem ser um problema12

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

Page 13: Workshop de desenvolvimento para blockchain Ethereum

Arrays13

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;

Page 14: Workshop de desenvolvimento para blockchain Ethereum

Interação entre contratos14

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) { } };

Page 15: Workshop de desenvolvimento para blockchain Ethereum

Interação entre contratos15

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); }

Page 16: Workshop de desenvolvimento para blockchain Ethereum

Modifiers16

Funções que adicionam funcionalidades a outra função

modifier onlyOwner { if (msg.sender != owner) throw; _; }

function stopSale(address pokeSellerAddress, uint pokemonID) onlyOwner {

Page 17: Workshop de desenvolvimento para blockchain Ethereum

Oculte tudo aquilo que não é público17

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 {

Page 18: Workshop de desenvolvimento para blockchain Ethereum

Eventos de Log as vezes são úteis18

event Log1(uint number); event Log2(string message);

Page 19: Workshop de desenvolvimento para blockchain Ethereum

Envio de transações19

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

Page 20: Workshop de desenvolvimento para blockchain Ethereum

Mensagens de erro nem sempre ajudam20

Page 21: Workshop de desenvolvimento para blockchain Ethereum

Browser Solidity21

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

Page 22: Workshop de desenvolvimento para blockchain Ethereum

Browser Solidity22

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/

Page 23: Workshop de desenvolvimento para blockchain Ethereum

Controle e acesso central ou por wallet23

Depende do seu modelo de negócio

Page 24: Workshop de desenvolvimento para blockchain Ethereum

Controle de acesso sempre24

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;

Page 25: Workshop de desenvolvimento para blockchain Ethereum

Crie whitelists e/ou blacklists25

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

Page 26: Workshop de desenvolvimento para blockchain Ethereum

26

Não esqueçaBlockchain 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

Page 27: Workshop de desenvolvimento para blockchain Ethereum

27

Revisando o WorkshopCom 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 únicosAtivos únicos e exclusivos (ou

não) para a sua plataforma

Criar um marketplace/exchangeVocê 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

Page 28: Workshop de desenvolvimento para blockchain Ethereum

Onde eu encontro os códigos e exemplos apresentados? https://github.com/eddieoz

truffle-mercado-pokemon

Licença MIT

Page 29: Workshop de desenvolvimento para blockchain Ethereum

A transfer of trust in a trustless world

Workshop Ethereum Básico para Desenvolvedores Fev/2017

Edilson Osorio Junior

originalmy.com [email protected] @eddieoz fb.com/osoriojr github.com/eddieoz

Page 30: Workshop de desenvolvimento para blockchain Ethereum