Що таке криптовалюта: спробуємо на словах створити та зрозуміти, як працює біткоїн та інші цифрові валюти зсередини

Перша криптовалюта — біткоїн, була створена в уже далекому 2009 році. У своїй доповіді таємнича особа (чи група осіб) під псевдонімом Сатоші Накамото розкрила протокол цієї криптовалюти та презентувала першу програму, яка його реалізувала. Тоді про крипту знали лише у вузьких колах, а зараз про біткоїн говорять всі та постійно: про його зростання, падіння, прогнози тощо. Однак, більшості досі невідомо, як працює ця криптовалюта.

Для того, щоб зрозуміти суть Bitcoin, достатньо було б прочитати його протокол від Сатоші. Однак, він доволі складний для розуміння пересічною людиною. Квантовий фізик, науковий письменник та програміст Майкл Нільсен у своєму блозі спробував інакше підійти до цього питання: розповів про поетапну побудову протоколу криптовалюти. «Український капітал» адаптував його розумовий експеримент, який пояснює, що таке біткоїн та як він працює.

Як ми можемо спроєктувати цифрову валюту

Стратегія, яка використовується в цій публікації, передбачає поетапне створення біткоїна. Ми почнемо з простого пояснення цифрової валюти, заснованої на практично очевидних ідеях. Свою експериментальну валюту назвемо «інфокоїн», щоб відрізняти її від біткоїна. Спочатку вона матиме низку недоліків, яких ми будемо позбуватися в процесі імітації протоколу біткоїн. Так ми заново відкриємо біткоїн.

На перший погляд, ідеальна робоча цифрова валюта здається чимось неможливим. Наприклад, уявімо собі першого власника криптовалюти — Алісу. Вона втомилася від фіатних грошей та вирішила винайти свою валюту, якою вона хоче обмінюватися зі своїми знайомими для взаєморозрахунків.

Першою ідеєю Аліси, як обмінюватися грошима, власне, без грошей, став простий гросбух — список, куди вона та інші буду записувати свої борги. В сучасному світі це може бути, наприклад, публічний інтернет-сайт, на який всі її знайомі можуть зайти, почитати або додати записи про борги.

Якщо Аліса хоче дати іншій людині — назвемо його Боб, один інфокоїн, вона просто пише «Я, Аліса, даю Бобу один інфокоїн». Проблема такого публічного сайту в тому, що будь-хто може додати будь-яку строку. Виникає питання: як Алісі захиститися від того, щоб Боб без її відома не міг також просто написати «Я, Аліса, даю Бобу один інфокоїн».

Для розв’язання цієї проблеми допоможе криптографія та цифрові підписи, а саме парні особистий ключ та відкритий ключ. Для того, щоб рядок вважався справжнім, Аліса підписує слова «Я, Аліса, даю Бобу один інфокоїн» своїм цифровим підписом. Боб, щоб перевірити правдивість рядка, використовує відкритий ключ цифрового підпису Аліси. Якщо верифікація підпису рядка підтверджена, це означає що цей рядок дійсно підписаний цифровим підписом Аліси та правильним особистим ключем.

Такий прототип цифрової валюти не дуже разючий, але у нього є всі переваги перед простим списком рядків «Я, Аліса, даю Бобу один інфокоїн» чи «Я, Боб, даю Алісі один інфокоїн». Підписаний рядок створює зобов’язання та гарантію, що Боб чи Аліса не зможуть підробити виплати один одному.

Однак, у цього протоколу є проблема. Боб дійсно не може підробити цифровий підпис Аліси, але що зупиняє його перед простим дублюванням вже підписаного рядка «Я, Аліса, даю Бобу один інфокоїн». Якщо не вигадати захисту, Боб може сотні разів просто повторювати цей запис з підписом.

Використання серійних номерів з метою позначити монети

Розв’язання проблеми з простою можливістю копіювання вже підписаних рядків, власне, не потребувало зусиль. Це питання вирішує одна з особливостей цифрових підписів. Річ у тому, що цифровий підпис не є однаковим під різними повідомленнями. Він буде докорінно відрізнятися, навіть якщо в рядку буде хоча б один новий символ — наприклад, серійний номер.

