|
| 1 | + |
| 2 | +# INPUT : Transactions = '''Neeraj->Zara->50,Nandu->Allu->5''' , difficulty=2 , |
| 3 | +# Previous_hash = a7sdxa036944e29568d0cff17edbe038f81208fecf9a66be9a2b8321c6ec7 |
| 4 | + |
| 5 | +# OUTPUT : Successfully mined bitcoins with nonce value:336 end mining. Mining took: 12.207852363586426 seconds |
| 6 | +# 006f74cef9d071afa15c58b38198be14f9b4aabb4cd6f7a44afffd9f6968efcd |
| 7 | + |
| 8 | +# Import the sha256 function |
| 9 | +from hashlib import sha256 |
| 10 | + |
| 11 | +# Nonce value |
| 12 | +MAX_NONCE = 10000 |
| 13 | + |
| 14 | + |
| 15 | +# Function for encoding text to a 64 bit hexadecimal value |
| 16 | +def SHA256(text): |
| 17 | + return sha256(text.encode("ascii")).hexdigest() |
| 18 | + |
| 19 | + |
| 20 | +# function for guessing nonce value |
| 21 | +def mine(block_number, transactions, previous_hash, prefix_zeros): |
| 22 | + |
| 23 | + # string with difficulty zeroes |
| 24 | + prefix_str = '0'*prefix_zeros |
| 25 | + |
| 26 | + # nonce is the value we want |
| 27 | + for nonce in range(MAX_NONCE): |
| 28 | + |
| 29 | + # concatinating the string and encoding it |
| 30 | + text = str(block_number) + transactions + previous_hash + str(nonce) |
| 31 | + new_hash = SHA256(text) |
| 32 | + |
| 33 | + # if matched the mined successfully |
| 34 | + if new_hash.startswith(prefix_str): |
| 35 | + print(f"Successfully mined bitcoins with nonce value:{nonce}") |
| 36 | + return new_hash |
| 37 | + |
| 38 | + # might raise exception due to hardware issues etc |
| 39 | + raise BaseException(f"Couldn't find correct has after trying {MAX_NONCE} times") |
| 40 | + |
| 41 | + |
| 42 | +# Driver Code |
| 43 | +if __name__=='__main__': |
| 44 | + |
| 45 | + # Transactions string |
| 46 | + transactions=input('Enter Transactions : ') |
| 47 | + |
| 48 | + # Number of prefix zeroes |
| 49 | + difficulty=int(input('Enter Difficulty level : ')) |
| 50 | + |
| 51 | + # For knowing time taken for mining |
| 52 | + import time |
| 53 | + start = time.time() |
| 54 | + print("start mining") |
| 55 | + |
| 56 | + previous_hash=input('Enter Previous has value : ') |
| 57 | + |
| 58 | + |
| 59 | + # Calling mine function with all required parameters |
| 60 | + new_hash = mine(5,transactions,previous_hash, difficulty) |
| 61 | + |
| 62 | + # total time for refrence |
| 63 | + total_time = str((time.time() - start)) |
| 64 | + print(f"end mining. Mining took: {total_time} seconds") |
| 65 | + print(new_hash) |
0 commit comments