BitCoin що це таке?

Bitcoin. Как это работает

Про Bitcoin я дізнався відносно недавно, але він мене відразу підкупив своєю ідеєю p2p. Чим глибше я заривався в їх Wiki, тим більше переймався цією ідеєю. Її реалізація красива і елегантна з технічної точки зору.

Пошук по Bitcoin видає купу топіків. За коментарями помітно, що у багатьох людей, особливо незнайомих з Bitcoin безпосередньо, виникає багато питань щодо принципів його роботи. Також багато здогадок, часто невірних. Щоб якось прояснити ситуацію, було вирішено написати цю статтю.

Справжні гроші?

Перше місце в списку головних помилок щодо Bitcoin займає ідея про те, що Bitcoin це чергові «папірці», нехай і електронні, які лише представляють «справжні» гроші, є такими собі борговими розписками. Звідси бере початок більшість інших помилок: раз це папірці, то вони нічого не варті; їх можна надрукувати або знищити скільки завгодно; їх можна підробити; їх можна скопіювати

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

складність видобутку

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

Припустимо людина весь день старанно здобував золото і добув в результаті 1 кг. Для нього вартість видобутого золота дорівнює одному дню старанної роботи. Після важкого робочого дня він вирішив відпочити і сходити в кінотеатр. За щасливим збігом касир віддавав квитки в обмін на золото. Чому? Тому що касирові подобається золото, але не подобається весь день працювати з киркою. Тому він готовий надати послугу - віддати квиток - в обмін на 1 кг золота. Фактично ж він обмінює свою послугу на один день важкої роботи.

Тепер уявімо іншу ситуацію. Винайшли копір, який працює з золотом. І будь-яка людина може за хвилину з одного 1 кг золота зробити 10 кг. У даній ситуації касир вже не буде обмінювати квитки на золото, так як тепер він сам легко зможе його надрукувати стільки, скільки захочеться. Золото перестане мати якусь цінність і його вже не можна буде використовувати в якості грошей.

У Bitcoin процес видобутку монеток теж вимагає ресурсів і часу. Але в даному випадку це не людські ресурси, а комп'ютерні.

Умовно обмежений ресурс

Чим довше видобувається золото, тим важче (затратним по ресурсам) стає його добувати. Це гарантує, що інфляція буде під контролем.

У Bitcoin схожу поведінку досягається шляхом введення функції швидкості сумарно видобутих монеток від часу. Ця функція обернено пропорційна, т. Е. Швидкість з часом падає і наближається до нуля. Якщо взяти інтеграл цієї функції за часом, то вийде експонента. Приблизно така:

Bitcoin. Как это работает

Тут видно, що загальне число монеток прагне до 21 000 000. Подробиці роботи Bitcoin будуть розглянуті далі. А поки потрібно знати дві речі: монетки з'являються в системі пачками приблизно кожні 10 хвилин, кількість монеток в одній пачці - 50, і воно зменшується вдвічі кожні 4 роки.

матеріальність

Це вже властивість не стільки золота, скільки будь-який не електронної валюти. Один злиток золота можна двічі обміняти на послугу або товар. Т. е. В один момент часу він може бути або у продавця, або у покупця.

Така поведінка звичайно для матеріальної валюти, але не для електронної. Щоб домогтися такого поведінки віртуальних грошей, потрібно докласти чимало кмітливості. У Bitcoin це поведінка забезпечене механізмом транзакцій. Усі транзакції об'єднуються в ланцюжки. Кожна транзакція бере монетки з однієї або декількох існуючих транзакцій і вказує, кому вони призначаються. Тому завжди можна перевірити весь ланцюжок на валідність.

Складність видобутку, обмежений ресурс, матеріальність - ці властивості, плюс використання криптографії для забезпечення безпеки, дозволяють використовувати Bitcoin в якості грошей. На них засновано ядро ​​Bitcoin. Це не просто домовленості. Всі вони закладені в системі by design, і по-іншому вона працювати не буде. Настав час розглянути цей самий дизайн.

ланцюжок блоків

Будь-яка електронна платіжна система повинна десь і якось зберігати транзакції. У Bitcoin вся інформація зберігається в ланцюжку блоків. Блоки передаються в форматі JSON. Кожен блок містить заголовок і список транзакцій. Тема складається з декількох властивостей, серед яких є хеш попереднього блоку. Таким чином весь ланцюжок блоків зберігає всі транзакції за весь час роботи Bitcoin.

