Блокчейн: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
Latreia (обговорення | внесок)
Згідно з перейменуванням, плюс невелике редагування
Рядок 15: Рядок 15:
Далі йдуть всі або деякі з останніх транзакцій, які ще не були записані в попередні блоки. Для транзакцій в блоці використовується [[TTH|деревоподібне хешування]]{{sfn|Satoshi|2008|c=4}}, аналогічне формуванню хеш-суми файлу в [[BitTorrent (протокол)|протоколі ''BitTorrent'']]. Транзакції, крім нарахування комісії за створення блоку, містять всередині атрибута ''input'' посилання на транзакцію, за якою на цей рахунок були отримані біткойни. Комісійні операції можуть містити в атрибуті будь-яку інформацію (для них це поле носить назву {{Lang-en|Coinbase parameter}}), оскільки у них немає батьківських транзакцій.
Далі йдуть всі або деякі з останніх транзакцій, які ще не були записані в попередні блоки. Для транзакцій в блоці використовується [[TTH|деревоподібне хешування]]{{sfn|Satoshi|2008|c=4}}, аналогічне формуванню хеш-суми файлу в [[BitTorrent (протокол)|протоколі ''BitTorrent'']]. Транзакції, крім нарахування комісії за створення блоку, містять всередині атрибута ''input'' посилання на транзакцію, за якою на цей рахунок були отримані біткойни. Комісійні операції можуть містити в атрибуті будь-яку інформацію (для них це поле носить назву {{Lang-en|Coinbase parameter}}), оскільки у них немає батьківських транзакцій.


Створений блок буде прийнятий іншими користувачами, якщо числове значення хешу заголовка дорівнює або нижче певного числа, величина якого періодично коригується. Оскільки результат [[Геш-функція|хешування]] (функції [[SHA-2|SHA-256]]) непередбачуваний, немає [[Алгоритм|алгоритму]] отримання бажаного результату, окрім випадкового перебору. Якщо хеш не задовольняє умову, то довільно змінюється блок службової інформації в заголовку, і хеш перераховується. Зазвичай потрібна велика кількість перерахунків. Коли варіант знайдено, вузол розсилає отриманий блок іншим підключеним вузлам, які перевіряють блок. Якщо помилок немає, то блок вважається доданим в ланцюжок, і наступний блок повинен включити в себе його хеш{{sfn|Satoshi|2008|c=3}}.
Створений блок буде прийнятий іншими користувачами, якщо числове значення хешу заголовка менше або дорівнює певному числу, величина якого періодично коригується. Оскільки результат [[Геш-функція|хешування]] (функції [[SHA-2|SHA-256]]) [[Одностороння функція|необоротний]], немає [[Алгоритм|алгоритму]] отримання бажаного результату, окрім випадкового перебору. Якщо хеш не задовольняє умову, то довільно змінюється блок службової інформації в заголовку, і хеш перераховується. Зазвичай потрібна велика кількість перерахунків. Коли варіант знайдено, вузол розсилає отриманий блок іншим підключеним вузлам, які перевіряють блок. Якщо помилок немає, то блок вважається доданим в ланцюжок, і наступний блок повинен включити в себе його хеш{{sfn|Satoshi|2008|c=3}}.


