LINUX.ORG.RU

История изменений

Исправление vvn_black, (текущая версия) :

Дело в том, что у меня файлы должны идти друг за другом, чтобы сравнивать их хэши

Зачем? По хешу (имени файла) читаешь блок, берешь из него значение хеша предыдущего блока и используеш его как имя файла, чтобы открыть предыдущий блок.

Хоть это и всё изначально неправильно, вот как-то так:

import json
import uuid


class Blockchain:

    def __init__(self, path_to_chain='./blockchain'):
        self._path_to_chain = path_to_chain

    def _read_block(self, block_hash):
        """ """
        with open('/'.join([self._path_to_chain, block_hash]), 'r') as f:
            return json.load(f)

    def _set_last_block(self, block_hash):
        """ """
        with open('/'.join([self._path_to_chain, 'last']), 'w') as f:
            f.write(block_hash)

    def last_block(self):
        """ """
        try:
            with open('/'.join([self._path_to_chain, 'last']), 'r') as f:
                return f.read()
        except FileNotFoundError:
            self._set_last_block('')
            return ''

    def new_block(self, name, amount, to_whom):
        """ """
        last = self.last_block()
        data = {
            'name': name,
            'amount': amount,
            'to_whom': to_whom,
            'prev_hash': last,
        }
        block_hash = str(uuid.uuid4())
        with open('/'.join([self._path_to_chain, block_hash]), 'w') as f:
            json.dump(data, f, indent=4, ensure_ascii=False)

        self._set_last_block(block_hash)

        return block_hash

    def get_chain(self, block_hash):
        """ """
        chain = []
        data = self._read_block(block_hash)
        chain.append((data['name'], block_hash))
        prev = data.get('prev_hash', None)
        while prev:
            data = self._read_block(prev)
            chain.append((data['name'], prev))
            prev = data.get('prev_hash', None)

        return chain


chain = Blockchain()
ch1 = chain.new_block('New block 1', 1000.00, 'хз что такое')  # 7a6372be-c929-4735-bd2f-0152d857da81
ch2 = chain.new_block('New block 2', 1001.00, 'хз что такое')  # 91ec4c4e-09ca-492f-ab43-b3a1e899f3dc
ch3 = chain.new_block('New block 3', 1003.00, 'хз что такое')  # cc2c30fc-12f8-4b7b-9773-dad621fd870a
ch4 = chain.new_block('New block 4', 1004.00, 'хз что такое')  # 7014176d-daf8-4632-8c56-ea484ad8eafa
ch5 = chain.new_block('New block 5', 1005.00, 'хз что такое')  # 13c2a5e7-143f-49a6-ade7-915a2eec9b64

print(chain.get_chain(ch4))

[('New block 4', '7014176d-daf8-4632-8c56-ea484ad8eafa'), ('New block 3', 'cc2c30fc-12f8-4b7b-9773-dad621fd870a'), ('New block 2', '91ec4c4e-09ca-492f-ab43-b3a1e899f3dc'), ('New block 1', '7a6372be-c929-4735-bd2f-0152d857da81')]

Если кто будет запускать этот бред, то создайте сначала в каталоге с скриптом каталог ./blockchain.

Исходная версия vvn_black, :

Дело в том, что у меня файлы должны идти друг за другом, чтобы сравнивать их хэши

Зачем? По хешу (имени файла) читаешь блок, берешь из него значение хеша предыдущего блока и используеш его как имя файла, чтобы открыть предыдущий блок.

Хоть это и всё изначально неправильно, вот как-то так:

import json
import uuid


class Blockchain:

    def __init__(self, path_to_chain='./blockchain'):
        self._path_to_chain = path_to_chain

    def _read_block(self, block_hash):
        """ """
        with open('/'.join([self._path_to_chain, block_hash]), 'r') as f:
            return json.load(f)

    def _set_last_block(self, block_hash):
        """ """
        with open('/'.join([self._path_to_chain, 'last']), 'w') as f:
            f.write(block_hash)

    def last_block(self):
        """ """
        try:
            with open('/'.join([self._path_to_chain, 'last']), 'r') as f:
                return f.read()
        except FileNotFoundError:
            self._set_last_block('')
            return ''

    def new_block(self, name, amount, to_whom):
        """ """
        last = self.last_block()
        data = {
            'name': name,
            'amount': amount,
            'to_whom': to_whom,
            'prev_hash': last,
        }
        block_hash = str(uuid.uuid4())
        with open('/'.join([self._path_to_chain, block_hash]), 'w') as f:
            json.dump(data, f, indent=4, ensure_ascii=False)

        self._set_last_block(block_hash)

        return block_hash

    def get_chain(self, block_hash):
        """ """
        chain = []
        data = self._read_block(block_hash)
        chain.append((data['name'], block_hash))
        prev = data.get('prev_hash', None)
        while prev:
            data = self._read_block(prev)
            chain.append((data['name'], prev))
            prev = data.get('prev_hash', None)

        return chain


chain = Blockchain()
ch1 = chain.new_block('New block 1', 1000.00, 'хз что такое')  # 7a6372be-c929-4735-bd2f-0152d857da81
ch2 = chain.new_block('New block 2', 1001.00, 'хз что такое')  # 91ec4c4e-09ca-492f-ab43-b3a1e899f3dc
ch3 = chain.new_block('New block 3', 1003.00, 'хз что такое')  # cc2c30fc-12f8-4b7b-9773-dad621fd870a
ch4 = chain.new_block('New block 4', 1004.00, 'хз что такое')  # 7014176d-daf8-4632-8c56-ea484ad8eafa
ch5 = chain.new_block('New block 5', 1005.00, 'хз что такое')  # 13c2a5e7-143f-49a6-ade7-915a2eec9b64

print(chain.get_chain(ch4))

[('New block 4', '7014176d-daf8-4632-8c56-ea484ad8eafa'), ('New block 3', 'cc2c30fc-12f8-4b7b-9773-dad621fd870a'), ('New block 2', '91ec4c4e-09ca-492f-ab43-b3a1e899f3dc'), ('New block 1', '7a6372be-c929-4735-bd2f-0152d857da81')]

Если кто будет запускать, то создайте сначала в каталоге с скриптом каталог ./blockchain.