Ethereumi valge raamat, selgitatud. 2. osa

Ethereum ehitati keskse fookuse kaudu - mitmesuguste detsentraliseeritud rakenduste loomiseks, millel on arvukalt kasutusjuhte, protokolli loomine.

Need pakuvad Turingi täielikku programmeerimiskeelt, kus olulised on arendusaeg, turvalisus ja koostoime dappide (detsentraliseeritud rakendused) vahel. Turingu täielik programmeeritav plokiahel võimaldab arendada mitmesuguseid nutikaid lepinguid, mis on palju keerukamad kui Bitcoini pakutavad.

Filosoofia

Ethereum on loodud järgmistel viiel põhimõttel.

Lihtsus

Ethereum on üles ehitatud lihtsa protokollina, millel on nägemus olla avatud kõigile, isegi

andmete salvestamise kulud ja aja ebaefektiivsus. Iga keskmine programmeerija peaks saama valida selle

töövoo ja projektide hõlpsa rakendamisega. See aitab enneolematut täielikult realiseerida

Blockchaini ja krüptovaluuta potentsiaal.

Universaalsus

Ethereumi Turingi täielikkus aitab luua mis tahes nutikat lepingut, mis olla saab

matemaatiliselt määratletud. Valuuta, tuletisinstrumendid või teie enda Skynet, saab ehitada ükskõik mida. Kui plaanite Skyneti ehitamist, võib teil olla vaja hulgaliselt blokeerivaid lepinguid ja toita neid nutika lepingu käitamiseks piisavalt gaasi.

Modulaarsus

Ethereum on konstrueeritud nii, et protokolli kõiki osi saab jagada üksikuteks üksusteks. Isegi kui keegi teeb väikeses protokollimuudatuses ühes kohas, ei tundu rakendusepaki muud osad muutuvat ja nad jätkavad tööd ilma täiendavate muudatusteta.

Uuendused, nagu Ethash, modifitseeritud Patricia puud ja RLP (mida arutatakse tulevastes postitustes), rakendatakse eraldi terviklike raamatukogudena. Ethereumi arendamine toimub nii, et sellest oleks kasu kogu krüptovaluutasüsteemile, mitte ainult endale.

Agility

Ethereumi protokolli konstruktsioonid ei ole kivisse pandud, ehkki kõrgetasemeliste konstruktsioonide muutmine toimub ainult mõistlikult.

Mittediskrimineerimine ja tsensuur

Olles tõeliselt avatud kõigile protokollidele, saab Ethereumi abil välja töötada igasuguseid rakendusi. Ethereumis kasutatavaid regulatiivseid mehhanisme kasutatakse ökosüsteemile tekitatava kahju piiramiseks ja minimeerimiseks, mitte konkreetse rakenduste kategooria piiramiseks.

Näiteks võite käitada lõpmatu silmuskripti, kui maksate demineerijatele oma koodi käitamise eest vajalikud ja asjakohased tasud.

Ethereumi kontod

Ethereumis koosneb osariik objektidest, mida nimetatakse kontodeks, kus igal kontol on 20-baidine avalik aadress. Riigi üleminekud on väärtuse ja teabe ülekandmine kahe või enama konto vahel. Ethereumi konto sisaldab nelja järgmist välja.

  • Nonce; see on loendur, mis tagab, et iga tehingut saab töödelda ainult üks kord
  • Konto praegune eetri saldo
  • Konto lepingukood (kui see on olemas, rakendatakse nutikatele lepingutele)
  • Konto salvestusruum (vaikimisi tühi)

Eeter on peamine Ethereumis kasutatav kütus ja seda kasutatakse tehingutasudeks, mida tuntakse ka kui Gwei.

Seal on kahte tüüpi kontosid:

  1. Välisomanduses olevad kontod; privaatsete võtmete abil juhitav: neil puudub omane kood. Sõnumid saadetakse tehingu loomise ja allkirjastamise teel.
  2. Lepinguarved; juhitav lepingukoodi abil: kood aktiveerub sõltuvalt vastuvõetud sõnumi sisust ja aktiveerida saab järgmised toimingud, näiteks lugemine ja sisemisse salvestusse kirjutamine, muude sõnumite saatmine või lepingute loomine.

