Site menu Além do Bitcoin: blockchain e smart contracts
e-mail icon
Site menu

Além do Bitcoin: blockchain e smart contracts

e-mail icon

O Bitcoin é uma monumental (senão a maior) inovação tecnológica na área de informática que se viu nos últimos anos. O funcionamento básico é muito bem descrito pelo artigo original, que traduzi e comentei. Vale a pena fazer uma pequena revisão aqui para dissecar os elementos inovadores.

O coração do Bitcoin é o chamado blockchain, ou "corrente de blocos". Este é o elemento que tanto interesse desperta. Inúmeros usos distintos de dinheiro digital têm sido imaginados e implementados com base nele.

O blockchain é essencialmente um banco de dados, com algumas características especiais, algumas inéditas, outras não.

O blockchain só pode crescer. Ele nunca diminui de tamanho, nem pode ser modificado. Não é possível "reescrever a História" no blockchain sem recomeçar do zero. Dados novos são acrescentados em blocos.

A quase totalidade dos bancos de dados (relacionais ou NoSQL) permite que linhas e colunas sejam alteradas ou removidas, o que pode ser perfeito para muitas aplicações, mas prejudica a auditabilidade. Em sistemas ERP "sérios", a norma é modelar o banco de dados de modo a armazenar todas as "versões" de cada registro para que a "história" do ERP seja auditável. Mas um DBA ainda pode manipular o banco de dados e falsear a história por baixo dos panos. A adoção de um banco baseado em blockchain garante que isso não pode acontecer.

Cada bloco do blockchain é criptograficamente protegido contra alterações, e é conectado a blocos preexistentes, tornando o conjunto ainda mais robusto. Reescrever a história alterando um bloco "enterrado" no blockchain implicaria em recalcular todos os blocos seguintes, até o mais recente, o que é extremamente custoso e dificilmente passaria despercebido.

Essa técnica tem parentesco com os bancos de dados MVCC, que (idealmente) nunca alteram ou removem linhas, apenas adicionam novas versões. Bancos de dados "log-structured" são parentes ainda mais próximos do blockchain, e compartilham algumas das vantagens: fáceis de replicar e copiar. Até onde sei, os bancos de dados relacionais (quase todos são MVCC e alguns são log-structured em certa medida) presumem que o meio de armazenamento é seguro e não protegem criptograficamente os dados. Mas isso não é difícil de adicionar; é meramente por uma questão de custo de processsamento que os bancos não embutem proteção criptográfica.

O blockchain do Bitcoin é tornado mais seguro pela difusão dos novos blocos para todos os participantes interessados. Com inúmeras cópias do mesmo banco de dados espalhadas por aí, e presumindo que a maioria dos participantes da rede é honesta, fica mais difícil um participante hostil tentar empurrar uma versão fraudada desse blockchain.

A segurança criptográfica de cada bloco do blockchain é incrementada pela prova de trabalho. Calcular um bloco válido é tornado difícil de propósito, para que seja difícil a um participante hostil gerar blocos com conteúdo fraudulento. A cada bloco que se soma ao blockchain, fica exponencialmente mais difícil cometer a fraude, pois o fraudador teria de recalcular não só o bloco que pretende alterar, mas todos os seguintes até o mais recente.

Segurança baseada em prova de trabalho não é tecnologia nova. O Bitcoin explicitamente baseia-se no HashCash que pretendia combater o spam forçando o remetente de um e-mail a "queimar" um segundo de processamento por mensagem. Mesmo fora da informática, há inúmeros procedimentos burocráticos e cartoriais destinados a criar um "paper trail" que prova boa-fé com um certo grau de confiança.

Por exemplo, suponha a contabilidade de uma empresa, com 100 mil lançamentos por ano. Cada lançamento contábil tem de ter um comprovante respectivo. Um auditor não vai verificar todos os lançamentos; vai verificar uma meia dúzia aleatoriamente. Se os seis lançamentos tiverem comprovantes, e se os comprovantes forem validados pelas empresas que pretensamente os emitiram, então é muito grande a probabilidade da contabilidade como um todo ser legítima. Certamente é possível fraudar uma contabilidade com 100 mil lançamentos, criando 100 mil comprovantes falsos etc. porém isso daria tanto trabalho que não valeria a pena. Literalmente, dá menos trabalho fazer a coisa dentro da lei! Isto é "prova de trabalho".

