Автор: Стилгар
Това е трета част от поредицата ни „Какво е Биткойн?“. Предишната част, която обяснява криптографията зад криптовалутите можете да прочетете тук.
Да предположим, че искаме да направим електронен кеш и сме въоръжени с криптография. Първата, най-естествена идея е да имаме банка и всеки да има сметка там. С помощта на публични и частни ключове ще изпращаме съобщения на банката и тя ще ги верифицира и ще мести парите от едната сметка в другата. Но какво ако смятаме банката за не достатъчно добра? Може би не вярваме на банката заради банкирането с частични резерви или не искаме правителството да обяви че ни конфискува депозитите както се е случвало многократно в историята (например в Кипър през 2013). Искаме да имаме електронен кеш, който да не изисква посредник.
Естествената идея която би могла да ни дойде е да създадем някакви единици от нашия електронен кеш по някакъв начин и да ги раздадем на някакви хора след което да публикуваме началната дистрибуция. Може би всички единици по начало ще бъдат притежавани от създателите на валутата или може би ще се дават срещу дарение за някоя благотворителна организация, въпросът е да имаме начално разпределение и да го публикуваме публично. Собствеността се удостоверява чрез подписване с публичен/частен ключ, публичният ключ се публикува с първоначалното разпределение.
След това при пращане на единица пари собственикът подписва транзакция (с частния си ключ), че дава тази единица на друг собственик (чрез неговия публичен ключ). Нещо подобно на чек. Новият собственик може да даде парите на друг като подпише транзакция (със своя частен ключ). Другият може да провери веригата от подписи до първоначалното разпределение което е публично известно. До тук добре, но какво пречи на един собственик да подпише две транзакции за едни и същи пари и да ги даде един път на Пешо и един път на Гошо? Този проблем се нарича double spend (двойно харчене) и дълго време никой не му бе измислил решение (има и други видове double spend). Точно този проблем е решил Satoshi Nakamoto със създаването на Bitcoin и така се появява първият в света децентрализиран електронен кеш. Той постига това като изобретява нещо наречено блокчейн и го комбинира с една съществуваща концепция наречена proof of work.
Blockchain
Представи си, че искаш да съхраняваш някак поредица от записи така че да е сигурно, че те не са променяни. Блокчейн е решение на този проблем. Данните се записват на порции наречени блокове. Всеки блок съдържа освен данните и хеш на предишния блок от веригата. Когато изпратим цялата верига на някой той може да провери започвайки от първия блок, че всеки блок наистина съдържа хеша на предишния като просто генерира хеша на всеки блок и сравни дали отговаря на записа в следващия. Припомням, че дори 1 бит информация да се промени хешът би бил тотално различен. Следователно ако някой опита да промени някой блок той ще трябва да промени всички блокове след това.
Разбира се промяната на всички блокове след това е възможна, но е възможно да направим нещо, което да пречи на това. Например може периодично да запазваме актуалния блок при нотариус или няколко човека да подписват с ключовете си актуалния блок при което за да се промени веригата би трябвало същите тези хора да подпишат всички предишни блокове до променения блок. Блокчейн се използва за такъв тип одити и е много подходяща технология за целта. Например компанията на моя приятел Божидар Божанов Log Sentinel предлага такова решение, което се използва от бизнеси и банки. Можем лесно да си представим как такава структура от данни би била полезна за изграждането на система за разплащания.
Bitcoin мрежата е блокчейн от данни. Въпреки че може да се записват произволни данни, като например бележки и съобщения, по-голямата част от данните на Bitcoin блокчейна са транзакции за изпращане на някакво количество биткоини от един адрес на друг подписани с частния ключ на адреса изпращащ парите. Адресите на Bitcoin мрежата са публичните ключове на получателите (всъщност са хеш на публичните ключове, любопитно решение, което Satoshi не е обяснил, но за целите на това описание може да приемем, че е същото).
Една транзакция съдържа адреса на изпращача, адреса на получателя, таксата (ще го обясним по-късно), количеството което да се изпрати и подпис на този комплект данни. (Отново опростявам, съдържа и още няколко записа нужни за работата на мрежата). В един блок се включват множество такива транзакции заедно с хеша на предишния блок и той се публикува на мрежата. Множество компютри по света, на които работи Bitcoin софтуерът получават копие на този блок и съхраняват копие на целия блокчейн. Тези компютри наричаме nodes (в буквален превод „възли“, но не звучи добре, може би „върхове“ е по-правилен превод, аз ще използвам чуждица). Никой от ноудовете не е главен или официален, всички ноудове са равни (peers).
Дотук добре, имаме схема която не позволява да се подмени стара транзакция както и история на транзакциите която позволява да бъдат валидирани транзакциите до произхода на всеки coin. Остава само още един проблем – ако някой ноуд ни даде един блокчейн, а друг ноуд ни даде друг блокчейн как разбираме кой е истинският Bitcoin блокчейн? Все пак няма главен или официален ноуд, на кой да вярваме?
Графика: Силно опростена схема на Bitcoin Blockchain

Proof of Work
През 1997 криптографът Адам Бек (който днес е активен участник в Bitcoin средите и управлява голяма компания в бранша) предлага метод за борба с e-mail спам. За да не се блокира даден e-mail компютърът на изпращача трябва да реши задача която изисква процесорно време. Идеята е, че за изпращача на истинско писмо няколко десетки секунди заетост на компютъра не е проблем, но спамърите които изпращат милиони писма ще имат нужда от огромно количество хардуер и електричество. Този тип доверие наричаме proof of work
В Bitcoin със създаването на всеки блок се генерира proof of work задача, която трябва да бъде решена за да се генерира следващ блок. Процесът на решаване на задачата се нарича копаене (mining). Множество копачи се състезават за да решат задачата и първият, който успее има правото да представи новия Bitcoin блок на света (на всички ноудове). Те лесно могат да проверят дали решението на задачата е вярно и да проверят дали блокът спазва останалите правила на Bitcoin мрежата (например дали не съдържа транзакция изпращаща несъществуващи единици Bitcoin) и ако блокът е валиден го добавят към блокчейна си и го разпращат на другите участници в мрежата.
Всички миньори започват „състезание“ по генериране на следващия блок с новата задача. Миньорът който генерира блок получава за награда определено количество Bitcoin. В Bitcoin мрежата наградата е начинът по който се създават първоначално биткоините. На всеки 210 000 блока наградата за нов блок се намалява на половина, събитие което наричаме halving и се случва на около 4 години. Един ден мрежата ще спре да дава награди за нови блокове и тогава всички 21 000 000 биткоини ще са произведени. Важно е да се отбележи, че целта на копането не е да се произведат биткоини. Съвсем спокойно можеше да се раздадат по някакъв друг начин, примерно в началото всички да са в Сатоши и той да подари на който реши. Целта е да се реши проблемът double spend. Proof of work е част от решението. Наградата за блок помага за това решение.
Как работи proof of work? Представи си че имаш уравнението x – 5 = 0 и знаеш, че отговорът е между 0 и 9, но не знаеш алгоритъм за ефективно решаване (не можеш просто да прехвърлиш -5 и да смениш знака). Представи си че такъв алгоритъм не е известен на човечеството. Как може да решим задачата в такъв случай? Еми просто започваме да опитваме всички възможни стойности за x:
0 – 5 равно ли е на 0? Не.
1 – 5 равно ли е на 0? Не.
…
5 – 5 равно ли е на 0? Да. Значи 5 е решението.
Интересното в тази ситуация е, че въпреки че ни отне много опити да налучкаме решението, ако кажем на някой че това е решението той може да го верифицира много по-бързо като провери само случая който сме му дали (5). Представете си сега че резултатът не е между 0 и 9 а е между 0 и огромно число (от тези дето нямат име и се пишат като степени защото иначе ще ни трябва цяла страница). По този начин процесът на намиране на решение е много бавен, но процесът за проверка е много бърз в сравнение с решаването.
Добре, обаче всички знаем как да решим горното уравнение с прехвърляне на -5 и смяна на знака. Каква ли ще е тази задача за която никой не знае ефективен алгоритъм за решаване и единственият начин е да се опитват решения едно по едно? Хммм… криптографските хеш функции!
Задачата която се решава в Bitcoin Proof of Work е намиране на определен SHA-256 хеш където входните данни са заглавната част (header) на бъдещия Bitcoin блок. Тези данни съдържат неща като датата на генерирането, хешът на предишния блок и едно число наречено nonce. Хешът на предишният блок е важен и означава, че работата по копането на новия блок не може да започне преди да е изкопан предишния. Ако това беше възможно всеки щеше да си има предварително изкопана колекция от хешове и да ги вади когато му е удобно. Nonce е просто някакво число. Копачът може да променя това число, за да генерира различни хешове, а другите данни да си останат същите. Накратко решаваме SHA256(x) = …
Внимателният читател би казал „Но авторе, никой не може да съчини данни за определен хеш при използване на криптографска хеш функция. Ако може функцията се счита за счупена и не трябва да се ползва!“. Точно така, никой не може да съчини данни които да генерират произволно избран хеш, но бихме могли да олекотим задачата. При Bitcoin вместо да се търси цял хеш се търси хеш който започва (или завършва) с определен брой нули, а другите цифри от хеша се игнорират, тоест може да са каквито и да са. Броят на нулите определя текущата трудност на копаенето и се саморегулира от протокола. Ако блоковете започнат да идват твърде бързо (тоест много компютри копаят) броят нули които изисква системата се увеличава, а ако блоковете идват твърде бавно броят нули намалява. Bitcoin цели да генерира средно 1 блок на 10 минути. Ако ви е интересно тук може да видите по-подробно обяснение на процеса както и един човек, който изпълнява една стъпка от него с лист и молив – http://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html
Добре, но как това ни помага да решим проблема с двата ноуда които ни дават две различни вериги? Все пак те може да си копаят съвсем легитимни хешове и да си произвеждат различни блокове. На това място Bitcoin Whitepaper–а съдържа едно кратко и красиво изречение, което обобщава иновацията на Сатоши (припомням, че PoW съществува отпреди Bitcoin и дори има прекурсори на блокчейна). Изречението е:
„The longest chain is Bitcoin.“ (Най-дългата верига е Bitcoin)
Ноудовете следва да изберат тази версия от предлаганите (валидни) вериги в която има повече блокове, тоест повече извършена работа. Това е последният елемент необходим за peer to peer electronic cash (мрежа за разплащане без централен сървър). Имаме начин да подписваме транзакции (криптография с публичен и частен ключ), имаме начин да подредим транзакциите (blockchain), имаме децентрализиран начин да знаем коя верига е истинската.
Визуална репрезентация на обясненото до тук може да се види в това видео:
ЕКИП – Експертен клуб за икономика и политика Едно различно мнение