Teist tüüpi kontot kasutab krüptovaluuta väljamakse: tuletisinstrumentide plokkide nõukogu selle aruka lepingutega rahakotisüsteemis.

Nutikad lepingud on seega autonoomsed agendid, kes elavad Ethereumi keskkonnas ja täidavad koodi, kui need edastatakse tehingu või teatega. Sellistel lepingutel on otsene kontroll nende eetribilansi ja oma võtmehoidla üle.

Tehingud

Ethereumis teostatav tehing on sisuliselt allkirjastatud ja krüpteeritud andmepakett, mis talletab väliselt omandis olevalt kontolt saadetava sõnumi.

Tüüpilised tehingud hõlmavad järgmist:

  • Sõnumi saaja (adressaadi avalik võti)
  • Saatja tuvastav allkiri (saatja privaatvõti)
  • Eetrikogus, mis edastatakse saatjalt saajale
  • Valikuline andmeväli
  • STARTGAS-i väärtus, mis tähistab arvutuslike sammude maksimaalset arvu, mida tehingu täitmisel on lubatud teha
  • GASPRICE väärtus, mis tähistab tasu, mida saatja maksab arvutusetapi eest

Jagageme need üksikud punktid. Esimesed kolm on standardsed väljad, mis esinevad igas krüptovaluutas. Andmeväljal puudub vaikefunktsioon, kuid lepinguga saab seda andmetele juurde pääseda. Näiteks kui leping toimib domeeni registreerimisteenusena, võib ta soovida tõlgendada talle edastatud andmeid nii, et need sisaldavad kahte “välja”, esimene väli on registreeritav domeen ja teine ​​väli on IP aadress registreerige domeen. Leping loeb need väärtused teateandmetest läbi ja paigutab need vastavalt vajadusele hoiule.

Väljad STARTGAS ja GASPRICE on Ethereumi teenuse keelamise vastase mudeli jaoks üliolulised. Lõpmatute silmuste või muu arvutusliku raiskamise vältimiseks tuleb igal tehingul seada piirang arvutatavate sammude arvule, mida see saab kasutada. Arvestuse põhiline ühik on “gaas”. Tavaliselt maksab arvutuslik samm 1 gaasi, kuid mõned toimingud maksavad suuremas koguses gaasi, kuna need on arvutuslikult kallimad või suurendavad osana riiki talletatavate andmete mahtu.

Tehinguandmetes on iga baidi eest tasu 5 gaasi. Tasusüsteem paneb ründaja maksma proportsionaalselt iga tarbitud ressursi, sealhulgas arvutamise, ribalaiuse ja salvestusruumi eest. Seega viib iga võrgutarbimist suurendav tehing loomulikult kõrgema gaasitasu.

Lihtsamalt öeldes on tasuline gaas võrdeline plokiahelas tehtud arvutuste arvu ja keerukusega.

Sõnumid

Lepingutega saab saata teateid teistele lepingutele.

Tüüpilised teated sisaldavad:

  • Sõnumi saatja
  • Sõnumi saaja
  • Teate abil edastatav eetrikogus
  • Valikuline andmeväli
  • STARTGASi väärtus

Sõnum sarnaneb tehinguga, välja arvatud see, et sõnumid luuakse lepinguga, mitte väliste kontodega. Sõnum toodetakse siis, kui lepingukood täidab koodi CALL-opoodi täitmiseks, sõnumi koostamiseks ja täitmiseks.

Teate võtab vastu adressaadikonto, kes seejärel käivitab selle koodi. Sel viisil saavad lepingud jõustuda suhetes teiste lepingutega sarnaselt väliste omandis olevate kontodega.

Lepinguga määratud gaasi eraldamine kehtib nii tehingu käigus tarbitud gaasi kui ka kõigi alamtäitmiste puhul.