Величина цільового числа, з яким порівнюється хеш, коригується через кожні 2016 блоків. Заплановано, що вся мережа буде витрачати на генерацію одного блоку приблизно 10 хвилин, на 2016 блоків&nbsp;— близько двох тижнів. Якщо 2016 блоків сформовані швидше, то мета трохи зменшується і досягти її стає важче, в іншому випадку мета збільшується. Зміна складності обчислень не впливає на надійність мережі Біткойн і потрібна лише для того, щоб система генерувала блоки майже з постійною швидкістю, що не залежить від потужності мережі<ref>{{Cite web|url=http://hashingit.com/analysis/30-finding-2016-blocks|title=Finding 2016 Blocks|accessdate=2015-12-21|lang=en}}</ref>.
Величина цільового числа, з яким порівнюється хеш, коригується через кожні 2016 блоків. Заплановано, що вся мережа буде витрачати на генерацію одного блоку приблизно 10 хвилин, на 2016 блоків&nbsp;— близько двох тижнів. Якщо 2016 блоків сформовані швидше, то мета трохи зменшується і досягти її стає важче, в іншому випадку мета збільшується. Зміна складності обчислень не впливає на надійність мережі Біткойн і потрібна лише для того, щоб система генерувала блоки майже з постійною швидкістю, що не залежить від потужності мережі<ref>{{Cite web|url=http://hashingit.com/analysis/30-finding-2016-blocks|title=Finding 2016 Blocks|accessdate=2015-12-21|lang=en}}</ref>.

Версія за 15:04, 12 вересня 2017

Блокчейн, тобто ланцюжок блоків транзакцій (англ. Blockchain, Block chain[1] від block — блок, chain — ланцюг) — розподілена база даних, яка підтримує постійно зростаючий перелік записів, званих блоками, захищена від підробки та переробки.[2] Кожен блок містить часову мітку та посилання на попередній блок хеш дерева.[3]:6[4]

Така розподілена база даних закладена в основу криптовалюти «Біткойн» (вона була описана у 2008 і реалізована в 2009 році), де слугує бухгалтерською книгою для всіх операцій.[2] Таку базу називають Блокчейн.

У квітні 2017 року в ЗМІ з'явилася інформація, що Україна планує перевести державні дані у блокчейн.[5]

Блок транзакцій

Блок транзакцій — спеціальна структура для запису групи транзакцій в системі Біткойн та аналогічних їй[1].

Щоб транзакція вважалася достовірною («підтвердженою»), її формат і підписи повинні перевірити і потім групу транзакцій записати в спеціальну структуру — блок. Інформацію в блоках можна швидко перевірити. Кожен блок завжди містить інформацію про попередній блок. Усі блоки можна вибудувати в один ланцюжок, який містить інформацію про всі вчинені коли-небудь операції з біткойнами. Перший блок в ланцюжку — первинний блок (англ. genesis block) — розглядається як окремий випадок, оскільки в нього відсутній материнський блок[6].

Блок складається із заголовка та списку транзакцій. Заголовок блоку включає в себе свій хеш, хеш попереднього блоку, хеши транзакцій та додаткову службову інформацію. Першою транзакцією в блоці завжди вказується отримання комісії, яка стане нагородою користувачеві за створений блок[1].

Далі йдуть всі або деякі з останніх транзакцій, які ще не були записані в попередні блоки. Для транзакцій в блоці використовується деревоподібне хешування[1], аналогічне формуванню хеш-суми файлу в протоколі BitTorrent. Транзакції, крім нарахування комісії за створення блоку, містять всередині атрибута input посилання на транзакцію, за якою на цей рахунок були отримані біткойни. Комісійні операції можуть містити в атрибуті будь-яку інформацію (для них це поле носить назву англ. Coinbase parameter), оскільки у них немає батьківських транзакцій.

Створений блок буде прийнятий іншими користувачами, якщо числове значення хешу заголовка менше або дорівнює певному числу, величина якого періодично коригується. Оскільки результат хешування (функції SHA-256) необоротний, немає алгоритму отримання бажаного результату, окрім випадкового перебору. Якщо хеш не задовольняє умову, то довільно змінюється блок службової інформації в заголовку, і хеш перераховується. Зазвичай потрібна велика кількість перерахунків. Коли варіант знайдено, вузол розсилає отриманий блок іншим підключеним вузлам, які перевіряють блок. Якщо помилок немає, то блок вважається доданим в ланцюжок, і наступний блок повинен включити в себе його хеш[1].

Величина цільового числа, з яким порівнюється хеш, коригується через кожні 2016 блоків. Заплановано, що вся мережа буде витрачати на генерацію одного блоку приблизно 10 хвилин, на 2016 блоків — близько двох тижнів. Якщо 2016 блоків сформовані швидше, то мета трохи зменшується і досягти її стає важче, в іншому випадку мета збільшується. Зміна складності обчислень не впливає на надійність мережі Біткойн і потрібна лише для того, щоб система генерувала блоки майже з постійною швидкістю, що не залежить від потужності мережі[7].

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

Основна послідовність блоків (чорні) є найдовшою від початкового (зелений) до поточного. Побічні гілки (фіолетові) відсікаються.

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

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

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

Розподілена база даних Blockchain формується як безперервно зростаючий ланцюжок блоків з записами про всі транзакції. Копія бази даних або її частини одночасно зберігаються на безлічі комп'ютерів та синхронізуються відповідно до формальних правил побудови ланцюжка блоків. Інформація в блоках не шифрована і доступна у відкритому вигляді, однак захищена від змін криптографічно через хеш-ланцюжок[1].

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

До версії 0.8.0 для зберігання ланцюжка блоків основний клієнт використовував Berkeley DB, починаючи з версії 0.8.0 розробники перейшли на LevelDB[en][8].

Підтвердження транзакцій

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

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

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

Для зменшення впливу таких ситуацій на мережу існують обмеження на розпорядження щойно отриманими біткойнами. Згідно сервісу blockchain.info до травня 2015 року максимальна довжина відкинутих ланцюжків була 5 блоків[10]. Необхідне число підтверджень для розблокування отриманого залежить від програми-клієнта або від вказівок приймаючої сторони. Клієнт «Bitcoin-qt» для відправлення не потребує наявності підтверджень, однак у більшості одержувачів за замовчуванням виставлено вимогу 6 підтверджень, тобто реально скористатися отриманим зазвичай можна через годину. Різні онлайн-сервіси часто встановлюють свій поріг підтверджень.

Біткойни, отримані за створення блоку, протокол дозволяє використовувати після 100 підтверджень[11], але стандартна програма-клієнт показує комісію через 120 підтверджень, тобто зазвичай скористатися комісією можна приблизно через 20 годин після її нарахування.

«Подвійне витрачання»

Якщо контролювати понад 50 % сумарної обчислювальної потужності мережі, то існує теоретична можливість при будь-якому порозі підтверджень одні і ті ж біткойни передати два рази різним одержувачам[12] — одна з транзакцій буде публічною і буде підтверджуватися в загальному порядку, а друга не буде афішуватися, її підтвердження відбуватиметься блоками прихованої паралельної гілки. Лише через деякий час мережа отримає відомості про другу транзакцію, вона стане підтвердженою, а перша втратить підтвердження і буде ігноруватися. В результаті не відбудеться подвоєння біткойнів[1], але зміниться їхній поточний власник, при цьому перший отримувач втратить біткойни без будь-яких компенсацій.

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

Подвійне витрачання біткойнів на практиці ніколи не було зафіксовано. На травень 2015 року паралельні ланцюжки ніколи не перевищували 5 блоків.[10]

Складність

За вимогу до хешів блоків відповідає спеціальний параметр, званий «складність». Так як обчислювальні потужності мережі непостійні, цей параметр перераховується клієнтами мережі через кожні 2016 блоків таким чином, щоб підтримувати середню швидкість формування розподіленої БД на рівні 2016 блоків в два тижні. Таким чином 1 блок повинен створюватися приблизно раз на десять хвилин. На практиці, коли обчислювальна потужність мережі зростає — відповідні часові проміжки коротше, а коли знижується — довший[13]. Перерахунок складності з прив'язкою до часу можливий завдяки наявності в заголовках блоків часу їх створення. Воно записано в Unix-форматі і взято за системним годинником автора блоку (якщо блок створений у пулі, то за системним годинником сервера цього пулу)[14].

Примітки

  1. а б в г д е ж и Satoshi, 2008.
  2. а б Economist Staff (31 жовтня 2015). Blockchains: The great chain of being sure about things. The Economist. Процитовано 18 June 2016. [Subtitle] The technology behind bitcoin lets people who do not know or trust each other build a dependable ledger. This has implications far beyond the crypto currency.
  3. Blockchain. Investopedia. Процитовано 19 March 2016. Based on the Bitcoin protocol, the blockchain database is shared by all nodes participating in a system.
  4. «Merkle trees are a fundamental part of what makes blockchains tick.», blog.ethereum.org/2015
  5. Украина переведет все государственные данные на блокчейн, 14 квітня 2017
  6. Genesis Block, Block 0 (англ.). Процитовано 21 грудня 2015.
  7. Finding 2016 Blocks (англ.). Процитовано 21 грудня 2015.
  8. Релиз Bitcoin 0.8.0 - OpenSource - Новости. Архів оригіналу за 13 березня 2013. Процитовано 22 лютого 2013.
  9. Bitcoin is under attack (англ.). Процитовано 21 грудня 2015.
  10. а б Число брошенных блоков (англ.). Процитовано 21 грудня 2015.
  11. Bitcoin Developer Examples (англ.). Процитовано 21 грудня 2015.
  12. Статья о вероятности Double Spending атаки (англ.). Архів оригіналу за 21 травня 2013.
  13. Графики изменения сложности сети Bitcoin (англ.). Процитовано 21 грудня 2015.
  14. Bitcoin hash (англ.). Процитовано 21 грудня 2015.

Література

Див. також

Посилання