184 мільярди біткоїнів: одна цікава історія

184 мільярди біткоїнів: одна цікава історія

Переклав CryptoGhost для "Що Біткоїться"

Це історія про 184 мільярдів біткоїнів: як вони були створені, чому це стало можливим і куди вони ділися. Спершу ми надамо контекст для розуміння, але можете сміливо скролити до підтеми "Біткоїн та цілі числа".

Змінна величина

В комп'ютерному програмуванні існує поняття змінних. Змінна виглядає як "коробка", в яку можна зберегти певне значення.

Є спеціальні коробки, в яких зберігаються літери, числа або десяткові числа. Наприклад:

var a = 5

a — це ціле число, так само як x у математичних рівняннях зі школи.

Цікавий факт: змінні, які зберігають букви, цифри та інші символи у вигляді тексту, називаються "рядками" або "текстом"; ті, що зберігають десяткові числа, називаються "рухомими" (з рухомою комою); а ті, що зберігають правильне значення (вірне чи хибне) називаються "булевими" на честь Джорджа Була . Є багато різних типів і вони залежать від мови програмування, що використовується.

Максимальне значення цілого числа на комп'ютері обмежується обсягом його пам'яті. Наприклад, у 64-розрядних комп'ютерах (більшість сучасних комп'ютерів) максимальне ціле число становить 9,223,372,036,854,775,807, а мінімальне -9,223,372,036,854,775,808. Так, це дев'ять мільйонів трильйонів в обох напрямках: додатні та від'ємні.


Комп'ютери можуть зберігати інформацію лише у бінарному форматі: в одиницях та нулях. Наприклад, 0101 - це 4-бітне число, яке перетворюється в десятковому вигляді так: 0*8 + 1*4 + 0*2 + 1*1 = 5. Ми множимо кожну цифру починаючи з правої на 2^x де x  — це позиція біта, що починається з 0, і подвоює значення кожного наступного числа: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1028...

Приклад:

01000101001001 =
= 0*2^13 + 1*2^12 + 0*2^11 + 0*2^10 + 0*2^9 + 1*2^8 + 0*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0
= 0*8192 + 1*4096 + 0*2048 + 0*1024 + 0*512 + 1*256 + 0*128 + 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 0*2 + 1*1
= 4096 + 256 + 64 + 8 + 1
= 4425

З 64-бітними числами ми маємо 64 біти:

0000000000000000000000000000000000000000000000000000000000000000

Кожен з цих нулів може бути одиницею, і та ж сама формула, що й вище, застосовується для перетворення числа в десяткову одиницю. Крайній лівий біт там для "знака": +/-. Це вказує на додатне чи від'ємне число.


Якщо ми беремо до уваги, що баланс Біткоїн-адреси не може бути від'ємним (ви можете або мати або не мати біткоїн), ми можемо використовувати непідписане ціле число — крайній лівий біт, що не використовується для додаткового значення замість знака +/-.

Це подвоює максимальне ціле число до 18 446 744 073 709 551 615 (вісімнадцять мільйонів трильйонів). Спроба збереження числа більшого навіть на 1 (одиницю) призведе до переповнення цілого числа. Уявіть собі спідометр автомобіля:


Спідометр

Коли він досягне 999 999, то через кілометр не покаже 1 000 000, тому що для цієї цифри просто немає місця. Спідометр повернеться до 000000. Те саме відбувається з числами на комп'ютерах: коли вони перевищують максимальне ціле значення, вони переповнюються і скидаються до 0 (нуля).

Біткоїн та цілі числа

Наразі біткоїн має 8 десяткових знаків. Найменший фрагмент біткоїна називається "сатоші". Слово "bitcoin" насправді існує лише "pro forma": коли у вас 1 BTC, то ви володієте сумою його найдрібніших частинок 100 мільйонів сатоші. Та через розповсюджені картинки та неправильні означення дехто вважає біткоїн саме "неподільною", а часом і зовсім фізичною "монетою".

(Ох і ці коїни... Одна морока з ними.)

Теоретично максимальна кількість біткоїнів становить 21 мільйон. Тобто 2 100 000 000 000 000 (два квадрильйони 100 трильйонів) сатоші. Якщо ми виключимо останні 8 цифр із максимального цілого числа, яке можна зберегти на комп'ютері (18 446 744 073 709 551 615) щоб відповідати протоколу Bitcoin, ми отримаємо: 184 467 440 737.09551615.