Так, наприклад, якщо додати до кожного повідомлення порядковий номер, то рядок «1. Я, Аліса, даю Бобу один інфокоїн» та «2. Я, Аліса, даю Бобу один інфокоїн» матимуть зовсім різні цифрові підписи. Навіть якщо на другий рядок скопіювати підпис із першого, то перевірка публічним ключем покаже «несправжність» другого.

Однак, в цьому процесі весь час існує інший ризик. Що захищає Боба від того, що Аліса може просто додавати та підписувати рядки про передачу інфокоїнів, якими насправді не володіє? Для розв’язання цього питання було запропоновано надавати серійний номер не рядкам, а, власне, інфокоїнам.

Як відрізнялися підписи у рядків з порядковими номерами рядків, буде і з записами «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1» та «Я, Аліса, даю Бобу один інфокоїн з серійним номером 2». Щоб ця схема працювала, нам потрібен надійне джерело серійних номерів для інфокоїнів. Одним зі способів створення такого джерела є відкриття «банку» інфокоїнів.

Цей «банк» буде надавати серійні номери для інфокоїнів та відстежувати, хто та скільки криптовалюти має. За допомогою такого «банку» можна буде підтвердити, що Аліса дійсно має певну кількість криптовалюти, яку хоче передати Бобу. Дані «банку» будуть підтверджувати, що Аліса не намагається двічі передати Бобу один інфокоїн, а рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 2» дійсно є легітимним.

Для того, щоб не виникало проблем під час передачі інфокоїнів, на кожну нову транзакцію їм надається новий серійний номер. На практиці це відбуватиметься так: 

  • Аліса приходить в «банк» і говорить: «Я хочу зняти один інфокоїн з мого рахунку».
  • Банк зменшує баланс рахунку Аліси на один інфокоїн та надає йому новий оригінальний номер, який ніколи раніше не використовувався. Наприклад, 1234567.
  • Коли Аліса хоче передати цей інфокоїн Бобу, вона створює та підписує рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567».
  • Боб не довіряє Алісі та вступає в контакт з «банком». Він перевіряє, що інфокоїн з цим серійним номером належить Алісі та вона ще не витрачала його.
  • Якщо все вірно, Боб інформує «банк» про бажання прийняти цей інфокоїн.
  • В кінці «банк» оновлює свої записи: в його даних інфокоїн з цим серійним номером більше не належить Алісі та знаходиться на рахунку Боба.

Загалом останнє рішення виглядає досить перспективним. Однак, як відомо, особливістю криптовалют є їх децентралізованість. Вона відрізняє їх від звичайних концепцій цифрових валют — наприклад, цифрових валют центрального банку. Інфокоїн може повністю виключити «банк» з протоколу, використовуючи технологію блокчейн.

Створювати «банк» спільними зусиллями

Інфокоїн може значно змінити свій характер, якщо не буде єдиної організації, відповідальної за цю криптовалюту. Ідея полягає в тому, щоб кожен (в сукупності) був цим «банком». Припустимо, що всі користувачі інфокоїна зберігають повний запис про те, кому належать інфокоїни. Це ми вже прописали як відкритий гросбух або сайт, де розписуються всі операції з інфокоїном. Виникає питання, як реалізувати таку ідею.

Це можна реалізувати, якщо єдиної книги чи сайту з записами транзакцій не буде, а у кожного користувача інфокоїна була його власна версія сайту з записами. Це працюватиме так:

  • Коли Аліса хоче передати інфокоїн Бобу, вона створює підписаний рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» та відправляє його Бобу.
  • Боб використовує свою копію записів транзакцій, щоб перевірити, чи дійсно інфокоїн з серійним номером 1234567 належить Алісі.
  • Якщо все вірно, Боб пересилає всім підписаний Алісою рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» та свій рядок про бажання прийняти цей інфокоїн.
  • Аліса та інші учасники обміну отримують ці рядки та записують собі, що рахунок Аліси зменшився на один інфокоїн, який перейшов на рахунок Боба.

Отже, протокол інфокоїна тепер дозволяє обійтися без централізованої системи записів транзакцій. Проте, з’являється декілька проблем. По-перше, мова йде про проблему присвоєння інфокоїну серійного номера, яка буде розв’язана далі. По-друге, з’являється проблема повторного витрачання в разі більшої кількості учасників мережі, ніж два.

