Prova de jogo: visão interna


Existem muitos artigos e discussões filisteus na Internet, mas não há informações suficientes sobre os méritos. Em algum momento, o autor percebeu que a mecânica e muitas nuances de segurança relacionadas não são totalmente compreendidas, mesmo por muitos desenvolvedores de criptomoedas. Isso foi revelado em um caso real de portar a implementação de PoS para uma das criptomoedas e na publicação adicional de informações sobre as vulnerabilidades encontradas por especialistas de terceiros.

Este artigo será útil para todos os desenvolvedores que já encontraram vulnerabilidades PoS ou que ainda estão por vir.


Horrorizado sob o corte.


Um grão de história


Na Internet, o surgimento da Prova de Participação (PoS) em Peercoin é rastreado após uma discussão em um dos fóruns em 2011, seu uso subsequente em Novaoin e sua distribuição posterior em PIVX e outros garfos de Bitcoin. Uma lógica kernel.cpp bastante primitiva foi levada ao kernel.cpp kernel.h / kernel.cpp , que vagueia pelos espaços dos garfos na forma de vários módulos Frankenstein.


O algoritmo PoS passou por vários estágios de desenvolvimento, alguém fornece versões. Agora as opções de PoS estão divididas por razões naturais, o DPoS apareceu. Uma das soluções mais avançadas é o protocolo Casper no Ethereum.


Qualquer blockchain requer a geração de blocos e alguém deve ter o direito de construir um novo bloco. Se o autor faz isso sem muita concorrência em um blockchain como o sistema de controle de versão Git, então em criptomoedas há uma luta feroz pela recompensa do bloco no âmbito do Proof-of-Work (PoW) - encontrando essa combinação de parâmetros de entrada variáveis ​​selecionando um resultado correspondente a determinado por um determinado objetivo (mineração, mineração).


O PoS substitui a Prova de Trabalho (PoW) para evitar o desperdício de recursos na mineração. Em vez disso, todos os parâmetros de entrada são estritamente definidos com uma característica constante, com base nas economias existentes dos porta-moedas. Portanto, o PoW é necessário como ponto de partida para o PoS, se você não recorrer a várias opções para o enriquecimento hipotecário inicial dos criadores da moeda.


Porque


Economizar energia é tão importante para desenvolvedores e detentores de moedas quanto limitar as emissões de gases de efeito estufa para produtores e consumidores. A verdade cruel é diferente:


  1. Os projetos baseados em PoW estão sujeitos aos chamados "Ataques de 51%": os atacantes podem alavancar grandes potências, criar uma cadeia paralela e, de repente, publicá-la com um movimento de moeda diferente (por exemplo, desperdício duplo)
  2. Os mineradores de PoW precisam cobrir seus custos e investir em capacitação - essa é uma saída direta de capital de projetos,
  3. os proprietários de poupança querem manter seu poder de compra aumentando seu capital, em vez de olhar para a inflação natural.

Em um exemplo vivo: entre novembro e dezembro de 2018, houve tentativas de ataques; então, em dezembro-fevereiro, houve uma agitação como a moeda mais lucrativa para mineração em placas de vídeo; a taxa caiu de 2+ para 0,5 USD; Depois de mudar para PoS, a taxa subiu para 1 USD em uma semana e o influxo de investimentos aumentou.




Pontos técnicos


Atenção: nesta seção, estamos falando sobre o PoS "tradicional" na forma como está em Peercoin, PIVX e seus garfos.


Você precisa entender que não há centralização e contabilização de "pontos". Nesta versão, o mesmo princípio de sorte funciona como no PoW.


1. Terminologia