Mõistagem sama näitega.

@A on välisomanduses olev konto

@B on leping

@A saadab @B tehingu 1000 gaasi abil.

@B tarbib 600 gaasi ja saadab sõnumi @C-le.

@C sisemine teostus tarbib 300 gaasi.

1000–600–300 = 100

See tähendab, et leping @B võib kulutada arvutamiseks / sõnumi / tehingu tegemiseks veel 100 gaasi enne gaasi otsa.

Ethereumi oleku ülemineku funktsioon

Nagu sarja 1. osas mainitud, võite meenutada oleku ülemineku funktsiooni

RAKENDADA (S, TX) -> S ”

Edasised sammud võetakse valgest raamatust ja need on üsna iseenesestmõistetavad:

  1. Tehingul peab olema õige arv väärtusi, allkiri peab olema kehtiv ja nonce peaks ühtima saatja konto nonce-ga. Kui see ei vasta, viska viga.
  2. Tehingutasu arvutatakse kui STARTGAS * GASPRICE, saatmisaadressi saab kindlaks määrata allkirja alusel. Lahutage tasu saatja saldodest ja lisage saatja ülemmäär. Kui kulutamiseks pole piisavalt saldo, visake viga.
  3. Initsialiseerige GAS = STARTGAS ja tehingus olevate baitide eest tasumiseks võetakse kindel kogus gaasi baiti kohta.
  4. Kandke tehingu väärtus saatja kontolt vastuvõtvale kontole. Kui vastuvõtvat kontot veel pole, looge see. Kui vastuvõttev konto on leping, käivitage lepingu kood kas lõpuni või seni, kuni täitmisele läheb otsa bensiini.
  5. Kui väärtuse ülekandmine ebaõnnestus, kuna saatjal ei olnud piisavalt raha või kui koodi täitmine läks otsa, siis tühistage kõik oleku muudatused, välja arvatud tasude maksmine, ja lisage tasud kaevandaja kontole. Tasude maksmist ei saa tagasi pöörata, kuna kaevur kulutab tehingu hõlbustamiseks energiat.
  6. Muul juhul tagastage saatjale kogu ülejäänud gaasi eest makstud tasud ja saatke kaevandajale tarbitud gaasi eest makstud tasud.

Oletame, et lepingu kood on järgmine:

ise salvestamine [kõneavaldus (0)]:
omaladu [kõneredaktor (0)] = kõnereklaam (32)

Leping on tegelikult kirjutatud madala taseme EVM-koodiga, kuid ülaltoodud näide on kirjutatud serpentis.

Vaatleme nüüd näidet:

Lepingu salvestusruum on esialgu tühi ja tehing saadetakse 10 eetri väärtuse, 2000 gaasi, 0,001 eetri gaasihinna ja 64 baiti andmetega, baitides 0–31 on number 2 ja baitides 32–63 stringi CHARLIE.

Selle stsenaariumi oleku ülemineku funktsiooni protsess on järgmine. Need sammud on sarnased ülaltoodud üldnäites mainituga.

  1. Kontrollige, kas tehing on õige ja korrektne.
  2. Kontrollige, kas tehingu saatjal on vähemalt 2000 * 0,001 = 2 eetrit. Kui on, lahutage saatja kontolt 2 eetrit. (Kuna peame valemitena kasutama STARTGAS * GASPRICE)
  3. Käivitage gaas = 2000; Eeldades, et tehing on 170 baiti pikk ja baititasu on 5, lahutage 850 (170 * 5), nii et gaasi on 1150 (2000–850).
  4. Lahutage saatja kontolt veel 10 eetrit ja lisage see lepingu kontole.
  5. Käivitage kood. Sel juhul on see lihtne: ta kontrollib, kas kasutatakse lepingu salvestusmahtu indeksis 2, märkab, et seda pole, ja seab siis salvestise indeksi 2 väärtuseks CHARLIE. Oletame, et selleks kulub 187 gaasi, seega on ülejäänud gaasi kogus 1150–187 = 963
  6. Lisage saatja kontole tagasi 963 * 0,001 = 0,963 eetrit ja tagastage saadud olek.

