Sto provando a scrivere un semplice cercatore di nonce-proof in python.Python interrompe più processi quando si restituisce un risultato?
def proof_of_work(b, nBytes):
nonce = 0
# while the first nBytes of hash(b + nonce) are not 0
while sha256(b + uint2bytes(nonce))[:nBytes] != bytes(nBytes):
nonce = nonce + 1
return nonce
Ora sto cercando di fare questo multiprocessed, quindi è possibile utilizzare tutti i core della CPU e trovare il nonce più veloce. La mia idea è quella di utilizzare multiprocessing.Pool
ed eseguire la funzione proof_of_work più volte, passando due params num_of_cpus_running
e this_cpu_id
in questo modo:
def proof_of_work(b, nBytes, num_of_cpus_running, this_cpu_id):
nonce = this_cpu_id
while sha256(b + uint2bytes(nonce))[:nBytes] != bytes(nBytes):
nonce = nonce + num_of_cpus_running
return nonce
Quindi, se ci sono 4 core, ognuno calcolerà nonce come questo:
core 0: 0, 4, 8, 16, 32 ...
core 1: 1, 5, 9, 17, 33 ...
core 2: 2, 6, 10, 18, 34 ...
core 3: 3, 7, 15, 31, 38 ...
Quindi, devo riscrivere proof_of_work
così quando qualcuno dei processi trova un nonce, tutti gli altri smettono di cercare i nonces, tenendo conto che il nonce trovato deve essere il valore più basso possibile per cui i byte richiesti sono 0. Se una CPU accelera per qualche motivo e restituisce un n valido una volta superiore al più basso nonce valido, la prova di lavoro non è valida.
L'unica cosa che non so come fare è la parte in cui un processo A si interrompe solo se il processo B trova un nonce che è inferiore al nonce che viene calcolato in quel momento dal processo A. Se il suo più in alto, A continua a calcolare (per ogni evenienza) fino a quando arriva al nonce fornito da B.
Spero di essermi spiegato correttamente. Inoltre, se c'è un'implementazione più veloce di tutto ciò che ho scritto, mi piacerebbe sentirne parlare. Grazie mille!
@MaartenBodewes Ho paura di non capire il tuo punto, forse sono ancora troppo programmatore nex xD. Cpu_id è solo un numero che assegno ad ogni processo. Per prima cosa ho il numero di core cpu 'x = multiprocessing.cpu_count()' e quindi avvio x processi, ognuno con un ID diverso che incrementa di un solo 1. Spero di averlo capito correttamente. – mesafria
Scusate, è stato solo un fraintendimento da parte mia. Non ho mai esaminato a fondo queste prove dei protocolli di lavoro. Disprezzo cose come il bitcoin: non mi piacciono i protocolli che convertono l'energia in denaro, preferisco il contrario. –
@MaartenBodewes la prova di lavoro non è solo utilizzata in bitcoin. Lo uso per prevenire gli attacchi DDoS. –