Como a dificuldade é calculada?

Alguém pode me explicar em inglês como a dificuldade é calculada. Eu tenho um entendimento muito aproximado de que ele é calculado com base na quantidade de potência de hash em toda a comunidade bitcoin durante um período específico de tempo. Mas isso é muito vago.

Também entendo que pode mudar muito rapidamente. Só pode aumentar? Existe alguma fórmula para calcular ou prever?

Obrigado por uma resposta detalhada, Meni Rosenfeld. Só para ter certeza de que acertei tudo. Estou resumindo o tempo todo, demorou para gerar os últimos blocos de 2016. E então aplique a fórmula.

Comentários

  • Acho que as perguntas de acompanhamento são melhores como comentários para a resposta. Basicamente sim, mas nenhuma soma é realmente necessária – você pode apenas pegar os carimbos de data / hora do último bloco e dos blocos de 2016 anteriores e subtrair.

Resposta

A dificuldade do Bitcoin começou em 1 (e nunca pode ir abaixo disso). Então, para cada 2016 blocos encontrados, os carimbos de data / hora dos blocos são comparados para descobrir quanto tempo levou para encontrar os blocos de 2016, chame-o de T. Queremos que os blocos de 2016 levem 2 semanas, então se T for diferente, nós multiplicamos a dificuldade em (2 semanas / T) – desta forma, se o hashrate continuar do jeito que estava, agora levará 2 semanas para encontrar os blocos de 2016.

Por exemplo, se levou apenas 10 dias, significa que a dificuldade é muito baixa e, portanto, será aumentada em 40%.

A dificuldade pode aumentar ou diminuir dependendo se levou menos ou mais de 2 semanas para encontrar os blocos de 2016. Geralmente, a dificuldade diminuirá depois que o hashr da rede cair.

Se o fator de correção for maior que 4 (ou menor que 1/4), então 4 ou 1/4 são usados, para evitar a mudança ser muito abrupto.

Há um bug na implementação, devido ao qual o cálculo é baseado no tempo para encontrar os últimos blocos de 2015, em vez de 2016. Corrigir isso exigiria uma bifurcação rígida e é, portanto, adiada por enquanto.

É possível dar uma estimativa aproximada para a próxima mudança de dificuldade, com base no tempo para encontrar os blocos recentes. Ninguém pode fazer previsões de longo prazo para a dificuldade futura com segurança, mas qualquer um é livre para especular com base nas tendências da taxa de câmbio, na lei de Moore e em outros avanços de hardware.

Comentários

  • @StevenRoose: AFAIK é, mas vou deixar para as pessoas que estão mais envolvidas com o código principal comentar … Isso é adequado para uma pergunta de SE separada.
  • Boa resposta, mas uma pequena, mas importante ponto é iludido: como os nós da rede concordam sobre qual é a dificuldade?
  • @deadalnix: A dificuldade de um bloco é um cálculo determinístico baseado nos dados dos blocos anteriores. Todos os nós fazem independentemente o mesmo cálculo e obtêm o mesmo resultado.
  • @deadalnix: O carimbo de data / hora é uma parte do bloco, o que significa que quem encontrou o bloco decide o que colocar nele . O carimbo de data / hora não deve ser anterior à mediana dos últimos 11 blocos. Além disso, se um nó receber um bloco com carimbo de data / hora mais de 2 horas no futuro, será jecte e não propague.
  • @tobi: Ah, ok. Os comentários anteriores eram sobre o bug e ” erros ” sugeriam que ‘ s o bug, então presumi que ‘ estamos falando sobre isso. Então sim. Se presumirmos que por volta de 2140 o hashrate será em torno de * 1B do que é agora, a programação estará adiantada em 96 semanas, ou quase dois anos. Mas há ainda outro efeito – um atraso causado pelo fato de que, no início, a dificuldade era 1, embora o hashrate não fosse ‘ o suficiente para justificá-lo.

Resposta

A resposta de Meni é boa. Eu só quero dar alguns métodos de detalhes práticos sobre cálculo de dificuldade, talvez útil para o futuro visualizações da resposta a esta pergunta.

Vamos dar uma olhada no cabeçalho do bloco genesis de Satoshi (parte das informações relacionadas):

$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... } 

Como podemos ver acima, o bloco de gênese tem uma dificuldade “1” e bits “1d00ffff”. Os bits de bitcoin significam o valor de hash “alvo”, o novo bloco gerado deve atender a uma condição: o valor de hash duplo SHA-256 do cabeçalho do bloco deve ser menor que isso valor “target”.

