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 - балъци винаги ще има, но няма какво да се направи...

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


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Отговорете в темата...

×   Поставихте готово форматирано съдържание.   Искате ли да премахнете форматирането?

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Предишното съдържание от редактора беше възстановено.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Зарежда...

×
×
  • Създай нов...