# Altchains

Desde o surgimento da Bitcoin em 2009, muitas criptomoedas alternativas (ou altcoins) foram criadas utilizando estruturas similares. Cada uma com sua própria blockchain e usualmente conhecidas como altchains por serem fortemente baseadas no software da Bitcoin.
Capazes de rastrear e verificar qualquer tipo de troca de dados, talvez a altchain que merece maior destaque seja a Namecoin. Dentre outras altchains conhecidas, com fins monetários ou não, estão: Litecoin, Dogecoin, Zerocoin e Ethereum.

## Objetivo

A Bitcoin usa o algoritmo da Blockchain para alcançar um consenso distribuído sobre quem tem a posse das criptomoedas. As blockchains foram criadas especificamente para o projeto Bitcoin, mas podem ser aplicadas em qualquer lugar onde um consenso distribuído precisa ser estabelecido na presença de atores maliciosos ou não confiáveis.
Embora seja possível tirar proveito da blockchain da Bitcoin para outros fins, o melhor é criar uma rede e uma altchain que compartilhem os mesmos mineradores. Abaixo estão listadas algumas razões que justificam essa atitude:
* A blockchain é uma estrutura de dados grande e complexa compartilhada entre muitas pessoas. Verificar sua integridade requer muitas operações lentas (e, portanto, caras), como as verificações do ECDSA e as buscas em disco. Hoje, todos que participam da Bitcoin administram um nó e, assim, mantêm toda a blockchain. Enquanto os futuros usuários finais provavelmente usarão modos mais eficientes, mas ligeiramente menos seguros como clientes SPV (do inglês, Simplified Payment Verification), comerciantes e mineradores pagarão sempre os custos totais para a manutenção desta estrutura de dados compartilhada.
* O formato de transação que o Bitcoin usa é flexível, mas, em última instância, é projetado para fins monetários. Não é possível excluir o campo "valor" mesmo que este campo não seja utilizado para a uma aplicação específica. Construir aplicativos não financeiros em cima de um sistema financeiro resulta em protocolos e códigos estranhos que são difíceis de entender, levando a problemas de manutenção.
* Satoshi Nakamoto, idealizador do Bitcoin, se opôs a colocar dados não relacionados com Bitcoin na cadeia principal.

## Projetando uma nova rede

Para criar uma nova rede que usa o padrão de projeto Blockchain, idealizado por Nakamoto, é necessário definir o que significa uma transação nessa nova rede. Em Bitcoin, as transações dividem e combinam o valor usando scripts, mas não há obrigatoriedade em se utilizar esta forma de operação.
Abaixo é mostrado um exemplo de uma transação simples semelhante a DNS, descrita usando a sintaxe do Protocol Buffers do Google:
Assim como a implementação da transação, a definição do bloco também depende do desenvolvedor da nova altchain. A formatação do bloco não precisa ser necessariamente igual ao que Satoshi Nakamoto projetou, mas precisa da maioria das mesmas partes conceituais. Também é necessário armazenar alguns dados da Bitcoin. Abaixo é apresentado um exemplo mínimo do que é necessário:
No exemplo acima, foram excluídos os seguintes campos do formato implementado por Satoshi, listados abaixo juntamente com as justificativas para tal:
* Versão: o próprio protobuf lida com o controle de versão dos formatos de dados binários.
* Raiz de Merkle: apesar de opcional o desenvolvedor pode optar por organizar as transações em uma raiz de Merkle, caso deseje utilizar o mesmo artifício de recuperação de espaço em disco utilizado por Satoshi Nakamoto no Bitcoin.

## Compartilhando trabalho

Atualmente, o campo bitcoin_data é a forma de compartilhar o trabalho com os mineradores (assumindo que eles optem por instalar o software da altchain em conjunto com o seus nós bitcoin). O suficiente necessário para dividir o trabalho está definido abaixo:
Uma árvore de Merkle é uma estrutura de dados na qual cada nó na árvore é um hash. As folhas da árvore são hashes das informações que se deseja incluir na árvore e os nós interiores são hashes das concatenações dos nós filhos. Um ramo de Merkle é a parte de uma árvore de Merkle que permite que se prove criptograficamente que algo recebido está na árvore, sem precisar de tudo o que está na árvore. Eles são calculados pela função CBlock :: GetMerkleBranch no código Bitcoin.
Armazenamos um ramo de Merkle aqui a fim de ser eficiente. Isso significa que não importa o tamanho do bloco Bitcoin atual, sua rede alternativa só precisa lidar com uma pequena quantidade de dados. Você poderia armazenar todo o bloco Bitcoin - isso seria mais simples, mas, em contrapartida, ineficiente.

## Altchains não-monetárias

Altchains são implementações alternativas do padrão de projeto Blockchain que não são necessariamente utilizadas para fins monetários. Muitas incluem uma moeda, mas esta moeda é usada apenas como um símbolo (token) a fim de alocar alguma outra informação, como um recurso ou um contrato. A moeda, em outras palavras, não é o ponto principal da plataforma; é uma característica secundária.

### Namecoin

