Si chiama algoritmo di "prova del lavoro". L'idea di base è che costringi il chiamante a fare del lavoro extra dopo aver creato l'hash. È possibile utilizzare qualsiasi algoritmo di hashing. Ecco un semplice modulo:
-
Il client calcola l'hash dei dati. (Dire, è 160 bit.)
-
Il client crea un blocco contenente l'hash e il resto dei dati tutti gli zeri. (Supponiamo che il blocco sia 512 bit.)
-
Il client calcola l'hash di questo blocco.
-
Se questo hash finale è inferiore alla destinazione, il client invia l'intero blocco appena sottoposto all'hash e viene eseguito.
-
Il client incrementa i dati nel blocco tranne l'hash e passa al passaggio 3.
Quando il server ottiene il blocco, calcola l'hash del blocco. Se l'hash è sotto il target, il server accetta il blocco e legge l'hash dall'inizio del blocco. Se l'hash è sopra il target, il server lo rifiuta.
Quindi, se il target è 0fffffff .. il client dovrà tipicamente eseguire il passaggio 3 (operazione di hash) 16 volte prima di ottenere un hash finale sotto il target. (C'è una probabilità su 16 che un determinato hash, in esadecimale, inizia con uno zero.) Se è troppo facile, imposta il target su 00fff ... e il client dovrà tipicamente fare 256 blocchi di hash.
Puoi costringere il cliente a fare, in media, quanti più hash desideri. Il numero effettivo di hash che il client dovrà eseguire segue una distribuzione di Poisson. Il rovescio della medaglia è che c'è sempre una possibilità che il cliente sia sfortunato e debba fare una grande quantità di lavoro.
Se devi impedire al client di "riutilizzare" il lavoro, puoi chiedere al cliente di chiedere un numero di sequenza. Il blocco contiene quindi l'hash, quindi il numero di sequenza, quindi il nonce (la parte che il client incrementa). È quindi possibile convalidare il numero di sequenza, in modo che il client non possa riutilizzare un blocco eseguito in precedenza e non possa precalcolare i blocchi.
Se non ti piace, puoi anche scegliere due numeri primi casuali e inviare il prodotto di quei numeri primi. Forza il cliente a calcolare quel numero. Accetta un hash per numero fattorizzato. Naturalmente, puoi impostare i numeri primi grandi o piccoli che vuoi per controllare la quantità di lavoro che il cliente deve fare.