Ethereum стои зад една от най-популярните криптовалути – и въпреки това е много повече от това. Това означава, че криптографските пари могат да се управляват напълно автономно благодарение на алгоритми. Но как работят така наречените интелигентни договори и къде отива пътуването?
За да разберем принципа на интелигентните договори в Ethereum, е необходимо първо да направим кратка екскурзия в света на програмните езици. Общите езици за програмиране са разделени на две групи: интерпретирани и компилирани езици. В първата група програмите се пишат на език от високо ниво, които след това се изпълняват от преводач. Два популярни примера за това са Python и JavaScript. Интерпретираните езици са често срещани в много домейни на приложения (като мрежата), защото можете да започнете веднага. Освен това те са много универсални и могат да се използват на различни платформи, без да е необходимо допълнително инструментално оборудване.
От друга страна, има компилирани езици, в които компилаторът първо преобразува програмния текст в друг език – често двоичен машинен код. Този двоичен код зависи от платформата и се изпълнява директно на процесор. Компилаторът може (и трябва) да изведе специален код за набор от инструкции на процесора, например за ARM или Intel съвместими процесори. Известни представители от този тип са C и Rust.
Реалността обаче, както винаги, е по-сложна, отколкото предполагат тези прости категории. От дълго време има смесени форми, като Java. Java компилаторът не превежда Java кода директно в „истински“ машинен код, а в специален междинен формат. Този междинен формат от своя страна се изпълнява от интерпретатор – Java Virtual Machine – на специфичната архитектура на процесора.
Умните договори в Ethereum работят по подобен начин. Всички възли, които валидират транзакции в Ethereum и добиват нови валути, съдържат екземпляр на виртуалната машина Ethereum (EVM). В жълтата книга, техническата спецификация на Ethereum, е точно определено кои инструкции поддържа EVM – и как те трябва да бъдат изпълнени.
Това е вътрешна разработка, която има многобройни специални характеристики:
- Взаимодействието с външния свят не е възможно: Всички алгоритмични решения трябва да са резултат от блокчейна и неговите транзакции.
- Аритметиката се основава на 256-битови стойности, за да улесни справянето с адреси и големи суми пари.
- Специални операции като хеш функциите са вградени директно за повишаване на производителността.
- На всички инструкции се присвоява функция на разходите (гориво), която приблизително съответства на необходимото време за изпълнение и необходимия обем памет. Терминът измерване е често срещан в английския език.
- Програмиране на EVM
Подобно на екосистемата Java, има няколко езика за програмиране, за които са налични EVM компилатори. Най-често срещаният език е Solidity, който повърхностно (синтактично) напомня на JavaScript. Към края на 2020 г. документацията на Ethereum изброява още два езика: Vyper, който се основава на Python, и Yul Plus, напълно независима разработка.
Общото между всички тези езици е, че те са специфични за дадена област, тъй като за разлика от езиците с общо предназначение, те заемат ниша със специални функции и по-специално специална среда на изпълнение: EVM. Разбира се, такива специфични за домейна езици (DSL) обикновено са добра идея за намаляване на сложността на приложенията.
Но в случая с EVM това няма особен смисъл. В края на краищата, независимо от липсата на възможности за взаимодействие с външния свят на блокчейн, той може да изпълнява всеки алгоритъм, така че е (с прости думи) Turing-пълен.
И така, защо да не използваме съществуващ език и среда за изпълнение? Ако е необходимо, тогава ще трябва да премахнете функции, но можете да се върнете към по-дълъг опит, по-стабилни инструменти и – много по-важното – по-широка база от програмисти. Тъй като в днешно време популярността на даден програмен език зависи от старата шапка, зависи не само дали можете да програмирате в него особено кратко, безопасно или динамично, но и колко лесно можете да получите достъп до колко съществуващи библиотеки и пакети. Тази промяна на времената е илюстрирана особено от JavaScript, който често е критикуван заради грубата си семантика, но е най-популярният език за програмиране най-късно от милионния NPM пакет.
Хората, които стоят зад спецификацията Ethereum, стигнаха до заключението, че някои проблеми могат да бъдат решени чрез мигриране от вътрешна разработка към универсален език. Колко практично това развитие в момента тече в мрежата, за да се установи алтернатива на най-добрия JavaScript за кучета: уеб събрание (WASM). Това е едновременно универсален междинен език и двоичен формат, съчетан със спецификация за преводачи. Както подсказва името, отвореният стандарт първоначално е замислен за мрежата; Междувременно обаче се обсъждат и други области на приложение (напр. Приложения за смартфони).
Развитието на WASM се ръководи от индустриални гиганти като Microsoft, Google и Apple. Това, което отличава езика, е, че той е проектиран за преносимост от самото начало. Това може да се разпознае от факта, че многобройни съществуващи програмни езици като Rust, C ++ или Go вече могат да се компилират за уеб сглобяване.
И така също перфектна основа за интелигентни договори? Всъщност Webassembly изглежда е направен за тази цел. Също така в браузъра – оригиналния домейн за WASM – е необходимо стриктно да се регулира текущия код, за да се предотвратят пропуски в сигурността. Освен това фактът, че WASM няма събиране на боклука, т.е. програмистът трябва сам да се погрижи за управлението на паметта, гарантира детерминираното изпълнение на алгоритмите. Като бонус има солидни и ефективни устни преводачи за различни платформи.
Всичко това са и критерии, които са изключително важни за дизайна на блокчейн. Следователно използването на ароматизиран уеб сглобяване на Ethereum (EWASM) е логичната цел на дългосрочното планиране на Ethereum 2. EWASM е напълно съвместим с WASM, но въвежда допълнителен интерфейс към блокчейна, за да може да контролира типичния Ethereum операции (например прехвърляне на жетони). За потребителите на Ethereum взаимодействието с интелигентните договори на EWASM е прозрачно и работи точно като EVM договорите.
Интелигентни договори при уеб сглобяване
Но как да постъпите, ако искате да програмирате интелигентен договор в EWASM? От една страна, имате нужда от подходяща мрежа Ethereum. Защото колкото и красива да е визията на Ethereum 2.0, тя е просто визия. За съжаление няма официална тестова мрежа, но можете да преминете към Oasis Ethereum, който е съвместим с Ethereum и до известна степен предлага преглед на бъдещия Ethereum 2.0.
Необходим ви е и език за програмиране, така че да не се налага да пишете ръчно код за сглобяване. Ръждата предлага много предимства тук. Благодарение на подкрепата на WASM в компилатора Rust, съвместими интелигентни договори могат да бъдат генерирани директно от програма Rust. В момента обаче Rust не е разумен избор за Ethereum, тъй като веригата с инструменти все още е твърде крехка. Повечето примери, които могат да бъдат намерени в Интернет, вече са остарели малко след публикуването.
Ето защо си струва вместо това да разгледаме Solidity тук. Класическият пример за интелигентен договор в Solidity е ERC-20 токен, стандартизиран интерфейс за управление на всеки токен по веригата Ethereum. По подразбиране Ethereum използва валутния етер. С токените ERC-20 можете да дефинирате други валути, например жетон, който може да бъде заменен един за един за евро. Такъв договор има фиксирана структура. По принцип в договора има полета за съхранение за:
- Броят на жетоните в обращение (следователно може да се зададе горна граница)
- Салда по текущата сметка
В Solidity това може да се определи, както следва:
uint256 private totalSupply;
картографиране (адрес => uint256) частни салда;
функция добавяне (uint256 a, uint256 b) вътрешни чисти връщания (uint256) {
uint256 c = a + b;
изискване (c> = a, „SafeMath: преливане на добавяне“);
връщане c;
}
функция sub (uint256 a, uint256 b) вътрешни чисти връщания (uint256) {
изискване (b <= a, „SafeMath: изваждане препълване“);
uint256 c = a – b;
връщане c;
}
Тези два метода се използват за безопасно събиране или изваждане на две числа. Например, ако в акаунта на източника няма достатъчно токени, транзакцията се прекъсва със съобщение за грешка („Преливане на изваждане“). Тогава действителната трансферна функция се изпълнява бързо:
прехвърляне на функция (
получател на адрес,
uint256 сума
) {
баланси [msg.sender] = под (баланси [msg.sender], сума);
салда [получател] = добавяне (салда [получател], сума);
}
Първо, салдото по сметката при подателя се намалява, след това се увеличава при получателя. Извикването на този метод винаги е транзакционно: Ако получателят вече има твърде много или изпращачът няма достатъчно токени, нито една от двете операции не се извършва. Горният код за солидност може да бъде преведен в уеб сглобка с помощта на компилатора SOLL.
Разполагане и други опции
Този завършен WASM файл може да бъде разположен на блокчейн с помощта на web3.js, както е обичайно за Ethereum. Ако искате да използвате Oasis за това, можете да конфигурирате подходящ доставчик. Можете да работите в браузъра или в Node.js.
За да разгърнете договора, трябва да създадете нова транзакция, която не е дала адрес на получател. HEX-кодираният низ на кода на уеб сборката се прехвърля като данни:
const квитанция = изчакайте web3.eth.sendTransaction ({от: 0, данни: „0061736d …“, газ: 10000000});
console.log (receive.contractAddress);
Ако всичко е наред, последният ред извежда адреса на новосъздадения договор:
„0xad1c3896b09F86906030654F6e92D61bf0D24293 “
Освен че се използва в блокчейн, WASM кодът, генериран от компилатора, може теоретично да се изпълни и непроменен в браузъра, при условие че са осигурени необходимите функции на Ethereum. Инструментите за уеб сглобяване предлагат и редица други опции за обработка, например двоичният код може да бъде преведен на C. Следователно би било напълно възможно да се използва един и същ код както в интелигентни договори, така и в класически приложения.
Заключение
С EWASM общността на Ethereum е определила курса за поставяне на интелигентни договори на солидна основа в бъдеще. За разлика от самостоятелно направения EVM, уеб сглобяването предлага осезаеми предимства – например широка приложимост и по-голяма сигурност благодарение на многобройни възможности за анализ.
Различни клиенти на Ethereum вече прилагат тази алтернативна виртуална машина, но някои от тях все още не са съвместими един с друг. Жалко, че веригата инструменти Rust все още не е интегрирана правилно в Ethereum. Тъй като обаче развитието на Ethereum 2.0 непрекъснато напредва и има голям интерес към уеб сглобяването, надяваме се скоро да има по-стабилни инструменти.