Python Forum

Full Version: Cryptocurrency Blockchain Error
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Can anybody help? Why am I getting a AttributeError: Blockchain has no attribute "latest block. Error message Angry
                                                                                          
import hashlib
import time


class Block:

    def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
        self.index = index
        self.proof_no = proof_no
        self.prev_hash = prev_hash
        self.data = data
        self.timestamp = timestamp or time.time()

    @property
    def calculate_hash(self):
        block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
                                              self.prev_hash, self.data,
                                              self.timestamp)

        return hashlib.sha256(block_of_string.encode()).hexdigest()

    def __repr__(self):
        return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
                                               self.prev_hash, self.data,
                                               self.timestamp)


class BlockChain:

    def __init__(self):
        self.chain = []
        self.current_data = []
        self.nodes = set()
        self.construct_genesis()

    def construct_genesis(self):
        self.construct_block(proof_no=0, prev_hash=0)

    def construct_block(self, proof_no, prev_hash):
        block = Block(
            index=len(self.chain),
            proof_no=proof_no,
            prev_hash=prev_hash,
            data=self.current_data)
        self.current_data = []

        self.chain.append(block)
        return block

    @staticmethod
    def check_validity(block, prev_block):
        if prev_block.index + 1 != block.index:
            return False

        elif prev_block.calculate_hash != block.prev_hash:
            return False

        elif not BlockChain.verifying_proof(block.proof_no,
                                            prev_block.proof_no):
            return False

        elif block.timestamp <= prev_block.timestamp:
            return False

        return True

    def new_data(self, sender, recipient, quantity):
        self.current_data.append({
            "sender": sender,
            "recipient": recipient,
            "quantity": quantity
        })
        return True

        @staticmethod
        def proof_of_work(last_proof):
            """this simple algorithm indentifies a number f" such that hash (ff") contains 4 leading zeroes
             f is the previous f"
             f" is the new proof
             """
            proof_no = 0
            while BlockChain.verifying_proof(proof_no, last_proof) is False:
                proof_no += 1

            return proof_no

        @staticmethod
        def verifying_proof(last_proof, proof):
            #verifying the proof: does has(last_proof, proof) contain 4 leading zeroes?

            guess = f"{last_proof}{proof}".encode()
            guess_hash = hashlib.sha256(guess).hexdigest()
            return guess_hash[:4] == "0000"

        @property
        def latest_block(self):
            return self.chain[-1]

        def block_mining(self, details_miner):

            self.new_data(
                sender="0", #it implies that this node has created a new block
                receiver=details_miner,
                quantity=
                1, #creating a new block (or identifying the proof number) is awarded with 1
            )

            last_block = self.latest_block

            last_proof_no = last_block.proof_no
            proof_no = self.proof_of_work(last_proof_no)

            last_hash = last_block.calculate_hash
            block = self.construct_block(proof_no, last_hash)

            return vars(block)

        def create_node(self, address):
            self.nodes.add(address)
            return True

        @staticmethod
        def obtain_block_object(block_data):
            #obtains block object from the block data

            return Block(
                block_data["index"],
                block_data["proof_no"],
                block_data["prev_hash"],
                block_data["data"],
                timestamp=block_data["timestamp"])


blockchain = BlockChain()

print("***Mining fccCoin about to start***")
print(blockchain.chain)

last_block = blockchain.latest_block
last_proof_no = last_block.proof_no
proof_no = blockchain.proof_of_work(last_proof_no)

blockchain.new_data(
    sender="0", #it implies this node has created a new block
    recipient="Del Trotter", #lets send Del some coins!
    quantity=
    1, #creating a new block (or identifying the proof number) is awarded with 1
)

last_hash = last_block.calculate_hash
block = blockchain.construct_block(proof_no, last_hash)

print("***Printing treasureCoin has been successful***")
print(blockchain.chain)
It looks like your indentation is off. The latest_block property is defined under new_data, not under BlockChain.
Thank you very much Ichabod Clap Ive fixed the indentations and all working Big Grin Big Grin Big Grin Thanks again Clap

Apologies about tags, I hadnt realised, perils of a newby Doh