A terminologia é relativamente geral, mas em diferentes implementações suas nuances são:


  • Alvo PoW - alvo = alvo básico, geralmente 2 ^ 240 (0x0000ffff ...) dividido pela complexidade do bloco (aumenta o número de zeros na frente).
  • Dificuldade do bloco - a complexidade do bloco em relação à meta base, determinada de forma determinável com base na taxa de crescimento atual da cadeia.
  • UTXO - Saída de transação não gasta , um par de um hash de transação e um número de saída.
  • CoinBase é uma transação especial com índice 0 no bloco que contém a recompensa.
  • Aposta ou CoinStake é uma transação especial com o índice 1 em um bloco.
  • Entrada de Aposta - UTXO que atende aos requisitos de uma aposta por tamanho e idade.
  • Modificador de estaca - um parâmetro especial calculado deterministicamente para cada entrada de estaca .
  • O Hash da estaca é um resultado de hash que deve ser aritmeticamente menor que o Alvo da estaca .
  • Alvo de Aposta - o mesmo que o objetivo de PoW, mas aumentado proporcionalmente pela quantidade de Entrada de Aposta em relação ao lance mínimo.
  • Bloquear assinatura - Bloquear assinatura .
  • Garfo - uma cadeia de ramificação.
  • Split - compartilhamento de rede.
  • Blocos órfãos - descartados devido à escolha de outra alternativa.

2. Anatomia


Processo de geração:


  1. Encontramos todos os UTXO que atendem aos requisitos do Stake Input
  2. Encontre o modificador de estaca.
  3. Multiplique o alvo de PoW pela entrada da estaca
    • em milionésimos de fato - é por isso que 1 MH PoW hashrate sai experimentalmente igual a uma moeda.
  4. Stake Hash = H(Stake Modifier, Stake Block Time, UTXO output index, UTXO txid, Current Block Time) .
    • Somente parâmetro variável
  5. Se Stake Hash >= Stake Target , tente encontrar o Current Block Time no intervalo aceitável.
    • você precisa considerar a possibilidade de estouros de meta de estaca quando multiplicados pela quantidade de entrada de estaca, dependendo da implementação.
  6. Colocamos Coinbase em tx [0] e CoinStake em tx [1].
    • o beneficiário do Coinbase é o mesmo script (endereço) que o Stake Input.
  7. Nós assinamos o bloco.

2.1 Tempo de bloqueio:


É fácil ver que uma fraude pode trazer algum benefício ao longo do tempo. O consenso padrão limita os limites inferior e superior.


Os inferiores sempre definem o tempo médio dos blocos nos últimos N blocos, geralmente acima de 11. Essa é a tolerância à imprecisão do tempo na geração de nós.


O limite superior histórico foi definido para PoW com um dedo para o céu às 2 horas. Aumentar os intervalos reduz a complexidade e torna o ramo menos atraente - portanto, não faz sentido. Mas para PoS, isso faz sentido.


O PIVX e outros limitam o tempo futuro a no máximo 3 minutos. Alguns colocam uma restrição mais severa, mas isso cria problemas para os usuários. Algumas implementações de PoS decidiram alterar os intervalos mínimos de tempo atual do bloco de um segundo para 15-16 segundos.


2.2 Modificador de estaca:


O Modificador de Estaca foi concebido como um meio de dificultar a previsão e construir a cadeia adiante, mas algo deu errado ...


Existem várias opções para o cálculo: os últimos bits de hashes de bloco no final de intervalos de tempo especificados progressivamente, valores [não muito] mal previstos de blocos anteriores, etc. Em alguns lugares, parece mais um código ofuscante do que algo sensato.


O original ocupa um intervalo de 64 intervalos. Essa lacuna é progressivamente dividida em 64 partes desiguais. As bordas são arredondadas para minutos. Nas bordas, os blocos existentes são selecionados e um último bit é retirado deles. Portanto, verifica-se um número de 64 bits, algo semelhante ao Nonce.


O intervalo em Peercon é de 20 minutos, mas o pessoal da PIVX decidiu que o intervalo de 1 minuto, arredondado para o minuto, é o que o médico ordenou.


Em geral, em algumas implementações como o Blackcoin V2 +, tudo é corrigido e o Stake Modifier é contado a partir da cabeça, enquanto no Peercoin V03, PIVX, Blackcoin V1 e outros do bloco Stake Input. Este último destrói quase completamente o significado. Supõe-se que a confusão ocorreu por causa do problema banal de nomear variáveis, outras metamorfoses e copiar-colar impensado. E o próprio autor descobriu o problema bastante tarde, enquanto toda a sua atenção estava focada na proteção contra DoS. Não seja pego!


2.3 Bloquear assinatura


Como o hash do bloco não serve mais como prova de trabalho e qualquer pessoa pode receber a transação CoinStake assinada do bloco de outra pessoa, é necessário verificar se o bloco foi criado pelo proprietário da Stake. Portanto, o cabeçalho é assinado com a mesma chave privada que o CoinStake.


