Вы здесь

Создать блокчейн меньше чем за 100 строк

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

Создать блокчейн меньше чем за 100 строк

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

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

1_TV_02Syq-SWRChiXigN8Rw.png

Концепция блокчейна в одном простом изображении

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

1_0D3Uc7yIyR7Kv-n7Fq6vXA.png

На этом этапе мой блок имеет атрибуты:

  • index (индекс) –индекс позиции блока в цепочке
  • timestamp (временная метка) – дата и время добавления блока в блокчейн
  • data (данные) – значение данных, другими словами – то, что вы хотите сохранить
  • previous hash (предыдущий хэш) – хэш индекса блока -1
  • hash (хэш) — хэш блока

Если вы не знаете, что такое хэш, я объяснил это в своем последнем посте здесь.

На картинке вас заинтересуют некоторые моменты, и я постараюсь их здесь объяснить:

  • Пусть будет запрограммировано больше функций isValid для ответа по каждому блоку, если он действителен.
  • Все в блоке определяет конструктор.
  • Функция «update» служит для обновления dict при чтении из файла; это нужно для сохранения данных на будущее.
  • Вычисление хэша для ранее сохраненных файлов для преобразования всегда в один и тот же код (encode), потому что разные коды (encodes) имеют разные символы, а разные символы выдают разные хэши.

Итак, эта цепочка действительна; если блок изменен, текущий блок узнает об этом и сделает себя недействительным; если какой-либо предыдущий блок был изменен, цепочка узнает об этом и полностью станет недействительной. Это концепция, которая делает сохранение данных в блокчейне неизменным.

Итак, смотрим на наш второй класс, т.е. блокчейн, он выглядит следующим образом:

1_RKxCwUFAebYgfkMjvJCeZA.png

Итак, класс блокчейна создает блоки и ищет любую проблему в цепочке, и именно этот класс отвечает за сохранение в простом 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.

До скорой встречи!

Категория: 
Биткоин для "чайников"
Технология: 
2
Ваша оценка: Нет Средняя: 2 (1 оценка)
15118 / 0
Аватар пользователя Daritas
Публикацию добавил: Daritas
Дата публикации: пн, 11/18/2019 - 11:19

Что еще почитать: