# SegWit

SegWit ou Segregated Witness (Testemunha Segregada), é uma proposta de mudança nas regras do software que rege o protocolo Bitcoin. Teve como objetivo sanar os problemas relacionados a maleabilidade de transações,aumentar a capacidade máxima do bloco e implementar recursos necessários para o suporte a outras aplicações como a Lightning Network (Rede Relâmpago). SegWit se caracteriza como um Soft Fork, isto é, um enrijecimento das regras do protocolo que leva a uma retrocompatibilidade com os antigos blocos da rede. Logo, ao contrário dos Hard Forks, seu ativamento não provoca a criação de uma nova blockchain. Sua ativação foi resultado de um consenso entre os usuários na rede Bitcoin, sendo necessário mais de 95% de aprovação da comunidade pela mudança. No dia 24 de Agosto de 2017, o SegWit foi ativado na rede principal do Bitcoin.

## Maleabilidade

Uma transação no protocolo Bitcoin é identificado por um número hexadecimal de 64 dígitos chamado de txid (Transaction ID). Este número é gerado usando as informações do endereço Bitcoin do destinatário e as moedas que estão sendo gastas. O txid(ID de Transação) pode ser usado para rastrear informações sobre a transação na blockchain tais como a quantidade de Bitcoin enviados, os endereços de envio e recebimento das moedas e a data da transferência. Contudo, a maneira como o txid é calculado permite que qualquer um possa fazer pequenas alterações na transação. Estas modificações não mudam o valor de Bitcoins sendo gastos, seu destino ou endereço de origem. Porém, afetam o ID de transação. Como exemplo, imagine que as seguintes transações ocorram dentro de um curto período de tempo:
Exemplo:
* Ana realiza o pagamento de 1 bitcoin a Roberto.
* Roberto usa o txid vindo da transação de Ana para pagar 1 bitcoin José.
* Se a transação entre Ana e Roberto for incluída na blockchain usando um txid diferente do informado por Roberto a José, esta última transação se tornará inválida. Caso José tenha oferecido um serviço ou enviado um produto a Roberto, Roberto poderia agir de má fé e não refazer a transação usando o txid válido.
Este problema poderia ser evitado caso José esperasse por algumas confirmações na blockchain antes de realizar sua parte da transação. Contudo, carteiras de bitcoin necessitavam de código extra para lidar com este problemas. Em meados de 2015, a rede bitcoin sofreu alguns ataques baseados na maleabilidade de endereços.
Devido ao problema de maleabilidade nas transações, não é possível criar serviços que dependem ou utilizem múltiplas transações não-confirmadas em sequência, pois uma mudança no ID de Transação pode acabar quebrando o resto da corrente de transações. Isto se torna um grande problema para os Contratos Inteligentes (Smart Contracts) e diversas outras aplicações mais avançadas como:
* Rede Relâmpago, aumentando enormemente o número de transações por segundo;
* Trocas Atômicas(Atomic Swaps) entre diferentes criptomoedas;
* Assinatura de Schnorr, que iriam prover outro aumento na capacidade de transações por bloco;
* MAST(Merkelized Abstract Syntax Trees), uma forma de aprimorar contratos inteligentes (Smart Contracts);
* TumbleBit, um rede de segunda camada anônima;

## Solução

Segwit define a criação de uma nova estrutura no bloco de transação chamada Testemunha("Witness"). Esta estruturada é separada da árvore de merkle das transações, que contém as informações sobre as transações presentes no bloco. A estrutura Testemunha contém dados necessários para realizar a checagem e validação das transações, porém não possui dados relacionados aos efeitos da transação, como por exemplo o valor gasto em Bitcoins e o endereço de envio das moedas. Esta mudança garante que o ID da transação permaneça o mesmo, tornando as transações não-maleáveis. Com isto, protocolos e serviços que usam Contratos Inteligentes(Smart Contracts) ou que juntam múltiplas transações em um corrente de transações podem usar o SegWit para proteger seu serviço dos ataques de maleabilidade.
Além disso, assinaturas e scripts que são deslocados para a estrutura Testemunha, fazem com que estes dados não sejam levados em consideração na contagem do limite tradicional de 1 MB por bloco da rede. Ao invés disso, um novo parâmetro é introduzido para realizar a contagem, uma unidade de peso. Blocos então podem ser formados por até 4 milhões de unidades de peso, 1 byte na antiga região do bloco equivalem a 4 unidades de peso, porém 1 byte na região "Testemunha" só possui 1 unidade de peso. Isso permite que os blocos possam conter um tamanho maior do que os 1 Megabytes originais sem a necessidade de um Hard Fork, podendo possuir um tamanho efetivo de mais de 2,7 megabytes.