2.4 Script de saída CoinBase e CoinStake


Os mesmos scripts de saída, ou como as pessoas chamam endereços de carteira, são necessários para preservar a privacidade e evitar vincular endereços individuais em uma carteira.


2.5 O que e onde?


Existem diferentes variações de como eles lidam com quantidades no CoinBase e CoinStake. Lógica e motivação em um caso particular:


  1. Os valores devem ser mantidos separados para evitar até a menor perda possível de fundos do usuário devido a erros de processamento.
  2. O CoinBase mantém suas 100 confirmações, mas o CoinStake pode ser gasto imediatamente, o que naturalmente deixa o risco de gastos duplos.
    • o encaixe na profundidade dos blocos também contradiz a qualificação de idade para uso como entrada da estaca.
  3. O CoinBase e o CoinStake nunca devem entrar no mempool e todas as transações baseadas neles devem ser excluídas durante a reconstrução da cadeia.

3. Blocos completos contra cabeçalhos


A entrada de um nó completo na rede começa com a sincronização. No Bitcoin, a sincronização é baseada principalmente em cabeçalhos de bloco, como eles contêm informações suficientes para verificação preliminar de consenso. Primeiro, cabeçalhos relativamente pequenos são retirados e verificados em lotes de até 2000 peças de um nó lateral. Se a verificação inicial foi bem-sucedida, todos os blocos são puxados em paralelo de todos os nós conectados.


A proteção contra inundações é baseada no fato de que o nó local compara o cabeçalho mais conhecido com o que possui e solicita toda a cadeia de cabeçalhos. Durante o download, tudo é verificado pelo baixo custo de espaço em disco e computação. As correntes são comparadas em peso com base em uma característica, como o trabalho em cadeia , que é a soma da complexidade de cada bloco individual. Construir uma cadeia alternativa tão forte exigirá investimentos extremamente grandes de recursos, o que torna os ataques pouco promissores.


Com o PoS, essa abordagem não funciona, porque Para verificar os blocos, você precisa processar os blocos anteriores completos pelo menos até a idade mínima da Estaca. As implementações visualizadas pelo autor não começaram a ser pervertidas, mas simplesmente se recusaram a trabalhar com cabeçalhos.


Portanto, o autor implementou um download paralelo oportunista de blocos seguindo os cabeçalhos, o que aumenta significativamente a velocidade de sincronização devido ao uso de todas as conexões. Atrasos menores ocorrem apenas se os pares estiverem em cadeias diferentes - a conexão será interrompida após um pequeno tempo limite, como no esquema padrão. Como sinal de menos, a tendência de escolher uma cadeia falsa no momento da sincronização.


A propósito, o cliente Bitcoin padrão e seus garfos têm captado o número mínimo padrão de conexões de saída por 8 por tempo suficiente, se alguns deles falharem por vários motivos. Isso foi resolvido por conexões de saída assíncronas.


4. Garfos, fendas e órfãos


Com a concorrência na construção de blocos, cadeias alternativas de 1-2 links são relativamente comuns. Os garfos mais longos nas redes desenvolvidas ocorrem naturalmente apenas com falhas épicas no consenso devido a um erro de programação ou uma interrupção global da Internet.


Mesmo com a separação, geralmente não há ameaça à integridade do processamento de transações, pois ao desanexar blocos, todas as transações voltam ao mempool e já estão incluídas em outros blocos. Mempool é um repositório temporário de transações depois que elas são criadas. O próprio Mempool é salvo em disco nas versões recentes. A recompensa pelo bloco é destruída. É por isso que o número mínimo de confirmações (profundidade) é definido para prêmios.


Acontece que os segmentos de rede local perdem a conexão com o mundo externo e continuam a minerar, assumindo que há uma conexão com a rede principal. Esses ramos geralmente não representam uma ameaça devido à sua fraqueza natural.


O principal ataque de 51% para PoW já foi descrito acima - é extremamente intensivo em recursos, mas para PoS está se tornando relativamente acessível. Por esse motivo, torna-se tecnicamente possível produzir muitos ramos a partir de vários elos da cadeia. Uma das soluções clássicas é proibir os garfos abaixo de uma certa profundidade.


