# Sawtooth Lake (projeto)

Sawtooth Lake é um projeto open source da Intel que provê um framework para implementação de um livro razão distribuído. Um dos focos da plataforma é a modularização e a flexibilidade. Esse foco faz com que o Sawtooth se diferencie da Blockchain do Bitcoin, permitindo o uso em aplicações variadas como: Internet das Coisas, gerenciamento de linhas de produção e processamento de apólices de seguro. A ideia por trás da modularização é dividir os componentes do livro razão em uma "família de transações", onde cada membro da familia é responsável por uma funcionalidade de domínio específico.
Uma das primeiras famílias de transação suportadas pelo Sawtooth é o MarketPlace que estabelece o conceito de participantes, contas, valores (assets), holdings e contratos. Essa família também oferece um livro razão distribuído que facilita a distribuição dessas posses digitais. Como mencionado anteriormente, um dos focos do Sawtooth é a modularidade e, partindo desse princípio, é possível adicionar novas famílias para cobrir requisitos específicos.

## Histórico

No dia 7 de abril de 2016, a Intel revelou o seu novo livro razão distribuído e experimental. Além do código fonte, foram postadas no Github informações sobre o projeto, um tutorial para implementação do código e vários guias. No mesmo dia, uma apresentação também foi feita ao comitê do Hyperledger para introduzir o projeto. Uma semana depois, em 14 de abril, foi feita uma proposta de incubação junto ao Hyperledger. A proposta foi logo aceita dando início à fase de incubação do Sawtooth Lake no Hyperledger.

## Motivação e tarefas da incubação

Motivação
A principal motivação do projeto é desacoplar o livro razão das transações. Isso significa uma maior flexibilidade para suportar casos de usos diferentes. Outras motivações incluem:
* Famílias de transações podem fornecer suporte para diferentes modelos de dados e semânticas de transações, tornando o projeto extensível para diferentes domínios de negócio.
* Flexibilidade para uso de de diferentes protocolos de consenso, tanto para redes permissionadas quanto não-permissionadas.
Os pontos destacados também estão alinhados às motivações do Hyperledger que incuba este projeto.
Tarefas
Algumas tarefas listadas como centrais para o projeto incluem:
* Desenvolver diagramas adicionais de imagem e de texto.
* Desenvolver um tutorial explicando o desenvolvimento e teste de novas famílias de transação.
* Implementar novas famílias de transação, tanto para casos financeiros quanto para casos gerais.
* Desenvolver um explorador de Blockchain.
* Desenvolver um explorador de rede para coletar dados de topologia e estatísticas.
* Demonstrar uma interface cliente para validadores em várias linguagens de programação.
* Testes de stress, tanto para o tamanho da rede quanto para a quantidade de transações.

## Algoritmo de consenso

Partindo do princípio da modularidade, o Sawtooth abstrai o conceito de consenso das transações. Isso permite que diferentes protocolos possam ser utilizados. O Sawtooth possui dois protocolos de consenso implementados. Cada um desses protocolos são baseados nas duas principais maneiras de se estabelecer consenso em um sistema distribuído: através de uma espécie de loteria ou através de um sistema de votos. O protocolo da loteria é baseado na "Prova de Tempo Decorrido" (Proof of Elapsed Time), enquanto o protocolo de votos é uma adaptação do consenso utilizado no Ripple no Stellar (Quorum Voting).
Prova de Tempo Decorrido
Esse técnica provê um consenso de Nakamoto utilizando um ambiente de execução de código seguro (Trusted Execution Environment ou TEE). A segurança e aleatoriedade da eleição do líder é fornecida através desse ambiente de execução. Ao utilizar o tempo de espera ao invés de uma técnica de prova de trabalho, a Prova de Tempo Decorrido diminui a necessidade por hardware especializados e alto poder computacional. Isso ocorre porque o ambiente de execução seguro valida o tempo esperado pelo validador.
O processo de eleição do validador líder começa com todos os validadores "pedindo" um tempo de espera para uma função segura (presente no TEE). Depois de associado o tempo a cada validador, o que esperou menos tempo é eleito líder. A validade do tempo esperado e do tempo alocado a cada validador é garantida pelo TEE.
A Prova de Tempo Decorrido funciona como um bom algoritmo de loteria. A escolha aleatória dos líderes segue uma distribuição similar a outros algoritmos de loteria, e a probabilidade dessa escolha é proporcional à quantidade de recursos dedicados. Como os recursos são processadores gerais que suportam TEE, o custo de participação é baixo e incentiva uma população grande de validadores. Essa técnica também diminui bastante o custo energético, já que a "prova" de trabalho é somente o tempo esperado. Vale destacar que a versão atual do Sawtooth roda sobre uma camada que emula um TEE, por isso ainda não está pronto para um ambiente de produção:

## Arquitetura Geral

A arquitetura do livro razão distribuído do Sawtooth consiste de três componentes centrais: o componente do livro razão (ledger), o diário (journal) e o componente de comunicação (communication). Esses três componentes são organizados em camadas: a comunicação na base, o journal no centro e o ledger no topo. Dessa maneira, pode-se destacar que as camadas representam a hierarquia desses componentes. Por exemplo, a comunicação é a camada de mais baixo nível e serve como base para outras. Fazendo uma analogia com a Web, o HTTP serve como a camada de comunicação para vários sites. Além das camadas centrais, vale citar os componentes básicos do projeto como as Transações (Transactions) e os Blocos (Blocks).
Transações (Transactions)
Transações são séries de mudanças a serem aplicadas atomicamente ao livro razão. A transação também define o modelo e a representação dos dados.
Blocks (Blocos)
Blocos são um conjunto de transações que são aplicadas a um livro razão. Como o bloco é somente um agregador de transações, não são esperadas várias implementações diferentes para esse componente, já que é dado suporte a vários tipos de transação em um único bloco. Uma possível exceção é o requisito de ter um tratamento especial para certos blocos.
Livro Razão (Ledger)
O componente do ledger define o modelo conceitual e semântico dos tipos de transação. O ledger é dito como conceitual, porque nessa camada só são feitas as descrições do componentes, a implementação de fato é feita nas camadas inferiores do journal e de communication. Um ponto importante desta camada é que novos ledgers definem novas famílias de transações.
Diário (Journal)
Como a camada do meio, esta gerencia o consenso junto às transações. Para prover essa funcionalidade, a camada Journal inclui o modelo de transação (transaction), o modelo de um bloco de transações (block transaction), os algoritmos de consenso e um módulo de armazenamento. Diferentemente da camada do ledger, esses não são modelos conceituais, ou seja, a implementação está presente nessa camada e não em camadas inferiores.
Comunicação (Communication)
A camada de comunicação gerencia a transmissão de mensagens entre os nós da rede. Nessa camada, é implementado o protocolo de comunicação chamado gossip, suas mensagens e outros objetos relacionados à comunicação. Dentre os tipos de mensagens, pode-se destacar:
* Mensagens de transação.
* Mensagens de blocos de transação.
* Mensagens de transferência de diário.
* Mensagens de debug.
* Mensagens de conexão.
* Mensagens de desligamento.
* Mensagens de topologia.