Last active
January 28, 2021 15:29
-
-
Save dvf/4bc7aa017c5559b476c6bcad01247b73 to your computer and use it in GitHub Desktop.
Blockchain: Step 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import hashlib | |
import json | |
from time import time | |
class Blockchain(object): | |
def __init__(self): | |
self.current_transactions = [] | |
self.chain = [] | |
# Create the genesis block | |
self.new_block(previous_hash=1, proof=100) | |
def new_block(self, proof, previous_hash=None): | |
""" | |
Create a new Block in the Blockchain | |
:param proof: <int> The proof given by the Proof of Work algorithm | |
:param previous_hash: (Optional) <str> Hash of previous Block | |
:return: <dict> New Block | |
""" | |
block = { | |
'index': len(self.chain) + 1, | |
'timestamp': time(), | |
'transactions': self.current_transactions, | |
'proof': proof, | |
'previous_hash': previous_hash or self.hash(self.chain[-1]), | |
} | |
# Reset the current list of transactions | |
self.current_transactions = [] | |
self.chain.append(block) | |
return block | |
def new_transaction(self, sender, recipient, amount): | |
""" | |
Creates a new transaction to go into the next mined Block | |
:param sender: <str> Address of the Sender | |
:param recipient: <str> Address of the Recipient | |
:param amount: <int> Amount | |
:return: <int> The index of the Block that will hold this transaction | |
""" | |
self.current_transactions.append({ | |
'sender': sender, | |
'recipient': recipient, | |
'amount': amount, | |
}) | |
return self.last_block['index'] + 1 | |
@property | |
def last_block(self): | |
return self.chain[-1] | |
@staticmethod | |
def hash(block): | |
""" | |
Creates a SHA-256 hash of a Block | |
:param block: <dict> Block | |
:return: <str> | |
""" | |
# We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes | |
block_string = json.dumps(block, sort_keys=True).encode() | |
return hashlib.sha256(block_string).hexdigest() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment