Изолиран свидетел, част 1: Как хитър хак може да увеличи значително потенциала на Биткойн

Ако трябва да откроим предложение (BIP), което екзалтира присъстващите на скорошния Scaling Bitcoin уъркшоп в Хонк Конг, това е предложението на Bitcoin Core и Blockstream девелопъра Dr. Pieter Wuille наречено Изолиран Свидетел (Sagregated Witness). След като си спечели одобрението на биткойн обществото, Изолиран Свидетел се очаква да подобри представянето на Биткойн в много различни аспекти по отношение на скалирането на протокола.

Какво е биткойн транзакция?

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

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

Биткойн транзакциите по същество представляват групи от заключващи елементи (locks) – и по-конкретно, всяка транзакция притежава два основни компонента. Единият ефективно отключва заключени биткойни в предишни транзакции, използвайки блокове информация наречени inputs. Инпутите съдържат скриптове  – инструкции за това как се отключва инпута. Тези скриптове се наричат scriptSigs. Другата половина се състои от един или повече нови заключващи елементи, които се наричат outputs, и които отново заключват същото количество или по-малко биткойни. Output-ите съдържат скриптове, които се наричат scriptPubKeys. По този начин биткойн ефективно преминава от inputs към outputs в рамките на една транзакция, и същевременно прескача от транзакция в транзакция.

Това правило има едно основно изключение. Coinbase транзакция (да не се бърка с компанията със същото име) е транзакция създадена от копач, открил нов блок и съдържаща награда – 25 биткойна към момента (наградата намалява наполовина на всеки 4 години). В допълнение към това coinbase наградата може да се увеличи със стойност, която е разликата между input/output – това са таксите за транзакция.

Цялото това отключване и заключване на биткойни се осъществява от участниците, които обработват транзакциите, след което последователно се прехвърля към Биткойн мрежата като пакети информация. Оттук възлите (nodes) в мрежата проверяват дали този процес на отключване и заключване е осъществен коректно. Ако мине проверката на един възел успешно, се изпраща на други възли, и ако възел е в същото време и копач – идва смисъла на таксите за транзакция.

Жизненоважни за коректното функциониране на мрежата са правилата, които възлите използват, за да проверяват изпълнението на транзакциите, да са съвместими с правилата, които използват (почти) всички копачи. Ако някой от копачите добави транзакции към блок, които останалите възли не успеят да валидират, то целият блок се смята за невалиден. Ако този възел в същото време е и копач, това може да доведе до двойно похарчване (double spending) и разклоняване на мрежата.

Този консенсус – правилата с които всички участници в мрежата са се съгласили – позволява на транзакциите да отключват и заключват биткойни в едно и също време по няколко начина. Output-и, заключващи биткойн обикновено включват scriptPubKey заедно с редове код в които има “Доказателство че притежаваш или знаеш скрития ключ, който съответства на публичния ключ, който съответства на Биткойн адреса“.

Да се изчисли публичния ключ, ако се знае частният ключ, е елементарен процес, но обратното е близко до невъзможно. Също така може да се изчисли биткойн адрес от публичен ключ, но обратното не е възможно. Следвайки тази логика можем да кажем, че ако имаме скрития ключ, можем да изчислим биткойн адреса, докато обратното не е възможно – това е улица с една посока.

Биткойн адресът, който заключва информация в scriptPubKey е разбира се адресът доставен и записан в края на транзакцията. Този адрес може да бъде създаден и записан само от притежателя на скрития ключ към него, следователно той е единственият, който може да създаде валиден scriptSig, и следователно единственият, който може да създава нови транзакции свързани с този адрес и да отключва и харчи заключените биткойни.

Кога се намесва подписването?

За да се докаже собствеността на скрития ключ, който кореспондира с публичния ключ, който кореспондира с биткойн адрес, теоретично скрития ключ може да се включи в scriptSig-а на транзакция. Но разбира се това не е добър вариант от гледна точка на сигурността, тъй като всеки, който види транзакцията ще знае скрития ключ, с който може да създаде нови транзакции (или да промени първоначалната) да си прехвърли колкото биткойна са останали заключени преди първоначалната транзакция да е включена в блок. Всъщност, ако копач реши да го прави, може с лекота да направи шашмата, тъй като той е този, който избира коя транзакция да потвърди.

За да се избегне тази схема, scriptPubKeys изисква scriptSig да включва един или повече подписи (signatures), за да отключи биткойн.

Подписите са криптографски трик, който използва скрития ключ, в комбинация други данни, за да изчисли уникален низ от числа. И използвайки магията на криптографията, кореспондиращият публичен ключ може да се използва, за да се провери дали подписът е направен от съответния частен ключ. По този начин подписът доказва както собственост на скрития ключ, така и потвърждение на каквито и да било данни от страна на притежателя му и всичко това без да се налага да се показва частният ключ.

Частните ключове обикновено се използват за подписване на информация за транзакция минус input-ите (scriptPubKeys, заключеното количество, и някои допълнителни детайли). Следователно подписът и публичният ключ, от който са похарчени биткойните се добавят към input полето на транзакцията. Това доказва, че притежателят на скрития ключ наистина възнамерява да създаде транзакция и осигурява сигурна среда за коректното изчисление на транзакцията.

