Криптовалюта: по делу и без излишеств. Часть 1

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


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


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


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


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


Леджер (гроссбух) и цифровые подписи

Представьте, что мы часто ходим со знакомыми в кафе, и потому часто обмениваемся деньгами. Иметь дело с наличными каждый раз может быть крайне неудобно, поэтому мы сообща записываем все, что каждый кому-либо должен в обычную тетрадь. Эта тетрадь доступна для всех участников и каждый может вносить в нее дополнения, как на Пикабу. В конце каждого месяца мы собираемся вместе в этом кафе и подсчитываем сколько каждый заплатил и занял за все время. Если кто-либо занимал больше, чем давал, то он кладет разницу на стол, а если, наоборот, то он берет со стола сколько должен. Все просто, не так ли? Однако что если один из наших знакомых по ошибке (или намеренно) добавит неправильную строку в тетрадь: например, "Маша должна Кате 200 рублей".


Итак, знакомьтесь, первая крупица криптографии - электронная подпись. Должник должен ставить свою подпись на каждую строку со своим именем, но как сделать чтобы её было невозможно подделать, тем более когда дело ведется электронно? Криптография легко справляется с проблемой подделок: у каждого участника есть публичный ключ (public key, сокращенно pk) и личный (private key или secret key, sk). И первый, и второй ключи - просто строка из нескольких битов (чаще всего 256 битов). Заметьте, что для каждого sk существует только и только один pk, ассоциированный с ним.

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

Подписать(Сообщение, sk) = подпись.

Изменив хоть совсем на немного сообщение, подпись измениться налицо. Функция Подписатьзависит от sk (который есть только у отправителя), то есть никто не сможет просто скопировать ваше сообщение, прогнать через функцию Подписать и получить точно такую же подпись, как ваша. Помимо функции для создания подписей, есть функция для проверки таковых - назовем, функция Проверить, которая возвращает Булево значение (ложь или правда), используя само сообщение и публичный ключ; не иначе как:

Проверить(Сообщение, подпись, pk) = true / false

Мы не будем углубляться в математику, скрытую за капотом этой функции, просто потому что на понимание этого у людей уходят семестры. Для нас сейчас достаточно осознать, что мошеннику невозможно подобрать такую подпись, не зная личный ключ жертвы, так, чтобы функция Проверить выдала бы true, потому что существует целых 2^256 всевозможных подписей. Это необыкновенно огромное число: назвав его астрономическим, вы переоцените масштабы видимой вселенной. В мире еще нет стратегии подбора такой подписи лучше, чем простой перебор, на который у мошенника уйдет больше времени, чем осталось существовать свету во вселенной.


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


Итак, с помощью электронных подписей мы убрали нужду верить каждому на слово, но у нашей маленькой системы есть один большой минус: что, если, например, Андрей будет должен 1.000 рублей к концу месяца и откажется появиться на сборке, чтобы оплатить долги? Здесь мы начинаем понемногу приближаться к пониманию природы Биткойну. Зачем нам нужно собираться в конце месяца, если можно сделать так, чтобы никто не смог бы тратить больше, чем он может позволить себе? Каждый из нас может вложить, например, 1.000 рублей в самом начале и если в книге будет записано, что Андрей уже задолжал 1.000 рублей, то следующая его транзакция будет недействительна, как если бы он её не подписывал. При таком раскладе, в книге для каждого участника должен вестись учет баланса. Теперь самое интересное в этой части: подумайте, при такой системе участники могут совсем не нуждаться в рублях, как валюте для обмена финансов. У каждого человека есть баланс, который может быть пополнен и израсходован. Люди теперь могут обмениваться не рублями, а долгами на бумаге. Давайте для простоты назовем это "леджер рублями" или сокращенно ЛР. Участник может, конечно, обменять настоящие рубли на ЛР: Андрей дает Маше 100 рублей, а она записывает в тетрадке со своей подписью, что должна ему 100 рублей (100 ЛР). Однако никто не гарантирует что 1 рубль = 1 ЛР - это теперь совершенно независимые единицы, также как рубль и доллар. Поэтому нам нужно осознать, что по определению ЛР - это история транзакций, как и Биткойн, как валюта - это, по сути дела, история транзакций.  Конечно, Биткойн не покупается изначально за рубли, как это обстоит с нашим ЛР и в отличие от нашей валюты, Биткойн децентрализован: для ЛР нужна тетрадка, которую кто-то будет хранить при себе, читай централизованная система.


Об этом и многом другом в следующем (надеюсь) выпуске. Впереди все самое интересное.


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