Хотите знать, как устроен Биткоин (и другие криптовалюты)?

23 мин на чтение

Оригинал видео

Что значит, “ИМЕТЬ биткоин”? Многие люди слышали о биткоине, что это полностью цифровая валюта, без потребности в правительстве, чтобы ее выпускать, и без нужды в банках, чтобы открывать счета и подтверждать переводы. А еще, что никто не самом деле не знает личность его изобретателя. И все равно, немногие понимают ответ на этот вопрос. По крайней мере, в деталях.

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

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

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

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

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

Если вы с друзьями часто обмениваетесь деньгами, например, совместно оплачивая счета в кафе, может быть не очень удобно каждый раз обмениваться наличными. Так что вы можете завести общий счет, или баланс, в который записывать запланированные платежи на будущее. Например, “Алиса должна Бобу 20 долларов”, “Боб должен Чарли 40 долларов”, и так далее.

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

Так что протокол участия в этой, очень простой, системе может выглядеть так: “каждый может добавлять строки в счет; а в конце месяца все собираются и рассчитываются”.

Одна из проблем с таким публичным балансом в том, что любой может добавить строку! Так, что остановит Боба добавить строку “Алиса должна Бобу 100 долларов” без ведома Алисы? Как мы можем убедиться, что каждая записанная транзакция - это именно то, что имел в виду отправитель?

Это как раз первая проблема, с которой нам поможет криптография - цифровые подписи. Как и письменные подписи, идея в том, что Алиса может добавить что-то к строке, что поможет убедиться, что она эту строку видела и одобряет. И должно быть практически нереально подделать эту подпись другому лицу.

На первый взгляд должно показаться, что цифровые подписи в принципе невозможны - ведь данные, которые составляют такую подпись могут быть просто скопированы компьютером. Так как защититься от подделок? Это работает так: каждый участник генерирует так называемую пару ключей - публичный и приватный ключ, каждый из которых выглядит как какая-то строка бит.

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

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

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

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

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

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

Так что заставить людей подписывать свои транзакции - весьма удачная идея, но есть небольшая лазейка. Если Алиса подпишет транзакцию, скажем, “Алиса переводит Бобу 100 долларов”, даже при том, что Боб не сможет подделать подпись Алисы на новом сообщении, он может просто скопировать эту строку столько раз, сколько захочет. И эта комбинация сообщения и подписи останется валидной.

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

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

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

Так что можно придумать хитрую систему, чтобы вообще никогда не рассчитываться, если есть способ не допустить чрезмерной траты участников. Например, сначала все участники скидывают в общий котел, скажем, 100 долларов, и вы записываете в баланс такие строки: “Алиса получает 100 долларов”, “Боб получает 100 долларов”, “Чарли получает 100 долларов” и так далее. Так что теперь не принимайте никакие транзакции, в которых участник тратит больше, чем у него есть на балансе.

Например, если первые две транзакции будут: “Чарли платит Алисе 50 долларов” и “Чарли платит Бобу 50 долларов” и потом он попытается добавить “Чарли платит вам 20 долларов”, это будет невалидно. Также невалидно, как если бы он вообще не подписал эту строку.

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

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

Вы, конечно, можете обменивать балансовые доллары на настоящие деньги. Например, скажем, Алиса дает Бобу 10 долларов в реальном мире в обмен на то, что он добавит и подпишет в балансе строку “Боб дает Алисе 10 балансовых долларов”. Но такие транзакции не гарантируются протоколом. Это больше похоже на то, как вы обмениваете доллары на евро или любые другие валюты на открытом рынке. Это своя, особая история.

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

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

Но перед этим мы расскажем о еще более существенном различии между криптовалютами и нашими балансовыми деньгами.

Пока что мы говорили, что этот баланс должен храниться в каком-то публично доступном месте, как веб-сайт, где все могут добавлять строки. Но это требует надежного центрального хранилища, которому все доверяют. А именно: кто хранит веб-сайт? Кто контролирует правила добавления новых строк? Чтобы избавиться и от этого доверительного элемента, мы заставим всех участников хранить собственную копию баланса. Так что когда вы хотите совершить транзакцию, например, “Алиса переводит Бобу 100 долларов”, вы распространяете это сообщение среди всех участников системы, чтобы они добавили эту строку к своей копии баланса.

НО, если вы не сделаете еще что-то, эта система просто абсурдна. Как можно убедиться, что у всех совпадают балансы? Если Боб слышит транзакцию, “Алиса переводит Бобу 10 долларов”, как он может быть уверенным, что все остальные услышали и добавили эту транзакцию? Чтобы он смог потом пойти и перевести эти 10 долларов, скажем, Чарли.

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

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

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

Но это очень клевая идея! Если понять ее, то вы поймете принцип биткоина и других криптовалют.

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

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

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

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

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

Представьте, что кто-то показал вам список транзакций. И он говорит: “Эй, я нашел особое число, такое что если дописать его в конце списка транзакций и применить SHA-256, то первые 30 бит получившегося хэша - все нули”. Как трудно для него, на ваш взгляд, было найти такое число?

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы понять, как это обеспечивает доверенную систему, и как можно доверять платежам в ней, довольно полезно проследить путь, который потребуется пройти, чтобы обмануть кого-то в такой системе. Допустим, Алиса пытается обмануть Боба с помощью поддельного блока. А именно, она пытается отправить ему такой, который включает строку “Алиса платит Бобу 100 долларов”, но не распространять этот блок на всю сеть, чтобы все остальные думали, что у нее все еще есть эти 100 долларов. Для этого ей нужно найти правильное доказательство работы до всех остальных майнеров, каждый из которых работает над своим блоком. И это вполне может случиться. Может, Алиса просто выиграет в эту мини-лотерею раньше всех остальных.

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

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

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

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

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

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

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

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

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

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

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

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