O valor dos bits “1d00ffff” no bloco genesis significa o valor “target”:

[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00. 

Então, para encontrar um novo bloco, você deve pesquisar esse valor nNonce de 32 bits (e nTimes e o hashMerkleRoot também) até que o valor hash do bloco tenha 4 bytes zero à esquerda.A propósito, o nNonce é um dos campos na estrutura do cabeçalho do bloco:

 struct header_structure{ // BYTES NAME uint32_t nVersion; // 4 version uint8_t hashPrevBlock[32]; // 32 previous block header hash uint8_t hashMerkleRoot[32]; // 32 merkle root hash uint32_t nTime; // 4 time uint32_t nBits; // 4 target uint32_t nNonce; // 4 nonce }; 

Porque o algoritmo SHA-256 (bem como qualquer algoritmo hash criptograficamente seguro) produz uma saída que aparecerá como uma sequência uniformemente aleatória , o método prático de “tentativa e erro” é a única maneira de encontrar um novo bloco para atender à condição. A probabilidade de encontrar um bloco com o valor hash inicial de 4 bytes e zero é 1 / (2 ^ 32), o que significa que os números médios de “tentativa e erro” são exatamente 2 ^ 32 (ou seja, 4G).

Para facilitar a compreensão humana sobre esse valor de hash “alvo”, definimos o termo “dificuldade”, que significa os números médios de “tentativa e erro” para encontrar um bloco que atenda à condição “alvo”. E definimos a unidade de “dificuldade”: 1 “dificuldade” = hashes 4G

Então, até hoje, a altura do blockchain de bitcoin chega a 501509, vamos dar uma olhada em seu cabeçalho:

$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... } 

O bloco 501509 “bits = 0x18009645, é o formato compacto de inteiro de 256 bits, seu formato de 256 bits é:

[0x00000000,0x00000000,0x009645,{0x00..0x00}] {0x00..0x00} at above has 21 bytes 0x00. that is 0x009645 * (256 ^ 21) The genesis block"s target is ( 0x00ffff * 256 ^ 26 )which is the difficulty unit "1.0". So, the difficulty = (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21) = 65535/38469 * (256^5) = 1.703579505575918 * 2^40 = 1873105475221.611 

Até agora, você tem todos os detalhes sobre como calcular a” dificuldade “. Em alguns casos, também usamos o formato simples 1.7T para dizer a dificuldade, no exemplo acima :

 (1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4 

Comentários

  • 1d é 29 em dezembro (não 26). SHS é SHA
  • obrigado @BorisIvanov, o erro de digitação SHS foi corrigido. Mas 1d realmente significa 26 bytes cauda zero em vez de 29, leia o exemplo detalhado mostrado acima.
  • ah sim. Significand

Resposta

Eu gostaria de dar minha 2 centavos aqui, explicando a relação entre a probabilidade de minerar um bloco dado o alvo atual t e a dificuldade correspondente d conforme é calculado no núcleo do bitcoin.

Assim, as funções criptográficas de hash são idealizadas pela abstração oráculo aleatória [ https://en.wikipedia.org/wiki/Random_oracle] . Podemos, portanto, modelar a saída da função hash doubleSHA256 usada em PoW como uma variável uniforme no espaço {0,1}^256, ou seja, matrizes de 256 bits . Assim, a probabilidade de um único hash h ser um hash válido é:

p = P(h < t) = t /( 2^{256} - 1 ) 

Por outro lado d é calculado da seguinte maneira, assim como @gary explicado antes apenas transformado em decimais:

d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t 

A implementação está em [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , linha 60, função GetDifficulty. Na verdade, se alguém puder explicar como exatamente o código é mapeado para a fórmula acima, isso seria útil. Combinando essas duas fórmulas, obtemos:

d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p 

Analisando esta última expressão, a dificuldade é a razão entre a probabilidade de obter um hash menor que 2^{224} (que é o número decimal mais baixo que tem uma representação binária usando 256 bits começando com 32 bits zero) e a probabilidade de obter um hash válido com base no destino atual t. Esta é uma implicação direta de definir, no bloco de gênese, como dificuldade 1 aquela associada ao alvo hexadecimal 0x1d00ffff , expresso no que penso ser chamado de forma compacta de 32 bits para números de 256 bits.

A boa pergunta, acredito, é por que essa forma compacta específica foi escolhida para representar o alvo.

Comentários

  • Votos positivos! A forma compacta fornece 3 bytes mais significativos para o alvo, na dificuldade mínima os 3 bytes mais significativos são 00ffff.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *