O algoritmo de mineração de bitcoin de um ' ponto de vista

Esta página: Blocos disse que a mineração é, na verdade, para resolver um problema matemático, mas ler o algoritmo de hash de bloco não ajuda muito. Eu também tentei ler código fonte bitcoind, mas ler código leva muito mais tempo do que ler documentação 🙂

E eu escrevi um cliente json-rpc simples para chamar o método getwork () para buscar os “dados”, mas o que deveria Eu faço próximo a este “dado”?

Alguém poderia explicar o processo de mineração na visão do programador?

Comentários

  • but what should I do next to this "data"? Aqui ‘ uma breve implementação de referência. github.com/jgarzik/pyminer/blob/master/pyminer.py
  • Além disso, explain the mining process in programmer's view é uma questão bastante ampla. Que problema específico você está tentando resolver?
  • @NickODell Obrigado pelo seu código! Agora eu entendo como criar novos blocos. Mas cada bloco enviado é válido (a rede bitcoin enviará bitcoin para essa pessoa)? Eu descobri que o wiki do Bitcoin dizia que apenas 6 blocos serão criados a cada hora. Suponha que 100 pessoas obtenham o cabeçalho do bloco usando getwork ao mesmo tempo com a mesma dificuldade, acho que muito mais do que 6 blocos serão criados por essas pessoas. Estou certo?
  • Respondendo na ordem: Não. Não.
  • possível duplicata de Não consigo descobrir a API do getwork

Resposta

O Algoritmo de Mineração é o seguinte:

  • Etapa 0 – Recupere o hash do bloco anterior da rede.

  • Etapa 1 – Reúna uma lista de transações potenciais conhecidas como “bloco”. Esta lista de transações vem da rede bitcoin ponto a ponto.

  • Etapa 2 – Calcular um hash para um bloco de transações potenciais junto com um número aleatório.
  • Etapa 3 – Se o hash for maior do que o nível de dificuldade definido atualmente, você minerou esse bloco. Caso contrário, recomece a partir da Etapa 1. Quaisquer adições à lista de transações da etapa 1 junto com a mudança no número aleatório da Etapa 2 significam que há “uma chance de que o critério seja atendido na próxima tentativa.

Do ponto de vista de um programador, o pseudocódigo pode ser parecido com isto:

 P := The hash of the previously mined block B := A block of transactions H := A hash function D := Difficulty Level 0 Retreive P 1 Construct/Modify B 2 IF H(P, B, Some Random Number) > D END 3 GOTO 1 

Devo avisar que existem algumas imprecisões nessa descrição, mas na maioria das vezes, isso deve ser bom o suficiente. E aqui estão mais alguns esclarecimentos úteis:

O que “sa hash?

Um hash é uma função que converte dados em um número dentro de um determinado intervalo. O hash tem a propriedade de saber que sua saída é essencialmente imprevisível (dentro de um determinado intervalo). A função hash específica usada para mineração de bitcoin é SHA256 aplicada duas vezes.

Como funciona o nível de dificuldade?

Esta natureza imprevisível da função hash significa que inserir dados aleatórios (a transação + o número aleatório) irá essencialmente produzir um número aleatório dentro de um determinado intervalo. Restringir ainda mais o intervalo da saída desejada afeta a probabilidade de encontrá-la em uma única rodada. Isso cria uma maneira de determinar probabilisticamente a frequência com que uma solução será encontrada com base no número de vezes que o algoritmo pode ser executado na rede. Especificamente, quando você ouve o termo “gigahashes” ou “terahashes”, isso se refere ao número de vezes que a Etapa 3 pode ser executada. Conforme o número de hashes por segundo em toda a rede aumenta, a rede aumenta automaticamente a dificuldade de forma que uma solução seja encontrada em cerca de 10 minutos.

O que acontece quando um bloco é extraído?

Quando um bloco é extraído, o minerador envia o bloco para todos os outros mineradores na rede como evidência de que ele encontrei. Este bloco contém uma lista de transações, o hash encontrado, o número aleatório específico e uma referência ao hash anterior. À medida que cada minerador recebe o bloco recém-extraído, ele remove todas as transações que está minerando no momento que existem dentro do bloco (porque já foram confirmadas na cadeia de blocos) e transmite o bloco para outros mineradores que fazem a mesma coisa. a propagação acontece muito rapidamente.

Nota: o minerador original do bloco recebe uma “taxa de mineração”, que é uma recompensa que consiste em todas as moedas não gastas de transações, além de uma recompensa “coinbase”. A recompensa da base de moedas começou com 50 bitcoins e diminui pela metade a cada 210.000 blocos (cerca de uma vez a cada 4 anos). A recompensa da base de moedas acabará ficando tão pequena que será minúscula em comparação com as taxas dos mineiros.

