我正试图用Python编写一个简单的工作量证明(Proof-of-Work)挖矿程序。
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
现在我正在尝试进行多进程处理,以便可以利用所有的CPU核心并更快地找到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时,其他所有进程都停止寻找nonce,注意所找到的nonce必须是要求字节为0的最低值。如果某个CPU由于某种原因加速,并返回高于最低有效nonce的有效nonce,则工作证明无效。
唯一不知道如何处理的部分是,进程A仅在进程B找到的nonce小于当前由进程A计算的nonce时才停止。如果它更高,则A继续计算(以防万一),直到到达B提供的nonce。
希望我自己解释得清楚。另外,如果有任何我写的东西的更快实现,我很乐意听取建议。非常感谢!
x = multiprocessing.cpu_count()
,然后启动x个进程,每个进程都有一个不同的ID,仅递增1。希望我理解得正确。 - mesafria