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

Как создать свою собственную криптовалюту с помощью Python

Автор оригинала: Alfrick Opidi.

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

В последнее время мы наблюдаем правительства, организации и физические лица, использующие технологии Blockchain, чтобы создать свои собственные криптовалюты – и избегать оставленных позади. Примечательно, когда Facebook предложил свою собственную криптовалюту, называемую Весы Объявление перемешивают много вод по всему миру.

Что, если вы также можете следовать костюме и создать свою собственную версию криптовалюта?

Я подумал об этом и решил разработать алгоритм, который создает крипто.

Я решил позвонить в криптовалюту FCCCOIN Отказ

В этом руководстве я собираюсь проиллюстрировать пошаговый процесс, который я использовал для создания цифровой валюты (я использовал объектно-ориентированные концепции языка программирования Python).

Вот основной план алгоритма блокчан для создания FCCCOIN :

class Block:

    def __init__():

    #first block class

        pass
    
    def calculate_hash():
    
    #calculates the cryptographic hash of every block
        
    
class BlockChain:
    
    def __init__(self):
     # constructor method
    pass
    
    def construct_genesis(self):
        # constructs the initial block
        pass

    def construct_block(self, proof_no, prev_hash):
        # constructs a new block and adds it to the chain
        pass

    @staticmethod
    def check_validity():
        # checks whether the blockchain is valid
        pass

    def new_data(self, sender, recipient, quantity):
        # adds a new transaction to the data of the transactions
        pass

    @staticmethod
    def construct_proof_of_work(prev_proof):
        # protects the blockchain from attack
        pass
   
    @property
    def last_block(self):
        # returns the last block in the chain
        return self.chain[-1]

Теперь позвольте мне объяснить, что происходит …

1. Создание первого класса блоков

Блокчан состоит из нескольких блоков, которые присоединяются друг к другу (что звучит знакомо, верно?).

Сторирование блоков происходит так, что если один блок подделан, остальная часть цепи становится недействительной.

При применении вышеуказанной концепции я создал следующий первоначальный класс блока:

import hashlib
import time

class Block:

    def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
        self.index = index
        self.proof_no = proof_no
        self.prev_hash = prev_hash
        self.data = data
        self.timestamp = timestamp or time.time()

    @property
    def calculate_hash(self):
        block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
                                              self.prev_hash, self.data,
                                              self.timestamp)

        return hashlib.sha256(block_of_string.encode()).hexdigest()

    def __repr__(self):
        return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
                                               self.prev_hash, self.data,
                                               self.timestamp)

Как вы можете видеть из кода выше, я определил __init __ () Функция, которая будет выполнена, когда Блок Класс начинается, как и в любом другом классе Python.

Я предоставил следующие параметры к функции инициирования:

  • Я -Это относится к экземпляру Блок класс, позволяющий получить доступ к способам и атрибутам, связанным с классом;
  • индекс -Это отслеживает положение блока в блокчане;
  • Доказательство_но -Это число, произведенное во время создания нового блока (называемого добычами);
  • Prev_hash -Это относится к хэш предыдущего блока в цепочке;
  • данные -Это дает запись всех завершенных транзакций, таких как купленное количество;
  • Timestamp -Это помещает метку времени для транзакций.

Второй метод в классе, calculate_hash , будет генерировать хеш блоков с использованием вышеуказанных значений. Модуль SHA-256 импортируется в проект, чтобы помочь в получении хэшей блоков.

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

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

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

В конечном итоге, блок будет выглядеть так:

{
    "index": 2,
    "proof": 21,
    "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823",
    "transactions": [
        {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}
    ],
    "timestamp": 1521646442.4096143
}

2. Создание класса Blockchain

Основная идея блокчана, так же как имя подразумевает, включает в себя «цепочка» несколько блоков друг к другу.

Поэтому я собираюсь построить Блокчан Класс, который будет полезен для управления работой всей цепочки. Именно здесь большая часть действия будет иметь место.

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

Позвольте мне объяснить роль каждого из методов в классе.

а. Метод конструктора

Этот метод обеспечивает создание блокчана.

class BlockChain:

    def __init__(self):
        self.chain = []
        self.current_data = []
        self.nodes = set()
        self.construct_genesis()