O principal problema dessa proteção é a incapacidade de os nós dos segmentos eremitas retornarem independentemente ao circuito principal após uma reinicialização.


Portanto , uma abordagem foi implementada na proibição de garfos com mais de um certo período de tempo somente se o topo da cadeia for bastante jovem.


Com um intervalo alvo de blocos de 1 minuto, o critério do garfo antigo foi escolhido em 1 hora, o que corresponde aproximadamente a 60% das confirmações do CoinBase, e o critério de juventude da coroa aos 15 minutos é 3 vezes maior que o atraso estatístico máximo do bloco.


5. Bloquear e dividir hash


No PoW, um hash de bloco cobre completamente todos os dados. Também é usado para verificar o alvo. No PoS, o Stake Hash é um valor separado porque é necessário excluir a possibilidade de sua seleção. Isso abre a principal ameaça - a capacidade de produzir um número ilimitado de versões diferentes do bloco com base na mesma estaca coincidente, que é fácil de inundar e colocar a rede ou seus nós individuais.


As abordagens de defesa ingênua dão origem a vulnerabilidades divididas ainda mais graves. Uma dessas abordagens em diferentes variações é permitir o uso da entrada da estaca apenas uma vez. Um ataque simples é enviar blocos diferentes para nós diferentes, o que cria imediatamente uma divisão suave.


É ainda mais fatal exacerbar isso com uma proibição de DoS, que dividirá não apenas as cadeias, mas a própria rede em diferentes segmentos.


Outros problemas surgem - a incapacidade de usar a estaca de um bloco derrubado.


Portanto , o método do acelerador foi escolhido como a solução mais segura - a mesma estaca não pode ser usada mais de uma vez por minuto. A lógica é simples: um ataque pode durar apenas no intervalo de 1 hora (veja a bifurcação antiga acima), para a qual é possível inundar não mais do que 60 blocos. Na melhor das hipóteses, no próximo bloco, a rede já passará para um único circuito. Na pior das hipóteses, com um ataque contínuo, isso acontecerá em uma hora. A probabilidade do pior caso - encontrar vários blocos seguidos, está derretendo exponencialmente.


Mesmo assim, permanecem alguns pontos nos quais os nós são vulneráveis ​​a inundações moderadas até o momento da sincronização completa .


6. idade mínima


Para alguns, essa limitação é desconcertante, mas é extremamente importante para a estabilidade da rede, pois esse parâmetro está diretamente relacionado ao comprimento máximo da rede alternativa, que o nó local poderá verificar sem distorções técnicas graves.


Como mencionado anteriormente, o nó local deve processar todos os blocos até o limite de idade para poder verificar se a Entrada da Estaca a) tem um lugar para ser b) é realmente UTXO e não foi gasta.


Verifique se isso é possível apenas através da funcionalidade do chamado. CoinView, que é o estado do movimento de moedas no momento de um bloco específico - o topo da cadeia principal no entendimento do nó local.


A implementação de um teste completo de circuitos alternativos em intervalos de tempo ou mesmo de uma maneira especial salva pelo CoinView parece pouco promissora, porque o número dessas cadeias alternativas é infinitamente grande.


Uma barra muito grande para o limite de idade do UTXO afeta negativamente os usuários que desejam gastar ou combinar parte de suas moedas.


Se você especificar essa borda na profundidade dos blocos, uma situação hipotética de uma cadeia completa será interrompida devido ao fato de não haver UTXO adequado. No caso de unidades de tempo, pelo menos algum movimento ocorre.


Portanto , uma escolha equilibrada de 1 hora é usada em outras redes em unidades de tempo absolutas, em vez da profundidade dos blocos.


7. O que é melhor que N UTXO para a quantidade mínima ou um UTXO com N total?


Aqui a analogia sugere: que é melhor ter uma arma com precisão de 0,9 ou três armas com precisão de 0,3, mas com probabilidades da ordem de 1/2 ^ 20, os resultados de tais cálculos parecem estar nivelados. Um pequeno mapa confunde a maturidade da qualificação.


A crença atual de que muitas transações pequenas encontram mais blocos provavelmente data de quando a idade da entrada da estaca também foi levada em consideração na determinação do peso. Naquela época, pequenas transações antigas realmente faziam muito sentido.


