Open plebhash opened 10 months ago
TLDR: podemos usar a crate homestar
(implementacao referencia da IPVM) pra contabilizacao de shares numa VM distribuida em diferentes nodos plebpool_node
o ShareLedger
descrito acima pode ser implementado como um programa de IPVM
(vm wasm distribuida, tecnologia irmã do IPFS, cria do Protocol Labs)
O IPVM
possui um sistema de DB chamado RhizomeDB
, que pode servir de primitiva de armazenamento indexado distribuído, sob o qual ShareLedger
pode ser abstraído.
assim, cada minerador poderia rodar seu próprio plebpool_node
e contabilizar as shares de todos os outros mineradores da pool, dentro de sua própria instância da wasm vm
para cada share encontrada por um minerador, ele é responsável por atualizar o ShareLedger
na IPVM
.
assim que atualiza, ele propaga essa atualização via gossip
contanto que a dificuldade de mineração esteja calibrada para um valor onde a taxa de submissão de shares seja restrita abaixo de um limiar ótimo pra rede, a tendência da IPVM
vai ser de atualizar o estado ShareLedger
(abstraído na RhizomeDB) de forma automatizada pela submissão de shares
condições necessárias para execução bem sucedida dessa atualização:
jd_server
plebpool_node
rejeita shares que não possuem essas características, e a execução da IPVM para atualização do ShareLedger
mineradores desonestos rodando versões customizadas de plebpool_node
(sobrescrevendo o ShareLedger
no IPVM
de forma desonesta) terão dificuldade em propagar suas shares, pois pares honestos de plebpool_node
detectarão que as shares recém inseridas na atualização de estado não atendem os critérios de share válida (template, dificuldade, assinatura), encerrando assim a conexão e isolando o atacante da rede.
contudo, essa arquitetura seria vulnerável a ataques eclipse, onde todas conexões de p2p dos nós plebpool_node
honestos são conexões com nós maliciosos... nesse cenário, o estado da IPVM plebpool
(armazenamento distribuído da variável ShareLedger
implementada com primitivas do RhizomeDB
) seria corrompido
referencias em IPVM
criei uma lista de stars pra crates que considero boas candidatas a dependencias: https://github.com/stars/plebhash/lists/plebpool-design
acho que viajei um pouco nesse aqui
viajei nada isso eh genial
para o problema de contabilizao de shares, proponho um hashmap duplo com interface de leitura via RPC
ShareLedger
o modulo
plebpool::share_ledger
usaria a cratedouble-map
para uso doDHashMap<K1, K2, V
fn
add_share
em pseudorust:
referencia sobre
fn DHashMap.get_keys_value()
: https://docs.rs/double-map/0.14.0/double_map/struct.DHashMap.html#method.get_keys_value)fn
share_janitor
async, checa as
block_height
, e se a job for antiga (e.g.: 6 blocos passados) ela é descartada de memoriaem pseudorust:
JSON-RPC
o modulo
plebhash::json_rpc
consome as APIs fornecidas porplebpool::share_ledger
e disponibiliza os seguintes endpoints:get_hashrate
um minerador enviando 1kH/s faria assim para conferir seu hashrate:
get_global_hashrate
se o minerador quiser saber o hashrate global (e.g.: 10GH/s):
get_relative_hashrate
se o minerador quiser saber como o hashrate dele se compara ao global:
onde o resultado é igual a
get_hashrate / get_global_hashrate
:get_shares
se o minerador quiser saber quantas shares ele ja acumulou no job atual (e.g.: 50MH):