Рубрики
Без рубрики

Узнайте блокчан, создав один

Лучший способ узнать, как работает Блокчан, чтобы создать тот, который вы здесь, потому что, как я … Теги с блокчанами, начинающими, питонами, колбой.

Блокчан (2 частью серии)

Вы здесь, потому что, как я, вы слышали о биткойне и криптовалюте, и хотите узнать, как они работают. После проведения часов чтения статей и смотрите видео YouTube, я думал о том, чтобы сделать простой проект, чтобы люди могли понять блокчан.

Помните, что блокчан является неизменной, последовательной цепочкой записей называемых блоками. Они могут содержать транзакции, файлы или любые данные, которые вам нравятся. Но важно, что они связаны вместе, используя хэши .

Если вы не уверены, что такое хеш, Вот объяснение Отказ

Для кого это руководство? Вам должно быть удобно для чтения и написания базового синтаксиса Python, а также некоторое понимание того, как HTTP-запросы работают, поскольку мы будем разговаривать с BlockChain через http.

Что мне нужно? Мы собираемся использовать здесь колбу, так что было бы хорошо, если у вас есть знания об этом. Даже если у вас нет рабочих знаний, это нормально, как я бы пошагол код за шагом. Давайте установим наши требования:

pip install Flask==1.1.2 requests==2.24.0

О, вам также понадобится HTTP-клиент, как Почтальон или завиток. Но все будет делать.

Где последний код? Исходный код – Доступно здесь Отказ

Откройте любой текстовый редактор, я предпочитаю VS код Отказ Давайте создадим имена файлов blockchain.py . Он будет содержать нашу структуру/класс Blockchain.

Представляя блокчан

Вот как наш Блокчан Класс будет выглядеть так:

class Blockchain(object):
    def __init__(self):
        self.chain = []
        self.current_transactions = []

    def new_block(self):
        # Creates a new Block and adds it to the chain
        pass

    def new_transaction(self):
        # Adds a new transaction to the list of transactions
        pass

    @staticmethod
    def hash(block):
        # Hashes a Block
        pass

    @property
    def last_block(self):
        # Returns the last Block in the chain
        pass

Хорошо, теперь допустим функцию функции. в этом :

  • цепь Содержит фактическую цепочку/последовательность блоков
  • Current_transactions Содержит список транзакций.

Функции отдыха имеют соответствующие комментарии, чтобы вы поняли их функциональность.

Наше Блокчан Класс несет ответственность за управление цепью. Он будет хранить транзакции и имеет несколько способов помощников для добавления новых блоков в цепочку.

Как выглядит блок?

Каждый блок имеет индекс , а Timestamp (в Unix времени), A Список транзакций , а Доказательство (позже в статье) и Хэш предыдущего блока Отказ

block = {
    "index": 2,
    "timestamp": 1595318883.8897538,
    "transactions": [
        {
            "sender": "0",
            "recipient": "d48099450667467e97a6033ddde69e8a",
            "amount": 70
        }
    ],
    "proof": 35293,
    "previous_hash": "65679099343e4a8f9c8c30438b053db6558546d8cef9378ed8d3dd3c7e317af5"
}

(Пример блока в нашем блокчане)

До этого момента идея цепь должен быть очевиден – каждый новый блок содержит хеш предыдущего блока. Таким образом, обеспечивая невосприимчивость к блокировкам. Если злоумышленник корректирует ранее Блок в цепь тогда все Последующие блоки будут содержать неверные хэши, в основном не совпадают с хэсами, хранящимися в других узлах. Слияние Для работы BlockChain для работы должны быть несколько узлов для хранения данных, и эти узлы должны быть децентрализованы, то есть не на одном сервере/IP.

Имеет ли это смысл? Если это не так, займите некоторое время, чтобы позволить ему погрузиться, прочитайте его еще раз – это основное представление о блокханах.

Добавление транзакции в блок

Транзакция является запись о передаче данных или в нашем случае поддельных денег. Нам понадобится способ добавления транзакций в блок. Наше new_transaction () Способ отвечает за это. Посмотрим, как это работает:

class Blockchain(object):
    ...

    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block
        :param sender:  Address of the Sender
        :param recipient:  Address of the Recipient
        :param amount:  Amount
        :return:  The index of the Block that will hold this transaction
        """

        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

Эта функция добавляет Дикт к Current_transactions с Отправитель , получатель и сумма транзакции. После new_transaction () Добавляет транзакцию в список, он возвращает индекс блока, который транзакция будет добавлена к- следующий, который нужно добывать Отказ Это будет полезно позже, чтобы пользователю, представив транзакцию.

Создание новых блоков

Когда наш Блокчан Суммерирован, нам нужно будет селить его с Бытие Блок-блок без предшественников. Нам также нужно добавить Доказательство нашему Бытие блок, который является результатом добычи добычи (или доказательства работы). Мы поговорим больше о добыче позже.

В дополнение к созданию Бытие Блок в конструкторе ( init ), мы также напишем несколько других методов.

import hashlib
import json
from time import time


class Blockchain(object):
    def __init__(self):
        self.current_transactions = []
        self.chain = []

        # Create the genesis block
        self.new_block(previous_hash=1, proof=100)
    def new_block(self, proof, previous_hash=None):
        """
        Create a new Block in the Blockchain
        :param proof:  The proof given by the Proof of Work algorithm
        :param previous_hash: (Optional)  Hash of previous Block
        :return:  New Block
        """

        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }

        # Reset the current list of transactions
        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block
        :param sender:  Address of the Sender
        :param recipient:  Address of the Recipient
        :param amount:  Amount
        :return:  The index of the Block that will hold this transaction
        """
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @staticmethod
    def hash(block):
        """
        Creates a SHA-256 hash of a Block
        :param block:  Block
        :return: 
        """

        # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

    @property
    def last_block(self):
        # Returns the last block in the chain
        return self.chain[-1]

Хорошо, теперь давайте посмотрим на код.

  • new_block : Добавляет блок в цепочку
  • new_transaction : Хранит передачу суммы от отправителя к получателю.
  • хеш : Возвращает шестнадцатеричное отформатированное хеш блока, переданного ему в SHA256.
  • last_block : Возвращает последний блок цепочки. Я также добавил некоторые комментарии и Docstrings чтобы помочь сделать это понятно. Мы почти закончили с представляем нашего блокчана. Но на данный момент вам должно быть интересно, насколько новые блоки созданы, кованые или добыты.

Понимание доказательства работы

Доказательство рабочего алгоритма (POW) заключается в том, насколько новые блоки созданы или заминирован на блокчане. Цель POW состоит в том, чтобы узнать номер, который решает проблему. Номер должен быть трудно найти, но легко проверить – Компьютерно говоря – кто-нибудь в сети. Это основная идея за доказательством работы.

Мы посмотрим на очень простой пример, чтобы помочь этому погрузинию.

Давайте решим, что хеш Из некоторого числа X умноженного на другое число Y должно заканчиваться в 0. Итак, хеш (х * ... 0 . И для этого примера давайте исправить х Отказ Реализация этого в Python:

from hashlib import sha256
x = 9
y = 0  # We don't know what y should be yet...
while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":
    y += 1
print(f'The solution is y = {y}')

Решение здесь y Отказ С тех пор добычае хеш кончается в 0.

hash(9 * 16) = 5ec1a0c99d4............2cf5563d97ff0

В биткойн доказательство алгоритма работы называется Hashcash Отказ И это не слишком отличается от нашего примера выше. Это алгоритм, который гонки шахтеров, чтобы решить, чтобы создать новый блок. В целом, сложность определяется количеством символов, которые в строке. Затем шахтеры вознаграждаются за свое решение, получая монету в транзакции.

Сеть может легко Проверьте их решение.

Реализация основных доказательств работы

Давайте реализуем аналогичный алгоритм для нашего блокчана. Наше правило будет: найдите номер, который при хешке с решением предыдущего блока хеш с 4 Ведущих Zeros (0000) производится.

import hashlib
import json

from time import time
from uuid import uuid4


class Blockchain(object):
    ...

    def proof_of_work(self, last_proof):
        """
        Simple Proof of Work Algorithm:
         - Find a number p' such that hash(pp') contains leading 4 zeroes, where p is the previous p'
         - p is the previous proof, and p' is the new proof
        :param last_proof: 
        :return: 
        """

        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1

        return proof

    @staticmethod
    def valid_proof(last_proof, proof):
        """
        Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes?
        :param last_proof:  Previous Proof
        :param proof:  Current Proof
        :return:  True if correct, False if not.
        """

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

Чтобы трудно найти доказательство, мы могли бы увеличить количество ведущих нулей. Но 4 достаточно. Вы обнаружите, что добавление одного ведущего нуля имеет огромное значение для необходимости времени. Чтобы лучше понять, я бы предложил добавить нули и проверить, сколько времени нужно, вы можете использовать простой пример, который мы использовали ранее.

Наш класс почти завершен. Весь класс в blockchain.py Отказ В следующем посте я начал использовать HTTP-запросы, чтобы взаимодействовать с нашей сетью. Я опубликую ссылку в разделе обновления до последующих постов. Чтобы получить исходный код GO здесь Отказ

Обновления

Ссылка на следующий блог здесь.

Я не могу взять кредит на эту статью. Эта статья – просто модернизированная версия Статья DVF Отказ Фото JJ YING на Бессмысленно

Блокчан (2 частью серии)

Оригинал: “https://dev.to/phantsure/learn-blockchain-by-creating-one-23dc”