Sellega lõpetatakse kogu protsessi etapid.

Kui tehingu vastuvõtvas lõpus lepingut ei sõlmitud, võrdub kogu tehingutasu lihtsalt esitatud GASPRICE-ga, mis on korrutatud tehingu pikkusega baitides, ja tehinguga koos saadetud andmed poleks olulised.

Sel juhul kasutaks kaevandaja kogu gaasi tulemuse saamiseks, kuna lepingut pole.

Tagasivõtmise korral töötavad sõnumid ja tehingud samadel tingimustel: kui sõnumi täitmine hakkab tühjaks saama, siis selle teate täitmine ja kõik muud selle täitmise käivitatud täitmised ennistatakse, kuid vanemate täitmised ei pea tagasi pöörduma.

See tähendab, et on "ohutu" hankelepingu korral helistada teisele lepingule, nagu A helistaks B-le G-gaasi, siis on A-i korraldus garanteeritud, et see kaotab maksimaalselt G-gaasi. Vanemate hukkamised väljaspool lepinguid ei taandu.

Samuti on olemas lepingukood, CREATE. Selle täitmise mehaanika on üldiselt sarnane CALL-iga, erandiks on see, et täitmise väljund määrab äsja loodud lepingu koodi.

Kavandame opcode'i üksikasjalikumalt oma tulevastes põhjalikes tehnilistes ajaveebipostitustes.

Koodi täitmine

Ethereumi lepingutes sisalduv kood on kirjutatud madala taseme korstnapõhises baitkoodikeeles, millele viidatakse kui “Ethereumi virtuaalse masina koodile” või “EVM-koodile”. EVM-kood on sisuliselt baitide seeria ja iga bait on toiming.

„Koodi täitmine on lõpmatu silmus, mis koosneb toimingu korduvast teostamisest praegusel programmiloenduril (mis algab nullist) ja seejärel programmi loenduri suurendamisest ühe võrra, kuni koodi lõpp on saavutatud või ilmub tõrge või STOPP või RETURN juhis tuvastati. ”

Toimingutel on juurdepääs kolme tüüpi ruumile, kus andmeid säilitada:

  1. Virn, viimane-esimeses-väljunud konteiner, kuhu väärtusi saab lükata ja hüpitada nagu tavalist virna.
  2. Mälu, lõpmata laiendatav baidimassiiv.
  3. Salvestusruum, võtmete / väärtuste pood Erinevalt pinu ja mälust, mis lähtestatakse pärast arvutamise lõppu, püsib mälu pikaajaliselt.

Koodil on ka juurdepääs väärtusele, saatjale, saabuva sõnumi andmetele ja ka bloki päisele. Kood võib ka väljundina tagastada andmebaidimassiivi.

EVM-koodi täitmismudel on üsna lihtne. Uurime seda lähemalt järgmistes sammudes.

Ethereumi virtuaalmasina töötamise ajal saab selle täieliku arvutusliku oleku määratleda tüübis. Grupp koosneb negatiivsetest riikidest, tehingust, sõnumist, koodist, mälust, pinu, arvutist ja gaasist.

Selles osas on põhiseisund globaalne olek, mis sisaldab kõiki kontosid ning sisaldab saldosid ja salvestusruumi.

Iga täitmisvooru alguses leitakse praegune käsk, võttes koodi pc-baiti (või 0, kui pc> = len (kood)), mis tähendab, et pc loetakse nulliks, kui see on suurem või võrdne koodi pikkuseni.

Igal juhisel on oma määratlus, kuidas see näpunäidet mõjutab.

ADD hüppab kaks elementi virnast välja, lükkab nende summa kokku, vähendab gaasi ühe võrra ja suurendab pc 1-ga (tüüpiline virna kasutamine)

