If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Bitcoin: Prova de trabalho

Uma explicação de protocolos de criptografia prova-de-trabalho, que são usados em várias aplicações criptográficas e na mineração de bitcoins. Versão original criada por Zulfikar Ramzan.

Quer participar da conversa?

Nenhuma postagem por enquanto.
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.

Transcrição de vídeo

O protocolo prova-de-esforço, é um veículo pelo qual alguém pode efetivamente provar que empregou uma quantidade significativa de esforço computacional. Protocolos de prova-de-esforço geralmente são quebra cabeças Os quebra cabeças podem, por um lado, ser desafiados e solicionadas e eles requerem um esforço computacional que não pode ser encurtado. Mas por outro lado, esse esforço pode ser fácilmente validado. Pode ser verificado em um tempo bem menor que o que levou a execução dos esforço. Há várias aplicações desses protocolos. Por exemplo, se você já ouviu falar do sistema eletrônico de pagamento bitcoin, esse sistema na verdade faz uso de um esquema de prova-de-esforço Dentro do contexto da criação de correntes de blocos de transação. Além do bitcoin, que é uma aplicação muito recente desses tipos de esquemas de prova-de-esforço, esses esquemas estavam sendo propostos no passado para outras aplicações. Por exemplo, esquemas de prova-de-esforço vem sendo propostos para fazer coisas como dissuadir ataques do tipo DoS. Aqui, a idéia é que a requisição de acesso a um serviço específico teria que resolver um problema computacional muito específico, um quebra cabeças de prova-de-esforço, antes de ter a permissão de acesso ao serviço. E a idéia aqui é que o esforço computacional exercído é um modo efetivo de regular o requisitante. O servidor em troca pode facilmente validar se o requisitante realizou o esforço requisitado e somente se aquele esforço for feito o servidor responderá ao requisitante do serviço. A aplicação original desse tipos de protocolos de prova-de-esforço, o primeiro lugar que vi isso sendo proposto, foi no contexto de detenção de spam em e-mails. Obviamente, todos sabemos o que é um spam. São mensagem que você não quer em sua caixa de entrada e talvez tenham chegado até você sem solicitação. A ideia aqui é que um protocolo de prova-de-esforço pode ser incluído em uma mensagem de e-mail particular. Conceitualmente é como colocar um selo na mensagem, mas ao invés de pagar por esse selo com dinheiro você está basicamente pagamento o selo com ciclos de CPU. Por um centro de legítmidade enviando uma pequena quantidade de mensagens este tipo de protocolos de prova-de-esforço não vão se acumular muito. Será apenas um pequeno retorno desde que seja executado apenas poucas vezes. É um tipo de impedimento, mas não é algo que exorbitante. para um remetente, que pode estar enviando várias mensagens, Talvez centenas de milhares ou milhões de mensagens, isso pode ser custoso o uso repetitivo de tantos ciclos de CPU após cada mensagem e remetente a que a mensagem está sendo enviada. Eu lhe apenas uma amostra de aplicações desses protocolos de prova-de-esforço. Deixe-xe detalhar um pouco mais como eles funciona na pratica. Antes de mais nada, o modo que eu gosto de pensar nesses protocolos é que tipicamente eles trabalham com uma cadeia de desafios. Eu poderia chama-lo de cadeia de desafios e você pode identificar como a letra <i>c</i>, então <i>c</i> será a cadeia de desafios. O que a pessoa executando o protocolo tentará fazer, A prova-de-esforço basicamente tenta chegar a prova correspondente. que está ligada a essa cadeia de desafios. Essa será a resposta associada com esse desafio que tem uma propriedade matemática específica em relação a esse desafio. Como você notou, quando falei em cadeia de desafios, no contexto de spam por exemplo, essa cadeia de desafios pode na verdade representar a mensagem. Será algo muito específico para a tarefa em mão. O que o executador terá que fazer é gerar a resposta. Vamos chamar a reposta de <i>r</i>. Na verdade, vamos usar a letra <i>p</i>. Vamos pensar nela como a prova. A provou ou resposta. A ideia é que quem executar vai gerar uma prova ou resposta E ele aparecer com um resultado que quando for combinado desafio e resposta e for aplicado uma função de criptografia <i>hash</i> nos dois juntos, Algo como SHA-256 ou algo dessa natureza, Se eu usar a cadeia de desafio e a prova gerada, combina-las e aplicar a função de criptografia <i>hash</i>, aplicar essas transformações matemáticas que representam função criptográfica <i>hash</i>, Eu quero sobrepor a resposta gerada De modo que que a saída sobre essa função <i>hash</i> terá uma propriedade muito específica. O prefixo de saída, os primeiro números dos bits serão zeros. Vamos dizer que o primeiros quarenta bits, ou os trinta primeiros, ou algum número de bits serão zeros. E os outros bits podem ser o que eles seriam normalmente. Obviamente, o que estamos tentando fazer aqui é gerar um resposta. que tem tenha um relacionamento com o cadeia de desafios. e esse relacionamento passa a ser a que ocorre ou é levado referente a um função <i>hash</i> específica e realmente incorpora ou considera o que a saída da função será quando a reposta é concatenada com a cadeia de desafio. Se você tem uma boa função de criptografia hash A única modo conhecido de encontrar este tipo de prova de esforço é efetivamente tentar várias possibilidades diferentes. Fazer vários combinações diferentes até encontrar uma que funcione. Se você precisasse encontrar uma saída que contenha cerca de quarenta zeros consecutivos, isso poderia requerer uma performance de cerca de dois elevado a quarenta. Dois elevado a quarenta invocações diferentes funções <i>hash</i>. Se você testar dois elevado a quarenta diferentes resultados e uma delas possivelmente funcionar se você testar dois elevado a quarenta desse resultados. Isso poderia requerir, só paralhe dar uma exemplo, aproximadamente um trilhão. Então se você testar um trilhão de resultados diferentes e dividir cada um deles, você provavelmente encontrará um resultado em que os quarenta primeiros bits sejam zero. As vezes bem menos que um trilhão de repetições, As vezes um pouco mais. Você pode dar muita sorte, e ter muito azar. Na média, terá que repetir cerca de um trilhão de vezes para encontrar a combinação onde os primeiro quarenta bits são iguais a zero. É algo que não é fácil mas também não está fora do reino de possibilidades. Para encontrar a razão pela qual é tão difícil resolver estes tipo de esquemas de prova de esforço mais eficietemente do que usando força bruta, eu acho que ajuda relembrar que a saída da função de criptografia <i>hash</i> parece mais ou menos aleatória. Na verdade, cada pedaço da saída se parece com cara ou coroa. É como jogar uma moeda e se o resultado é cara, você tem um zero e se for coroa, pense que o resultado é um. O que você está fazendo é dizer: Se joguei quarenta moedas qual a chance de que eu tenha quarenta caras consecultivas nessas quarenta vezes que jogar a moedas. Obviamente, que provavelmente é muito pequeno, mas não está fora do reino das possibilidades. Se você pegou quarenta moedas E jogou essas quarenta moedas um trilhão vezes, você na verdade espera ver uma instância na qual todas as quarenta moedas sejam cara. Em uma das um trilhão de tentativas. Uma coisa interessante desse esquema de prova de esforço pode ser arredondado para cima ou para baixo. Por exemplo, digamos que você queira requerer ainda mais levantamento de peso computacional Para encontrar a resposta correta. Você quer aumentar o trabalho que precisa ser testado aqui. O que você pode fazer nesse caso é somente aumentar o número requerimento de zeros no começo. Cada vez que você adicionar um zero, Você efetivamente dobra o poder computacional necessário em média. Isso porque você está efetivamente pedindo que mais uma moeda seja cara. isso acarreta aumento do número de testes. Se eu tivesse quarenta e uma jogadas e precisasse de quarenta e uma caras consecultivas Seria preciso dua vezes mais esforço que quarenta caras consecutivas também, cada vez que você remover do resultado requerido isso reduziria o poder computacional necessário para cerca de metade do que era preciso inicialmente. Por exemplo, se eu precisar somente os primeiros trinta e nove bits sejam zero pois será preciso cerca de metade das tentativas necessárias para que os primeiros quarenta bits sejam zeros. O legal é que quando se chega a uma solução, vamos dizer que alguém tenta e finalmente chega a um resultado que funcione, é muito fácil validar se o resultado obtido é a prova-de-esforço correta. Tudo o que você precisa pegar entrada e fazer a validação com o resultado usando a função <i>hash</i>. Por exemplo, se alguém propõem esse resultado vamos chamar de <i>p prime</i> tudo o que você faz é pegar a entra e o <i>p prime</i> e usa-los na função hash. Você vê se o quarenta primeiros bits são todos zeros. É preciso executar a função <i>hash</i> uma vez que <i>c</i> e <i>p prime</i> estejam concatenados e você pode ver que a saída de fato tem o número requisitado de zeros na frente. Se você ver que a saída tem os zeros requisitados, então você pode considerar a prova-de-esforço válida porque você sabe que isso deve ter tomado um bom tempo de alguém, muitas tentativas, realmente, para chegar até esse <i>p prime</i>, de modo que essa concentração de <i>c</i> e <i>p prime</i> lhe dá a quantidade de zeros na aplicação dessa função de criptografia <i>hash</i>. Como você pode ver, esses esquemas são bem simples mas bem espertos ao mesmo tempo. Eles realmente vão chegar um resultado que tem uma relação matemática muito específica com o desafio original. Espero que esse vídeo tenha ajudado a lhe dar um gosto pela mecânica de funcionamento dos teste de prova-de-esforço. Legendado por [Valter Bigeli]