У поточних версіях програми Bitcoin ланцюжок блоків скачується цілком кожним клієнтом, що робить систему повністю децентралізованою. Дані ніяк не шифруються і будь-хто може вручну простежити всі транзакції. Існує навіть спеціальний сайт - Bitcoin Block Explorer, на якому можна легко подивитися всю інформацію про блоках і транзакціях.

На момент написання статті кількість блоків в ланцюжку дорівнювало 110 968, і, як я вже говорив раніше, це кількість приблизно через кожні 10 хвилин збільшується на 1. Це означає, що хтось із учасників зміг створити новий блок.

Працює це таким чином. Один з клієнтів створює нову транзакцію і розсилає її іншим клієнтам, які зайняті генерацією блоку. Вони додають цю транзакцію до свого блоку і продовжують генерацію. Рано чи пізно у кого-то вийде згенерувати блок. Такий блок запечатується (до нього більше не додаються транзакції) і розсилається по мережі. Далі клієнти перевіряють блок і транзакції усередині нього на валідність. Якщо ніяких проблем немає, то транзакції вважаються схваленими. До цього моменту свіжий блок вже доїхав до кожного клієнта і доданий в ланцюжок. Після цього процес повторюється - клієнти починають генерувати черговий блок і збирати в нього нові транзакції.

блок

Розглянемо зміст блоку і процес його створення більш докладно. Приклад блоку можна знайти на все тому ж Bitcoin Block Explorer . Блок складається з заголовка і списку транцакцій. Тема складається з наступних властивостей:

  • hash - SHA-256 хеш заголовка блоку. Такий хеш є досить випадковим, а час його обчислення передбачувано. Хочу зауважити, що хешіруется тільки заголовок, без транзакцій. Так що число транзакцій не буде сильно впливати на час обчислення хеша.
  • ver - Версія схеми блоку. На даний момент у всіх блоків одна версія - 1.
  • prev_block - Хеш попереднього блоку в ланцюжку. Завдяки цій властивості ланцюжок можна підробити, замінивши в ній один з блоків, так як хеш блоку завжди залежить від хеша попереднього блоку в ланцюжку. Змінивши один з блоків, доведеться пересоздавать всі наступні.
  • mrkl_root - Merkle root - список хеш транзакцій. Хеш блоку повинен обов'язково залежати від транзакцій, щоб їх не можна було підробити. Але обчислювати його безпосередньо буде довго, якщо кількість транзакцій велике. Тому спочатку хешіруются самі транзакції, а потім їх хеші використовуються для обчислення хеша всього блоку.

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

  • time - uint32_t представляє час створення блоку. Максимально допустимий рік - 2106.
  • bits - Одне з найважливіших властивостей. Є скороченою формою цільового значення хеша. Блок вважається згенерував (дійсним), коли його хеш менше цього цільового значення. Цільове значення визначає складність створення блоку. Чим воно менше, тим менше ймовірність підібрати відповідний хеш за одну ітерацію. Це властивість оновлюється кожні два тижні.

Відбувається це таким чином. Підраховується число згенерованих блоків за останні два тижні і порівнюється з еталоном (1 блок кожні 10 хвилин). Якщо блоків занадто багато, то складність збільшується. Якщо блоків занадто мало - зменшується. Таким чином система адаптується до збільшення числа користувачів і, як наслідок, сумарної потужності їхніх комп'ютерів.

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

Наприклад, версія ніколи не змінюється. Хеш попереднього блоку оновлюється тоді, коли хто-небудь нас випередить і згенерує новий блок. Merkle root оновлюється при додаванні транзакції. Час - кожні кілька секунд. Bits (цільове значення, складність) - кожні два тижні. Все це дуже довго. Щоб не чекати, поки оновиться одна з властивостей і існує nonce.

Розглянемо гіпотетичну ситуацію. Всі значення nonce були перевірені і жодне з них не підходить. За цей час жодне інше властивість не змінилося. Відбувається переповнення nonce і воно знову починається з нуля. Виходить, що далі хеші будуть повторюватися. Щоб уникнути подібних ситуацій, після переповнення nonce, змінюється спеціальне властивість однієї з транзакцій. Після цього оновлюється Merkle root і хеші заголовка блоку вже не будуть повторюватися.

  • n_tx - Кількість транзакцій в списку.
  • size - Розмір блоку в байтах.

