• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Как работает цепочка блоков ? Приоткрываем капот Blockchain

Привет Codeby !

6.jpeg


Я впервые затрагиваю тему криптовалюты, не кидайте камни :3 Я не буду скидывать все в общий котел, копипастить определения из вики и тому подобное. Все рассмотреть сейчас у меня не получится и эта статья будет посвещена основной идее добычи, а именно - майнинге криптовалюты. О том, что из себя представляют все эти транзакции, блокчейны и процесс их добывания. Вам необязательно покупать тачки для майнинга, вкладывать деньги или пытаться заработать на этом другими путями (как-то незаконно например), чтобы просто разобраться в этом. И я считаю, что само фундаментальное понятие - криптовалюта, должно иметь место быть в любом информационном и электронном мире. При всем при этом, переход на децентрализованную электронную систему крипто денег, колоссально изменит и нашу жизнь и экономику. Ну или все закончится печальным Fallout'ом, кто знает.


Эквивалент представления блока

В нашем примере эквивалентом одного блока будет следующая запись :

{'index': 2, 'timestamp': 1644749528.435878, 'transactions': [{'sender': '684741e048f535586c29bce1d7b345de0722efad334a826faf2c83fd141acab6', 'recipient': 'cryptochain@cryptmail.in', 'amount': 18}], 'proof': 85, 'previous_hash': '00406930eef7ab53ebfd2f196dc94e2d5244c4292e9599de5ed9785f00ab087e'}

index - индекс текущего блока
timestamp - время
transactions - словарь транзакций (будем записывать одну транзакцию с ключом отправителя (sender) и числом всех предыдущих транзакций(amount)
proof - доказательство работы (распишу чуть позже)
previous_hash - хэш предыдущего блока

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

В реальности все примерно так же - как только создается новый блок, в него попадает часть транзакций (число ограничено протоколом). Последовательность этих блоков и есть блокчейн (цепь)

Краткое описание работы протокола :
  1. Новые транзакции транслируются всем узлам, которые собирают операции в блок.
  2. Затем каждый майнер пытается вычислить хеш для нового блока.
  3. Как только математическая задача решена, блок транслируется по всей сети.
  4. Узлы проверяют, все ли транзакции действительны (то есть не были ли потрачены биткоины).
  5. Начиная работу над следующим блоком, узлы заявляют, что они приняли предыдущий и добавили его в цепочку

В данный момент на официальном сайте висит информация о скорости вычисления хэшей в секунду майнерами. И для биткоина это 245.457 EH/s (экзахэшей в секунду) что мы можем округлить до 245 квинтиллионов, а это ± 245 000 000 000 000 000 000 хэш/с. Неплохо да? Сколько знаков майнеры найдут у корня из 2 за пару секунд?
Таким образом список всех транзакций в блоках и последовательность блоков в блокчейне и есть сама валюта.

Самый обычный S9 асик или application-specific integrated circuit (интегральная схема для конкретного применения) - выдает тэрахэши/с, а именно :
13 TH/s - это 13 000 000 000 000 (триллиардов) хэшей в секунду. В нем используются специальные хэш платы, так что это железо создано для добычи .

3.jpeg


В чем сложность ?

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

Вот как можно представить этот процесс наглядно, на примере простого класса и алгоритма :
Python:
import os
import math
import hashlib
import json
from time import time

from colorama import init, Fore, Style


init()

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

        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):

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

        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender_key, recipient, amount):

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

        return self.last_block['index'] + 1

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

    @staticmethod
    def hash(block):

        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

    def proof_of_work(self, last_proof):

        proof = 0
        frash = 0
        while self.valid_proof(last_proof, proof, frash)[0] is False:
            proof += 1
            frash = math.sqrt(last_proof)

        return [proof, self.valid_proof(last_proof, proof, frash)[1]]

    @staticmethod
    def valid_proof(last_proof, proof, frash):

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        print(Fore.GREEN, guess_hash)
        return [guess_hash[:2] == "00", guess_hash]

    def maining(self):
        try:
            while True:
                print(Style.RESET_ALL)
                m = self.proof_of_work(self.chain[-1]['proof'])
                if m:
                    self.amount += 1
                    self.new_transaction(os.urandom(32).hex(), 'cryptochain@cryptmail.in', self.amount)
                    self.new_block(m[0], m[1])
                    print(Fore.CYAN, self.chain)
        except KeyboardInterrupt:
            print(Fore.CYAN, self.chain)

if __name__ == '__main__':
    b = Blockchain()
    b.maining()

Процесс работы скрипта - это процесс перебор всех значений хэшей блока, пока не будет найден нужный, а именно тот, что начинается с "00"

1.png


Количеством нулей обусловлена сложность - proof . Это количество попыток, которое было затрачено на поиск нового блока. В примере лишь два нуля в начале блока, но в реальности этих нулей порядка 20 и алгоритм намного сложнее (можно поиграть с нулями и прочувствовать разницу времени вычисления).
Сложность поиска с каждым новым нулем возрастает по геометрической прогрессии. Как только будет найдет новый хэш, будет создан новый блок, который примет хэш предыдущего.

2.png


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

Византийский взлом (Byzantine Fault) — это потенциальная проблема, с которой может столкнуться сеть, если участники не согласятся с ее стратегией. Ошибка предполагает, что некоторые члены могут быть подкуплены. Такие узлы будут работать недемократично, и одной точки отказа будет достаточно, чтобы поставить систему под угрозу.

Блокчейн Биткоин решает Византийский сбой с помощью своего алгоритма Proof-of-Work, позволяя внедрять новые стратегии. Если 51% сети соглашается с процессом, то Blockchain одобряет цепь блоков. Поскольку количество майнеров продолжает расти, вероятность того, что злонамеренные участники захватят блокчейн, становится маловероятной. По данным портала по инсайдерским новостям Business Insider, в криптопространстве активно работает около 1 миллиона майнеров. Потребовалось бы примерно 510 000 узлов, чтобы договориться о намеренной угрозе блокчейна для успеха Византийского разлома

Другими словами, чтобы поддерживать свою (ложную) цепочку блоков, вы должны успевать майнить новые блоки быстрее всего остального мира. Имея 51% всех вычислительных ресурсов которые есть у майнеров, у вас будут шансы.


Ключи и транзакции

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


Послесловие

Сама идея реализации простого блокчейна по протоколу HTTP найдена у dvf

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


Спасибо за внимание
 
Последнее редактирование модератором:

sith_ortodox

Green Team
11.10.2018
50
33
BIT
28
Такой вопрос назрел. Есть кошелек Multibit Core. Как можно ускорить его синхронизацию? Уже неделю блоки скачивает и завис на 87%. Цена вопроса 5.4 Btc
P.S.: Цена полезного ответа 0.5 Btc
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!