Jump to content
hash.bg - биткойн форум
stamen

Как работи Етериум

Recommended Posts

Целта на този постинг е чрез обща дискусия  да обясним какво представлява Етериум, какво са смарт контрактите (СМ) и как действат построените върху тях децентрализирани организации (ДАО).

 

Стартовата ни точка ще е презумпцията, че всички са запознати с блокчейн имплементацията от биткойн. Ако не сте, на сайта има достатъчно много информация за нея. Все пак, ето я сбита в няколко реда:

 

Как работи блокчейна на биткойн 

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

 

Какво е различното в етериум

Мрежата на етериум също се състои от сметки. Те обаче са два вида: единият вид е проста сметка за съхранение на етери - подобни на тези в биткойн.

Другият вид сметки са smart contracts, които освен баланса на етери, съдържащи се в тях, могат да съхраняват произволно много друга информация, както и логика за боравенето с нея. 

 

Основната разлика между простите етериум сметки от тези на биткойн е в това, че етериум сметките записват директно баланса в себе си, а не отделните транзакции. Но като цяло може да ги смятаме за идентични. За нас сега са интересни другият вид сметки - смарт контрактите, над които ще се концентрираме по-долу.

 

Смарт Контракт (СК) Сметки

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

 

Има една друга много съществена разлика между смарт контрактите и простите етериум сметки:

 

Смарт контрактите не разполагат с частен ключ, който може да се разпорежда със съхраняваните в смарт контракта етери.

 

Горното свойство не случайно е форматирано в червен курсив - може би ще е добре да поспрете и добре да размислите над него.

 

Примерен смарт контракт

За да сме по-конкретни, нека си представим, че искаме да направим СК, който да управлява този форум по дадени правила, като например:

 

  •  за да се регистрираш във форума, трябва да изпратиш поне 10 етера към контракта;

  •  за да пуснеш мнение трябва да пуснеш 0.01 етер с него;

  •  всеки може да маркира дадено мнение като спам, като за целта плаща 0.1 етера

  •  ако 20% от потребителите маркират дадено мнение като спам, авторът му губи членството си във форума както и платените от негови етери в СК-та, като всички негови мнения биват изтривани;

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

  •  при събирането на 100 етера от спамери и от такси, платени за публикуване на мнения или маркиране на спам, те се изпращат на адрес, който се гласува от активните членове във форума, като за целта са необходими 20% кворум и 50% +1 глас.

 

Разбира се, горното е само за да покажем, как ще работи един такъв смарт контракт. Този вид смарт контракти се наричат Децентрализирани организации, защото те имат членове и правила за управление на средствата от съдържащите се в контракта етери, както и правила за включване и изключване в ДАО-то.

 

Създаване на СК

Всеки може да създаде този контракт като пусне транзакция към мрежата на етериум, която съдържа логиката в програмен код на горните правила;

 


Тази функция изглежда по следния начин:

 

DaoForum()

{

       създай register Members

       създай register Messages

}

 


Копачът, който изкопае блока, създава нов публичен адрес в етериум, който изглежда като 0xbb9bc244d798123fde783fcc1c72d3bb8c189413, и вътре в този адрес се създават два регистъра

Members - този регистър ще съдържа етериум адреса на всеки активен член на форума, както и баланса на етери, който той има. При създаването на СК-та, този регистър е празен, а създателят на СК-та публикува някъде публичния адрес на създадения СК и казва, ето кода, който описва правилата на контракта. Ако искате да участвате, моля регистрирайте се.

 

Messages - в този регистър пазим всички публикувани мнения с техните автори

 

 



Какво е GAS

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

За пример, всяка аритметична операция може да струва 0.001 газ. Ако ти си пратил 1 газ с твоята транзакция, но кодът ти съдържа над 1000 операции, той спира да се изпълнява след 1000-ната операция, ти си губиш пратения газ с транзакцията и всичко точно. Ако обаче си пуснал 1 газ, но само 0.2 газа са необходими за изпълнението на кода, то 0.8 газ се връщат към изпращача. Мисля, че е ясна логиката, или? Различните мерки при етериум може да видите тук: ether.fund/tool/converter

 

 

Регистрация в нашия смарт контракт

Ако някой иска да се регистрира в нашия форум, той трябва да има етериум уолет, от който да прати поне 10 етера към нашия смарт контракт.

И по-точно - той трябва да изпрати транзакция към нашата функция Register, която изглежда така:

 

function Register()

{

          if Msg.Value < 10Ether    //ако не са пуснати поне 10 етера

                  return                       // не прави нищо, излез от фунцкията

 

          Members.Create  (msg.Sender, Msg.Value)

}

 

Както прави тази функция?

