SlideShare uma empresa Scribd logo
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
FOHAT
Blockchain Curitiba
Curitiba.js
FOHAT
Meetup Blockchain Curitiba
fohat.co
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
DApp
Aplicação frontend
Smart Contract
Regra de Negócio
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Similar à uma classe, que possui métodos e atributos
● Identificado por um endereço próprio (0x71c20d...9ec0)
● Executa regras contratuais definidas em código
● Escritos em linguagem de alto nível (Solidity ou outras)
● Compilados em bytecode
● A EVM consome gas para executar as operações do contrato
tipagem estática
● Public: podem ser chamadas por funções do próprio contrato, de contratos
herdados ou por usuários externos.
● External: podem ser acessadas somente externamente, não sendo possível ser
chamada pelo próprio contrato.
● Private: podem ser acessadas somente pelo próprio contrato.
● Internal: podem ser acessadas pelo próprio contrato e por contratos herdados.
Mantenha suas funções private ou internal,
a menos que haja necessidade de interação externa.
● Memory: utilizada para valores temporários.
É apagada entre execuções distintas e é barata.
● Storage: utilizada para armazenar variáveis de estado do contrato.
É mais cara pois é gravada no blockchain.
Variáveis locais (memory) e de estado (storage) serão sempre
públicas para leitura, mesmo se marcadas como private.
● view: função que não modifica o estado na blockchain
● pure: função que não lê e não modifica o estado na blockchain
● payable: permite que o contrato receba ETH na execução da função
● transfer() lança erro e para a execução caso haja falta de gas
● send() retorna false e deixa que você trate o erro
Caso usar send(), NÃO ESQUEÇA DE TRATAR O RETORNO!!!
Enviando ETH:
=
● Aquela que não deve
ser nomeada
● Não possui argumentos
● E não retorna nada!
E pra que serve então???
● É executada quando o contrato recebe ETH
● Ou quando se tenta executar uma função de nome inválido no contrato
● Sem fallback function, o ETH enviado será rejeitado
● Um fallback executa com 2300 de *gas
○ Gas insuficiente para trabalhar com variáveis em STORAGE
○ Basicamente o que dá pra fazer é emitir um evento,
informando que recebeu ETH
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Um fallback pode executar com mais gas, caso isso fique explícito
● No caso de um contrato enviar ETH para outro, pode chamar a
função addr.call.value(x)()
○ Dessa forma, o fallback pode fazer operações mais caras
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Indentação: 4 espaços por nível
● Tabs ou Espaços? Espaços
● Tamanho máximo de linha: 79 ou 99 caracteres
● Estruturas de controle, declaração de funções e variáveis
● Funções modifiers
● Convenções de nomenclatura
● imports no topo do contrato
● Ordem de declaração das funções
● Basicamente o recomendado é seguir a PEP 8
● Blocos possuem um limite de gas para as transações dentro dele
● Tomar cuidado com loops de tamanho variável
● Não se aplica a view e pure functions
● Porém, quando uma view ou pure function é chamada a partir
de uma transação, ela também consome gas
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● O consumo de gas tem impacto direto na estrutura
de custos da organização
● Por isso, otimize seus contratos
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Corresponde a instrução SSTORE
● 20.000 de gas para guardar novos dados
● 5.000 de gas pra alterar dados *
○ Com exceção de uma alteração que zera um dado (Gas refund)
Recomendação:
Escreva o mínimo possível na storage
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
106.297 gas 100.123 gas
● EVM armazena as variáveis em slots de 32 bytes
● Variáveis que ocupam espaço menor são “empacotadas”
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Evitar usar um contrato para armazenamento de dado somente
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Operações que alteram o estado da blockchain são caras
○ Ex: Criar contratos, guardar dados em um contrato.
● Para incentivar as pessoas a liberarem espaço que não será mais
utilizado, a EVM implementa o mecanismo de Gas Refund
● Duas operações que reembolsam gas:
○ SUICIDE: “matar” o smart contract. Devolve 24.000 gas.
○ SSTORE: Apagar dados do contrato. Devolve 15.000.
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
“Everyone here is a target for attack. Be paranoid.”
Martin Swende (DEVCON3)
● Se houver um bug, não é possível atualizar e corrigir o código
● Qualquer erro pode levar a consequências terríveis
● Disneylândia para hackers
○ Baixo esforço, altos retornos e baixo risco
● Todo o ecossistema está amadurecendo em termos de segurança
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● O contrato não deve enviar Ether durante uma alteração de estado
○ Recomendado: Salvar o saldo dos usuários em um mapping (address => uint)
○ Usuário realiza o saque do saldo através de uma função específica
● King of Ether Hack
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Um contrato (A) pode chamar outro contrato (B) e transferir o controle de
Ether para o contrato (B), possibilitando que (B) chame (A) novamente
antes que essa interação seja concluída.
Isso permite que o contrato (B) possa realizar um loop recursivo,
utilizando a função fallback, por exemplo.
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Contrato de Ataque
The DAO hack
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Tipos de dados de tamanho fixo para inteiros na EVM
● As variáveis podem ser exploradas para resultar em números fora do
intervalo do tipo de dados que os armazena
● Um uint8, por exemplo, só pode armazenar números no intervalo [0..255].
Tentar armazenar 256 em um uint8 resultará em 0
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
SafeMath Library
OpenZeppelin
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
● Testnet é uma rede de testes pública do Ethereum
● É gratuita, porém insegura
● Na testnet:
○ Ethers são fáceis de serem obtidos
○ Ethers não possuem valor como criptomoeda
Faça deploy e teste os seus contratos na testnet
antes de utilizar em produção na mainnet.
Ganache
goo.gl/bGonkq goo.gl/ZXqTvNe goo.gl/dELuzR goo.gl/cp6u9hgoo.gl/gJxR16
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019
Code Review
SOLIDIFIEDZeppelinMythrill
• github.com/ethereum/wiki/wiki
• solidity.readthedocs.io
• ethdocs.org
www.fohat.co
Obrigado!
andre@fohat.co
@aferreira44
@aferreira44
@aferreira44
rafael@fohat.co
@capaci
@capacirafael
@rafaelcapaci
Link dos slides:
bit.ly/smart-contracts-tdc-2019