След което цялата информация по транзакцията – този път включително и input-ите – се хешира на едно място. При този процес се създава уникално ID на транзакцията, с което тя се индентифицира оттук нататък. Ако транзакцията се включи впоследствие във блок, копачът хешва вече създаденото ID заедно с ID-то на друга транзакция и създава нов хеш. И този хеш се хешва отново, този път с хеша на други две ID-та на транзакции. Този процес продължава докато остане един хеш накрая. Тази структура от навързани хешове се нарича Merkle Tree, а последният хеш Merkle Root. Merkle Root се комбинира с допълнителна информация за блока и оформя хедъра на блока, който пък се използва за идентификация на всеки отделен блок. Хешът на блок хедъра, най-накрая, се включва в хедъра на следващия блок, като навързва блоковете във верига (blockchain).

Какво е Изолиран Свидетел (Sagregated Witness)?

Предложението за Изолиран Свидетел, както беше представено от Wuille в Хонг Конг е базирано на концепция използвана при Blockstream Sidechain Elements и допълващата идея на Биткойн Core разработчика Luke Dashjr. Концептуално идеята е оформена през последните няколко месеца със съдействието на Core разработчиците Gregory Maxwell и Eric Lombrozo и вероятно ще види бял свят по някое време следващата година (2016).

Погледнато от перспективата на Биткойн възлите, които не използват Sagregated Witness (нека ги наречем “остарели възли”), някои новосъздадени output-и скоро може да започнат да използват странен тип scriptPubKeys. Странен, защото тези scriptPubKeys вече няма да се считат заключени. Тези scriptPubKeys, често реферирани като “всеки може да харчи”, основно се характеризират с това, че не изискват подпис. В допълнение ще включват и някакъв на безмислен текст.

Старите възли няма да разбират тези транзакции. Те ще ги разглеждат като силно уязвими, поради факта че всеки може да създаде scriptSig и да отключи output-ите. Но в същото време ще ги валидират. С презумцията че в крайна сметка това не са техните биткойни, а всички други могат да правят със своите каквото си решат. Безмисленият текст ще се счита за леко нереден, но също ще минава валидация. И така те ще валидират транзакцията и ще я предават нататък към други възли.

От друга страна възлите, които са “включили” Sagregated Witness ъпдейта (нека ги наречем “нови възли”) ще забележат нещо друго. Текстът в scriptPubKey, който за старите възли ще е безмислен, ще бъде разпознат от новите възли като много специален тип output.

Също като типичните output-и, този нов тип output ще изисква един или няколко подписа, за да отключи биткойн. Но за разлика от старите output-и, тези нови output-и няма да изискват подписа да бъде включен в scriptSig на последващите транзакции. Вместо това те ще изискват подписът да бъде включен в съвсем нова част от транзакцията –  Sagregated Witness.

Тази част наречена изолиран свидетел/sagregated witness по същността си е добавка, която носи със себе си подпис плюс допълнителна информация. Същественото е, че sagregated witness напълно се игнорира от старите възли, но се разпознава, обработва и валидира от новите. Освен това, данните които sagregated witness съдържа, не се хешират заедно с другите части на транзакцията в нейното ID-то.

По този начин и старите и новите възли ще валидират успешно транзакции съдържащи подписи в изолирания свидетел. Старите възли ще валидират, тъй като от тяхната перспектива тези транзакции няма да се нуждаят от подпис, докато новите ще я валидират, тъй като нужният подпис ще е в изолирания свидетел. И след като хеша на ID на транзакция и на старите и новите възли ще е един и същ, всички ще са съгласни със създаването на блок, следователно и със структурата на блокчейна.

Много е важно да се отбележи, че или всички копачи – или поне мнозинството от тях – трябва да използват sagregated witness, за да се предотврати двойно харчене и разклонения на веригата. Ако всички копачи използват sagregated witness, старите възли ще се чудят защо някои транзакции не са включени в блокове, но след като копачите решават коя транзакция да включат, и след като това не са транзакции с техните биткойни, те няма да имат нищо против да валидират.

Но има един проблем. Ако подписите нямат ефект при създаването на блокчейна, то той спира да служи като доказателство, че правилният подпис е включен в транзакциите.

За да е сигурно, че подписите са включени в блокчейна, новите копачи (Segregated Witness-enabled) трябва да добавят трик. Вместо да създават само Merkle Tree от всички транзакции, трябва да създадат и Merkle Tree от всички Segregated Witness. Така Root-а на Segregated Witness’s Merkle Tree се включва в input полета на coinbase транзакцията. По този начин Segregated Witness’s Merkle Tree променя информацията за транзакцията на coinbase транзакцията, както и ID-то ѝ, следователно променя хедъра на блока и накрая продължаването на блокчейна.

Предложението за Изолиран Свидетел позволява подписите да бъдат извадени от Биткойн транзакциите, като запазва нивото на сигурност и без да променя съществуващите правила на консенсуса.

Във втората част на тази тема, ще разберем какъв е смисълът и как може да се използва Изолираният Свидетел/Sagregated Witness.

Може да превъртите видеото до 35:20 мин.

източник: Bitcoin Magazine

Коментари през Facebook

Коментирай първи.

Остави коментар

Your email address will not be published. Required fields are marked *