Блокчейн — ETH.BUILD
Демонстрація того, як працює майнінг у блокчейні, зокрема як блоки об'єднуються в ланцюг, як доказ виконання роботи (PoW) захищає блокчейни та що відбувається, коли хтось намагається підробити дані.
Date published: 14 січня 2021 р.
Посібник від Остіна Гріффіта, який демонструє, як працює майнінг у блокчейні за допомогою інструменту візуального програмування ETH.BUILD. Остін розглядає консенсус доказу виконання роботи (PoW), об'єднання блоків у ланцюг, складність майнінгу, винагороди за блок та незмінність ланцюга.
Ця стенограма є доступною копією оригінальної стенограми відео (opens in a new tab), опублікованої Остіном Гріффітом. Її було трохи відредаговано для зручності читання.
Проблема координації (0:00)
Доброго ранку, з п'ятницею краваток-метеликів! Цей випуск ETH.BUILD присвячений блокчейну — дійсно крутій речі. Ми в цьому клоунському човні, з нашою краваткою-метеликом Біткоїн. Поїхали.
Отже, у навчальній програмі ми вже розібрали пари ключів, хеші та реєстри. Ми з'ясували, що якщо ми хочемо передавати цінність туди-сюди в розподіленій мережі — не централізованій — ми стикаємося з проблемами координації. У нас виникає проблема, коли ми не можемо знайти консенсус між різними сторонами, оскільки всі вони отримують різні транзакції в різний час. Існує багато різних способів вирішення цієї проблеми, але жоден з них не був ідеальним до появи доказу виконання роботи (PoW).
Ми розглянули задачу візантійських генералів як побічний квест, і дізналися, що генералам потрібно було довести наявність армії під час надсилання повідомлень через незахищену мережу. Тоді сторона-одержувач могла б зрозуміти, що ця людина дійсно є генералом з армією, яка збирається атакувати, і вони могли б скоординуватися.
Блоки та нонс (1:04)
Отже, з цим реєстром ми завантажуємо транзакції з мережі. Замість того, щоб кожен окремий користувач доводив свою роботу, ми абстрагуємо доказ виконання роботи в блок транзакцій і дозволимо майнеру працювати над цим.
Ми беремо блок, який містить транзакції — все, що надходить через мережу, ми завантажуємо в цей блок. Якщо ми подивимося на структуру цього блоку, він також має нонс. Цей нонс дозволяє нам змінювати хеш. Якщо ми візьмемо весь цей блок, перетворимо його на рядок і захешуємо, ми отримаємо хеш. Зі зміною транзакцій змінюється і цей хеш, але також зі зміною нонса хеш теж змінюється.
Тут ми виконуємо певну роботу — у нас є випадковий набір транзакцій, і ми змінюємо нонс, поки хеш не отримає нуль на початку. Якщо ви дивилися побічний квест про візантійських генералів, ми вибрали цей початковий нуль як довільний обсяг роботи для доведення. Отже, нонс просто перебирає кожне число — 1, 2, 3, 4 — і коли ми отримуємо нуль на початку, ми кажемо: це дійсний блок.
Доказ виконання роботи в дії (3:00)
Якщо ми візьмемо видобутий блок, витягнемо хеш і помістимо його в хеш-функцію, ми зможемо довести, що він має нуль на початку — ми можемо довести, що над цим блоком була виконана робота.
Хеш-функція вимагає ресурсів процесора (CPU), які є обмеженими. Ми витрачаємо всю потужність нашого процесора, намагаючись знайти хеш із нулями на початку. Як тільки ми це робимо, ми отримуємо дійсний блок — блок фактично заморожується. Які б транзакції там не були на той момент, тепер вони в цьому блоці, і всі його визнають, а ми можемо переходити до наступного блоку.
Об'єднання блоків у ланцюг (3:56)
Ось у чому хитрість: ми беремо старий блок і підключаємо його до нового блоку. Якщо ми подивимося на структуру, новий блок не має транзакцій і має порожній нонс, але він має батьківський блок із транзакціями. Попередній блок стане частиною наступного блоку, тому ми отримаємо цілий ланцюг.
Ми додаємо останні транзакції з пулу транзакцій і працюємо над пошуком нонса. Блок номер 2 видобуто — нам знадобився нонс, що дорівнює 10, щоб зробити ці транзакції дійсними. Потім ми робимо те саме: підключаємо старий блок, додаємо новий, закидаємо туди останні транзакції та знову працюємо над ним. Після достатньої кількості спроб ми знайшли нонс для блоку 3. Блок 4 — той самий процес, і ми продовжуємо рухатися вперед.
Складність майнінгу (5:02)
Це занадто просто — ми можемо дуже швидко знайти дійсний блок, а ми хочемо, щоб це було складніше. Я збираюся збільшити складність до 2. Ми підключаємо блок 5, додаємо останні транзакції та запускаємо лічильник. Тепер ми займаємося майнінгом — використовуємо нашу обмежену потужність процесора, щоб довільно перебирати випадкові хеші, поки не знайдемо хеш із двома нулями на початку, оскільки складність була збільшена. Це займе трохи часу.
Тепер у нас є цей блокчейн із 5 блоків. Ці блоки містять транзакції, і кожен з них посилається на попередній. На створення кожного блоку пішов певний довільний обсяг роботи, і цей обсяг роботи контролюється складністю.
Майнер (6:46)
Давайте подивимося, що таке майнер. У задачі візантійських генералів генералу, який хотів «атакувати на світанку», потрібні були солдати. Те, що відбувається всередині кожного солдата, — це саме те, що ми робимо тут з нашим майнером: ми беремо повідомлення та нонс і пропускаємо їх через хеш-функцію якомога швидше, намагаючись отримати ці нулі на початку. Нулі на початку — це якась довільна річ, про яку ми всі домовилися: це достатній обсяг роботи, щоб довести, що ви солдат або що ви можете вести війну.
Дозвольте мені додати майнера і зробити це трохи швидше. Майнер робитиме те саме для наших блоків — він бере транзакції, що надходять із пулу транзакцій, завантажує їх у блок і просто працює над ним, поки не знайде дійсний хеш.
Майнер трохи ефективніший. Він більше зосереджений на майнінгу. Він випадковим чином перебирає хеші — це саме те, що наш майнер робив раніше, просто в абстрактному вигляді. Ми бачимо, як він працює у фоновому режимі, просто перебираючи хеші. Він знайшов його — блок 6 видобуто.
Подвійні витрати та поширення в мережі (10:00)
Тепер ми поговорили про проблему подвійних витрат і навіть про проблему поширення в мережі. Коли у нас є реєстр і розподілена мережа, і хтось надсилає транзакцію, вона потрапляє до різних людей у різний час. Тому в мережі можуть бути два майнери, які одночасно видобувають блок, і в них будуть різні транзакції.
Кожен з них є дійсним на той момент — вони обидва виконали доказ виконання роботи, обидва мають нулі на початку. Але вони не можуть бути канонічними одночасно. Вони не можуть бути істиною одночасно. Тому нам потрібен спосіб, щоб мережа дійшла консенсусу щодо того, який ланцюг є справжнім.
Кілька майнерів і консенсус (12:27)
Дозвольте мені взяти цей блок і перемістити його сюди. Я хочу, щоб 2 різні майнери працювали над однією проблемою, ніби слухаючи один і той самий пул транзакцій і створюючи блоки незалежно один від одного. У нас є 2 майнери: Меллорі та Майк. Я збільшив складність до 3, і обидва працюють над пошуком хешу з трьома нулями на початку.
Отже, Меллорі знайшла блок першою! Чудово. Що відбувається далі — оскільки ми знаходимося в розподіленій мережі, Майк може ще навіть не знати про блок Меллорі. Він може все ще працювати над власною версією. І ось Майк теж знайшов блок. Отже, у нас є 2 дійсні шляхи.
Якщо ви є одним із пірів у мережі і бачите блок Меллорі першим, ви думаєте, що це головний блок. Потім пізніше надходить блок Майка. Ви зберігаєте обидва на випадок, якщо один із них стане найдовшим ланцюгом. І правило таке: слідуйте за найдовшим дійсним ланцюгом.
Coinbase та винагороди за блок (15:33)
Коли майнер видобуває блок, ми кажемо: ось усі транзакції, які ми хочемо, ось нонс, ось батьківський блок — але ми також скажемо, ось людина, яка видобула цей блок. Це називається coinbase — здається, зараз є така компанія, але це інше. Ми просто будемо називати це «майнер». Отже, наші блоки тепер вимагають поля майнера.
Отже, Майк щойно знайшов блок, і Майк також отримає з цього значення 10. Нам потрібно стимулювати майнерів виконувати всю цю роботу, чи не так? Вони витрачають гроші на купівлю цього обладнання, щоб, по суті, зробити мережу безпечною. Ці майнери витрачають гроші на захист мережі за допомогою всієї своєї потужності хешування — з усіма майнерами разом, можливо, десятками тисяч. Вони платять великі гроші за створення установок, які працюють над цими хешами, і щоб стимулювати їх, ми даємо їм частку, яка називається винагородою за блок, з кожного видобутого ними блоку.
Винагороди за блок та стимули (16:52)
Отже, у цій версії блоку Меллорі має 10 доларів, але в цій версії Майк має 10 доларів. Кожен із цих двох гравців зацікавлений продовжувати розвивати свій власний ланцюг, а решті мережі потрібно знайти консенсус. По суті, все зводиться до того, у кого найдовший дійсний ланцюг.
Майк збирається встановити свій блок як батьківський і почати працювати над наступним блоком. Меллорі збирається зробити те саме. І все зводиться до того, хто ще в мережі вибере чию сторону. Оскільки ми не хочемо карати людей із поганим з'єднанням, я майже впевнений, що в Етеріумі ми платимо за uncle-блоки (дядькові блоки) — дійсні блоки, які не потрапили до найдовшого ланцюга — тому що вони все ще допомагають захищати мережу.
У нас була ця проблема координації та консенсусу, і ми вирішили її, додавши цей довільний обсяг роботи, який має бути виконаний, щоб зробити транзакції дійсними. Меллорі виконала всю цю роботу, хешуючи, хешуючи і хешуючи, щоб знайти 3 нулі на початку хешу всіх цих транзакцій і попереднього блоку.
Запити до блокчейну (18:30)
Ми можемо взаємодіяти з тим ланцюгом, який є найдовшим. Майк ще не дійшов до 7, тому ми бачимо, що висота тут все ще 6. І ми можемо робити такі речі, як запитувати баланси людей. Отже, ми натискаємо на баланс — що ми отримуємо? 524. Отже, Хайді мала 524 або будь-який інший нативний токен для цього ланцюга. Ми можемо бачити її нонс, ми можемо робити все те, що могли робити з реєстром, але тепер ми складаємо блоки, і ці блоки містять транзакції.
Ми перенесли роботу з користувачів, які просто надсилають гроші, на майнерів, і ми стимулювали їх, даючи їм цю винагороду за блок. Також буде невелика сума, яку кожна людина платить за транзакцію, але ми повернемося до цього в наступному епізоді. Ми не хочемо зараз говорити про газ, але корисно знати, що є стимул не просто видобути блок, а видобути повний блок із великою кількістю транзакцій. Але це менший стимул — ми дійдемо до цього згодом.
Незмінність ланцюга (19:51)
У міру видобутку блоків вони стають дедалі безпечнішими. Дозвольте мені показати, що я маю на увазі. Отже, Майк видобув блок, Меллорі була тут, проводила демонстрацію і не змогла видобути блок. Тож тепер ланцюг Майка буде найдовшим, і він пошириться мережею. Всі побачать його і скажуть: гаразд, цей ланцюг має 7 блоків, усі вони дійсні — це той, за яким ми будемо слідувати. Ви можете отримати хард-форки, спірні форки, де правила, за якими ми граємо, зміняться, і різні групи людей захочуть слідувати за різними ланцюгами. Крута річ.
Гаразд, нарешті, якщо ми повернемося до блоку 3 і щось змінимо — змінимо будь-яку дрібницю — я зайду сюди. Тут є якась транзакція до Френка. Скажімо, замість Френка ми змінимо її на Ів. Тепер подивіться, що станеться, коли я натисну «ОК»: погляньте на це. Я змінив крихітну частинку блоку 3, і раптом весь ланцюг розвалюється. Він більше не дійсний. Якби я транслював це в мережу, люди б мене просто засміяли.
Ви не можете нічого змінити після того, як блок видобуто, якщо тільки ви не повернетеся назад і не видобудете все заново з урахуванням змін. Мені б, по суті, довелося знову підключити майнера сюди і спробувати мати достатньо потужності, щоб наздогнати Майка аж тут із 7 блоками. Це було б дуже, дуже важко. Чим глибше знаходиться блок, тим важче його змінити. Той факт, що в цьому блоці 3 Карлос відправив 84 Бобу — Боб може бути цілком впевненим, знаючи, що на глибині кількох блоків ці гроші точно там. Немає жодних шансів, що тут виникне якийсь спірний форк — я в безпеці. Це те, що ми називаємо фінальністю.
Підсумок (22:00)
Замість того, щоб мати реєстр і цю проблему консенсусу, ми використовуємо доказ виконання роботи (PoW), щоб підібрати хеш для перевірки блоку — і «дійсний» означає довільну кількість нулів на початку. Ми все ще будемо стикатися з проблемами під час побудови ланцюга блоків, коли видобуті блоки можуть фактично надходити в різні місця в різний час. Тому у нас є додатковий алгоритм консенсусу, який каже: слідуйте за найдовшим ланцюгом, який є дійсним і відповідає набору правил, у якому ви хочете брати участь.
Гаразд, з п'ятницею краваток-метеликів! Це був блокчейн на ETH.BUILD. Я збережу це і викладу туди, щоб ви могли просто натиснути «завантажити» і мати ланцюг для гри. Гарної п'ятниці!