Mining


Con il termine “mining” si intende il processo atto ad aggiunge nuovi blocchi alla catena di blocchi, rendendo difficile la modifica degli stessi e quindi della cronologia delle transazioni.


Possiamo individuare ad oggi due forme di mining:


Mining “Solo”

Il minatore tenta di generare nuovi blocchi da solo, con i proventi derivanti dal premio del blocco e le commissioni di transazione che vanno interamente a se stesso, permettendogli di ricevere ingenti pagamenti con una varianza più alta (tempo più lungo tra i pagamenti)


Mining “Pool”

Il minatore raggruppa le risorse con altri minatori per trovare blocchi più spesso, con i proventi condivisi tra i minatori della pool in stretta correlazione con la quantità di potere di hashing che ciascuno di loro ha contribuito, consentendo al minatore di ricevere piccoli pagamenti con una varianza inferiore (minor tempo tra i pagamenti).


Solo Mining

Come illustrato di seguito, i miner “solo” usano tipicamente bitcoind per ottenere nuove transazioni dalla rete. Il loro software di mining esegue periodicamente il polling (letteralmente, interrogazione ciclica) di bitcoind per le nuove transazioni utilizzando RPC getblocktemplate, che fornisce l'elenco di nuove transazioni più la chiave pubblica a cui deve essere inviata la transazione coinbase.



Il software di mining costruisce un blocco utilizzando il modello (descritto di seguito) e crea un'intestazione di blocco (block header). Invia quindi l'intestazione del blocco da 80 byte al suo hardware di data mining (un ASIC) insieme a una soglia target (impostazione della difficoltà). L'hardware di mining itera su ogni possibile valore per il nonce dell'header del blocco e genera l'hash corrispondente.


Se nessuno degli hash è sotto la soglia target, l'hardware di mining ottiene un'intestazione di blocco aggiornata con una nuova radice di merkle dal software di mining; questa nuova intestazione di blocco viene creata aggiungendo ulteriori dati nonce al campo coinbase della transazione coinbase.

D'altra parte, se si trova un hash al di sotto della soglia target, l'hardware di mining restituisce l'intestazione del blocco con il nonce riuscito al software di data mining. Il software di mining combina l'intestazione con il blocco e invia il blocco completato a bitcoind per essere trasmesso alla rete per l'aggiunta alla catena di blocchi.


Pool Mining


I minatori delle pool seguono un flusso di lavoro simile, illustrato di seguito, che consente agli operatori del pool di pagare i minatori in base alla loro quota di lavoro svolto. Il pool di mining ottiene nuove transazioni dalla rete utilizzando bitcoind. Utilizzando uno dei metodi discussi in seguito, il software di mining di ciascun minatore si connette al pool e richiede le informazioni necessarie per costruire le intestazioni dei blocchi.



Nell'estrazione in pool, il pool imposta la soglia di destinazione di alcuni ordini di grandezza superiore (meno difficile) rispetto alla difficoltà di rete. Ciò fa sì che l'hardware di mining restituisca molte intestazioni di blocco che non danno un hash con valore eleggibile per l'inclusione nella catena di blocchi ma che eseguono l'hash al di sotto del target del pool, dimostrando (in media) che il minatore ha controllato una percentuale dei possibili valori hash.

Il minatore invia quindi al pool una copia delle informazioni necessarie al pool per verificare che l'intestazione abbia l'hash al di sotto della destinazione e che il blocco di transazioni a cui fa riferimento il campo della radice di merker dell'intestazione sia valido per gli scopi del pool. (Questo di solito significa che la transazione coinbase deve pagare la pool).

L'informazione che il minatore invia al pool viene chiamata condivisione (share) perché dimostra che il minatore ha fatto una parte del lavoro. Per casualità, alcune condivisioni che il pool riceve saranno al di sotto del target di rete: il pool di mining invia il blocco costituito alla rete perché sia aggiunto alla catena di blocchi.

Il compenso per il blocco e le commissioni di transazione derivanti dall'estrazione di quel blocco vengono corrisposti al pool di mining. Il pool paga una parte di questi proventi ai singoli minatori in base al numero di condivisioni che hanno generato. I pool utilizzano diversi sistemi di distribuzione dei premi basati su questo sistema di condivisione di base.


Prototipi di blocchi


