История изменений
Исправление 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
.