Поточний протокол дозволяє Алісі обманювати та витрачати один інфокоїн декілька разів: наприклад, одночасно передати їх Бобу та Чарлі. Вона просто може створити два рядки: «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» надіслати Бобу, а «Я, Аліса, даю Чарлі один інфокоїн з серійним номером 1234567» надіслати Чарлі. За умови, якщо вона відправить ці повідомлення одночасно, Боб та Чарлі приймають від Аліси один і той самий інфокоїн, не знаючи про транзакцію іншому.

Як ми можемо розв’язати проблему повторних витрат? Очевидним рішенням для Боба буде перевірка цієї угоду не тільки у своїх записах, а й в записах інших учасників. Він може транслювати перспективну ​​угоду всім користувачам мережі та попросити їх допомогти визначити, чи є угода легітимною. Це працюватиме так:

  • Коли Аліса хоче передати інфокоїн Бобу, вона створює підписаний рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» та відправляє його Бобу.
  • Боб використовує свою копію записів транзакцій, щоб перевірити, чи дійсно інфокоїн з серійним номером 1234567 належить Алісі та надсилає запит до інших учасників, чи володіє Аліса цим інфокоїном.
  • Якщо все вірно та від достатньої кількості учасників надходить повідомлення «Так, Аліса володіє інфокоїном 1234567, тепер він може бути переданий Бобу», Боб пересилає всім підписаний Алісою рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» та свій рядок про бажання прийняти цей інфокоїн.
  • Аліса та інші учасники обміну отримують ці рядки та записують собі, що рахунок Аліси зменшився на один інфокоїн, який перейшов на рахунок Боба.

Однак, цей протокол має неточності. Наприклад, «від достатньої кількості учасників» — це від скількох? Отримувати відповіді від всіх учасників неможливо, адже їх кількість невідома апріорі. Розібратися в цьому прямо зараз важко, а замість цього в наступному розділі вкажемо проблеми в цьому протоколі. Їх вирішення матиме великий позитивний побічний ефект, який зробить протокол ще більш зрозумілим.

Доказ роботи

Припустимо, Аліса все-таки хоче обманути та здійснити повторну витрату. Вона може зробити це, контролюючи повідомлення мережі: наприклад, створити мільярд фейкових користувачів, які будуть підтверджувати її неправдиві транзакції. Боб та Чарлі будуть отримувати мільярд підтверджень того, що Аліса 100% власник фейкових інфокоїнів.

Способом уникнути такої ситуації є ідея «доказу роботи» (proof-of-work). Вона містить поєднання двох інших, здавалося б, парадоксальних ідей:

  1. Штучно зробити комп’ютерні обчислення, які необхідні для підтвердження транзакцій, важкими. Це зробить підтвердження операцій, які мусять виконувати користувачі мережі, затратними для них.
  2. Винагороджувати користувачів мережі за проведення важких комп’ютерних обчислень та допомогу перевірки транзакцій.

Для розуміння цього процесу, треба знати що таке хеш-функція. Хешуванням називають процес перетворення даних у двійковий рядок фіксованої довжини. Наприклад, біткоїн використовує відому криптографічну хеш-функцію SHA-256 — вона перетворює будь-які дані в рядок з 256 нулів та одиниць або хеш.

Хеш великого тексту буде докорінно відрізнятися, навіть якщо в ньому змінити хоча б один символ. Однак, він буде завжди буде одним і тим же з однаковими вхідними даними. Головною особливість криптографічних хеш-функцій є те, що розкодувати хеш назад в текст неможливо. Реально здійснити розкодування можна лише підбором вихідного тексту, його хешуванням та сподіванням вгадати закодований текст (2 у 256 ступені можливостей).

Спробуємо використати хеш-функцію SHA-256 для того, щоб ускладнити роботу Аліси в намаганні здійснити повторну витрату. Для того, щоб підтвердити будь-які транзакції, не достатньо передати повідомлення «Так, Аліса володіє інфокоїном 1234567, тепер він може бути переданий Бобу».

