1
1.1
Блокчейн - це загальнодоступна база даних, яка оновлюється і використовується на багатьох комп'ютерах у мережі.
"Блок" означає дані і стан, що зберігаються в послідовних групах, відомих як "блоки". Якщо ви відправляєте BTC будь-кому, дані транзакції повинні бути додані в блок, щоб вона була успішною.
"Ланцюжок" ("чейн") означає той факт, що кожен блок криптографічно посилається на свій батьківський об'єкт. Іншими словами, блоки з'єднуються один з одним. Дані в блоці не можуть бути змінені без зміни всіх наступних блоків, що потребуватиме згоди всієї мережі.
Кожен комп'ютер у мережі повинен узгодити кожен новий блок і ланцюжок загалом. Такі комп'ютери називають "вузлами". Вузли гарантують, що всі, хто взаємодіє з блокчейном, мають одні й ті самі дані. Щоб досягти цієї розподіленої угоди, блокчейну потрібен механізм консенсусу.
Зараз Bitcoin використовує консенсус-механізм доказу роботи. Це означає, що будь-хто, хто хоче додати нові блоки даних у ланцюжок, повинен вирішити складну головоломку, для чого потрібно багато обчислювальної потужності. Розв'язання головоломки підтверджує, що ви витратили обчислювальні ресурси. Цей процес називається майнінгом. Майнінг зазвичай здійснюється методом перебору і помилок, але успішне додавання блоку винагороджується в BTC.
Нові блоки транслюються на ноди, перевіряються і підтверджуються, таким чином оновлюючи стан блокчейн мережі для всіх.
У підсумку, коли ви відправляєте кому-небудь BTC, транзакція повинна бути проведена і включена в новий блок. Потім оновлений стан передається всій мережі.
Також важливо знати що SHA-256 (Secure Hash Algorithm 256-bit) є однією з криптографічних хеш-функцій, яка приймає на вхід послідовність даних будь-якої довжини і генерує хеш-значення фіксованої довжини 256 біт (32 байти). Вона була розроблена Національним інститутом стандартів і технологій США (NIST) та стала широко використовуваною в різних криптографічних застосуваннях, включаючи криптовалюти.
Для криптовалюти SHA-256 є основною хеш-функцією, використовуваною в біткоїні та інших багатьох криптовалютах. В біткоїні вона використовується для хешування блоків, транзакцій та інших даних, а також для Proof-of-Work (доказ роботи) алгоритму, який вимагає вирішення складної обчислювальної задачі для майнерів.
1.1.2 Передумови створення Біткоїна.
Повністю одноранговий устрій системи електронних грошей
дозволяє здійснювати електронні транзакції між учасниками безпосередньо,
минаючи будь-які фінансові інститути. Частково, це завдання вирішує
використання цифрових підписів, але необхідність довіреної особи для
контролю за подвійною витратою позбавляє цей підхід основних переваг. Ми
пропонуємо децентралізоване вирішення проблеми подвійної витрати з
використанням однорангової (пірингової) мережі. Мережа ставить мітки часу
на транзакції, з'єднуючи їх у ланцюжок доказів виконаної роботи на
основі хешування. Сформовані таким чином записи неможливо
змінити, не виконавши заново всього обсягу обчислень. Найдовша
версія ланцюжка слугує не тільки підтвердженням черговості подій, а й
доводить, що над нею виконав роботу найбільший обчислювальний
сегмент мережі. Доти, доки більша частина обчислювальних потужностей
контролюється вузлами, не об'єднаними з метою атакувати мережу, вони будуть
генеруватимуть найдовший ланцюжок, випереджаючи будь-яких зловмисників.
Пристрій самої мережі дуже простий: повідомлення розсилаються на основі
принципу "найменших витрат", а вузли можуть залишати мережу і знову
підключатися до неї в будь-який момент, приймаючи найдовшу версію
ланцюжка для відновлення пропущеної історії транзакцій.
Інтернет-комерція в більшості випадків спирається на фінансові установи,
які виступають у ролі довірених посередників для проведення електронних платежів.
Така схема добре працює для більшості транзакцій, але в її основі лежить довіра,
що тягне за собою певні проблеми. Необхідне посередництво фінансових інститутів
перешкоджає здійсненню незворотних транзакцій. Ціна цих послуг збільшує
вартість транзакцій і встановлює мінімальну їхню ціну, роблячи непрактичним
проведення нечастих і невеликих транзакцій. Крім того, відсутність незворотних
транзакцій збільшує і вартість сервісів, чиї послуги є нескасованими.
Оскільки платіж можна анулювати, продавець змушений бути насторожі, вимагаючи від
покупця більше інформації, ніж у принципі необхідно. І певний відсоток
шахрайства приймається просто як неминучість. Ці націнки і невизначеності з
платежами можуть бути подолані в разі оборудок з паперовою готівкою, однак
механізму для проведення прямих електронних транзакцій не існує.
Необхідна платіжна система, заснована на криптографії, а не на довірі,
яка дозволила б будь-яким двом учасникам здійснити переказ коштів безпосередньо,
без участі посередника. Обчислювальна дорожнеча скасування транзакцій захистила б продавців від шахрайства, а легкоздійсненні механізми ескроу захистили б покупців. У цій роботі ми пропонуємо вирішення проблеми подвійної витрати, засноване на розподіленому одноранговому сервері міток часу, який своєю
обчислювальною потужністю підтверджує хронологічний порядок транзакцій. Система перебуває в безпеці, поки під сукупним контролем її чесних учасників
перебуває більше обчислювальної потужності, ніж під контролем групи зловмисників, що діють спільно зловмисників.
1.1.2 Опис транзакцій
Визначимо електронну монету як послідовність цифрових підписів. Черговий
власник відправляє монету наступному, підписуючи хеш попередньої транзакції та
публічний ключ майбутнього власника і приєднуючи цю інформацію до монети.
Одержувач може перевірити кожен підпис, щоб підтвердити коректність усього ланцюга.
Проблема, зрозуміло, в тому, що одержувач не може визначити, скільки разів колишній
власник витратив цю монету. Традиційне рішення полягає в перевірці
центральною довіреною особою ("монетним двором" або емітентом) кожної транзакції.
Після будь-якого платежу монета повертається до емітента, який випускає нову її
версію; і тільки безпосередньо отриманим таким чином монетам можна довіряти.
Недолік цього підходу в тому, що від компанії-емітента залежить доля всієї грошової
системи, оскільки вона подібно до банку контролює кожну транзакцію, що проходить через неї
транзакцію, що проходить через неї.
Адресат має знати, що ніхто з попередніх власників не підписав транзакцію,
яка передує за часом тій, що перебуває в ланцюжку відправленої йому монети. Для
наших цілей лише перша транзакція з кількох є істинною, тому ми не
повинні турбуватися про пізні спроби подвійної витрати. У централізованій моделі
емітент знав про всі транзакції і вирішував, у якому порядку вони йдуть. Щоб позбавити
схему від посередника, учасникам необхідно відкрито публікувати транзакції [1], а також
вміти приходити до згоди щодо єдиного порядку їх проходження. Одержувачу потрібен доказ того, що для кожної транзакції з ланцюжка більшість
користувачів згодні вважати її першою.
1.3 Сервер міток часу
Почнемо опис нашого рішення із сервера міток часу. Його робота полягає в
хешуванні блоку даних, на який потрібно поставити мітку, і відкритій публікації
цього хешу, як у газеті або Usenet-постах [2-5]. Мітка часу показує, що в даний
момент конкретні дані існували і тому потрапили в хеш блоку. Кожен хеш
включає в себе попередню мітку: так вибудовується ланцюг, де чергова ланка
зміцнює всі попередні.
1.1.4 Доказ роботи
Щоб реалізувати розподілений одноранговий сервер міток часу, ми використовуємо
схему "доказу роботи", подібну до системи Hashcash Адама Бека [6]. Суть
полягає в пошуку такого значення, чий хеш (наприклад, SHA-256) починався б із
деякого числа нульових бітів. Потрібно виконати обсяг роботи, що експоненціально
залежний від числа нулів, але для перевірки знайденого значення достатньо обчислити
лише один хеш.
У нашому сервері міток часу пошук значення з потрібним хешем відбувається шляхом
перебору значення ітерованого поля-добавки (nonce) в блоці даних. Щойно блок,
що задовольняє умові, знайдено, його вміст не можна змінити, не виконавши заново
всієї роботи. І якщо він не є останнім у ланцюжку, ця робота охоплює і
переобчислення всіх блоків, що йдуть за ним.
Доказ роботи через хешування також вирішує питання про визначення версії,
підтримуваної більшістю. Якщо голосом вважається одна IP-адреса, то таку схему
можна скомпроментувати, якщо контролювати великий діапазон адрес. Наша схема
заснована на принципі "один процесор - один голос". Найдовший із хеш-ланцюжків
висловлює думку більшості, яка вклала в нього найбільшу кількість ресурсів.
Якщо більше половини обчислювальної потужності належить чесним вузлам, то ланцюжок
чесних транзакцій зростатиме швидше і випередить будь-який конкуруючий ланцюг. Щоб
внести зміни в будь-який з минулих блоків, атакуючому доведеться виконати заново
роботу над цим блоком і всіма наступними, а потім наздогнати і перегнати чесних
учасників за новими блоками. Нижче ми покажемо, що ймовірність такого успіху у
зловмисника, що володіє меншими ресурсами, експоненціально зменшується залежно від
залежно від числа блоків.
Для компенсації зростаючої обчислювальної потужності процесорів і коливання числа
працюючих вузлів у мережі, складність хешування повинна змінюватися, щоб
забезпечувати рівномірну швидкість генерації блоків. Якщо вони з'являються занадто
часто - складність зростає, і навпаки
1.1.5 Мережа
Система працює за такими правилами:
1) Нові транзакції розсилаються всім вузлам.
2) Кожен вузол об'єднує транзакції, що надійшли, у блок.
3) Кожен вузол намагається підібрати хеш блоку, що задовольняє поточну складність.
4) Щойно такий хеш знайдено, цей блок відправляється в мережу.
5) Вузли приймають блок, тільки якщо всі транзакції в ньому коректні й не використовують
уже витрачені кошти.
6) Свою згоду з новими даними вузли висловлюють, починаючи роботу над наступним
блоком і використовуючи хеш попереднього як нові вихідні дані.
Учасники завжди вважають істинною найдовшу версію ланцюжка і працюють над
її подовженням. Якщо два вузли одночасно опублікують різні версії чергового блоку,
то хтось із решти пірів отримає раніше одну версію, а хтось - іншу. У такому
випадку кожен почне працювати над своєю версією ланцюжка, зберігши іншу на випадок,
якщо вона виявиться продовжена раніше. Двоїстість зникне, щойно буде отримано
новий блок, який продовжить будь-яку з гілок, і ті вузли, що працювали над
конкуруючою версією, переключаться на неї.
Нові транзакції не обов'язково мають досягати всіх вузлів. Якщо про них знатиме
досить багато вузлів, незабаром вони потраплять в один із блоків. Правила розсилки блоків
теж не є суворими щодо втрачених повідомлень. Як тільки вузол,
що пропустив один із блоків, отримає вже наступний за ним, він запросить інформацію, якої бракує
інформацію, щоб заповнити очевидний пропуск.
1.1.6 Стимули працездатності мережі
За замовчуванням, перша транзакція в блоці є спеціальною, що створює нову
монету, яка належить творцеві блоку. Така схема заохочує чесних учасників
мережі, стимулюючи їх підтримувати роботу мережі, а також вирішує питання про початковий
розподіл грошової маси за відсутності центрального емітента. Рівномірне
збільшення кількості монет в обігу можна порівняти з видобутком золота, в який
золотошукачі теж вкладають свої ресурси. У ролі останніх у нашому випадку
виступають процесорний час і електрика.
Іншим способом стимулювання може бути комісія за транзакції. Якщо вхідна
сума платежу більша за вихідну, то різниця є комісією за переказ і
додається до базового значення нагороди за знайдений блок у першій транзакції. Як тільки
тільки сумарний обсяг грошової маси досягне заздалегідь встановленого максимуму,
єдиним джерелом заохочення роботи над блоками залишаться комісії, при цьому
позбавлені інфляції.
Така форма стимулювання може також сприяти зменшенню випадків
шахрайства. Якщо жадібний зловмисник здатен виділити більше
обчислювальних потужностей, ніж усі чесні учасники, він може обманювати продавців,
анулюючи свої транзакції і повертаючи кошти, або ж спрямувати свої ресурси на
генерацію нових блоків і монет. Більш вигідним для нього є варіант "гри за
правилами", який забезпечує отримання більше половини всіх нових грошей, ніж варіант "саботажу системи" і підтримання свого капіталу на постійному рівні.
1.5
1.1.7 Оптимізація використання дискового простору
Як тільки остання транзакція в монеті-ланцюжку опиниться всередині досить старого
блоку, всі попередні їй транзакції в ланцюжку можуть бути видалені з метою очищення
дискового простору. Щоб хеш блоку залишився незмінним, усі транзакції в блоці
зберігаються у вигляді хеш-дерева Меркла [7][2][5] і лише його корінь включають у хеш блоку.
Розмір старих блоків може бути зменшено за рахунок видалення непотрібних гілок цього
дерева, зберігати проміжні хеші необов'язково.
Заголовок порожнього блоку становитиме близько 80 байт. З розрахунку швидкості генерації
блоку раз на десять хвилин отримуємо 80*6*24*365=4.2 Мб на рік. Для середньостатистичного
на 2008 рік комп'ютера з 2 Гб оперативної пам'яті з урахуванням закону Мура,
що пророкує зростання на 1.2 Гб на рік, зберігання даних не буде проблемою, навіть якщо усі заголовки блоків перебуватимуть у пам'яті.
1.1.8 Спрощений механізм перевірки платежів
Верифікація транзакцій можлива без запуску повнофункціонального вузла.
Користувачеві необхідно лише зберігати заголовки блоків найдовшого ланцюжка,
який він отримав від інших вузлів, і запитувати хеш-піддерево для необхідної
транзакції. Він не може перевірити коректність транзакції самостійно, але отримавши
посилання на блок, у якому вона перебуває, він може переконатися в тому, що цей блок і всі
наступні прийняті та підтверджені мережею.
На такий метод перевірки можна покладатися, поки мережа хоча б наполовину перебуває
під контролем чесних учасників, тобто поки зловмисник не заволодіє великими
ресурсами. Звичайні вузли можуть перевіряти транзакції самостійно, але якщо
нападник генерує найдовший ланцюг блоків, то своїми сфабрикованими
транзакціями він може скомпроментувати спрощену схему. Однією зі стратегій
протидії цьому може бути розсилка сигналів тривоги від звичайних пірів, які
отримують "помилковий" блок. Такий сигнал змушуватиме програму-клієнт завантажувати
блок повністю, щоб самостійно підтверджувати некоректність даних. Компанії,
часто приймають платежі, можливо, будуть підключатися до мережі у звичайному режимі для
більшої незалежності, безпеки та швидкості перевірки.
1.1.9 Об'єднання та розподіл сум
Незважаючи на те, що можна оперувати окремими монетами, створювати спеціальну
транзакцію для кожного цента було б занадто незручно. Для підтримки поділюваних і
об'єднуваних сум транзакції містять кілька входів і виходів. Звичайна
транзакція матиме такий вигляд: або один вхід від попереднього великого платежу, або
кілька входів, що акумулюють невеликі суми, і не більше двох виходів: один
є власне платежем, а інший, якщо необхідно, повертає "решту" назад
відправнику.
Необхідно зазначити, що збільшення зв'язків, коли транзакція залежить від кількох,
а ті своєю чергою залежать від ще більшої кількості, не є проблемою, оскільки немає
необхідності отримувати повну і незалежну копію історії транзакції.
1.1.10 Забезпечення конфіденційності
Традиційна банківська модель підтримує необхідний рівень
конфіденційності, надаючи доступ до інформації лише сторонам-учасницям і
довіреній третій особі. Необхідність відкритої публікації транзакцій виключає
такий підхід, однак приватність, як і раніше, можна зберегти, якщо публічні ключі
будуть анонімними. Відкритою буде інформація про те, що хтось відправив комусь
деяку суму, але без прив'язки до конкретних особистостей. Стільки ж даних
розкривається і на фондових біржах, які публікують час і обсяг приватних угод,
не вказуючи, між ким саме їх було здійснено.
Додатковим захистом буде генерація нової пари "відкритий/закритий
ключ" для кожної транзакції: це запобігатиме зв'язуванню різних платежів з їхнім
загальним відправником або адресатом. Деякого публічного зв'язування все ж не уникнути
уникнути: транзакції з кількома входами доводять, що ці суми належать
одній особі. Ризик полягає в тому, що розкриття особи власника ключа може
призвести до розкриття і всіх належних йому транзакцій.
1.1.11 Оцінка ризиків
Розглянемо сценарій, у якому зловмисник намагається генерувати довший
ланцюг блоків, ніж чесні учасники. Навіть якщо він досягне успіху, це не призведе до того, що
можна буде створювати гроші з повітря, привласнювати собі чужі монети або вносити
інші довільні зміни. Вузли ніколи не приймуть некоректну транзакцію або
блок, що її містить. Атакуючий може лише намагатися змінити одну зі своїх
транзакцій, щоб повернути собі гроші.
Перегони між чесними учасниками і нападником можна уявити як
біноміальне випадкове блукання. Успішна подія, коли "хороший" ланцюг подовжується
на один блок, призводить до збільшення відриву на одиницю, а неуспішна, коли черговий
блок створює зловмисник, - до його скорочення. Імовірність атакуючого надолужити
різницю в кілька блоків така сама, як і в задачі про "розорення гравця". Уявімо, що
гравець має необмежений кредит, починає з деяким дефіцитом і в нього є
нескінченно багато спроб, щоб відігратися.
Імовірність того, що він досягне успіху, як і ймовірність зловмисника наздогнати чесних
учасників, обчислюється таким чином [8]:
p = імовірність появи блоку в чесному ланцюжку
q = імовірність того, що блок створить атакувальник
qz = імовірність того, що атакувальник надолужить різницю в z блоків
У разі p > q ймовірність зменшується експоненціально зі зростанням числа блоків, на яке відстає зловмисник. Оскільки всі ставки проти нього, без вдалого ривка на початку його шанси на успіх стають мізерно малими.
Розглянемо тепер, як довго одержувачу платежу варто чекати, перш ніж він буде повністю впевнений, що колишній власник не зможе скасувати транзакцію. Ми
припускаємо, що зловмисник-відправник дозволяє адресату деякий час вірити, що платіж було проведено, після чого повертає гроші собі. Одержувач дізнається
про це, але шахрай сподівається, що буде вже занадто пізно.
Адресат створює нову пару ключів і повідомляє свій публічний ключ відправнику
просто перед підписанням транзакції. Це не дозволить відправнику заздалегідь почати
працювати над ланцюжком і провести транзакцію в той момент, коли він буде достатньо
щасливий, щоб зробити ривок уперед. Після відправлення платежу шахрай починає
потай працювати над паралельною версією ланцюжка, що містить альтернативну
транзакцію.
Одержувач чекає, поки транзакцію не буде додано в блок і поки той не буде
продовжено ще z блоками. Йому невідомий прогрес зловмисника, але якщо середня
швидкість генерації чесних блоків - відома величина, то число блоків нападника
підпорядковується розподілу Пуассона з математичним очікуванням:
З результатів досліджень, видно, що ймовірність падає експонційно зі зростанням z.
Блокчейн - це загальнодоступна база даних, яка оновлюється і використовується на багатьох комп'ютерах у мережі.
"Блок" означає дані і стан, що зберігаються в послідовних групах, відомих як "блоки". Якщо ви відправляєте BTC будь-кому, дані транзакції повинні бути додані в блок, щоб вона була успішною.
"Ланцюжок" ("чейн") означає той факт, що кожен блок криптографічно посилається на свій батьківський об'єкт. Іншими словами, блоки з'єднуються один з одним. Дані в блоці не можуть бути змінені без зміни всіх наступних блоків, що потребуватиме згоди всієї мережі.
Кожен комп'ютер у мережі повинен узгодити кожен новий блок і ланцюжок загалом. Такі комп'ютери називають "вузлами". Вузли гарантують, що всі, хто взаємодіє з блокчейном, мають одні й ті самі дані. Щоб досягти цієї розподіленої угоди, блокчейну потрібен механізм консенсусу.
Зараз Bitcoin використовує консенсус-механізм доказу роботи. Це означає, що будь-хто, хто хоче додати нові блоки даних у ланцюжок, повинен вирішити складну головоломку, для чого потрібно багато обчислювальної потужності. Розв'язання головоломки підтверджує, що ви витратили обчислювальні ресурси. Цей процес називається майнінгом. Майнінг зазвичай здійснюється методом перебору і помилок, але успішне додавання блоку винагороджується в BTC.
Нові блоки транслюються на ноди, перевіряються і підтверджуються, таким чином оновлюючи стан блокчейн мережі для всіх.
У підсумку, коли ви відправляєте кому-небудь BTC, транзакція повинна бути проведена і включена в новий блок. Потім оновлений стан передається всій мережі.
Також важливо знати що SHA-256 (Secure Hash Algorithm 256-bit) є однією з криптографічних хеш-функцій, яка приймає на вхід послідовність даних будь-якої довжини і генерує хеш-значення фіксованої довжини 256 біт (32 байти). Вона була розроблена Національним інститутом стандартів і технологій США (NIST) та стала широко використовуваною в різних криптографічних застосуваннях, включаючи криптовалюти.
Для криптовалюти SHA-256 є основною хеш-функцією, використовуваною в біткоїні та інших багатьох криптовалютах. В біткоїні вона використовується для хешування блоків, транзакцій та інших даних, а також для Proof-of-Work (доказ роботи) алгоритму, який вимагає вирішення складної обчислювальної задачі для майнерів.
1.1.2 Передумови створення Біткоїна.
Повністю одноранговий устрій системи електронних грошей
дозволяє здійснювати електронні транзакції між учасниками безпосередньо,
минаючи будь-які фінансові інститути. Частково, це завдання вирішує
використання цифрових підписів, але необхідність довіреної особи для
контролю за подвійною витратою позбавляє цей підхід основних переваг. Ми
пропонуємо децентралізоване вирішення проблеми подвійної витрати з
використанням однорангової (пірингової) мережі. Мережа ставить мітки часу
на транзакції, з'єднуючи їх у ланцюжок доказів виконаної роботи на
основі хешування. Сформовані таким чином записи неможливо
змінити, не виконавши заново всього обсягу обчислень. Найдовша
версія ланцюжка слугує не тільки підтвердженням черговості подій, а й
доводить, що над нею виконав роботу найбільший обчислювальний
сегмент мережі. Доти, доки більша частина обчислювальних потужностей
контролюється вузлами, не об'єднаними з метою атакувати мережу, вони будуть
генеруватимуть найдовший ланцюжок, випереджаючи будь-яких зловмисників.
Пристрій самої мережі дуже простий: повідомлення розсилаються на основі
принципу "найменших витрат", а вузли можуть залишати мережу і знову
підключатися до неї в будь-який момент, приймаючи найдовшу версію
ланцюжка для відновлення пропущеної історії транзакцій.
Інтернет-комерція в більшості випадків спирається на фінансові установи,
які виступають у ролі довірених посередників для проведення електронних платежів.
Така схема добре працює для більшості транзакцій, але в її основі лежить довіра,
що тягне за собою певні проблеми. Необхідне посередництво фінансових інститутів
перешкоджає здійсненню незворотних транзакцій. Ціна цих послуг збільшує
вартість транзакцій і встановлює мінімальну їхню ціну, роблячи непрактичним
проведення нечастих і невеликих транзакцій. Крім того, відсутність незворотних
транзакцій збільшує і вартість сервісів, чиї послуги є нескасованими.
Оскільки платіж можна анулювати, продавець змушений бути насторожі, вимагаючи від
покупця більше інформації, ніж у принципі необхідно. І певний відсоток
шахрайства приймається просто як неминучість. Ці націнки і невизначеності з
платежами можуть бути подолані в разі оборудок з паперовою готівкою, однак
механізму для проведення прямих електронних транзакцій не існує.
Необхідна платіжна система, заснована на криптографії, а не на довірі,
яка дозволила б будь-яким двом учасникам здійснити переказ коштів безпосередньо,
без участі посередника. Обчислювальна дорожнеча скасування транзакцій захистила б продавців від шахрайства, а легкоздійсненні механізми ескроу захистили б покупців. У цій роботі ми пропонуємо вирішення проблеми подвійної витрати, засноване на розподіленому одноранговому сервері міток часу, який своєю
обчислювальною потужністю підтверджує хронологічний порядок транзакцій. Система перебуває в безпеці, поки під сукупним контролем її чесних учасників
перебуває більше обчислювальної потужності, ніж під контролем групи зловмисників, що діють спільно зловмисників.
1.1.2 Опис транзакцій
Визначимо електронну монету як послідовність цифрових підписів. Черговий
власник відправляє монету наступному, підписуючи хеш попередньої транзакції та
публічний ключ майбутнього власника і приєднуючи цю інформацію до монети.
Одержувач може перевірити кожен підпис, щоб підтвердити коректність усього ланцюга.
Проблема, зрозуміло, в тому, що одержувач не може визначити, скільки разів колишній
власник витратив цю монету. Традиційне рішення полягає в перевірці
центральною довіреною особою ("монетним двором" або емітентом) кожної транзакції.
Після будь-якого платежу монета повертається до емітента, який випускає нову її
версію; і тільки безпосередньо отриманим таким чином монетам можна довіряти.
Недолік цього підходу в тому, що від компанії-емітента залежить доля всієї грошової
системи, оскільки вона подібно до банку контролює кожну транзакцію, що проходить через неї
транзакцію, що проходить через неї.
Адресат має знати, що ніхто з попередніх власників не підписав транзакцію,
яка передує за часом тій, що перебуває в ланцюжку відправленої йому монети. Для
наших цілей лише перша транзакція з кількох є істинною, тому ми не
повинні турбуватися про пізні спроби подвійної витрати. У централізованій моделі
емітент знав про всі транзакції і вирішував, у якому порядку вони йдуть. Щоб позбавити
схему від посередника, учасникам необхідно відкрито публікувати транзакції [1], а також
вміти приходити до згоди щодо єдиного порядку їх проходження. Одержувачу потрібен доказ того, що для кожної транзакції з ланцюжка більшість
користувачів згодні вважати її першою.
1.3 Сервер міток часу
Почнемо опис нашого рішення із сервера міток часу. Його робота полягає в
хешуванні блоку даних, на який потрібно поставити мітку, і відкритій публікації
цього хешу, як у газеті або Usenet-постах [2-5]. Мітка часу показує, що в даний
момент конкретні дані існували і тому потрапили в хеш блоку. Кожен хеш
включає в себе попередню мітку: так вибудовується ланцюг, де чергова ланка
зміцнює всі попередні.
1.1.4 Доказ роботи
Щоб реалізувати розподілений одноранговий сервер міток часу, ми використовуємо
схему "доказу роботи", подібну до системи Hashcash Адама Бека [6]. Суть
полягає в пошуку такого значення, чий хеш (наприклад, SHA-256) починався б із
деякого числа нульових бітів. Потрібно виконати обсяг роботи, що експоненціально
залежний від числа нулів, але для перевірки знайденого значення достатньо обчислити
лише один хеш.
У нашому сервері міток часу пошук значення з потрібним хешем відбувається шляхом
перебору значення ітерованого поля-добавки (nonce) в блоці даних. Щойно блок,
що задовольняє умові, знайдено, його вміст не можна змінити, не виконавши заново
всієї роботи. І якщо він не є останнім у ланцюжку, ця робота охоплює і
переобчислення всіх блоків, що йдуть за ним.
Доказ роботи через хешування також вирішує питання про визначення версії,
підтримуваної більшістю. Якщо голосом вважається одна IP-адреса, то таку схему
можна скомпроментувати, якщо контролювати великий діапазон адрес. Наша схема
заснована на принципі "один процесор - один голос". Найдовший із хеш-ланцюжків
висловлює думку більшості, яка вклала в нього найбільшу кількість ресурсів.
Якщо більше половини обчислювальної потужності належить чесним вузлам, то ланцюжок
чесних транзакцій зростатиме швидше і випередить будь-який конкуруючий ланцюг. Щоб
внести зміни в будь-який з минулих блоків, атакуючому доведеться виконати заново
роботу над цим блоком і всіма наступними, а потім наздогнати і перегнати чесних
учасників за новими блоками. Нижче ми покажемо, що ймовірність такого успіху у
зловмисника, що володіє меншими ресурсами, експоненціально зменшується залежно від
залежно від числа блоків.
Для компенсації зростаючої обчислювальної потужності процесорів і коливання числа
працюючих вузлів у мережі, складність хешування повинна змінюватися, щоб
забезпечувати рівномірну швидкість генерації блоків. Якщо вони з'являються занадто
часто - складність зростає, і навпаки
1.1.5 Мережа
Система працює за такими правилами:
1) Нові транзакції розсилаються всім вузлам.
2) Кожен вузол об'єднує транзакції, що надійшли, у блок.
3) Кожен вузол намагається підібрати хеш блоку, що задовольняє поточну складність.
4) Щойно такий хеш знайдено, цей блок відправляється в мережу.
5) Вузли приймають блок, тільки якщо всі транзакції в ньому коректні й не використовують
уже витрачені кошти.
6) Свою згоду з новими даними вузли висловлюють, починаючи роботу над наступним
блоком і використовуючи хеш попереднього як нові вихідні дані.
Учасники завжди вважають істинною найдовшу версію ланцюжка і працюють над
її подовженням. Якщо два вузли одночасно опублікують різні версії чергового блоку,
то хтось із решти пірів отримає раніше одну версію, а хтось - іншу. У такому
випадку кожен почне працювати над своєю версією ланцюжка, зберігши іншу на випадок,
якщо вона виявиться продовжена раніше. Двоїстість зникне, щойно буде отримано
новий блок, який продовжить будь-яку з гілок, і ті вузли, що працювали над
конкуруючою версією, переключаться на неї.
Нові транзакції не обов'язково мають досягати всіх вузлів. Якщо про них знатиме
досить багато вузлів, незабаром вони потраплять в один із блоків. Правила розсилки блоків
теж не є суворими щодо втрачених повідомлень. Як тільки вузол,
що пропустив один із блоків, отримає вже наступний за ним, він запросить інформацію, якої бракує
інформацію, щоб заповнити очевидний пропуск.
1.1.6 Стимули працездатності мережі
За замовчуванням, перша транзакція в блоці є спеціальною, що створює нову
монету, яка належить творцеві блоку. Така схема заохочує чесних учасників
мережі, стимулюючи їх підтримувати роботу мережі, а також вирішує питання про початковий
розподіл грошової маси за відсутності центрального емітента. Рівномірне
збільшення кількості монет в обігу можна порівняти з видобутком золота, в який
золотошукачі теж вкладають свої ресурси. У ролі останніх у нашому випадку
виступають процесорний час і електрика.
Іншим способом стимулювання може бути комісія за транзакції. Якщо вхідна
сума платежу більша за вихідну, то різниця є комісією за переказ і
додається до базового значення нагороди за знайдений блок у першій транзакції. Як тільки
тільки сумарний обсяг грошової маси досягне заздалегідь встановленого максимуму,
єдиним джерелом заохочення роботи над блоками залишаться комісії, при цьому
позбавлені інфляції.
Така форма стимулювання може також сприяти зменшенню випадків
шахрайства. Якщо жадібний зловмисник здатен виділити більше
обчислювальних потужностей, ніж усі чесні учасники, він може обманювати продавців,
анулюючи свої транзакції і повертаючи кошти, або ж спрямувати свої ресурси на
генерацію нових блоків і монет. Більш вигідним для нього є варіант "гри за
правилами", який забезпечує отримання більше половини всіх нових грошей, ніж варіант "саботажу системи" і підтримання свого капіталу на постійному рівні.
1.5
1.1.7 Оптимізація використання дискового простору
Як тільки остання транзакція в монеті-ланцюжку опиниться всередині досить старого
блоку, всі попередні їй транзакції в ланцюжку можуть бути видалені з метою очищення
дискового простору. Щоб хеш блоку залишився незмінним, усі транзакції в блоці
зберігаються у вигляді хеш-дерева Меркла [7][2][5] і лише його корінь включають у хеш блоку.
Розмір старих блоків може бути зменшено за рахунок видалення непотрібних гілок цього
дерева, зберігати проміжні хеші необов'язково.
Заголовок порожнього блоку становитиме близько 80 байт. З розрахунку швидкості генерації
блоку раз на десять хвилин отримуємо 80*6*24*365=4.2 Мб на рік. Для середньостатистичного
на 2008 рік комп'ютера з 2 Гб оперативної пам'яті з урахуванням закону Мура,
що пророкує зростання на 1.2 Гб на рік, зберігання даних не буде проблемою, навіть якщо усі заголовки блоків перебуватимуть у пам'яті.
1.1.8 Спрощений механізм перевірки платежів
Верифікація транзакцій можлива без запуску повнофункціонального вузла.
Користувачеві необхідно лише зберігати заголовки блоків найдовшого ланцюжка,
який він отримав від інших вузлів, і запитувати хеш-піддерево для необхідної
транзакції. Він не може перевірити коректність транзакції самостійно, але отримавши
посилання на блок, у якому вона перебуває, він може переконатися в тому, що цей блок і всі
наступні прийняті та підтверджені мережею.
На такий метод перевірки можна покладатися, поки мережа хоча б наполовину перебуває
під контролем чесних учасників, тобто поки зловмисник не заволодіє великими
ресурсами. Звичайні вузли можуть перевіряти транзакції самостійно, але якщо
нападник генерує найдовший ланцюг блоків, то своїми сфабрикованими
транзакціями він може скомпроментувати спрощену схему. Однією зі стратегій
протидії цьому може бути розсилка сигналів тривоги від звичайних пірів, які
отримують "помилковий" блок. Такий сигнал змушуватиме програму-клієнт завантажувати
блок повністю, щоб самостійно підтверджувати некоректність даних. Компанії,
часто приймають платежі, можливо, будуть підключатися до мережі у звичайному режимі для
більшої незалежності, безпеки та швидкості перевірки.
1.1.9 Об'єднання та розподіл сум
Незважаючи на те, що можна оперувати окремими монетами, створювати спеціальну
транзакцію для кожного цента було б занадто незручно. Для підтримки поділюваних і
об'єднуваних сум транзакції містять кілька входів і виходів. Звичайна
транзакція матиме такий вигляд: або один вхід від попереднього великого платежу, або
кілька входів, що акумулюють невеликі суми, і не більше двох виходів: один
є власне платежем, а інший, якщо необхідно, повертає "решту" назад
відправнику.
Необхідно зазначити, що збільшення зв'язків, коли транзакція залежить від кількох,
а ті своєю чергою залежать від ще більшої кількості, не є проблемою, оскільки немає
необхідності отримувати повну і незалежну копію історії транзакції.
1.1.10 Забезпечення конфіденційності
Традиційна банківська модель підтримує необхідний рівень
конфіденційності, надаючи доступ до інформації лише сторонам-учасницям і
довіреній третій особі. Необхідність відкритої публікації транзакцій виключає
такий підхід, однак приватність, як і раніше, можна зберегти, якщо публічні ключі
будуть анонімними. Відкритою буде інформація про те, що хтось відправив комусь
деяку суму, але без прив'язки до конкретних особистостей. Стільки ж даних
розкривається і на фондових біржах, які публікують час і обсяг приватних угод,
не вказуючи, між ким саме їх було здійснено.
Додатковим захистом буде генерація нової пари "відкритий/закритий
ключ" для кожної транзакції: це запобігатиме зв'язуванню різних платежів з їхнім
загальним відправником або адресатом. Деякого публічного зв'язування все ж не уникнути
уникнути: транзакції з кількома входами доводять, що ці суми належать
одній особі. Ризик полягає в тому, що розкриття особи власника ключа може
призвести до розкриття і всіх належних йому транзакцій.
1.1.11 Оцінка ризиків
Розглянемо сценарій, у якому зловмисник намагається генерувати довший
ланцюг блоків, ніж чесні учасники. Навіть якщо він досягне успіху, це не призведе до того, що
можна буде створювати гроші з повітря, привласнювати собі чужі монети або вносити
інші довільні зміни. Вузли ніколи не приймуть некоректну транзакцію або
блок, що її містить. Атакуючий може лише намагатися змінити одну зі своїх
транзакцій, щоб повернути собі гроші.
Перегони між чесними учасниками і нападником можна уявити як
біноміальне випадкове блукання. Успішна подія, коли "хороший" ланцюг подовжується
на один блок, призводить до збільшення відриву на одиницю, а неуспішна, коли черговий
блок створює зловмисник, - до його скорочення. Імовірність атакуючого надолужити
різницю в кілька блоків така сама, як і в задачі про "розорення гравця". Уявімо, що
гравець має необмежений кредит, починає з деяким дефіцитом і в нього є
нескінченно багато спроб, щоб відігратися.
Імовірність того, що він досягне успіху, як і ймовірність зловмисника наздогнати чесних
учасників, обчислюється таким чином [8]:
p = імовірність появи блоку в чесному ланцюжку
q = імовірність того, що блок створить атакувальник
qz = імовірність того, що атакувальник надолужить різницю в z блоків
У разі p > q ймовірність зменшується експоненціально зі зростанням числа блоків, на яке відстає зловмисник. Оскільки всі ставки проти нього, без вдалого ривка на початку його шанси на успіх стають мізерно малими.
Розглянемо тепер, як довго одержувачу платежу варто чекати, перш ніж він буде повністю впевнений, що колишній власник не зможе скасувати транзакцію. Ми
припускаємо, що зловмисник-відправник дозволяє адресату деякий час вірити, що платіж було проведено, після чого повертає гроші собі. Одержувач дізнається
про це, але шахрай сподівається, що буде вже занадто пізно.
Адресат створює нову пару ключів і повідомляє свій публічний ключ відправнику
просто перед підписанням транзакції. Це не дозволить відправнику заздалегідь почати
працювати над ланцюжком і провести транзакцію в той момент, коли він буде достатньо
щасливий, щоб зробити ривок уперед. Після відправлення платежу шахрай починає
потай працювати над паралельною версією ланцюжка, що містить альтернативну
транзакцію.
Одержувач чекає, поки транзакцію не буде додано в блок і поки той не буде
продовжено ще z блоками. Йому невідомий прогрес зловмисника, але якщо середня
швидкість генерації чесних блоків - відома величина, то число блоків нападника
підпорядковується розподілу Пуассона з математичним очікуванням:
З результатів досліджень, видно, що ймовірність падає експонційно зі зростанням z.