Conteúdo principal
Mercado financeiro e de capitais
Curso: Mercado financeiro e de capitais > Unidade 8
Lição 8: Bitcoin- Bitcoin: O que é?
- Bitcoin: visão geral
- Bitcoin: Funções de hash criptográfico
- Bitcoin: Assinaturas digitais
- Bitcoin: Prova de trabalho
- Bitcoin: Cadeias de blocos de transação
- Bitcoin: O fornecimento de dinheiro
- Bitcoin: A segurança das cadeias do bloco de transação
© 2023 Khan AcademyTermos de usoPolítica de privacidadeAviso de cookies
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.
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]