Mais conteúdo relacionado

PDF
TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...
PDF
Comparação Sintaxe Portugol vs Java
PPTX
Geca - Encontro 0
PDF
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
PPTX
Interfaces reativas com ReactiveUI no Xamarin.Forms
PDF
Minicurso Node.js fullstack IFCE - 2015-11-28
PDF
Event-based Asynchronous Pattern (EAP)
PDF
Introdução ao Node.js
TDC2017 | São Paulo - Trilha Blockchain How we figured out we had a SRE team ...
Comparação Sintaxe Portugol vs Java
Geca - Encontro 0
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
Interfaces reativas com ReactiveUI no Xamarin.Forms
Minicurso Node.js fullstack IFCE - 2015-11-28
Event-based Asynchronous Pattern (EAP)
Introdução ao Node.js

Semelhante a Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019 (17)

PDF
TDC 2018 - Boas práticas no desenvolvimento de Smart Contracts
PDF
Blockchain além do Hello World
PDF
Workshop: Ethereum e Smart contracts
PPT
Gerência de Transações Distribuídas de Consultas
PDF
Workshop de desenvolvimento para blockchain Ethereum
PDF
Camada rede
PDF
Blockchain - Smart Contracts - Meetup
PDF
Ferramentas para desenvolvimento no blockchain Ethereum
PPTX
Amazon EC2 boas praticas e otimizações de desempenho
PDF
programacao orientada a objetos - curso_comparativo_poo_3_5.pdf
PDF
Rethinking main memory oltp recovery
PDF
06 it-curso gxxbr
PDF
Banco de Dados 2: Controle de Concorrência
PPTX
Introdução ao Git
PDF
Blockchain 2.0 - O Bitcoin além do dinheiro digital
PDF
Lista 03 respostas
PPT
ASP.Net Módulo 2
TDC 2018 - Boas práticas no desenvolvimento de Smart Contracts
Blockchain além do Hello World
Workshop: Ethereum e Smart contracts
Gerência de Transações Distribuídas de Consultas
Workshop de desenvolvimento para blockchain Ethereum
Camada rede
Blockchain - Smart Contracts - Meetup
Ferramentas para desenvolvimento no blockchain Ethereum
Amazon EC2 boas praticas e otimizações de desempenho
programacao orientada a objetos - curso_comparativo_poo_3_5.pdf
Rethinking main memory oltp recovery
06 it-curso gxxbr
Banco de Dados 2: Controle de Concorrência
Introdução ao Git
Blockchain 2.0 - O Bitcoin além do dinheiro digital
Lista 03 respostas
ASP.Net Módulo 2
Anúncio

Último (8)

PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Mecânico de Manutenção de Equipamentos.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Arquitetura de computadores - Memórias Secundárias
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Manejo integrado de pragas na cultura do algodão
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Viasol Energia Solar -Soluções para geração e economia de energia
Mecânico de Manutenção de Equipamentos.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Anúncio

