Upload
originalmycom
View
81
Download
4
Embed Size (px)
Citation preview
Desenvolvendo aplicações reais para Blockchain Ethereum
Edilson Osorio Junior OriginalMy.com
Fev/2017
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
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
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
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
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
Vamos falar de programação? 15 dicas de desenvolvimento
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;
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
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)
Í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
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;
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) { } };
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); }
Modifiers16
Funções que adicionam funcionalidades a outra função
modifier onlyOwner { if (msg.sender != owner) throw; _; }
function stopSale(address pokeSellerAddress, uint pokemonID) onlyOwner {
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 {
Eventos de Log as vezes são úteis18
event Log1(uint number); event Log2(string message);
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
Mensagens de erro nem sempre ajudam20
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
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/
Controle e acesso central ou por wallet23
Depende do seu modelo de negócio
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;
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
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
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
Onde eu encontro os códigos e exemplos apresentados? https://github.com/eddieoz
truffle-mercado-pokemon
Licença MIT
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