транзакції

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

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

На практиці все це реалізовано за допомогою наступних властивостей:

  • hash - Хеш всієї транзакції. Виходить, що транзакції хешіруются двічі. Перший раз під час обчислення хеша транзакції. Другий раз під час обчислення хеша блоку. Крім того кожен блок посилається на хеш попереднього блоку, а кожна транзакція - на хеш попередньої транзакції (або транзакцій). Якщо змінити транзакцію і якимось дивом її хеш не поламати, то поламаються всі інші хеші і змінена ланцюжок блоків буде відкинута усіма клієнтами.
  • ver - Версія схеми транзакції. Поки вона жодного разу не змінювалася, так що всюди дорівнює 1.
  • vin_sz - Кількість попередніх транзакцій, з яких гроші переводяться на нові адреси. Одна або більше.
  • vout_sz - Кількість адрес, на які переводяться гроші. Один або більше.
  • lock_time - Поки не використовується і всюди дорівнює 0. Ідея в тому, щоб створювати відкладені транзакції, щоб вони додавалися не в поточний генерується блок, а, наприклад, в слещующій. Мається на увазі, що в цій властивості вказано кількість блоків, які повинна пропустити транзакція перед додаванням. Це дає можливість протягом деякого часу змінити транзакцію і переподпісать її.
  • size - Розмір транзакції в байтах. Мається на увазі розмір транзакції в форматі JSON.
  • in - Містить список входів (джерел) транзакції. Як входів використовуються виходи попередніх транзакцій (prev_out). У кожного виходу є такі властивості:
    • hash - Хеш попередньої транзакції.
    • n - Так як у транзакції може бути кілька виходів, то потрібно вказувати, з якого з них беруться гроші. Для цього і існує ця властивість. У ньому міститься порядковий номер виходу попередньої транзакції, починаючи з 0.
    • scriptSig - В цій властивості відправник повинен довести, що він перекладає саме свої гроші, а не чужі. Для цього він указавает публічний ключ одержувача попередньої транзакції, т. Е. Свій ключ, так як він повинен бути одержувачем. Крім того він додає ECDSA підпис цієї ж транзакції, яка зроблена його приватним ключем. Це доводить, що він розпоряджається своїми грошима, а не чужими.

Після списку входів транзакції (in) вказується список виходів (out), т. Е. Адресатів. Кожен вихід має такі властивості:

  • value - Містить кількість грошей, які будуть переведені на нову адресу. Вони беруться з попередніх транзакцій. Тому дане число не повинно перевищувати їх суму. Наприклад, ми хочемо взяти 10 монеток з однієї транзакції і 20 з іншої і направити 25 за новою адресою. Щоб оставш 5 монеток не пропали, ми посилаємо їх самим собі, як здачу. Таким чином в нашій транзакції буде два адресата, одним з яких є ми самі. Value завжди вказується в наномонетах, щоб уникнути дрібних чисел.
  • scriptPubKey - Це властивість, разом з scriptSig складають сценарій на модифікованому

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

На мій смак, емісія грошей реалізовано просто і елегантно. У кожному блоці перша транзакція в списку є особливою транзакцією. У неї завжди один вхід, у якого замість властивості scriptSig є властивість coinbase. Це властивість може містити що завгодно.

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

висновок

Proof of work (доказ роботи) - результат роботи, якого важко добитися, але легко перевірити. Робота мережі Bitcoin заснована на цьому принципі. Перевірити хеш (результат роботи) можна за частки секунди. А для того, щоб його підібрати, потрібно багато роботи.

Тут можна згадати аналогію з золотом, на видобуток якого йде багато часу і ресурсів. Але зрозуміти, що перед тобою золото, можна практично відразу. У цьому сенсі Bitcoin також має свою цінність. Але не треба розуміти це як ціну в доларах або в рахунках за електрику, яке використовував комп'ютер під час підбору хеша.

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

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

Як тільки Bitcoin потрапив на ринок, його цінність визначається виключно рівнем довіри до системи. Чим більше людина довірятимуть, тим більше куплять Bitcoin, тим більше доларів в нього вкладуть і, як наслідок, тим дорожче буде Bitcoin.

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

Сподіваюся, що після цієї статті з Хабархабар рівень довіри до Bitcoin хоча б трохи виросте.