Ако изпращачът не е пуснал поне 10 етера в транзакцията си към нас (както виждате в етериум транзакциите се наричат Messages), то игнорирай тази транзакция, но за това сравнение копачът ще си вземе малко газ.

 

Ако е пуснал обаче 10 или повече етера, тези етери влизат в баланса на СК-та, а в нашия вътрешен регистър, ние записваме, че имаме нов член на форума (msg.Sender, което е просто адреса на пращащия транзакцията) и той има баланс, равняващ се на изпратените от него етери.

 

Важно: тук пиша условен код. Ето как изглежда истинският код на етериум, чийто език се нарича Solidity: http://solidity.readthedocs.io/en/latest

 

Публикуване на мнение

OK, вече съм се регистрирал в СК-форума и искам да публикувам мнение. За целта пускам транзакция към мрежата на етериум, от адреса, с който съм се регистрирал, и в нея пускам 0.01 етера, плюс достатъчно газ, за да се изпълни логиката на функцията по публикуването. 

 

function Publish ()

{

        if Msg.Value < 0.01

            return

 

         if NOT Members.Contain(msg.Sender) // ако регистъра с членове, не съдържа изпращача

             return

 

         Messages.Create (msg.Sender, Msg.data) //мнението се записва, като вътре му се дава и униклано ID

}

 

Както виждате, това е доста опростен вид на форум, но просто в регистъра създаваме нов запис, който съдържа автора и мнението му. Ако не се лъжа, запазването на данни в блокчейна също струва газ според обема на данните. така че колкото по-голямо мнение, толкова повече газ трябва да се прати.

 

Маркиране като спам

 

function MarkSpam (messageID)

{

     if Msg.Value < 0.1

         return

 

    if !Members.Contain(msg.Sender) // ако регистъра ни с членове, не съдържа изпращача, излез

         return

 

Messages[messageID].SpamCount += 1; //увеличи с едно броя на спам отметките за това съобщение

 

    if Messages[messageID].SpamCount >= Members.Count/5 //ако броя на отметките е по-голям от 20%, 

  {

     Members.Remove(Messages[messageID].Author);  //изтрий автора от членовете,

   }

}

 

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

 

Когато някой пусне транзакция в етериум, тя влиза в даден блок и от този блок нататък, смарт контрактът си е променил състоянието. Всеки Node после проверява тази логика и резултатът му трябва да съвпада с резултата, получен от копачът, изкопал блока.

 

Ще спра до тук, за да видим, дали има проблясъци и какво не е ясно. Ще се радвам ако се вижда как този смарт-контракт-форум не принадлежи на никой - създателят му няма никакви права - за това е децентрализиран! Всеки може да прочете от блокчейна съдържанието на регистъра Messages и да ги публикува някъде. Ако не му вярвате, може да си свалите програма за това и да си го четете на вашия компютър от вашия етериум блокчейн - не е нужно да е на сървър.

 

Самият контракт притежава всички такси платени за регистрация и за маркиране на мненията като спам.

 

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

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Липсата на отговори и въпроси означава, че или на всички им е просветнало, или нищо не се разбира... Макар да ми се иска да е първото, знам, че става въпрос за второто... Може би някой ще пожелае да ми помогне и разясни по-добре за какво става въпрос.

 

Също така вмъкнах нещо много важно в горното мнение, което ще пейстна и тук:

 

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

 

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

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

това според мен се изтъква като огромен +,но ще доведе до много неприятности.

Даже и Уиндоус го упдеитват за да работи в крак с времето   :) а и един от най-ценните и доказали се като работещи "Смарт контракти" в историята ,като Американската конституция ,има не малко поправки.

 

 

първото е така. Второто не е. Нека вземем за пример TheDAO. Вече има предложения за подобрение на кода. След като се наберат достатъчно, те се вкарват в кода, който се публикува като нов смарт контракт - TheDAO 2.0. После се гласува в TheDAO 1.0 дали да се премине на новия код. Ако да, всички активи се местят там... 

 

За второто ти твърдение ще ти дам примера на биткойн, който е типичен пример за ДАО - колко време работи без грешка. нещо подобно ще е и с ДАО-тата, ще има ъпдейти, но с много ясни правила за тях, за разлика от биткойна, където този въпрос е пропуснат от Сатоши и сега сме в тази криза.. То има (най-дългия блокчейн), но не е много ефективен.

 

За мошеническите смарт контракти - 100% ще се появят. Та сега няма ли ги в лицето на OneCoin - балъци винаги ще има, но няма какво да се направи...

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Създайте нов акаунт или се впишете, за да коментирате

За да коментирате, трябва да имате регистрация

Създайте акаунт

Присъединете се към нашата общност. Регистрацията става бързо!

Регистрация на нов акаунт

Вход

Имате акаунт? Впишете се оттук.

Вписване

×