Просто файна картинка із числами


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

Але в чому прикол усіх цих заплутаних абстрактних цифр?

184 мільярди біткоїнів

Коли відправляємо біткоїни, ми повідомляємо програмному забезпеченню "відправити стільки-то BTC з цієї адреси на цю адресу ". Але в 2010 році програма мала критичну помилку.

При відправленні BTC з одних адрес на інші адреси (у мережі Біткоїн можна відправити токени з декількох адрес на кілька інших адрес одночасно), програмне забезпечення перевіряло загальні вхідні значення та загальні вихідні значення, але не те, що відбувалося між ними.

Під час однієї такої транзакції злочинці задали програмі наступні інструкції (далі спрощено для легшого розуміння):

  • з моєї адреси, яка має 50.51 BTC
  • надіслати 92233720368.54277039 на адресу A
  • надіслати 92233720368.54277039 на адресу B
  • надіслати 50.51 BTC на адресу C

Сума операцій A та B становила 184,467,440,737.08554000. Це рівно 997615 сатоші від їх максимальної кількості. Інші суми у транзакції разом з цим числом призвели до переповнення цілих чисел, а загальна сума зменшилася до всього 50,51 BTC, які мали бути відправлені.


Додавання: не любимо математику зі школи :(


Програмне забезпечення розглянуло лише вхідні та вихідні дані:

  • У мене є вхідні 50.51 біткоїна
  • У мене є вихідні 50.51 біткоїна
  • Результат менший або рівний вводу даних, звідси транзакція дійсна

(спочатку плата за операції була необов'язковою та тривіальною)

В результаті адреса А та адреса В обидві отримали по 184 мільярди дійсних біткоїнів, хоча в той час їх було всього близько 1,5 мільйона.

Рішення

Сатоші, Теймос, Джефф Гарзік та інші, хто помітив цю дивну транзакцію, швидко оголосили про необхідність рішення. Протягом кількох годин було написано патч для коду, який вирішує цю проблему для майбутніх транзакцій, разом із пропозицією відмовитися і скасувати проблемну транзакцію. Цей патч був доданий до програмного забезпечення Bitcoin Core вузла, який підписує та надсилає транзакції. Також на форумі розробників було зроблено пропозицію: зупинити усім обробку транзакцій, доки не буде встановлено виправлення, ігнорувати блок, який обробляє цю транзакцію та всі блоки після нього. Сталася "подорож у часі" для Біткоїна і блокчейн відкотили до моменту інциденту.


Подорож у часі


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

Ідеологія

Ви часто чуєте, як максималісти кажуть, що Ethereum централізовано навколо засновника Віталіка Бутеріна або що це не є справжнім блокчейном через 2016 рік. Тоді через хак DAO були вкрадено 3 мільйони ефірів (ETH) 15% всього ефіру на той час. Проблема була вирішена так само: "хард форк", який повернув попередній стан мережі та інвестиції вкладникам.

Цей крок спричинив до форку: так з'явився Ethereum Classic (ETC). Послідовники ETC на законних підставах стверджували, що відкат блокчейну є проти правил і відділилися від більшості (80%).

Чи була боротьба з хакерами такою ціною виправдана? Так чи інакше, лишається філософське питання: якби Біткоїн був настільки ж поширеним, як Ethereum на момент його інциденту, чи стався би Bitcoin Classic? Чи праві максималісти, осуджуючи Ethereum через цю різницю в популярності? І якщо так, то де знаходиться лінія розмежування, коли система вважається занадто популярною, щоб змінити її? Тут є над чим подумати.


Задумаймось...


Я особисто відчуваю, що краще "форкати" саме через такі випадки, ніж для дивідендів та "халявних грошей", як це відбувається майже щотижня в Біткоїні: Bitcoin Gold, Bitcoin Diamond, Bitcoin Segwit2... [Але багато хто любить щось на дурняк, часто лишаючись у дурнях. Та то вже тема для іншої розмови. — прим. редакції].

Висновок

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

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

За матеріалами Bitfalls.

"Що Біткоїться" — це освітньо-медійний ресурс про криптовалюти і блокчейн з гумором. Щодня ми робимо ранкові брифи головних новин.

Report Page