Voltando ao blockchain. No cenário ideal, inúmeros computadores independentes trabalham para calcular blocos novos. Assim que um deles finaliza o cálculo, difunde o resultado. Os demais participantes conferem a validade do candidato a novo bloco: se for julgado inválido ou fraudulento, vão ignorá-lo e prosseguem no cálculo de um bloco válido. Cedo ou tarde, algum participante honesto achará um bloco válido que será imediatamente aceito pelos demais, que só então desistirão de calcular o bloco presente, passando a dedicar-se ao próximo. (Já vamos ver como encorajar participantes honestos a dedicar seus computadores a essa tarefa.)

Um aspecto do Bitcoin e outras moedas digitais, que não é obrigatório mas é interessante, é que a dificuldade de cálculo do bloco é calibrada freqüentemente. Na média, um novo bloco Bitcoin é produzido a cada dez minutos, apesar do poder computacional dedicado ao Bitcoin estar aumentando exponencialmente há vários anos.

Considerando que há "mineiros" empregando vastíssimos recursos computacionais no cálculo desses blocos, o Bitcoin é assegurado contra fraudes mesmo sendo um blockchain aberto, pois é impossível a qualquer fraudador amealhar recursos computacionais maiores que a soma dos demais participantes.

Um blockchain usado para fins "privados", que não seja aberto ao público como o Bitcoin, poderia relaxar nesse requisito, adotando uma "prova de trabalho" mais leve e/ou que não aumente com o tempo. De qualquer forma, alguma prova de trabalho deve haver, para que o blockchain seja resistente a fraudes.

Como dito antes, a segurança do Bitcoin é garantida pela dedicação dos participantes honestos em calcular novos blocos válidos. O "pulo do gato" do Bitcoin é a forma que esses participantes são encorajados: quem acha um novo bloco, ganha um certo número de Bitcoins, mais as "gorjetas" opcionais das transações incluídas nesse bloco. No momento em que escrevo isto, um bloco novo "paga" no mínimo 12,5 Bitcoins que valem 5000 dólares, e isso acontece a cada 10 minutos, então são milhões de dólares por mês potencialmente ao alcance de qualquer interessado.

Quem dedica computadores ao cálculo de blocos é denominado "mineiro" no jargão Bitcoin, devido ao paralelo que o artigo original do Bitcoin fez com a mineração de metais preciosos. O pagamento por bloco encoraja "mineiros" de todos os tipos, de computadores pequenos a hardware ASIC dedicado.

Assumindo que as leis de mercado funcionam, os 12,5 bitcoins por bloco atrairão mais e mais "mineiros" até o ponto em que o valor do bitcoin encoste nos custos de eletricidade e equipamento. Uma valorização do Bitcoin provoca um ingresso de "mineiros", que aumenta o poder de processamento agregado da rede, que aumenta a segurança do blockchain. Como a dificuldade é ajustada para que saia um bloco novo a cada 10 minutos em média, o ingresso de mais "mineiros" não causa inflação. A rede também pode ajustar-se para baixo: se alguns "mineiros" abandonarem a atividade, isso é detectado pelo aumento no tempo médio de criação de blocos novos, e a dificuldade é ajustada para baixo, "barateando" a tarefa para os mineiros restantes.

Além do poder computacional combinado de todos os "mineiros" honestos ser muito maior do que qualquer fraudador, o número de participantes também faz diferença. O lema do Bitcoin é "uma CPU, um voto", mesmo que seja a CPU de um celular. Mesmo que um fraudador consiga calcular blocos em, digamos, 2 minutos em vez de 10, os demais participantes rejeitarão o bloco por conter transações falsas, e prosseguirão procurando por um bloco "honesto".

E como os participantes honestos sabem que um bloco contém transações falsas?

No Bitcoin, cada transação é criptograficamente assinada. Como o Bitcoin é "dinheiro digital", assina a transação quem "gasta" o dinheiro. É impossível fraudar essa assinatura, até onde se sabe, então falsificar a assinatura não é uma modalidade viável de fraude. Os "mineiros" conferem as assinaturas das transações dos novos blocos, e também conferem se os valores envolvidos realmente existiam no blockchain.

