Как работает биткоин, очень простым языком

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

Откуда берутся адреса в биткоине

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

Чтобы поигратся с ECDSA можно зайти на https://8gwifi.org/ecsignverify.jsp. Попробуем создать 2 пары ключей, для этого надо просто открыть в 2 вкладках эти страницы. При старте страницы генерируется пара ключей. При генерации этих ключей нужен очень сильный рандом, поэтому вас просят порисовать на экране некоторые биткоин кошельки, чтобы создать большую энтропию и предсказать какой был ваш ключ было невозможно.


Если попробовать сгенерировать 2 ключа, и подписать ими один и тот же текст, то подписи будут совершенно разные. В этом и смысл криптовалюты, никто не может за вас подписать какой то документ без приватного ключа. Но чтобы понять что этот текст именно от кого нужно, а не тупо подписанный текст, то вам нужно запомнить где-то публичный ключ человека от которого вы будете получать подписи. Смысл ассиметричной криптографии в том, что зная только публичный ключ никто не может получить приватный ключ, и соответственно не может подписывать документы от вашего имени.
Например, для криптовалюты мы можем подписывать сообщение о транзакции. В нем будет написано к кому будет перевод, и от кого.
В криптовалютах очень часто используют такую схему для подтверждения того что приказ о переводе подписали именно вы, а не кто-то другой. Но откуда тогда берется адрес? Есть публичный ключ, и приватный. Но они оба слишком длинные и не похожи на обычный адрес биткоина. Дело в том, что для получения адреса биткоина используется хеш публичного ключа. Хеш по сути это когда вы даете на вход одно, а на выходе получаете тект который имеет определенное кол-во символов. Хеши используются в совершенно разных местах. Например в веб приложениях, хеширование паролей пользователей позволяет защитить систему авторизации от простого копирования пароля пользователя. Для генерации хеша можно воспользоватся сервисом https://emn178.github.io/online-tools/sha256.html
Как я и сказал выше, вы даете на вход что-то и на выход получаете какой то текст определенной длинны. Если кто-то будет знать только этот выходной текст, то он никогда не сможет получить его содержимое. Конечно это не 100% невозможно, и зависит от криптостойкости хеш алгоритма. Существует множество разных алгоритмов, например MD5, SHA1, и прочих. Но их не используют когда задача в стойкости алгоритма.
Теперь с пониманием что адрес это всего лишь хеш публичного ключа, мы можем составить следующее:

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

Блокчейн, что такое, как работает

Блокчейн, в переводе это цепочка блоков. Блокчейн используется в криптовалютах для сохранения данных о совершенных транзакциях в сети. У биткоина есть свой блокчейн, который можно посмотреть в блокчейн обозревателе. Например в https://www.blockchain.com/explorer?view=btc.
Блокчейн работает через хеши. В контенте следующего блока в блокчейне есть хеш предыдущего, поэтому если вы измените контент хоть 1 блока из блокчейна, то при проверке целостности блокчейна это обнаружится. Для создания простейшего псевдо блокчейна состоящего из 2 блоков нужно просто открыть 2 вкладки нашего хеш генератора. 



Как вы видите, таким образом можно нагенерировать блоки. В каждом блоке есть транзакция от кого-то кому-то. И так же указан майнер блока, которому отдадут деньги за нахождение блока. Предствьте такой список блоков, у каждого есть предыдущий хеш, и контент кто кому что перевёл. Любой человек из интернета может синхронизировать ваш блокчейн на свой компьютер, проверить если предыдущий хеш (генерируя хеш блока сам) такой же, как и у предыдущего блока. Если хеш одного из блоков неправильный, то можно просто спросить у сети хеш и контент этого блока.
После синхронизации, человек знает хеш последнего блока. И может записать в нужной сети форме новый блок, предыдущий хеш, и контент блока. Но как вы понимаете, в такой схеме возникает проблема: если блок может записать любой проходимец из интернета, значит он может начать DOS атаку, посылая очень много блоков с бесполезным содержимым. Для защиты от таких спаммеров и придумали POW с майнингом.

Как связаны блокчейн и майнинг

POW значит proof of work. Как мы и выяснили в предыдущем разделе, каждый блок имеет свой хеш. POW основывается на том что хешу предявляются какие-то требования. Например что хеш блока должен начинатся с 3 нулей в начале. Но хеш же никогда не меняется, если не менять его входное значение. Поэтому в блоках есть некий раздел для какого-то рандомного мусора, чтобы меняя его, найти хеш соответствующий требованиям.
import random, hashlib

