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
今、私はこれをマルチプロセスで実行しようとしているので、すべての CPU コアを使用して nonce をより速く見つけることができます。私の考えはmultiprocessing.Pool
、関数proof_of_workを複数回使用して実行し、2つのパラメーターを渡す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
必要があります。見つかったナンスは、必要なバイト数が 0 である可能な最小値でなければならないことを考慮してください。CPU が高速化する場合何らかの理由で有効なナンスよりも高い有効なナンスを返す場合、プルーフ オブ ワークは有効ではありません。
方法がわからない唯一のことは、プロセス A が現在計算しているノンスよりも低いノンスをプロセス B が見つけた場合にのみプロセス A が停止する部分です。 Bによって提供されたナンスに到達するまで(念のため)計算します。
私は自分自身を正しく説明したことを願っています。また、私が書いたもののより高速な実装があれば、それについて聞きたいです。どうもありがとうございました!