## Ativação

Para que um Soft Fork ou Hard Fork seja ativado, é preciso haver um consenso na rede sobre qual versão do software do Bitcoin será utilizada. A forma de ativação escolhida para o SegWit foi o MASF(Miner Activated Soft Fork), descrito pelo BIP 9 (Bitcoin Improvement Proposal). De acordo com o BIP 9, a atualização começará a ser implantada a partir de uma data inicial e a cada 2016 blocos (em torno de 2 semanas) é feita a quantificação de quantos mineradores sinalizaram acordo sobre a mudança das regras. No caso do SegWit, um minerador indicava acordo com as mudanças sinalizando com o número 1 no campo de versão do bloco, dando assim prova de sua concordância. Para que o SegWit fosse ativado com sucesso, mais de 95% dos mineradores deveriam mostrar acordo entre um período de 2016 blocos (em torno de 2 semanas). Contudo, na ativação através do BIP 9 também existe uma data final definida. Se, até a data final, não houvesse consenso suficiente por parte dos mineradores, a mudança não seria adotada. A data de início do SegWit foi de Novembro de 2016 e se estenderia até Novembro de 2017. No dia 24 de Agosto de 2017, o SegWit foi ativado na rede principal do Bitcoin.

## Endereços SegWit

Endereços SegWit são diferentes dos endereços tradicionais usados no Bitcoin. Existem 2 formatos diferentes para os Endereços SegWit. Um destes formatos é empacotado dentro de um P2SH(Pay To Script Hash), estes endereços começam com um "3" e se parecem com um endereço MultiSig. Este tipo de endereço pode ser usado em qualquer carteira, tenha ela suporte para transações SegWit ou não. No BIP 173, foi introduzido um segundo formato para endereços SegWit chamado Bech32. Neste formato, os endereços começam com os dígitos "bc1". O Bech32 não é empacotado em um P2SH(Pay To Script Hash), sendo considerado uma implementação nativa de SegWit.

## Carteiras

Para usufruir dos benefícios trazidos pela implementação do SegWit, se faz necessário o uso de uma carteira que adote esta implementação. Ao gastar bitcoins através de endereços SegWit, o valor nas taxas de transações passam a ser menores do que as taxas de um endereço Bitcoin tradicional. Isto ocorre porque a parte da transação que contem a assinatura (a "Testemunha") não precisa ser acessada rapidamente, logo SegWit permite aos mineradores armazenar até 4 vezes mais bytes com informações de assinaturas em um bloco. Isto melhora a eficiência na criação de um bloco de transação, reduzindo os custos operacionais do sistema que gera os blocos, e por sua vez, reduzindo os custos com taxas de transação.
Na tabela abaixo estão algumas carteiras que possuem suporte a endereços Segwit.
Carteiras :
| Android | Ios | Desktop | Hardware | Paper Wallet |
| GreenAdress | GreenAdress | Electrum | Ledger Nano S | segwitaddress |
| Electrum | | mSIGNA | Trezor | |
| Samourai | | Carteira Bitcoin Core | | |

## Adoção

Depois da ativação do SegWit na rede do Bitcoin, a adoção das mudanças passou a ser feita por grandes casas de câmbio(Exchanges), usuários comuns usando carteiras com suporte a endereços SegWit e outros serviços do ecossistema Bitcoin. No final de Fevereiro de 2018, a adoção do SegWit já beirava os 30% de toda a rede. Grandes casas de câmbio como CoinBase, BitStamp, BitFinex, Kraken,que são responsavéis por realizar uma grandíssima quantidade de transações de Bitcoins, já oferecem suporte ao SegWit em seus serviços.

## SegWit vs SegWit2x

Ao contrario do SegWit, que é um Soft Fork e apresenta retrocompatibilidade com a blockchain do Bitcoin, o SegWit2x foi uma proposta de Hard Fork na criptomoeda, o que levaria a criação de uma blockchain paralela em que os usuários da rede deveriam escolher em qual das duas blockchains permanceriam. A proposta do SegWit2x é duplicar o tamanho do bloco de transações, indo de 1 Megabyte tradicional para 2 Megabytes por bloco, tendo assim o foco de aumentar a escalabilidade do Bitcoin, melhorando o número de transações por segundo. A integração do SegWit2x esta prevista para o dia 16 de novembro de 2017, porém foi suspenso por falta de consenso por parte da comunidade.