block = """
Предыдущий хеш: 0
Перевод тому
Перевод сему
мусор:
"""

while True:
    block_byte = block+str(random.random())
    byte = block_byte.encode('utf-8')
    f = hashlib.sha1(byte).hexdigest()

    if f[:6] == '000000':
        print(f"Нашел хеш, который намайнил: {f}")
        break
Например, если поставить правило что хеш должен начинатся с 6 нулей, то на среднем современном компьютере потребуется ждать примерно 10 секунд для генерации 1 блока. Процессоры не очень эффективны в генерации хешей, поэтому в промышленном майнинге используются асик майнер (даже не видеокарты), именно асик майнеры. Асик майнеры это FPGA, специально запрограммированные на создание хешей, они могут генерировать их с огромными скоростями, в миллионы раз выше обычных компьютеров. Например средний асик майнер для майнинга биткоина, может создавать 10 триллионов таких хешей в секунду. В примере я использовал алгоритм sha1, но биткоин использует более сложный для добычи - sha256.
Зачем моей маме для перевода биткионов мне держать целый асик майнер у себя дома? Если в сети небыло бы коммисий для майнеров, и награды за блок, то никто бы попросту не хотел добывать блоки. Поэтому в биткоин сети в каждом блоке в начале есть кол-во биткионов переходящих майнеру за новый блок. Их кол-во заданно определенным алгоритмом сети. Майнеру нужно дописать в блоке транзакций транзакцию отправления денег из coinbase к себе. coinbase это место откуда берутся все блоки. Не путайте coinbase блокчейн сети, с компанией coinbase. Это совершенно разные вещи. Например рассмотрим блок https://www.blockchain.com/btc/block/99999. В нем нету вообще никаких транзакций, только перевод награды майнером на свой кошелек.
Но сейчас писать пустые блоки в сеть никому не выгодно, тк если бы в блоке были указаны транзакции пользователей, которые хотели совершить перевод с коммисией, то с майнер получит большую награду, чем создав пустой блок.

UTXO, что это такое и как оно работает

Как вы можете понять что при переводе с 1 аккаунта, биткионы не появились из воздуха? В биткоине вы никогда не храните какой-то баланс или что-то вроде этого. Вы лишь имеете право на передвижение UTXO. Это по сути и есть баланс вашего кошелька. Когда биткион кошелек хочет посчитать ваш баланс, ему нужно пройтись по всем UTXO сети, и понять можете ли вы использовать их как input для перевода, или нет. Для этого и нужен UTXO. UTXO - это unspend transaction output. Он нужен для того чтобы сеть могла понимать, откуда взялись деньги, могут ли их потратить. UTXO основан на том, что биткоины всегда имееют 1 четский путь от появления, до своего владельца. Новый блок майнят, майнер получает биткоины на свой кошелек, он их продаёт на какой то бирже, для этого он переводит их со своего кошелька на биржевые. На бирже кто-то их покупает, покупателю эти биткионы пересылаются на его биткоин кошелек. И в этой схеме всегда получается что есть какой то майнер, и какие-то владельцы. Задача UTXO в том чтобы понимать какие биткионы сейчас существуют, их можно можно ли их перевести или нет.
Например, если мы взглянем поподробнее на любую транзакцию в блокчейне биткоина, например https://www.blockchain.com/btc/tx/fde74f881baa49671d0c88a47c27e675056540bd693ebbf60cfc3e5de5ff4e8d, то внизу страницы мы увидим 
Input и Output. В Input стоит 0, и Output стоит кошелек майнера этого блока. И сеть это одобрит, тк майнер нашел этот блок и получает тем самым биткионы на свой кошелек. UTXO, как и физические монеты может быть только потрачен, или непотрачен. Когда совершается каждая транзация в блоке, проверяется если UTXO этих транзакций были потрачены ранее. Таким образом, вы не можете потратить свои биткионы несколько раз.
Внутри UTXO написаны правила, соответствуя которым они могут быть использованы для создания нового. В этом и есть сама суть "владения" биткоинами, что вы можете их перевести право на следующий перевод следующему кошельку.

Комментарии

Популярные сообщения из этого блога

DOS атака при помощи Python

Ведем телеграм канал через питон

Django migrations не видит изменения моделей