Sia nel mining solo che in pool, il software di mining deve ottenere le informazioni necessarie per costruire le intestazioni dei blocchi. Questa sottosezione descrive, in modo lineare, come tali informazioni vengono trasmesse e utilizzate. Tuttavia, nelle implementazioni effettive, parallel thread e queuing vengono utilizzati per mantenere gli ASIC funzionanti alla massima capacità.


getwork RPC


Il metodo più semplice e originale era l'ormai raro Bitcoin Core “getwork” RPC, che costruisce direttamente un'intestazione per il minatore. Dal momento che un'intestazione contiene solo un singolo nonce a 4 byte valido per circa 4 gigahash, molti minatori moderni devono eseguire dozzine o centinaia di “getwork” al secondo. I minatori soli possono ancora usare “getwork” su v0.9.5 o precedenti, ma la maggior parte delle pool oggi lo scoraggia o non consente il suo utilizzo.


getblocktemplate RPC


Un metodo migliorato è il RPC Bitcoin Core “getblocktemplate”. Ciò fornisce al software di mining molte più informazioni:


Le informazioni necessarie per costruire una transazione coinbase pagando il pool o il portafoglio bitcoind del minatore “solista”.

Un dump completo delle transazioni che bitcoind o il pool mining suggeriscono di includere nel blocco, consentendo al software di mining di ispezionare le transazioni, facoltativamente aggiungere ulteriori transazioni ed eventualmente rimuovere transazioni non richieste.

Altre informazioni necessarie per costruire un'intestazione di blocco per il blocco successivo: la versione del blocco, l'hash del blocco precedente e i bit (target).

L'attuale soglia di destinazione (target) del pool di mining per l'accettazione di condivisioni (share). (Per i minatori in “solo”, questo è il target della rete.)


Usando le transazioni ricevute, il software di mining aggiunge un nonce al campo extra nonce della coinbase e quindi converte tutte le transazioni in un merkle tree per ricavare una merkle root che può utilizzare in un'intestazione di blocco. Ogni volta che è necessario modificare il campo extra nonce, il software di mining ricostruisce le parti necessarie del merkle tree e aggiorna i campi time e merkle root nell'intestazione del blocco.

Come tutti gli RPC bitcoind, getblocktemplate viene inviato su HTTP. Per garantire che ottengano il lavoro più recente, la maggior parte dei minatori utilizza la longpoll HTTP (https://en.wikipedia.org/wiki/Push_technology#Long_polling ) per lasciare una richiesta getblocktemplate aperta in ogni momento. Ciò consente alla mining pool di inviare un nuovo getblocktemplate al minatore non appena un altro minatore della rete pubblica un nuovo blocco o il pool desidera inviare più transazioni al software di mining.


Stratum


Un'alternativa ampiamente usata per getblocktemplate è il protocollo di mining Stratum. Stratum si concentra sul fornire ai minatori le informazioni minime di cui hanno bisogno per costruire le intestazioni dei blocchi da soli:


Le informazioni necessarie per costruire una transazione coinbase che paga il pool.

Le parti del merkle tree che devono essere re-hashate per creare una nuova merkle root quando la transazione coinbase viene aggiornata con un nuovo extra nonce . Le altre parti del merkle tree, se presenti, non vengono inviate, limitando effettivamente la quantità di dati che devono essere inviati a (al massimo) circa un kilobyte al volume corrente delle transazioni.

Tutte le altre informazioni non-merkle root necessarie per costruire un'intestazione di blocco per il blocco successivo.

L'attuale soglia di target della mining pool per l'accettazione di condivisioni (shares).


Usando la transazione coinbase ricevuta, il software di mining aggiunge un nonce al campo extra nonce della coinbase, esegue l’hash della transazione coinbase e aggiunge l'hash alle parti ricevute del merkle tree. Come necessario, l'albero viene sottoposto all'hash per creare una merkle root, che viene aggiunta alle informazioni dell'intestazione del blocco ricevute. Ogni volta che il campo extra nonce deve essere modificato, il software di mining aggiorna e ricompone la transazione coinbase, ricostruisce la merkle root e aggiorna il campo merkle root dell'intestazione.

A differenza di getblocktemplate, i minatori che usano Stratum non possono ispezionare o aggiungere transazioni al blocco che stanno attualmente minando. Diversamente da getblocktemplate, il protocollo Stratum utilizza direttamente un socket TCP bidirezionale, quindi i minatori non devono utilizzare HTTP longpoll per assicurarsi che ricevano aggiornamenti immediati dai pool di mining quando un nuovo blocco viene trasmesso alla rete peer-to-peer.


Tradotto da: bitcoin.org