Вот роли его атрибутов:

  • Self.Chain -Это переменная держит все блоки;
  • self.current_data -Это переменная сохраняет все заполненные транзакции в блоке;
  • self.construct_genesis () -Это метод позаботится о построении исходного блока.

б. Построение блока Бытия

Блокчан требует Construct_genesis Способ построить начальный блок в цепочке. В Конвенции Blockchain этот блок особенный, потому что он символизирует начало блокчана.

В этом случае давайте построим его, просто передавая значения по умолчанию для contruct_block метод.

Я дал оба Доказательство_но и Prev_hash Значение нуля, хотя вы можете предоставить любое значение, которое вы хотите.

def construct_genesis(self):
    self.construct_block(proof_no=0, prev_hash=0)


def construct_block(self, proof_no, prev_hash):
    block = Block(
        index=len(self.chain),
        proof_no=proof_no,
        prev_hash=prev_hash,
        data=self.current_data)
    self.current_data = []

    self.chain.append(block)
    return block

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

contruct_block Метод используется для создания новых блоков в блокчане.

Вот что происходит с различными атрибутами этого метода:

  • индекс -Это представляет длину блокчана;
  • vicket_nor & prev_hash – метод вызывающего абонента передает их;
  • данные -Это содержит запись всех транзакций, которые не включены в любой блок на узле;
  • self.current_data -Это используется для сброса списка транзакций на узле. Если блок был построен, и транзакции, выделенные ему, список сбрасывается, чтобы убедиться, что будущие транзакции добавлены в этот список. И этот процесс будет проходить постоянно;
  • Self.Chain.append () – Этот метод объединяет вновь построенные блоки к цепочке;
  • Возвращение – Возвращается построенный объект блока.

др. Проверка достоверности

check_valitelity Метод важен при оценке целостности блокчана и обеспечения отсутствия аномалий.

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

Поэтому это check_valitelity Метод использует Если утверждения, чтобы проверить, правильно ли хэш каждой блокировки.

Он также проверяет, если каждый блок указывает на правильный предыдущий блок, посредством сравнения стоимости их хэшей. Если все правильно, он возвращает true; В противном случае он возвращает false.

@staticmethod
def check_validity(block, prev_block):
    if prev_block.index + 1 != block.index:
        return False

    elif prev_block.calculate_hash != block.prev_hash:
        return False

    elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no):
        return False

    elif block.timestamp <= prev_block.timestamp:
        return False

    return True

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

new_data Метод используется для добавления данных транзакций в блок. Это очень простой способ: он принимает три параметра (подробности отправителя, детали получателя и количество) и добавляют данные транзакции в self.current_data список.

В любое время новый блок создан, этот список выделяется на этот блок и сброс еще раз, как описано в contruct_block метод.

Как только данные транзакции были добавлены в список, возвращается индекс следующего блока, который будет создан.

Этот индекс рассчитывается путем добавления 1 к индексу текущего блока (который является последним в блокчане). Данные помогут пользователю представить транзакцию в будущем.

def new_data(self, sender, recipient, quantity):
    self.current_data.append({
        'sender': sender,
        'recipient': recipient,
        'quantity': quantity
    })
    return True

ф. Добавление доказательства работы

Доказательство работы это понятие, которая предотвращает злоупотребление блокчану. Просто его цель состоит в том, чтобы определить номер, который решает проблему после определенного количества вычислительной работы.

Если уровень сложности определения числа высокий, он препятствует спамам и вмешающимся в блокчане.

В этом случае мы будем использовать простой алгоритм, который отговаривает людей от добычи добычи или легко создавать блоки.