Se houverem várias transações que gastem um mesmo saldo, todas menos uma são impedidas de entrar no bloco e no blockchain. Além disso, os participantes da rede que não são "mineiros" também podem conferir transações individuais. Basta conferir se o saldo existe no blockchain.

Por outro lado, para cometer-se uma fraude lucrativa, seria necessário:

Outra modalidade de ataque, considerando a improvável hipótese do fraudador possuir mais capacidade de processamento que o resto dos "mineiros":

O Bitcoin recomenda que transações vultosas sejam consideradas confirmadas apenas depois de "enterradas" por seis blocos, o que leva aprox. uma hora. Isso impede o fraudador de cometer a "versão simples" da fraude, e dificulta sobremaneira a "versão difícil", pois ele teria de sobrepujar o poder de processamento dos "mineiros" durante uma hora inteira, e mesmo assim correndo o risco de algum "mineiro" honesto dar sorte. Se o fraudador consegue calcular blocos a cada 5 minutos em média, e alguém por acaso encontrar um bloco em 2 minutos (o que acontece na prática, é uma questão de probabilidades), o golpe será frustrado.

O Bitcoin visa implementar dinheiro digital, porém nada impede de utilizarmos essas mesmas idéias em outras instâncias, em qualquer espécie de banco de dados distribuído. A segurança atingida pelo blockchain implementado nos moldes do Bitcoin permite seu uso em aplicações bancárias, notariais, registro de imóveis, etc. Por outro lado, há aplicações do blockchain onde os participantes são confiáveis e pode não haver a necessidade de tanta desconfiança mútua.

Por exemplo, um banco de dados poderia exigir que cada transação seja assinada. Apenas transações assinadas e que sejam consistentes com o blockchain preexistente seriam aceitas no blockchain. Isso proporcionaria uma garantia ACID absurdamente forte, além da certeza da autoria da transação. Manipular a velocidade de cálculo dos blocos também pode ser útil (mais rápido para aumentar a concorrência, mais lento para impedir "condições de corrida", quando o efeito de duas transações seguidas muda conforme uma ou outra é executada primeiro).

O próprio Bitcoin pode ser usado para representar quaisquer outros valores, ou mesmo dados. As chamadas moedas coloridas (colored coins) podem ser relacionadas a bens ou direitos arbitrários. Por exemplo, uma "moeda colorida" pode ter valor intrínseco (em Bitcoins) irrisório, mas representa a posse de algo valioso: uma ação, um imóvel, um direito futuro, um testamento, um contrato, etc. As moedas coloridas permitem estender as vantagens do blockchain a qualquer mercado real ou virtual sem que este tenha de implementar seu próprio blockchain.

Smart contracts

A mais nova coqueluche da tecnologia de blockchain, já prevista pelo Bitcoin mas aprofundada no Ethereum, é o chamado smart contract ou "contrato esperto".

O smart contract é, essencialmente, um programa de computador acompanhado de uma pequena quantidade de memória e sua própria carteira de dinheiro (wallet); o pacote todo fica armazenado no blockchain. Quando alguém comunica-se com o smart contract, ele é executado. Por estar no blockchain, todos os participantes interessados sabem exatamente o que o smart contract faz, qual é seu estado atual, e quanto dinheiro ele retém na carteira.

Um exemplo de como isso pode ser útil é uma transação estilo MercadoPago. No Bitcoin, toda transação é irreversível, mas isso é incompatível com o mundo real. A solução "humana" é um terceiro de boa-fé que retém os fundos do vendedor até o comprador dar seu ok. No caso do Bitcoin "baunilha", essa retenção teria de ser implementada fora do blockchain.

Já o smart contract permitiria implementar essa retenção dentro do blockchain, de forma automática e transparente. O comprador remete dinheiro ao "robô" e este só transfere fundos ao vendedor quando o comprador confirmar o recebimento da mercadoria. Conceitualmente é o mesmo que usar um terceiro de boa-fé humano, porém o "robô" vive no blockchain e seu funcionamento é previsível e garantido.

