1- Considere que a prova de trabalho (PoW) de uma criptomoeda pode ser dada pela função:
PoW(bloco + nonce) onde "bloco" é o bloco a ser minerado, "nonce" é um número aleatório de 32 bits (ou 64 bits em algumas moedas) e o resultado de "PoW(x)" é um valor inteiro de 256 bits.
2- Considere que o resultado de PoW(x) é matematicamente equivalente a um gerador pseudoaleatório (não há prova matemática disso para nenhum dos algoritmos atualmente usados, apenas provas empíricas).
(P1) O problema da mineração é encontrar um valor de "nonce" tal que:
PoW(bloco + nonce) <= target onde target é um parâmetro definido pela rede bitcoin, representado como um inteiro de 256 bits. (na prática ele é representado pela dificuldade, que é o número real dado pela divisão do valor 0x0000FFFF x 2
224 pelo valor do target).
A probabilidade p de encontrar uma solução para este problema na primeira tentativa é
p(x) = 1/target, que é proporcional à dificuldade, sendo aproximadamente
p(x) = dificuldade/(0x0000FFFF x 2224).
Ao longo do tempo, e de diversas tentativas, temos uma distribuição de poison, conforme o algorista indicou.
Considere agora que eu precise aumentar minha probabilidade de encontrar uma solução par ao problema em (P1) num determinado periodo de tempo. Como a dificuldade está fora do meu controle, a única solução é eu aumentar o número de tentativas a serem feitas nesse periodo. Uma pool nada mais é que um mecanismo para aumentar o numero de tentativas de resolver (P1) em um determinado periodo de tempo. E ela faz isso ao unificar e centralizar as tentativas de diversos usuários, ligados em rede.
Para distribuir o trabalho de forma a evitar duplicidade, a pool determina a cada usuário que trabalhe com um subconjunto da "nonce", da seguinte forma:
seja N o número de usuários, para cada usuário "n", nonce
n está no intervalo
[(n-1) * 232/N, n * 232/N). (essa é uma forma simplificada do que realmente é feito, existem outros mecanismos com alterar a ordem das transações enviadas a cada usuário, alterar o timestamp do bloco, etc, que são usadas pelas pools, mas o princípio é semrpe o mesmo: dividir o trabalho igualmente entre os usuários).
Entramos agora no problema real que precisamos resolver:
(P2) Como medir a contribuição de cada para a pool?
A solução usada pelas pools é simples. Dado um "target" target
pool de tal forma que
targetpool >>> target, o problema enviado pela pool aos usuários passa a ser:
PoW(bloco + noncen) <= targetpoolcomo
targetpool >>> target, é fácil ver que qualquer solução para (P1) atende também a (P2), entretanto muito mais soluções atendem (P2) do que (P1).
Veja que a pool não altera a probabilidade de que um individuo resolva (P1), mas aumenta a freqüência com que o grupo de usuários que compõem a pool encontra uma solução para (P1). Além disso, por (P2) ser muito mais fácil de resolver, pode-se usar as soluções de (P2) que não sejam soluções de (P1), comumente chamadas de "shares" para medir o tamanho da contribuição de cada um e "repartir" o bolo da seguinte forma:
Seja shares
n o numero de soluções de (P2) submetidas pelo usuário n <= N, calculamos o valor pago payout
n como sendo:
payout
n = 25 BTC*(shares
n/∑
i=1Nshares
i)
Com isso podemos ver que, sendo (P2) contido em (P1), todos os participantes na pool contribuem para a solução de (P1) de forma proporcional a sua capacidade de resolver (P2). E respondendo sua pergunta:
Pelo que eu entendi da sua explicação o meu minerador trabalha à toa então? Porque eu não tenho capacidade suficiente para encontrar com bloco dificuldade tão alta...
você tem sim a capacidade suficiente para encontrar um bloco com dificuldade alta, só o tempo médio entre um bloco encontrado e outro é que é muito alto. A pool diminui esse tempo tratando o grupo como um todo como se fosse um único indivíduo, e depois repartindo os dividendos.
Espero que tenha sido suficiente para você a "matemática" da coisa (sinceramente, seria muito mais fácil explicar e entender sem a matemática, já que é tudo muito intuitivo e direto). Mas como eu estava atoa e sou chato, resolvi fazer com a matemática toda.