No momento, com base em experimentos práticos e cálculos teóricos, os grupos agrupados em UTXO grandes trazem mais blocos. Além disso, menos UTXO requer menos trabalho da CPU. Alguém afirma o contrário.


Então pense por si mesmo.


8. Executando blocos para a frente


Os mineradores PoS naturalmente superam um pouco os tempos de bloco. Isso afeta a complexidade da rede para pior. O código Bitcoin padrão seleciona o primeiro bloco recebido, independentemente do tempo indicado nele. A maioria das implementações de PoS faz o mesmo.


Portanto, a lógica do minerador PoS foi alterada para iniciar a seleção a partir do tempo médio dos blocos, se o tempo do bloco atual fosse adiante. Ao mesmo tempo, antes de comparar a ordem, os nós comparam o tempo indicado dos blocos. O minerador PoS envia o bloco encontrado para a rede, mesmo que veja que está gerando um fork.


Dessa forma, a rede também é protegida contra blocos hipotéticos enviados prematuramente, cuja entrada de estaca não pode ser usada nos próximos 60 segundos com o mesmo modificador de estaca devido à proteção contra DoS. Como uma punição dupla por trapacear com o tempo.


9. Uma pequena lista de verificação


  1. A entrada da estaca deve ser UTXO válida antes do ponto da bifurcação:
    • no caso da corrente principal, o ponto da forquilha é a ponta,
    • no caso de um circuito alternativo - o UTXO após o ponto de forquilha pode levar a auto-DoS ao alternar,
    • O UTXO não deve estar no mempool por si só.
  2. Não aceite o CoinStake no mempool ao reconstruir o circuito principal:
    • o mesmo acontece com o CoinBase,
    • isso pode destruir a cadeia de transações (improvável).
  3. Não aceite garfos de blocos antigos se a parte superior estiver bem viva.
  4. O limite de idade em unidades de tempo absoluto para entrada de estaca é necessário para estabilidade e segurança.
  5. O Hash da estaca só deve mudar a partir do horário do bloco.
  6. O modificador de estaca não deve ser vinculado ao bloco de entrada de estaca.
  7. Trabalhar com cabeçalhos de bloco requer processamento especial na rede e durante a reindexação.
  8. O CoinStake é gravado na carteira local e requer algumas alterações para a exibição correta dos ventiladores.
  9. Os mineradores PoS provavelmente têm batentes suficientes e precisam ser finalizados com um arquivo.
  10. O re-índice precisa ser aprimorado, porque Ele funciona por analogia com os cabeçalhos - primeiro ele carrega e verifica apenas o índice de blocos e, em seguida, apenas tenta processar os blocos.
  11. Se a transição para o PoS não for codificada, mas através do spork, será necessário capturá-la na inicialização, porque sporks não são salvos.
  12. Os pontos de verificação no Dash e no Bitcoin são quase uma farsa e exigem uma revisão muito séria.
  13. Se a bifurcação do Dash for da versão 0.13, haverá problemas com o processamento de dados de masternode no modo de usuário simples.
    • Com o reinício frequente do cliente, a exibição da rede fica distorcida.
    • É melhor ignorar o cache se estiver executando no modo gráfico.
  14. Altere a seleção do melhor bloco, levando em consideração o horário do bloco.
  15. Bitcoin .
  16. mempool CoinStake .





. mainnet PoW , , PoS, . PoS Ethereum Casper'.


GPU - — ethminer'. 150-200 GH (ethash). - PoS .


PoS PIVX 2.x " ". - PIVX , , . , PIVX 2.x . Dash 0.12 Bitcoin'.


, PoS . , , .




. . whitepaper -.



PoS PIVX Bitcoin/Dash. CoinStake . PoS .


, Stake Modifier Stake Hash , Stake Input . - , - PIVX .



— . :


  1. .
  2. .
  3. — .. , .
  4. , - , .

. spork' , .


, . spork' .


PoS


, - . spork, , .



, .. . , .



testnet, .


testnet 3 1 mainnet, .



PoW , PoS - , 1e6 PoW.


. mainnet Stake Input.


.


PoS


X spork PoS . - , .


. , . .


, , .



Stake Modifier . . PIVX - … , , Ethereum, .




Conclusão


- , . , PoS , . .


: - .


GitHub

Source: https://habr.com/ru/post/pt442862/


All Articles