Основная концепция блокчейна очень проста: распределенная база данных, которая поддерживает постоянно растущий список упорядоченных записей.

Блокчейн – это термин, обычно ассоциируемый с Биткоином и/или Эфириумом, но блокчейн – это нечто большее. Блокчейн – это технология, стоящая за ними и за любой другой криптовалютой.
Есть много других сфер применения для блокчейна, например, игры (CryptoKitties) или также блокчейн+IOT (Интернет вещей), и это только начало развития технологии.

Блокчейн – это, как вытекает из названия, одна цепочка блоков, следовательно у нас есть первый класс, т.е. Блок.

На этом этапе мой блок имеет атрибуты:
- index (индекс) –индекс позиции блока в цепочке
- timestamp (временная метка) – дата и время добавления блока в блокчейн
- data (данные) – значение данных, другими словами – то, что вы хотите сохранить
- previous hash (предыдущий хэш) – хэш индекса блока -1
- hash (хэш) — хэш блока
Если вы не знаете, что такое хэш, я объяснил это в своем последнем посте здесь.
На картинке вас заинтересуют некоторые моменты, и я постараюсь их здесь объяснить:
- Пусть будет запрограммировано больше функций isValid для ответа по каждому блоку, если он действителен.
- Все в блоке определяет конструктор.
- Функция «update» служит для обновления dict при чтении из файла; это нужно для сохранения данных на будущее.
- Вычисление хэша для ранее сохраненных файлов для преобразования всегда в один и тот же код (encode), потому что разные коды (encodes) имеют разные символы, а разные символы выдают разные хэши.
Итак, эта цепочка действительна; если блок изменен, текущий блок узнает об этом и сделает себя недействительным; если какой-либо предыдущий блок был изменен, цепочка узнает об этом и полностью станет недействительной. Это концепция, которая делает сохранение данных в блокчейне неизменным.
Итак, смотрим на наш второй класс, т.е. блокчейн, он выглядит следующим образом:

Итак, класс блокчейна создает блоки и ищет любую проблему в цепочке, и именно этот класс отвечает за сохранение в простом json файле и чтение из него. Наша первая версия блокчейна готова!! \о/
Код целиком представлен ниже – вы можете выполнить и увидеть выход.
#!/usr/bin/python3
# coding=UTF-8
# encoding=UTF-8
import json
import os
import hashlib
import datetime
class Block:
def __init__(self, index, data, previousHash='00000'):
self.index = index
self.timestamp = str(datetime.datetime.now())
self.data = data
self.previousHash = previousHash
self.hash = self.calculateHash()
def update(self, dic):
self.__dict__=dic
return self
def calculateHash(self):
return hashlib.sha256(str(self.index).encode('utf-8')
+ self.previousHash.encode('utf-8')
+ str(self.data).encode('utf-8')
+ self.timestamp.encode('utf-8')).hexdigest()
def isValid(self):
return self.hash == self.calculateHash()
def printBlock(self):
return ("\nBlock #" + str(self.index)
+ "\nData: " + str(self.data)
+ "\nTimeStamp: " + str(self.timestamp)
+ "\nBlock Hash: " + str(self.hash)
+ "\nBlock Previous Hash: " + str(self.previousHash)
+"\n---------------")
class BlockChain:
def __init__(self, file="block.chain"):
self.chain = [Block(0, "Genesis")]
self.file=file
def getLatestBlock(self):
return self.chain[len(self.chain)-1]
def getNextIndex(self):
return self.getLatestBlock().index + 1
def generateBlock(self, data):
self.chain.append(Block(self.getNextIndex(), data, self.getLatestBlock().hash))
def isChainValid(self):
for i in range (1, len(self.chain)):
if not self.chain[i].isValid():
return False
if self.chain[i].previousHash != self.chain[i-1].hash:
return False
return True
def printBlockChain(self):
return ''.join([self.chain[i].printBlock() for i in range(1, len(self.chain))])
def save(self):
if(self.isChainValid()):
with open(self.file, 'w') as f:
f.write(json.dumps(self, default=lambda obj: obj.__dict__))
else:
print("Not saved the chain!")
def open(self):
if(os.path.exists(self.file)):
with open(self.file) as f:
data = json.load(f)
self.__dict__ = data
self.chain = [Block("","").update(dic) for dic in data["chain"]]
def main():
blockchain = BlockChain()
blockchain.generateBlock("Hello World!")
blockchain.generateBlock(3)
blockchain.generateBlock({"account": 123123, "mount": 100})
print(blockchain.printBlockChain())
print ("Chain valid? " + str(blockchain.isChainValid()))
blockchain.save()
blockchain.chain[1].data = "Hello Darkness my old friend!"
print(blockchain.printBlockChain())
print ("Chain valid? " + str(blockchain.isChainValid()))
blockchain.save()
test = BlockChain()
test.open()
print(test.printBlockChain())
print ("Chain valid? " + str(test.isChainValid()))
test.save()
if __name__ == '__main__':
main()
В этой версии нашего блокчейна мы не использовали протокол «доказательство работы», т.к. первоначальная идея – создать блокчейн и гарантировать интегрированность цепи. Использование протокола будет моим следующим шагом.
Я создал проект, за развитием которого вы можете следить на GitHub. Я буду дальше увеличивать мой блокчейн. Если вам интересно, подпишитесь на мою страничку: я буду писать посты о ходе процесса.
P.S: Я не эксперт в блокчейне, поэтому буду рад любым советам, рекомендациям по исправлению кода и комментариям с изложением каких бы то ни было проблем по теме. Либо вы можете связаться со мной через LinkedIn.
До скорой встречи!