Beispiel #1
0
    def calculate_hash(self, index, previous_hash, timestamp, data, nonce=None):

        # Calculating the transaction summary similar to a Merkle root
        transactions = data if isinstance(data, list) else [data]
        transactions_summary = [transaction_object(transaction).id for transaction in transactions]

        if not nonce:
            header = str(index) + previous_hash + str(timestamp) + str(transactions_summary) + str(self.difficulty_bits)
            return self.proof_of_work(header)
        else:
            hash_object = SHA256.new(data=(str(index) + previous_hash + str(timestamp)
                                           + str(transactions_summary) + str(self.difficulty_bits) + str(nonce)).encode())
            return hash_object.hexdigest()
Beispiel #2
0
    def add_block(self, new_block):

        if self.is_valid_new_block(new_block, self.get_latest_block()):

            transactions = new_block.data if isinstance(new_block.data, list) else [new_block.data]
            ret_val = process_transactions([transaction_object(transaction) for transaction in transactions], self.get_unspent_tx_outs(), new_block.index)

            if ret_val is None:
                print('block is not valid in terms of transactions')
                return False
            else:
                self._blockchain.append(new_block)
                self.set_unspent_tx_outs(ret_val)
                update_transaction_pool(self.get_unspent_tx_outs())
                return True
Beispiel #3
0
    def is_valid_chain(self, blockchain_to_validate):

        # if self.calculate_hash_for_block(Block(**blockchain_to_validate[0])) != self.get_genesis_block().hash:
        #     return False

        previous_block = None
        unspent_tx_outs = []
        for current_block in blockchain_to_validate:
            if previous_block and not self.is_valid_new_block(Block(**current_block), previous_block):
                return False
            current_block = (Block(**current_block))
            transactions = current_block.data if isinstance(current_block.data, list) else [current_block.data]
            unspent_tx_outs = process_transactions([transaction_object(transaction) for transaction in transactions], unspent_tx_outs, current_block.index)
            previous_block = current_block

            if not unspent_tx_outs:
                return False

        return unspent_tx_outs