🌳 Дерево Меркла — гешові дерева та докази
Будуйте дерево Меркла, гешуючи блоки даних попарно до єдиного кореня. Змініть листок — і корінь зміниться; перевірте блок логарифмічним доказом Меркла — основа блокчейнів.
Про цю симуляцію
Ця симуляція будує дерево Меркла прямо у вашому браузері: кожен блок даних стає гешем листка, сусідні геші попарно об'єднуються та гешуються знову рівень за рівнем, і процес повторюється, доки не залишиться єдиний корінь Меркла. Змініть будь-який блок і подивіться, як зміна поширюється вгору шляхом до кореня, або запросіть доказ Меркла, щоб перевірити, що один листок належить під цим коренем, використовуючи лише O(log n) суміжних гешів.
🔬 Що це показує
Полотно малює кожен рівень дерева від листків унизу до єдиного кореня вгорі, з'єднуючи кожну пару дочірніх вузлів з батьківським. Редагування поля блоку даних перераховує геш його листка та підсвічує змінений шлях до кореня червоним, демонструючи, що дерево Меркла стійке до підробки: жоден листок не може змінитися без зміни кореня.
🎮 Як використовувати
Введіть текст у будь-яке поле Блоки даних, щоб змінити вміст цього листка, і подивіться, як оновлюється геш кореня. Перетягніть повзунок Листки (2–16), щоб змінити розмір дерева, потім оберіть Індекс листка та натисніть Перевірити листок, щоб побудувати та підсвітити доказ Меркла: суміжний геш на кожному рівні (бурштиновий) плюс шлях до кореня (фіолетовий), з розміром доказу, показаним на панелі статистики. Очистити підсвітку скидає вигляд.
💡 Чи знали ви?
Bitcoin та Ethereum зберігають корінь Меркла в кожному заголовку блока, тож легкий клієнт може перевірити, що одна транзакція входить до блока з кількох тисяч транзакцій, використовуючи лише близько двадцяти суміжних гешів — розмір доказу майже не зростає, навіть якщо блок містив би мільйон транзакцій, оскільки довжина доказу масштабується як O(log n).
Ще запитання про дерева Меркла
Чому ця симуляція використовує короткий геш FNV-1a замість SHA-256?
Симуляція використовує невелику, швидку функцію змішування у стилі FNV-1a, яка створює 4-символьний шістнадцятковий ідентифікатор замість повного 256-бітного дайджесту SHA-256, лише щоб геші були читабельними на екрані та перераховувалися миттєво під час набору тексту. Алгоритм побудови дерева, властивість стійкості до підробки та логіка доказу O(log n) ідентичні промисловим системам; відрізняється лише базова геш-функція.
Що відбувається з деревом, коли кількість листків не є степенем двійки?
На будь-якому рівні з непарною кількістю вузлів функція buildTree симуляції пов'язує останній вузол із його копією перед гешуванням, це саме те правило дублювання останнього вузла, яке використовується в реальних реалізаціях дерева Меркла, наприклад у Bitcoin. Це зберігає бінарність кожного рівня, тож дерево завжди коректно зводиться до єдиного кореня, незалежно від того, чи є кількість листків (від 2 до 16 у цій демонстрації) степенем двійки.
Чим змінений шлях відрізняється від шляху доказу у візуалізації?
Редагування листка запускає markChangedPath, яка проходить від цього листка вгору до кореня, позначаючи кожного предка червоним, щоб показати, які геші були перераховані. Натискання Перевірити листок натомість запускає buildProof, яка позначає шлях до кореня фіолетовим та позначає суміжний геш, потрібний на кожному рівні, бурштиновим, це мінімальний набір додаткових гешів, потрібних перевіряючому, щоб перерахувати корінь із цього одного листка, не бачачи жодного іншого блока.
Чому доказ Меркла має довжину лише O(log n) гешів?
Кожен рівень дерева зменшує кількість вузлів удвічі, тож дерево з n листків має приблизно log2(n) рівнів. Доказу потрібен рівно один суміжний геш на кожному рівні шляху від листка до кореня, тож його розмір зростає логарифмічно, а не лінійно з кількістю листків, для мільйона листків це приблизно 20 гешів, що дозволяє легкому клієнту перевірити входження, не завантажуючи решту 999 999 блоків.
Чи можуть два різні листки коли-небудь дати однаковий корінь дерева?
У принципі геш-колізія могла б призвести до того, що два різні набори даних дають однаковий корінь, але з криптографічно стійким гешем, таким як SHA-256, це обчислювально нездійсненно, спрощена функція у стилі FNV-1a у цій демонстрації не стійка до колізій і використовується тут лише заради швидкості та читабельності, а не для реальних гарантій цілісності.