Криптовалюта произвела революцию в том, как мы проводим транзакции, и это только верхушка.

Основанная в 2009 году неизвестным (-ими) человеком (-ами) по имени Сатоши Накамото, технология Blockchain является прорывом и продемонстрировала огромный потенциал как быстрый, безопасный и простой в использовании метод перевода или получения средств, а также способы это вы можете спросить?

Ну, для начала, нет «центрального органа», отслеживающего транзакции, как это сделал бы банк.
Все детали хранятся в тайне между получателем и отправителем, и нет необходимости в посредниках. Более того, простота доступа, которую предлагает Blockchain, по меньшей мере, поразительна. В мире все еще есть страны, где обычные платежные веб-сайты (например, PayPal) запрещены, и это создает множество препятствий для людей, которые пытаются получить или отправлять средства в зарубежные страны.
А вот криптовалюта не знает границ. Его можно отправить из любой точки мира в любую точку мира.

Но, на мой взгляд, самое большое преимущество криптовалюты - это защита от инфляции. Да, технология блокчейн находится в стадии разработки, и поэтому она нестабильна, но в отличие от обычной валюты, которую можно напечатать до забвения, криптовалюту ДЕЙСТВИТЕЛЬНО трудно производить в массовом порядке.

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

Как работает блокчейн?

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

Как следует из названия, цепочка блоков - это «цепочка блоков». Каждый блок содержит «хэш», «индекс» и информацию о конкретной транзакции, которая имела место.
Все блоки в Блокчейн связаны друг с другом с помощью переменной «хэш». «Хэш» содержит информацию о предыдущем блоке в цепочке, и это то, что удерживает всю цепочку связанной и связанной.

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

Переходя к части Python, я сначала определю своего отправителя как случайное лицо, мою цепочку блоков как список с «фиктивным блоком генезиса», информацию о транзакции как пустой список и импортирую библиотеку с именем «hashlib» ( подробнее об этом позже)

from hashlib import sha256
sender = 'Moeed'
blockchain = [genesis_block]
genesis_block = {'previous_hash': 'XYZ',
                 'index': 0,
                 'transactions': [], 'proof': 0}
open_transactions = []

Затем я определю функцию, которая попросит отправителя ввести свои данные, такие как сумма транзакции для отправки и адрес получателя.

def get_transaction():
    recipient = input('Enter your recipient')
    amount = input('Enter your amount')
    return (recipient,amount)

Затем я попытаюсь добавить информацию о транзакции в список «open_transaction», определенный ранее.

while True:
    I = input('Enter your choice')
    if I == '1':
        data = get_transaction()
        recipient, amount = data
        transaction = {'sender': sender,
                      'recipient': recipient,
                      'amount': amount}
        open_transactions.append(transaction)
        print(open_transactions)

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

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

SHA-256

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

«Хеш-часть» блока в цепочке блоков - это не что иное, как выходные данные алгоритма SHA-256, тогда как входные данные - «хэш предыдущего блока», «индекс »и« информация о транзакции »объединены в строковый формат.

Посмотрим на код здесь:

Я уже импортировал библиотеку «hashlib».

Я попытаюсь создать функцию, которая будет принимать «хэш», «индекс» и «информацию о транзакции» предыдущего блока и преобразовывать их в хеш для блока, следующего за ним.

def hash_block(last_block):
    previous_hash = ''

    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])
    hash = sha256(json.dumps(previous_hash).encode('utf-8')).hexdigest()
    return hash

Поскольку наш блокчейн начинается с «блока генезиса», определенного ранее, мы даем ему фиктивное значение «previous_hash», равное XYZ.

«Доказательство работы»

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

Блокчейн-майнинг намеренно сложен, чтобы мы не массово производили монеты, а предложение контролировалось в соответствии со спросом. Это достигается с помощью алгоритма «доказательства работы».

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

Хэш вычисляется с использованием алгоритма SHA-256 с теми же входными данными (previous_hash, индекс, информация о транзакции), но с добавлением номера итерации, также известного как «доказательство». Таким образом, «доказательство» будет увеличиваться на единицу до тех пор, пока не будет выполнено условие, которое мы поместили (первые два нуля).

