Я пытаюсь написать простой прокси-искатель на рабочем столе в python.
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
Теперь я пытаюсь сделать это многопроцессорным, поэтому он может использовать все ядра ЦП и быстрее найти nonce. Моя идея состоит в том, чтобы использовать multiprocessing.Pool
и выполнять функцию proof_of_work несколько раз, передавая два параметра num_of_cpus_running
и this_cpu_id
следующим образом:
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
Итак, если есть 4 ядра, каждый из них будет вычислять такие числа:
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 ...
Итак, я должен переписать proof_of_work
, поэтому, когда любой из процессов находит nonce, все остальные перестают искать nonces, принимая во внимание, что найденное nonce должно быть самым низким значением, для которого требуемые байты равны 0. Если по какой-то причине ЦП ускоряется, и возвращает действительное значение nonce, превышающее минимальное допустимое значение nonce, тогда доказательство работы недействительно.
Единственное, что я не знаю, как это сделать, - это часть, в которой процесс A остановится только в том случае, если в процессе B обнаружен nonce, который ниже, чем nonce, который вычисляется прямо сейчас процессом A. Если его более высокий, A продолжает вычислять (на всякий случай) до тех пор, пока он не достигнет nonce, предоставленного B.
Надеюсь, я правильно объяснил. Кроме того, если есть более быстрая реализация всего, что я написал, я хотел бы услышать об этом. Большое вам спасибо!