Boas práticas no desenvolvimento de smart contracts, The Dev Conf - TDC SP 2019

  • 8. ● Similar à uma classe, que possui métodos e atributos ● Identificado por um endereço próprio (0x71c20d...9ec0) ● Executa regras contratuais definidas em código ● Escritos em linguagem de alto nível (Solidity ou outras) ● Compilados em bytecode ● A EVM consome gas para executar as operações do contrato
  • 10. ● Public: podem ser chamadas por funções do próprio contrato, de contratos herdados ou por usuários externos. ● External: podem ser acessadas somente externamente, não sendo possível ser chamada pelo próprio contrato. ● Private: podem ser acessadas somente pelo próprio contrato. ● Internal: podem ser acessadas pelo próprio contrato e por contratos herdados.
  • 11. Mantenha suas funções private ou internal, a menos que haja necessidade de interação externa.
  • 12. ● Memory: utilizada para valores temporários. É apagada entre execuções distintas e é barata. ● Storage: utilizada para armazenar variáveis de estado do contrato. É mais cara pois é gravada no blockchain.
  • 13. Variáveis locais (memory) e de estado (storage) serão sempre públicas para leitura, mesmo se marcadas como private.
  • 14. ● view: função que não modifica o estado na blockchain ● pure: função que não lê e não modifica o estado na blockchain ● payable: permite que o contrato receba ETH na execução da função
  • 15. ● transfer() lança erro e para a execução caso haja falta de gas ● send() retorna false e deixa que você trate o erro Caso usar send(), NÃO ESQUEÇA DE TRATAR O RETORNO!!!
  • 17. ● Aquela que não deve ser nomeada ● Não possui argumentos ● E não retorna nada! E pra que serve então???
  • 18. ● É executada quando o contrato recebe ETH ● Ou quando se tenta executar uma função de nome inválido no contrato
  • 19. ● Sem fallback function, o ETH enviado será rejeitado ● Um fallback executa com 2300 de *gas ○ Gas insuficiente para trabalhar com variáveis em STORAGE ○ Basicamente o que dá pra fazer é emitir um evento, informando que recebeu ETH
  • 21. ● Um fallback pode executar com mais gas, caso isso fique explícito ● No caso de um contrato enviar ETH para outro, pode chamar a função addr.call.value(x)() ○ Dessa forma, o fallback pode fazer operações mais caras
  • 24. ● Indentação: 4 espaços por nível ● Tabs ou Espaços? Espaços ● Tamanho máximo de linha: 79 ou 99 caracteres ● Estruturas de controle, declaração de funções e variáveis ● Funções modifiers ● Convenções de nomenclatura ● imports no topo do contrato ● Ordem de declaração das funções ● Basicamente o recomendado é seguir a PEP 8
  • 25. ● Blocos possuem um limite de gas para as transações dentro dele ● Tomar cuidado com loops de tamanho variável ● Não se aplica a view e pure functions ● Porém, quando uma view ou pure function é chamada a partir de uma transação, ela também consome gas
  • 27. ● O consumo de gas tem impacto direto na estrutura de custos da organização ● Por isso, otimize seus contratos
  • 29. ● Corresponde a instrução SSTORE ● 20.000 de gas para guardar novos dados ● 5.000 de gas pra alterar dados * ○ Com exceção de uma alteração que zera um dado (Gas refund)
  • 30. Recomendação: Escreva o mínimo possível na storage
  • 36. ● EVM armazena as variáveis em slots de 32 bytes ● Variáveis que ocupam espaço menor são “empacotadas”
  • 39. ● Evitar usar um contrato para armazenamento de dado somente
  • 42. ● Operações que alteram o estado da blockchain são caras ○ Ex: Criar contratos, guardar dados em um contrato. ● Para incentivar as pessoas a liberarem espaço que não será mais utilizado, a EVM implementa o mecanismo de Gas Refund ● Duas operações que reembolsam gas: ○ SUICIDE: “matar” o smart contract. Devolve 24.000 gas. ○ SSTORE: Apagar dados do contrato. Devolve 15.000.
  • 44. “Everyone here is a target for attack. Be paranoid.” Martin Swende (DEVCON3)
  • 45. ● Se houver um bug, não é possível atualizar e corrigir o código ● Qualquer erro pode levar a consequências terríveis ● Disneylândia para hackers ○ Baixo esforço, altos retornos e baixo risco ● Todo o ecossistema está amadurecendo em termos de segurança
  • 47. ● O contrato não deve enviar Ether durante uma alteração de estado ○ Recomendado: Salvar o saldo dos usuários em um mapping (address => uint) ○ Usuário realiza o saque do saldo através de uma função específica ● King of Ether Hack
  • 50. Um contrato (A) pode chamar outro contrato (B) e transferir o controle de Ether para o contrato (B), possibilitando que (B) chame (A) novamente antes que essa interação seja concluída. Isso permite que o contrato (B) possa realizar um loop recursivo, utilizando a função fallback, por exemplo.
  • 55. ● Tipos de dados de tamanho fixo para inteiros na EVM ● As variáveis podem ser exploradas para resultar em números fora do intervalo do tipo de dados que os armazena ● Um uint8, por exemplo, só pode armazenar números no intervalo [0..255]. Tentar armazenar 256 em um uint8 resultará em 0
  • 61. ● Testnet é uma rede de testes pública do Ethereum ● É gratuita, porém insegura ● Na testnet: ○ Ethers são fáceis de serem obtidos ○ Ethers não possuem valor como criptomoeda
  • 62. Faça deploy e teste os seus contratos na testnet antes de utilizar em produção na mainnet.