@staticmethod
def proof_of_work(last_proof):
    '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
         f is the previous f'
         f' is the new proof
        '''
    proof_no = 0
    while BlockChain.verifying_proof(proof_no, last_proof) is False:
        proof_no += 1

    return proof_no


@staticmethod
def verifying_proof(last_proof, proof):
    #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

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

грамм. Получение последнего блока

Наконец, Neight_block Метод является методом помощника, который помогает получить последний блок в блокчане. Помните, что последний блок на самом деле является текущим блоком в цепочке.

@property
    def latest_block(self):
        return self.chain[-1]

Давайте суммируем все вместе

Вот весь код для создания FCCCOIN Криптовалюта.

Вы также можете получить код на Этот репозиторий Github.

import hashlib
import time


class Block:

    def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
        self.index = index
        self.proof_no = proof_no
        self.prev_hash = prev_hash
        self.data = data
        self.timestamp = timestamp or time.time()

    @property
    def calculate_hash(self):
        block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
                                              self.prev_hash, self.data,
                                              self.timestamp)

        return hashlib.sha256(block_of_string.encode()).hexdigest()

    def __repr__(self):
        return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
                                               self.prev_hash, self.data,
                                               self.timestamp)


class BlockChain:

    def __init__(self):
        self.chain = []
        self.current_data = []
        self.nodes = set()
        self.construct_genesis()

    def construct_genesis(self):
        self.construct_block(proof_no=0, prev_hash=0)

    def construct_block(self, proof_no, prev_hash):
        block = Block(
            index=len(self.chain),
            proof_no=proof_no,
            prev_hash=prev_hash,
            data=self.current_data)
        self.current_data = []

        self.chain.append(block)
        return block

    @staticmethod
    def check_validity(block, prev_block):
        if prev_block.index + 1 != block.index:
            return False

        elif prev_block.calculate_hash != block.prev_hash:
            return False

        elif not BlockChain.verifying_proof(block.proof_no,
                                            prev_block.proof_no):
            return False

        elif block.timestamp <= prev_block.timestamp:
            return False

        return True

    def new_data(self, sender, recipient, quantity):
        self.current_data.append({
            'sender': sender,
            'recipient': recipient,
            'quantity': quantity
        })
        return True

    @staticmethod
    def proof_of_work(last_proof):
        '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
         f is the previous f'
         f' is the new proof
        '''
        proof_no = 0
        while BlockChain.verifying_proof(proof_no, last_proof) is False:
            proof_no += 1

        return proof_no

    @staticmethod
    def verifying_proof(last_proof, proof):
        #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

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

    @property
    def latest_block(self):
        return self.chain[-1]

    def block_mining(self, details_miner):

        self.new_data(
            sender="0",  #it implies that this node has created a new block
            receiver=details_miner,
            quantity=
            1,  #creating a new block (or identifying the proof number) is awarded with 1
        )

        last_block = self.latest_block

        last_proof_no = last_block.proof_no
        proof_no = self.proof_of_work(last_proof_no)

        last_hash = last_block.calculate_hash
        block = self.construct_block(proof_no, last_hash)

        return vars(block)

    def create_node(self, address):
        self.nodes.add(address)
        return True

    @staticmethod
    def obtain_block_object(block_data):
        #obtains block object from the block data

        return Block(
            block_data['index'],
            block_data['proof_no'],
            block_data['prev_hash'],
            block_data['data'],
            timestamp=block_data['timestamp'])

Теперь давайте проверим наш код, чтобы посмотреть, работает ли он.

blockchain = BlockChain()

print("***Mining fccCoin about to start***")
print(blockchain.chain)

last_block = blockchain.latest_block
last_proof_no = last_block.proof_no
proof_no = blockchain.proof_of_work(last_proof_no)

blockchain.new_data(
    sender="0",  #it implies that this node has created a new block
    recipient="Quincy Larson",  #let's send Quincy some coins!
    quantity=
    1,  #creating a new block (or identifying the proof number) is awarded with 1
)

last_hash = last_block.calculate_hash
block = blockchain.construct_block(proof_no, last_hash)

print("***Mining fccCoin has been successful***")
print(blockchain.chain)

Это сработало!

Вот вывод процесса добычи:

***Mining fccCoin about to start***
[0 - 0 - 0 - [] - 1566930640.2707076]
***Mining fccCoin has been successful***
[0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243]

Заключение

Там у вас есть!

Вот как вы можете создать свой собственный блокчан, используя Python.

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

Если Эта монета Были развернуты как есть, он не мог встретить нынешних рыночных требований к стабильной, безопасной и простой в использовании криптовалюту.

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

Тем не менее, это хорошая отправная точка, если вы решите сделать ваше имя, известное в удивительном мире криптос.

Если у вас есть какие-либо комментарии или вопросы, пожалуйста, опубликуйте их ниже.

Счастливый (Crypto) кодировка!