我正在尝试在 python 中编写一个简单的工作证明 nonce-finder。
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 个核心,每个核心都会像这样计算 nonce:
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 加速由于某种原因,并返回一个高于最低有效随机数的有效随机数,则工作证明无效。
我唯一不知道该怎么做的是,只有当进程 B 发现一个低于进程 A 现在正在计算的 nonce 的 nonce 时,进程 A 才会停止的部分。如果它更高,A 保持计算(以防万一)直到它到达 B 提供的随机数。
我希望我正确地解释了自己。另外,如果我写的任何东西有更快的实现,我很想听听。非常感谢!