Для підтвердження транзакції тепер треба знайти число, хеш (256 нулів та одиниць) якого та копії записів починається з певної кількості нулів — наприклад, 10 нулів. Необхідна кількість нулів, яка є підтвердженням операції, не є сталою та визначається системою «складності», щоб одна операція в середньому підтверджувалася за 10 хв. Це працюватиме так:

  • Коли Аліса хоче передати інфокоїн Бобу, вона створює підписаний рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567» та відправляє його Бобу.
  • Боб використовує свою копію записів транзакцій, щоб перевірити, чи дійсно інфокоїн з серійним номером 1234567 належить Алісі та надсилає запит до інших учасників, чи володіє Аліса цим інфокоїном.
  • Якщо учасники бачать, що все вірно (Аліса дійсно володіє інфокоїном 1234567 та може передати його Бобу) до підтверджувальної копії записів транзакції вони підбирають числа, хеш яких з цими записами відповідає умовам системи: перші 10 цифр мають бути нулями.
  • Вірогідність отримання «правильного» числа складає 1 до 10 млрд. Припустимо, що Девіду пощастило — він знайшов підходяще число та може підтвердити операцію.
  • Девід перший з усіх розповсюджує в мережі це число — доказ своєї роботи, та копію записів транзакцій, яка підтверджує правильність переказу одного інфокоїну від Аліси до Бобу.
  • Інші учасники мережі можуть перевірити, чи є це число «правильним». Для цього вони беруть копію записів та додають до неї це число. Якщо хеш дійсно починається з 10 нулів, це є доказом роботи Девіда.
  • Якщо все вірно, вони оновлюють свої копії записів, додавши рядок «Я, Аліса, даю Бобу один інфокоїн з серійним номером 1234567».

Як зазначалося, цей процес важкий: вимагає багато ресурсів для того, щоб бути першим. Щоб ідея «доказу роботи» працювала, користувачам потрібен стимул, щоб вони допомагали перевіряти транзакцій. Розв’язанням цієї проблеми є «винагорода».

Винагорода за майнінг та довіра до «найбільшої» роботи

Припустимо, що в протокол додамо певну винагороду для тих, хто успішно перевірив блок транзакцій. Наприклад, додамо до їх рахунку певну кількість інфокоїнів. Винагорода має бути достатньо велика, щоб створювати стимул для користувачів брати участь в перевірці.

У протоколі біткоїна цей процес підтвердження та винагороди називається майнінгом. За кожен перевірений блок угод, успішний майнер отримує винагороду в біткоїнах. Спочатку ця винагорода була встановлена ​​на рівні 50 біткоїнів, але кожні 210 тисяч перевірених блоків (приблизно раз на чотири роки) нагорода зменшується вдвічі — відбувається халвінг. Таких поділів вже відбулося три, а зараз нагорода за майнінг знизилася до 6,25 біткоїна.

За прогнозом, у 2140 році загальна пропозиція біткоїна перестане збільшуватися. Однак, це не усуне стимул для перевірки транзакцій. Біткоїни також дає можливість виділити деяку суму в угоді як комісію за транзакцію, що потрапить до майнера-перевірщика.

Цей процес підтвердження, який ми додали до протоколу інфокоїна, розв’язує проблему можливих повторних витрат. Будь-які фейкові зміни, які Аліса хоче додати в розповсюджену копію записів, потребуватимуть від неї обрахунку цієї та всіх наступних операцій, які, наприклад, Боб здійснює на рахунок Чарлі та всіх інших учасників системи.

Звісно, обман Аліси не є неможливим: вона може спробувати обрахувати підтвердження своєї повторної витрати та всіх наступних операцій, які здійснюють учасники системи. Однак, це можливо лише теоретично: для цього Аліса має контролювати понад 50% від всіх потужностей обрахунків. В сучасних реаліях, наприклад, біткоїну, це неможливо.

Власне, з цього процесу і походить назва технології блокчейну (blockchain), тобто ланцюжка блоків. Теоретично Аліса може постійно створювати та підтверджувати власний ланцюжок блоків. Аліса не може мати таких потужностей для обрахунку, які можуть посперечатися з усією системою інфокоїна. Рано чи пізно такі «побічні гілки» відсікаються, а далі обраховується лише «основна послідовність блоків» — найдовша, для якої було виконано «найбільше роботи».

На цьому закінчується базовий опис основних ідей, достатніх для загального розуміння протоколу та технології біткоїна. В тексті не описано багато деталей технології, адже ціль була не зробити технічний опис. Правила біткоїни прості та легкі для розуміння. Однак це не означає, що легко зрозуміти всі наслідки цих правил.

Чи можна зараз почати майнити криптовалюту на домашньому ПК? Такі питанням ставлять сьогодні чимало людей на фоні чергового росту медійності даного виду активів. Сьогодні «зайти в майнінг» вже не так просто, чому — розбирався «Український капітал».