Namecoin foi a primeira bifurcação do código bitcoin. É uma tecnologia de código aberto experimental que melhora a descentralização, segurança, resistência a censura, privacidade e velocidade de certos componentes da infraestrutura da internet como DNS e identidades. Também pode ser definida como uma plataforma descentralizada de registro e transferência baseado em valor-chave que utiliza uma blockchain e dá suporte a um registro global de nomes de domínio similar ao sistema de registro de nomes de domínio da Internet.
Namecoin é atualmente utilizada como um serviço de nomes de domínio (DNS) alternativo para o domínio raiz .bit e também pode ser utilizada para:
* Registrar nomes e pares chave-valor em outros espaços de nome;
* Armazenar informações como endereços de e-mail, chaves de criptografia, certificados SSL, arquivo de assinatura, sistemas de votação, certificados da bolsa; e uma série de outras aplicações.
O sistema da Namecoin inclui uma moeda cujo símbolo é NMC, utilizada para pagar taxas de transações para registrar e transferir nomes. Atualmente, a taxa para registrar um nome é de 0.01 NMC ou, aproximadamente, 1 centavo de dólar americano. Como na bitcoin, as taxas são coletadas por mineradores de namecoins.
Os parâmetros básicos da Namecoin são os mesmos da Bitcoin:
* Geração de blocos: 10 minutos;
* Total da moeda: 21 milhões de NMC até o ano 2140;
* Algoritmo de consenso: prova-de-trabalho com SHA256;
* Capitalização de mercado: 10 milhões de dólares na metade de 2014.
Espaços de nome (ou namespaces) da Namecoin não são restritos e qualquer um pode utilizar qualquer espaço de nome de qualquer forma. No entanto, certos espaços de nome possuem uma especificação acordada, de modo que, quando é lido a partir da blockchain, softwares a nível de aplicativo sabem ler e continuar a partir dali. Se estiver mal formado, qualquer software que você use para ler a partir do espaço de nome específico criará um erro. Alguns dos espaços de nome populares são:
* d/ é o namespace do nome de domínio para domínios .bit;
* id/ é o namespace para armazenar identificadores de pessoas, como endereços de e-mail, chaves PGP e assim por diante; e
* u/ é uma especificação adicional, mais estruturada, para armazenar identidade (com base em openspecs).
O cliente Namecoin é muito semelhante ao do Bitcoin Core, porque é derivado do mesmo código-fonte. Após a instalação, o cliente baixará uma cópia completa da blockchain da Namecoin e estará pronto para consultar e registrar nomes. Existem três comandos principais:
* name_new
** Pesquisa ou pré-registra um nome
* name_firstupdate
** Registra um nome e torna o registro público
* name_update
** Muda os detalhes ou atualiza um registro de nome
Por exemplo, para registrar o domínio my-domain.bit, devemos utilizar o comando name_new como a seguir:
O comando name_new registra uma reivindicação no nome, criando um hash do nome com uma chave aleatória. As duas sequências de caracteres retornadas pelo comando name_new são o hash e a chave aleatória (4124ac6d13e16b31 no exemplo anterior) que podem ser usadas para tornar público o registro do nome. Uma vez que essa reivindicação tenha sido registrada na blockchain da Namecoin, ela pode ser convertida em um registro público com o comando name_firstupdate, desde que seja fornecida a chave aleatória:
Este exemplo mapeará o nome de domínio www.my-domain.bit para o endereço IP 4.3.2.1. O hash retornado é o ID da transação que pode ser usado para rastrear esse registro. Você pode ver quais nomes estão registrados para você executando o comando name_list:
Os registros de Namecoin precisam ser atualizados a cada 36.000 blocos (aproximadamente 200 a 250 dias). O comando name_update não tem taxa e, portanto, a renovação de domínios na Namecoin é gratuita. Os provedores de terceiros podem lidar com registro, renovação automática e atualização via uma interface web, por uma pequena taxa. Com um fornecedor de terceiros, evita a necessidade de executar um cliente Namecoin, mas você perde o controle independente de um registro de nome descentralizado oferecido pela Namecoin.

### Ethereum

Ethereum é uma plataforma de processamento e execução de contrato Turing-completo baseada em um ledger de blockchain. Não é um clone do Bitcoin, mas um design e implementação completamente independentes. Ethereum possui uma moeda incorporada, chamada ether, que é necessária para pagar a execução do contrato. A cadeia de blocos de Ethereum registra contratos, que são expressos em uma linguagem Turing-completa de baixo nível, semelhante à bytecode. Essencialmente, um contrato é um programa que é executado em cada nó no sistema Ethereum. Os contratos Ethereum podem armazenar dados, enviar e receber pagamentos de ether, armazenar ether e executar uma gama infinita (pois é Turing-completo) de ações computáveis, atuando como agentes de software autônomos descentralizados.
O Ethereum pode implementar sistemas bastante complexos que de outra forma são implementados como altchains. Por exemplo, o seguinte é um contrato de registro de nome semelhante ao utilizado no Namecoin escrito em Ethereum (ou, mais precisamente, escrito em uma linguagem de alto nível que pode ser compilada para o código Ethereum):