LINUX.ORG.RU

Python: как присваивать уникальный номер информации в блокчейн

 ,


0

1

def create_block(name, amount, to_whom, prev_hash=''): # Создаем блок

data = {
        'name': name,
        'amount': amount,
        'to_whom': to_whom,
        'hash': prev_hash,
        }

with open(blockchain_dir + filename, 'w') as file:
    json.dump(data, file, indent=4, ensure_ascii=False)

Вопрос в том, как информации записанной в эти блоки присвоить уникальный номер? Можно подробно объяснить. Я просто новичок в питоне.

Ответ на: комментарий от lil_rainnn

Лучше запихнуть всё это в sqlite. Не надо файлов.

Уникальный номер, это же хеш этого блока? Так в поле hash и записывать, а ссылку на предыдущий блок в prev_hash.

Или как советовали в предыдущем топике считать UUID для блока.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)
Ответ на: комментарий от vvn_black

У меня блоки хранятся в папке blockchain по порядку [1, 2, 3, …] В каждом блоке JSON файл с информацией о транзакциях. И я хочу, чтобы каждой транзакции присваивался номер. Создав новую транзакцию ей можно было бы присвоить тот же номер. И таким образом отследить всю историю транзакций (к которым был присвоен данный номер), написав лишь этот номер.

lil_rainnn
() автор топика
Ответ на: комментарий от lil_rainnn

Это условия лабораторной работы что ли такие?

Используй в качестве имени файла uuid тогда. Будешь сразу по цепочке открывать файлы.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Нет не лабораторной. У меня задача: сделать блокчейн с возможностью открывать нужный список транзакций записанных под уникальным номером . Дело в том, что у меня файлы должны идти друг за другом, чтобы сравнивать их хэши. А порядок я установил через функцию sorted(по возрастанию целых чисел)

lil_rainnn
() автор топика
Ответ на: комментарий от lil_rainnn

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

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

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

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 ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это блокчейн, читать не умеешь? Даёшь ему дескриптор блока, он обрабатывает транзакцию.

anonymous
()

взять хэш от json.dump-а. только сделать ему sorted=True, чтобы всегда был одинаковый

buratino ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.