Comentários

  • A recompensa é reduzida pela metade a cada 210000 blocos .- > Acabei de ver isso agora e acho que é legal: bitcoinclock.com
  • Oh , e a dificuldade é ajustada a cada blocos de 2016, assumindo que a rede continuará a operar com a taxa média de hash dos últimos blocos de 2016 e definindo a nova dificuldade de modo que esse hashrate resulte em um ciclo de bloco de aproximadamente 10 minutos.
  • Posso estar errado, mas acredito que o bloco também contém o hash do último bloco. E é assim que os blocos são encadeados para trás, levando ao termo blockchain.
  • @Murch, a dificuldade é realmente ajustada a cada bloco com base em quanto tempo levou para encontrar o bloco anterior, e neste ponto, o a dificuldade só pode aumentar. A cada blocos de 2016, a dificuldade é ajustada em relação aos últimos blocos de 2016 e pode subir ou descer. Isso ajuda a proteger contra quedas repentinas no poder de computação, o que, de outra forma, faria com que o tempo para encontrar um bloqueio aumentasse para mais de 10 minutos.
  • @ Tarandeep-Gill, that ‘ está correto! O hash do bloco anterior é hash junto com a lista de transações. Na verdade, isso me faz pensar que minha explicação sobre o hash está um pouco incompleta – A função hash específica não é SHA256 aplicada duas vezes conforme indicado, mas sim aquela função aplicada a várias partes do bloco (incluindo transações e o hash do bloco anterior) De maneiras diferentes. Esta é uma daquelas ” imprecisões ” sobre as quais avisei. Será que você consegue encontrar os outros …

Resposta

O objetivo de resolver um “quebra-cabeça” é (a) atrasar a mineração do bloco para uma média de 10 minutos e (b) incorrer em custos do mundo real para minerar um bloco (gastando energia da CPU, portanto, energia). Os custos existem para evitar um ataque Sybil (colocando muitas máquinas de mineração em funcionamento para fazer um ataque de 51%).

O atraso é colocado para permitir que um bom bloco se propague ao redor do globo para todos os outros mineradores , sem dar ao mineiro que acabou de cunhar o novo bloco uma vantagem inicial. Para isso, o tempo de bloqueio (10 minutos) precisa ser de ordem de magnitudes maiores que o atraso de propagação (alguns segundos).

Portanto, o tipo de quebra-cabeça é, em certo sentido, irrelevante, poderia muito bem ser um Sudoku gigante.

Resposta

Qualquer hash é um hash válido. A questão é se o hash satisfaz nossos critérios. O hash é, na verdade, algumas coisas (voltaremos a isso) que, alinhadas juntas, formam uma string com um comprimento específico. Você então hash a string inteira. Pense no hash resultante como um número. O que queremos é que o número resultante seja menor que um número de destino. Portanto, é como rolar um dado de um bilhão de lados e chegar a um número abaixo do número-alvo. Esse número-alvo é considerado “dificuldade”. Conforme mais pessoas estão jogando o dado, diminuímos o número-alvo para reduzir a probabilidade qualquer rolo de dados acertará.

Tão importante, algumas das coisas que alinhamos na seqüência de hash são coisas que podemos ajustar. O hash não é exatamente como rolar o dado, porque se tivermos a mesma coisa repetidamente, obteremos o mesmo resultado continuamente. No entanto, mesmo um pequeno ajuste no hash pode ter um grande impacto sobre o que é o hash resultante. O item principal que podemos manipular é chamado de “nonce”. Basicamente, escolhemos um nonce para usar na string, fazemos um hash de toda a string e vemos o que obtemos. Se o hash não for atingido, modificamos o nonce e tentamos novamente . O nonce em si não é muito grande, então há um número limitado de variações do nonce que você pode experimentar. O próximo item que podemos alterar é um carimbo de data / hora. Também podemos mexer no timestamp. Cada meneio do timestamp nos permite percorrer todo o conjunto de valores de nonce possíveis novamente. Repetimos esse processo de esgotar as possibilidades do nonce e, em seguida, mexer o timestamp continuamente até o hash resultante é menor do que o número de dificuldade desejado.

Quando isso acontece, proclamamos ao mundo que este carimbo de data / hora mais este nonce funcionam para resolver o bloqueio. Outros validam como verdadeiro e é adicionado ao cadeia de blocos. Um bloco é considerado “Validado” uma vez que está um certo número de blocos “profundos” na cadeia de blocos, o que significa que é um bloco histórico em comparação com o bloco atual. Validação é um nome um pouco incorreto aqui, porque não é que o bloco já não seja válido. O que estamos validando é a prova do trabalho, ou seja, uma vez que esse bloco histórico esteja enterrado longe o suficiente, a quantidade de esforço envolvida para criar essa história é intransponível para que outra pessoa tente criar uma variação diferente da história. Eles teriam que criar sua própria versão desse bloco (a única razão é escrever em sua própria versão das transações, ou seja,roubar moedas) depois resolvê-los eles mesmos, então resolva o próximo bloco e o seguinte e assim por diante e “alcance” todos os outros. Isso significa que eles teriam que superar o mundo no jogo de lançamento de dados. Talvez uma vez na história do universo alguém pudesse ter sorte no momento com dois ou três blocos consecutivos, mas com os 120 blocos que a maioria das piscinas de mineração e trocas exigem agora? Não vai acontecer, nunca.

Deixe uma resposta

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