Regras mais elaboradas, como prazo de confirmação, prazo de devolução caso o vendedor não confirme a remessa, etc., tudo isso pode ser programado no "robô" smart contract. A intervenção externa ao blockchain (humana ou não) só seria necessária se comprador e vendedor caíssem num impasse.

Como a inclusão de um smart contract no blockchain é relativamente "barata", pode-se cadastrar um smart contract para cada transação. Em vez do MercadoPago centralizar milhões de transações de forma opaca, ele poderia delegar todas ao blockchain, sendo cada uma delas totalmente transparente aos interessados. (Todo mundo pode ver todos os smart contracts, mas a identidade de compradores e vendedores não é tão fácil de descobrir.)

Outra coisa trivial de implementar num smart contract: um pagamento periódico. Por exemplo, eu quero pagar um montante mensal por 2 anos. Programando isso num smart contract, o pagamento ocorreria mesmo que eu morresse, pois o dinheiro já está na carteira do robô. E mesmo sendo um pagamento irreversível (ou seja, eu não posso revogar o pagamento) o recipiente do dinheiro também não tem como forçar o robô a pagar tudo antecipadamente.

Também posso implementar um crowdfunding, onde o montante arrecadado é automaticamente devolvido se não atngir o alvo, e também é devolvido se o beneficiário não sacar o dinheiro até um certo prazo. Não seria mais necessário contratar intermediário nenhum para crowdfunding. Tudo que seria necessário é que as pessoas conferissem o código do smart contract, ou que alguém de confiança o fizesse.

As possibilidades são realmente estonteantes.

O "pulo do gato" técnico é que o código do smart contract é executado por inúmeros "mineiros" no processo de calcular um novo bloco. Seja quem for o executante do smart contract, os efeitos colaterais produzidos devem ser exatamente os mesmos. Isso pode ser verificado por qualquer participante da rede. Para que um novo bloco seja aceito como válido, as transações causadas por smart contracts e seus novos estados internos devem coincidir perfeitamente com as estimativas.

Aqui, temos três problemas potenciais a analisar. Primeiro: quem garante que os "mineiros" vão querer dedicar poder de processamento aos smart contracts? Segundo: o que acontece se o smart contract entrar em loop infinito, por acidente ou de propósito?

O primeiro problema é resolvido pela boa e velha propina. Assim como as transações do Bitcoin têm uma "gorjeta" opcional (os "mineiros" priorizam a inclusão de transações com "gorjeta" nos blocos), os smart contracts também estipulam custos de cadastro e execução. Os "mineiros" podem decidir se a "gorjeta" é suficiente ou não, dado o tamanho e tempo de execução do programa.

O ponto é: uma simples transferência de fundos pode até entrar no blockchain sem pagar gorjeta (embora possa demorar várias horas), porém um smart contract dificilmente seria executado de graça!

Quanto ao segundo ponto, os desenvolvedores de "smart contracts" estão devidamente avisados que, dada a tecnologia atual, o programa deve ser o mais simples possível. O Ethereum especifica que "um smart contract não deve esperar mais capacidade de processamento do que seria encontrada num celular de 1999". O smart contract definitivamente não é um meio de realizar processamento maciço distribuído no estilo Seti@Home. A capacidade de processamento agregada empregada em cada smart contract será muito grande, porque ele será executado simultaneamente por milhares ou milhões de "mineiros", mas isso é apenas para garantir o consenso.

Um smart contract pode conter bugs que o façam entrar em loop infinito. Neste caso os "mineiros" devem implementar métodos de detectar quando o smart contract consumiu processamento desproporcional à "gorjeta", e cancelá-lo.

O Bitcoin possui um esquema para execução de smart contracts, embora eu acredite que os "mineiros" não o implementem no presente momento. Seja como for, o esquema Bitcoin não é "Turing-completo". Isso significa que um "robô" Bitcoin não pode entrar em loop infinito, e sua carga de processamento pode ser determinada a priori, antes da execução. É uma resposta aos dois problemas colocados mais acima. Já o Ethereum permite que os smart contracts sejam Turing-completos, controlando-os a posteriori com base na "gorjeta" paga pelo processamento.

e-mail icon