Механиката на биткойн копаенето

Дата на публикуване: 24.03.2014

В тази статия ще ви представим механиката на Биткойн копаенето. Надяваме се да разберете значението на „proof-of-work“, „трудноста на веригата“, хеширане, копане и изкопаване.  Докато в първата част обяснихме защо копачите имат стимул да бъдат честни, тук ще разгледаме как всъщност се случват нещата. Забелязали сме, че повечето хора по принцип са склонни да повярват в уникалните способности на криптовалутите, но „аха“ моментът идва едва когато прозрат колко гениално е замислено всичко от математическа гледна точка. Нещо като поговорката „Не стига само да го видиш, друго си е да го пипнеш“ – така и с новите технологии: „не стига да знаеш какво могат, хубаво е да разбереш, как го постигат“. Макар и леко по-техническо, нивото на статията е достатъчно достъпно за всеки, който има интерес да се занимава с крипто технологиите. Ако имате въпроси, независимо колко технически или не, ще се радваме да ги споделите в темата от нашия форум за това: „За същността на копането“.

Преводът е на St0ky, а оригиналната статия е написана от Chris Pacia:

Криптографски хеш-функции

Преди да започна трябва да обясня какво са хеш-функциите, тъй като те са съществена част от Биткойн протокола. Казано накратко – хеш-функцията е математически алгоритъм, който преобразува входен масив от данни в изходен низ (или поредица от символи). Да предположим например, че имаме алгоритъм, който събира всички цифри на дадено число. Ако числото е 1234, алгоритъмът ще ни върне изходен низ 10.

 1234  ==> 10

Изглежда просто, но има определени характеристики на добрите хеш-функции, които ги правят подходящи за използване в криптографията. Имайте ги предвид, защото те са жизненоважни за функционирането на Биткойн протокола.

  1. Изчисляването на хеша за каквито и да са входящи данни трябва да е лесна задача, но също така да е невъзможно (предвид съвременното ниво на компютрите) да изчислите входящите данни, ако имате хеша им,  дори и да знаете математическия алгоритъм, използван за хеширане. В този смисъл, погледнете горния пример –  можем да сметнем, че хешът е 10 при входен масив 1234, но обратната сметка не е толкова лесна. В нашия случай съществуват много възможни стойности, които да върнат същия изходен резултат, например 55, 136, 7111 и други. Предвид простотата на функцията ни обаче, всеки може лесно да налучка началния масив. Хеш-функциите, ползвани в индустрията обаче, са толкова сложни, че не могат да бъдат разбити дори и от квантови компютри (в рамките на години и срещу разумни разходи).
  2. За разлика от примера ни, всеки хеш трябва да отговаря на точно един входящ масив от данни. Ако два различни начални масива дават един и същ хеш като резултат, имаме хеш колизия (от англ. hash collision). Добрите криптографски хеш-алгоритми нямат този проблем.
  3. Хеш-функцията трябва да може да работи с входни масиви с различен размер и съответно да връща изходен низ с фиксиран размер. Например:
    –––––––––––––––––––––––––––––––––-
    hello   ==> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
    goodbye ==> 82e35a63ceba37e9646434c5dd412ea577147f1e4a41ccde1614253187e3dbf9
    –––––––––––––––––––––––––––––––––-
    Полученият хеш трябва да има една и съща дължина, независимо дали началната стойност е с размер 10 или 10 000 знака.
  4. Малка промяна във входящия масив трябва да даде напълно различен хеш, който по никакъв начин не е свързан с хеша от първоначалния вариант на входящия масив. Например вижте как съвсем леки промени в изписването на еднаквото по значение „Hello World“ се отразява на хеша на този израз:
    ––––––––––––––––––––––––-
    hello world  ==> 98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f
    Hello World  ==> a830d7beb04eb7549ce990fb7dc962e499a27230
    Hello World! ==> 8476ee4631b9b30ac2754b0ee0c47e161d3f724c
    Hello, World ==> 6782893f9a818abc3da35d745a803d72a660c9f5
    ––––––––––––––––––––––––-

Биткойн използва криптографската хеш-функция SHA256 (от англ. Secure Hash Algorithm 256-bit). Тези алгоритми са разработка на Агенцията за национална сигурност (NSA) на САЩ. Предполагам, че си задавате въпроса, дали можем да се доверим на нещо създадено точно от тях? Да, това наистина е повод да сме подозрителни, но истината е, че алгоритмите са публични и са анализирани от стотици специалисти по криптография от цял свят, които са постигнали консенсус относно надеждността им.

Merkle trees

След като изяснихме основата, нека се фокусираме върху самия протокол. В първата част отбелязахме, че всички биткоин транзакции се предават до всеки от пиърите в мрежата (всеки, който си е включил клиент на биткойн или „копачка“). Копачите събират тези транзакции и извършват множество проверки, за да установят, че са валидни. Транзакциите, преминали проверките за достоверност, се добавят към масива от данни, с който копачът се стреми да изчисли новия блок във веригата и така да получи наградата от 25 биткойна. С това всъщност започва процесът по създаването на един блок. Първата стъпка е да се приложи хеш-функция (от тук нататък ще го наричаме хеширане) на всяка транзакция в  басейна от данни посредством SHA256 алгоритъм. Суровият вид на данните от транзакциите изглежда така:

01000000017a06ea98cd40ba2e3288262b28638ce

c5337c1456aaf5eedc8e9e5a20f062bdf000000008a

473044022030e2d23be71a907a3ad7de846b3bbe8

886c4a839e1aa2cf0d314b1d327f12d2a022039718

fc3886a171e4ec2b138e6547b03dd326ef7f12295d

06e351e7c02010068014104e0ba531dc5d2ad13e2

178196ade1a23989088cfbeddc7886528412087f4b

ff2ebc19ce739f25a63056b6026a269987fcf538313

1440501b583bab70a7254b09effffffff01b02e052a0

10000001976a9142dbde30815faee5bf221d6688e

bad7e12f7b2b1a88ac00000000

След хеширането те приемат следния вид:

2d94683fa2f8aaae4a6f377d93b875f680adf96b9c3e9577554b742f412fa9ad

Всички хешове на транзакциите са организирани в така нареченото Merkle Tree или хеш дърво. Това дърво е подобно на турнирната схема на Шампионската лига след групите. Хешовете са организирани в групи по двойки, които се съединяват и отново се хешират. Същото се прави за всеки нов набор от двойки,  докато се оформи структура подобна на дърво.

 merkle tree

Горният пример се състои само от четири транзакции (Тx0,Tx1,Tx2,Tx3), но един реален блок носи информацията за стотици транзакции, затова и дървото ще бъде доста по-голямо. Хешът на върха на дървото се нарича Merkle Root или Root Hash. Не се притеснявайте, ако до тук не разбирате защо транзакциите са организирани в подобна структура. Скоро всичко ще ви се изясни.

Root Hash-а от всички транзакции се поставя в главната част на блока заедно с хеша от предишния блок (това ще бъде разяснено по-късно) заедно с едно случайно число, наречено Nonce (също ще бъде обяснено по-късно). Главната част на блока трябва да изглежда така:

Блок

Към главната част на блока се прилага хеш-функция с SHA256 алгоритъм, в следствие на което полученият хеш служи като идентификатор на блока. Дали след като е свършено всичко това, можем да излъчим блока към останалата част от мрежата? Отговорът е не. Все още не сме представили доказателство за работа (proof-of-work). Прочетете за неговото значение на следващата страница: Proof of Work (Pow), Coinbase transaction, hash chain…

Optimization WordPress Plugins & Solutions by W3 EDGE