SSTORE hüppab kaks parimat üksust virnast välja ja lisab teise üksuse lepingu hoiuruumi esimese üksuse määratud indeksiga.

EVM-i täitmise optimeerimiseks õigeaegse kompileerimise abil on palju viise. Ethereumi põhiline juurutamine võib toimuda mõnesaja koodiridaga.

Blockchain ja kaevandamine

Ethereumi blockchain sarnaneb enam-vähem Bitcoini plokiahelaga vaid mõne peene erinevusega.

Peamine erinevus Ethereumi ja Bitcoini vahel blockchaini arhitektuuri osas on see, et erinevalt Bitcoinist (mis sisaldab ainult tehingute loendi koopiat) sisaldavad Ethereumi plokid tehingute loendi koopiat, uusimat olekut, ploki numbrit ja raskused.

Põhilist ploki valideerimise algoritmi Ethereumis saab selgitada järgmistes etappides:

  1. Kontrollige, kas eelnev viidatud plokk on olemas ja kas see on kehtiv.
  2. Kontrollige, kas ploki ajatempel on suurem kui viidatud eelmise ploki ajatempel ja vähem kui 15 minutit tulevikus.
  3. Kontrollige, kas ploki arv, raskusaste, tehingu juur, onu juur ja gaasi limiit (mitmesugused madala tasemega Ethereumi spetsiifilised mõisted, mida käsitletakse hiljem) kehtivad.
  4. Kontrollige, kas tõend töö kohta plokis on kehtiv.
  5. Olgu S [0] olek eelmise ploki lõpus. (tuletage meelde, et seda arutati ja selgitati eelmises blogipostituses)
  6. Las TX on ploki tehingute loend n tehinguga. Kõigi i jaoks 0… n-1 korral seadke S [i + 1] = RAKENDA (S [i], TX [i]). Kui mõni rakendus annab tõrke või kui plokkis kuni selle hetkeni tarbitud gaasi koguhulk ületab GASLIMIT, tagastage tõrge.
  7. Las S_FINAL on S [n], kuid lisades kaevandajale makstud plokkitasu (S_FINAL = S [n] + Blokeeri preemia). Preemia antakse siis, kui kaevur on bloki kaevandamise edukalt lõpetanud.
  8. Kontrollige, kas oleku S_FINAL Merkle puu juur on võrdne ploki päises toodud lõpliku olekujuuriga. Kui see on olemas, on blokk kehtiv; vastasel juhul pole see kehtiv. (Merkle puu ja valideerimine koos bloki päisega on selgitatud eelmises ajaveebi postituses olevate piltidega)

Kogu oleku salvestamise viis igas plokis võib alguses tunduda ebatõhus, kuid on võrreldav Bitcoini omaga.

Olek salvestatakse puustruktuuris ja pärast iga plokki on vaja muuta ainult pisikest osa puust. See tähendab, et kahe külgneva ploki vahel peaks suurem osa puust olema sama. Andmeid saab salvestada üks kord ja osutada neile kaks korda, kasutades viiteid (alamrea räsi).

Selle saavutamiseks kasutatakse spetsiaalset puuliiki, mida tuntakse Patricia puu nime all, sealhulgas Merkle puu kontseptsiooni modifikatsiooni, mis võimaldab sõlme tõhusalt sisestada ja kustutada.

Kuna kogu olekuteave on osa viimasest plokist, ei ole vaja kogu plokiahela ajalugu talletada.

Tavaliselt küsitakse füüsilise riistvara osas, kus lepingukoodi täidetakse.

Lepingukoodi täitmise protsess on määratletud oleku siirdefunktsioonis endas, mis on osa ploki valideerimise algoritmist. Kui tehing lisatakse plokki B, täidavad selle tehingu käivitatud koodi täitmise kõik sõlmed, mis kas ploki B alla laadivad ja kinnitavad, kas nüüd või tulevikus.

See tähistab Ethereumi valge raamatu 2. osa lõppu. Järgmises osas käsitleme Ethereumi protokolli ja ökosüsteemi rakendusi reaalajas.