Как только условие будет выполнено, полученный хэш из «hash_block» будет добавлен в блок, а затем этот блок будет добавлен в цепочку блоков.

Теперь давайте посмотрим на код функции «Доказательство работы».

def proof_of_work():
    previous_hash = ''
    proof = 0
    last_block = blockchain[-1]
    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])


    guess_hash = previous_hash + str(proof)
    hash = sha256(hashed.encode('utf-8')).hexdigest()
    while hash[0:2] != '00':
            guess_hash = previous_hash + str(proof)
            hash = sha256(guess_hash.encode('utf-8')).hexdigest()
            proof = proof + 1
            print(hash)
    return proof

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

Майнинг блока

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

def hash_block(last_block):
    previous_hash = ''

    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])
    hash = sha256(json.dumps(previous_hash).encode('utf-8')).hexdigest()
    return hash
def mine_block():
    
   
    last_block = blockchain[-1]
   
    hashed_block = hash_block(last_block)
    proof = proof_of_work()
    
    block = {
        'previous_hash': hashed_block,
        'index': len(blockchain),
        'transactions': open_transactions,
        'proof': proof
    }
    blockchain.append(block)
    print(blockchain)
    print(hashed_block)
    print(proof)
    return True

Как видно из приведенного выше кода, мы сначала определяем функцию «hash_block», которая принимает пустую строку с именем «previous_hash» и добавляет другие значения блока, такие как индекс и информация о транзакции. как строки и создает одну большую строку. Затем эта строка возвращается как зашифрованная строка с использованием алгоритма SHA-256.

Затем мы запускаем функцию «mine_block», которая использует функцию «hash_block» для возврата хеша и «доказательство работы» для вычисления хеша, имеющего в начале два нуля.

Затем результаты (номер доказательства и хеш) добавляются в словарь под именем «блок», которое затем добавляется в список цепочки блоков.

Это создает первый блок. Но кое-чего все еще не хватает

Что, если кто-то вмешается в блокчейн? Скажем, что, если бы кто-то изменил значения в Блоке. Как мы можем этого не допустить? Это просто. Мы проверяем цепочку, которая сравнивает «previous_hash» одной цепочки с вычисленным хешем блока перед ней. Давайте посмотрим на код

def verify_chain():
    
    for (index, block) in enumerate(blockchain):
        if index == 0:
            continue
        if block['previous_hash'] != hash_block(blockchain[index - 1]):
            print(block['previous_hash'])
            print(hash_block(blockchain[index - 1]))
            print(block)
            print(blockchain[index-1])
            return False

    return True

а затем мы наконец добавляем условие, которое реализует указанную выше функцию.

if not verify_chain():
    print('Invalid block')
    break

Если какое-либо значение внутри нашей цепочки блоков будет изменено, приведенное выше условие вернет «Недействительная цепочка».

и, наконец, некоторый код для взаимодействия пользователя с цепочкой

while True:
    I = input('Enter your choice')
    print('1 to recieve transactions')
    print('2 to mine block')
    print('3 to alter block')
    if I == '1':
        data = get_transaction()
        recipient, amount = data
        transaction = {'sender': owner,
                      'recipient': recipient,
                       'amount': amount}
        
        open_transactions.append(transaction)
        print(open_transactions)
        save_data()

    if I == '2':
        mine_block()
        open_transactions = []
        

    if I == '3':
        alter_block()


    if not verify_chain():
        print('Invalid block')
        break

Приведенный выше код не требует пояснений. Вход 1 используется для приема транзакций с входа. Вход 2 используется для добычи блока, а вход 3 используется для «изменения блока».

Мы используем «alter_block», чтобы проверить, работает ли «verify_chain».

Код для функции «alter_block»:

def alter_block():
    blockchain[0] =    {'previous_hash':'ABC',
                 'index':0,
                 'transactions':[],'proof':0}

Примечание. В приведенной выше функции мы изменяем первый блок, изменяя «previous_hash» с «XYZ» на «ABC», что даст нам неправильный хеш, и, следовательно, условие «verify_hash» вступит в игру.

Заключение

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

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