2024-10-10 16:20:01 +00:00
|
|
|
import hashlib
|
|
|
|
import time
|
|
|
|
|
2024-10-10 16:20:57 +00:00
|
|
|
|
2024-10-10 16:20:01 +00:00
|
|
|
def proof_of_work(difficulty: int) -> int:
|
|
|
|
"""
|
|
|
|
Simulates a Proof of Work mining process.
|
|
|
|
|
2024-10-10 16:20:57 +00:00
|
|
|
The miner must find a nonce such that the hash of the nonce starts
|
2024-10-10 16:20:01 +00:00
|
|
|
with a specific number of leading zeros (difficulty).
|
|
|
|
|
|
|
|
Args:
|
|
|
|
difficulty (int): The number of leading zeros required in the hash.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
int: The nonce value that solves the puzzle.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
>>> result = proof_of_work(2) # Difficulty of 2 should be fast
|
|
|
|
>>> isinstance(result, int)
|
|
|
|
True
|
|
|
|
"""
|
2024-10-10 16:20:57 +00:00
|
|
|
prefix = "0" * difficulty
|
2024-10-10 16:20:01 +00:00
|
|
|
nonce = 0
|
|
|
|
start = time.time()
|
2024-10-10 16:20:57 +00:00
|
|
|
|
2024-10-10 16:20:01 +00:00
|
|
|
while True:
|
|
|
|
hash_result = hashlib.sha256(f"{nonce}".encode()).hexdigest()
|
|
|
|
if hash_result.startswith(prefix):
|
|
|
|
end = time.time()
|
|
|
|
print(f"Nonce: {nonce}, Hash: {hash_result}, Time: {end - start:.2f}s")
|
|
|
|
return nonce
|
|
|
|
nonce += 1
|