Opas Ethereumin hajautetun äänestyssovelluksen kehittämiseen

Kun koko kryptovaluuttamarkkinat ovat ylittäneet 700 miljardin dollarin markkina-arvon, kryptovaluutatila räjähti parin viime kuukauden aikana. Mutta tämä on vasta alkua. Kun lohkoketjujärjestelmät kehittyvät ja laajentuvat edelleen, yksi hieno tapa uppoutua tähän uuteen tilaan ja hyödyntää tätä tekniikkaa on hajautetut sovellukset, jotka tunnetaan myös nimellä dApps.

CryptoKitties, joka on kuuluisa Ethereum Blockchainin ruuhkautumisestaan, on loistava esimerkki dApp: sta, joka yhdistää ainutlaatuisesti kasvatettavien ja kerättävien kissojen käsitteet blockchainiin. Tämä sensaatiomainen peli on vain yksi luova esimerkki käytännössä rajattomasta määrästä mahdollisuuksia.

Vaikka näennäisesti erittäin monimutkainen, on kehitetty tiettyjä puitteita ja työkaluja, jotta abstraktit vuorovaikutuksesi lohkoketjun ja älykkäiden sopimusten kanssa. Tässä blogiviestissä käyn läpi yhden tavan luoda hajautettu äänestyssovellus Ethereumiin. Aion käydä lyhyesti Ethereumin läpi, mutta sinulla todennäköisesti on oltava siitä ymmärrys, jotta voit käyttää tätä opasta täysimääräisesti. Lisäksi odotan sinun tuntevan Javascriptin.

Miksi tehdä hajautettu äänestyssovellus?

Pohjimmiltaan suuri hajautettu sovellus, joka käyttää blockchain-tekniikkaa, antaa sinun suorittaa samat toiminnot kuin tänään (kuten rahansiirto) ilman luotettavaa kolmatta osapuolta. Parhailla dApps-sovelluksilla on erityinen todellinen käyttömahdollisuus, joka hyödyntää blockchainin ainutlaatuisia ominaisuuksia.

Pohjimmiltaan lohkoketju on jaettu, ohjelmoitava, kryptografisesti turvallinen ja siksi luotettava pääkirja, jota kukaan ei voi hallita ja jota kuka tahansa voi tarkastaa. - Klaus Schwab

Vaikka äänestyssovellus ei ehkä ole hyvä sovellus kuluttajille, olen päättänyt käyttää sitä tässä oppaassa, koska pääkysymykset, jotka estävät ketju - avoimuus, turvallisuus, saavutettavuus, kuultavuus - ovat tärkeimmät ongelmat, jotka vaivaavat nykyisiä demokraattisia vaaleja.

Koska lohkoketju on pysyvä tallenne jaetuista tapahtumista (äänistä), jokainen ääni voidaan kiistattomasti jäljittää tarkalleen milloin ja missä se tapahtui paljastamatta äänestäjän henkilöllisyyttä. Lisäksi aikaisempia ääniä ei voida muuttaa, kun taas nykyistä ei voida hakata, koska jokainen tapahtuma on vahvistettu verkon jokaisessa solmussa. Ja kaikilla ulkopuolisilla tai sisäisillä hyökkääjillä on oltava 51 prosentin solmujen hallinta tietueen muuttamiseksi.

Vaikka hyökkääjä pystyi saavuttamaan, että vaikka syötät väärin käyttäjien äänet todellisilla henkilötunnuksillaan tutkan alle, päästä päähän -äänestysjärjestelmät voisivat antaa äänestäjille mahdollisuuden tarkistaa, onko heidän äänensä syötetty oikein järjestelmään, mikä tekee järjestelmästä erittäin turvallisen.

Ethereumin ydinkomponentit

Odotan sinun ymmärtävän Blockchainia ja Ethereumia loppuosan tästä oppaasta. Tässä on mahtava opas siitä, ja olen kirjoittanut lyhyen yleiskatsauksen ydinkomponenteista, jotka haluaisin sinun tietävän.

  1. Älykkäät sopimukset toimivat taustalogiikkana ja tallennustilana. Sopimus on kirjoitettu Solidityllä, älykkäällä sopimuskielellä, ja se on kokoelma koodeja ja tietoja, jotka sijaitsevat tietyssä osoitteessa Ethereum-lohkoketjussa. Se on hyvin samanlainen kuin olio-ohjelmoinnin luokka, jossa se sisältää funktioita ja tilamuuttujia. Älykkäät sopimukset yhdessä Blockchainin kanssa ovat kaikkien hajautettujen sovellusten perusta. Ne ovat, kuten Blockchain, muuttumattomia ja jaettuja, mikä tarkoittaa, että niiden päivittäminen on tuskaa, jos he ovat jo Ethereum-verkostossa. Onneksi tässä on joitain tapoja tehdä se.
  2. Ethereum Virtual Machine (EVM) hoitaa koko Ethereum-verkon sisäisen tilan ja laskennan. Ajattele EVM: ää kuin tätä massiivista hajautettua tietokonetta, joka sisältää "osoitteita", jotka pystyvät suorittamaan koodia, muuttamaan tietoja ja olemaan vuorovaikutuksessa toistensa kanssa.
  3. Web3.json Javascript-sovellusliittymä, jonka avulla voit olla vuorovaikutuksessa Blockchainin kanssa, mukaan lukien tapahtumien tekeminen ja älypuhelimiin soittaminen. Tämä sovellusliittymä tiivistää yhteydenpidon Ethereum-asiakkaiden kanssa, jolloin kehittäjät voivat keskittyä sovelluksensa sisältöön. Sinulla on oltava Web3-ilmentymä, joka on upotettu selaimeesi.

Muut työkalut, joita käytämme

  1. Tryffelion suosittu testauskehys Ethereumille. Se sisältää kehityksen lohkoketjun, kokoamis- ja siirtoskriptit, joilla voit käyttää sopimusta Blockchainiin, sopimustestausta ja niin edelleen. Se tekee kehityksestä helpompaa!
  2. Tryffelisopimukset on abstraktio Web3 Javascript -sovellusliittymän päällä, jonka avulla voit helposti muodostaa yhteyden ja olla yhteydessä älykkääseen sopimukseesi.
  3. Metamask tuo Ethereumin selaimeesi. Se on selainlaajennus, joka tarjoaa Ethereum-osoitteeseesi linkitetyn suojatun Web3-esiintymän, jonka avulla voit käyttää hajautettuja sovelluksia. Emme käytä Metamaskia tässä opetusohjelmassa, mutta se on tapa, jolla ihmiset voivat olla vuorovaikutuksessa DAppisi kanssa tuotannossa. Sen sijaan pistämme oman Web3-instanssimme kehityksen aikana. Katso lisätietoja tästä linkistä.

Aloitetaan!

Yksinkertaisuuden vuoksi emme todellakaan rakenna aikaisempaa kuvaamaani täyttä äänestysjärjestelmää. Selvyyden vuoksi se on vain yhden sivun sovellus, jossa käyttäjä voi syöttää henkilötodistuksensa ja äänestää ehdokasta. Siellä on myös painike, joka laskee ja näyttää äänten määrän ehdokasta kohti.

Tällä tavalla voimme keskittää älykkäiden sopimusten luomisen ja vuorovaikutuksen sovelluksen sisällä. Koko tämän sovelluksen lähdekoodi on tässä arkistossa, ja sinun on asennettava Node.js ja npm.

Ensinnäkin, asennetaan tryffeli maailmanlaajuisesti.

npm install -g truffle

Jos haluat käyttää tryffelikomentoja, sinun on suoritettava ne olemassa olevassa projektissa.

git clone //github.com/tko22/truffle-webpack-boilerplatecd truffle-webpack-boilerplatenpm install

Tämä arkisto on vain tryffelilaatikon luuranko, jotka ovat kattiloita tai esimerkkisovelluksia, jotka voit saada yhdellä komennolla - truffle unbox [box name]. Web-pakkauksen sisältävää tryffelirasiaa ei kuitenkaan päivitetä uusimpiin versioihin, ja se sisältää esimerkkisovelluksen. Siksi loin tämän repon (joka on linkitetty yllä oleviin ohjeisiin).

2. Hakemistorakenne

Hakemistorakenteen tulisi sisältää nämä:

  • contracts/- Kansio, jolla on kaikki sopimukset. ÄLÄ POISTAMigrations.sol
  • migrations/ - Kansio, jolla on siirtotiedostot, joiden avulla voit viedä älykkäät sopimuksesi Blockchainiin.
  • src/ - pitää sisällään sovelluksen HTML / CSS- ja Javascript-tiedostot
  • truffle.js - Tryffeli-määritystiedosto
  • build/- Et näe tätä kansiota ennen kuin olet koonnut sopimuksesi. Tämä kansio sisältää rakennuksen artefaktit, joten älä muokkaa mitään näistä tiedostoista! Rakennuksen artefaktit kuvaavat sopimuksesi toimintaa ja arkkitehtuuria ja antavat tryffelisopimuksia ja web3-tietoja siitä, miten voit toimia älykkään sopimuksesi kanssa Blockchainissa.

1. Kirjoita älykkäät sopimuksesi

Tarpeeksi asennuksen ja esittelyn kanssa. Mennään koodiin! Ensinnäkin, kirjoitamme älykkään sopimuksemme, joka on kirjoitettu vakavuudella (muut kielet eivät ole niin suosittuja). Se voi tuntua pelottavalta, mutta se ei ole.

Kaikissa sovelluksissa haluat älykkäiden sopimusten olevan mahdollisimman yksinkertaisia, jopa typerästi yksinkertaisia. Muista, että joudut maksamaan jokaisesta tekemästäsi laskelmasta / tapahtumasta, ja älykkäät sopimuksesi ovat ikuisesti Blockchainissa . Joten haluat todella sen toimivan täydellisesti - eli mitä monimutkaisempi se on, sitä helpompaa on tehdä virhe.

Sopimuksemme sisältää:

  1. Tilamuuttujat - muuttujia, jotka pitävät arvoja, jotka pysyvästi tallennettu Blockchain. Käytämme valtion muuttujia pitämään luetteloa ja äänestäjien ja ehdokkaiden määrää.
  2. Funktiot - Funktiot ovat älykkäiden sopimusten suoritettavia tiedostoja. Niitä kutsumme olemaan vuorovaikutuksessa Blockchainin kanssa, ja niillä on erilainen näkyvyys sekä sisäisesti että ulkoisesti. Muista, että aina, kun haluat muuttaa muuttujan arvoa / tilaa, on tapahduttava tapahtuma, joka maksaa Etherille. Voit tehdä myös callsBlockchainiin, joka ei maksa eetteriä, koska tekemäsi muutokset tuhoutuvat (lisätietoja tästä osiosta 3, kun teemme todella transactionsja calls).
  3. Tapahtumat - Aina kun kutsutaan tapahtumaa, tapahtumaan välitetty arvo kirjataan tapahtumalokiin. Tämän avulla Javascript-soittopyynnöt tai ratkaistut lupaukset voivat tarkastella tiettyä arvoa, jonka haluat siirtää takaisin tapahtuman jälkeen. Tämä johtuu siitä, että aina, kun teet tapahtuman, tapahtumaloki palautetaan. Kirjaamme vasta luodun ehdokkaan tunnuksen tapahtuman avulla, jonka näytämme (tarkista osan 3 ensimmäinen luetelmakohta).
  4. Rakennetyypit - Tämä on hyvin samanlainen kuin C-rakenne. Rakenteiden avulla voit pitää useita muuttujia, ja ne ovat mahtavia asioille, joilla on useita määritteitä. Candidateson vain heidän nimensä ja puolueensa, mutta voit ehdottomasti lisätä niihin lisää määritteitä.
  5. Kartoitukset - Ajattele näitä kuten hash-karttoja tai sanakirjoja, joissa sillä on avainarvopari. Käytämme kahta kartoitusta.

On vielä pari tyyppiä, joita ei ole lueteltu tässä, mutta jotkut niistä ovat hieman monimutkaisempia. Nämä viisi kattavat monia rakenteita, joita älykäs sopimus yleensä käyttää. Nämä tyypit selitetään tarkemmin täällä.

Tässä on älykkään sopimuksen koodi. Huomaa, että tätä tiedostoa tulisi kutsua, Voting.solmutta halusin, että Github-luettelossa on muotoilu, joten annoin sille .jslaajennuksen. Kuten muutkin oppaat, aion antaa koodissa kommentteja, jotka selittävät mitä se tekee, ja selitän jälkikäteen samalla kun huomautan tietyistä varoituksista ja logiikasta.

Pohjimmiltaan meillä on kaksi rakennetta (tyypit, jotka sisältävät useita muuttujia), jotka kuvaavat äänestäjää ja ehdokasta. Strukturien avulla voimme määrittää niille useita ominaisuuksia, kuten sähköpostit, osoitteet ja niin edelleen.

Äänestäjien ja ehdokkaiden seuraamiseksi laitamme heidät erillisiin kartoituksiin, joissa ne on indeksoitu kokonaislukuina. Ehdokas tai äänestäjän hakemisto / avain - antaa kutsua sitä tunnukseksi - on toimintojen ainoa tapa käyttää niitä .

Seuraamme myös äänestäjien ja ehdokkaiden määrää, mikä auttaa meitä indeksoimaan heitä. Älä myöskään unohda tapahtumaa rivillä 8, joka kirjaa ehdokkaan tunnuksen, kun se lisätään. Tätä tapahtumaa käyttää käyttöliittymämme, koska meidän on seurattava ehdokkaan henkilötodistusta voidaksemme äänestää ehdokkaan puolesta.

  1. Tiedän, toisin kuin sanoin aiemmin sopimusten tekemisestä erittäin yksinkertaiseksi, tein tämän sopimuksen hieman monimutkaisemmaksi verrattuna siihen, mitä tämä sovellus todella tekee. Tein sen kuitenkin niin, että teillä olisi paljon helpompaa tehdä muokkauksia ja lisätä ominaisuuksia tähän sovellukseen jälkikäteen (lisää lopusta). Jos haluat tehdä vielä yksinkertaisemman äänestyssovelluksen, älykäs sopimus voi toimia alle 15 koodirivillä.
  2. Huomaa, että tilamuuttujat numCandidatesja numVotersei ilmoiteta julkisesti. Näiden muuttujien näkyvyys on oletusarvoisesti, internalmikä tarkoittaa, että niihin pääsee suoraan vain nykyisen sopimuksen tai johdettujen sopimusten kautta (älä huoli siitä, emme käytä sitä).
  3. Käytämme 32bytesmerkkijonoja stringtyypin käyttämisen sijaan . EVM: n sanakoko on 32 tavua, joten se on "optimoitu" käsittelemään tietoja 32 tavun paloina. (Kääntäjien, kuten Solidity, on tehtävä enemmän työtä ja tuotettava enemmän tavukoodeja, kun tietoja ei ole 32 tavun paloina, mikä johtaa tehokkaasti korkeampiin kaasukustannuksiin.)
  4. Kun käyttäjä äänestää, uusi Voterrakenne luodaan ja lisätään kartoitukseen. Jotta voisit laskea tietyn ehdokkaan äänien, sinun on tarkistettava kaikki äänestäjät ja laskettava äänten määrä. Ehdokkaat toimivat samalla tavalla. Siten nämä kartoitukset pitävät sisällään kaikkien ehdokkaiden ja äänestäjien historian.

2. Välitä web3 ja sopimukset

Kun älykäs sopimus on valmis, meidän on nyt suoritettava testilohkoketjumme ja otettava tämä sopimus käyttöön Blockchainiin. Tarvitsemme myös tapan puhua sen kanssa, joka tapahtuu web3.js: n kautta.

Ennen kuin aloitamme testilohkoketjun, meidän on luotava 2_deploy_contracts.jskansioon kutsuttu tiedosto, /contractsjoka käskee sen sisällyttämään äänestyssopimussi, kun siirryt.

Aloita Ethereum-lohkoketjun kehittäminen siirtymällä komentoriville ja suorittamalla:

truffle develop

Tämä elää komentorivilläsi. Koska Solidity on käännetty kieli, meidän on käännettävä se ensin tavukoodiksi, jotta EVM voidaan suorittaa.

compile

Sinun pitäisi nyt nähdä build/kansio hakemistosi sisällä. Tämä kansio sisältää rakennuksen artefaktit, jotka ovat tärkeitä tryffelin sisäiselle toiminnalle, joten älä koske niihin!

Seuraavaksi meidän on siirrettävä sopimus. Siirtymät on tryffelisarja, jonka avulla voit muuttaa sovelluksesi sopimuksen tilaa kehittäessäsi. Muista, että sopimuksesi on käytetty tiettyyn osoitteeseen Blockchainissa, joten aina, kun teet muutoksia, sopimuksesi sijaitsee eri osoitteessa. Siirtojen avulla voit tehdä tämän ja myös siirtää tietoja ympäri.

migrate

Onnittelut! Älykäs sopimuksesi on nyt Blockchainissa ikuisesti. No eipä oikeastaan…. koska truffle developpäivittyy joka kerta, kun lopetat sen.

Jos haluat jatkuvan estoketjun, harkitse Ganache, jonka on myös kehittänyt Truffle. Jos käytät Ganachea, sinun ei tarvitse soittaa truffle develop. Sen sijaan juokset truffle compileja truffle migrate. Katso tämä blogiviesti ymmärtääksesi, mitä sopimuksen käyttöönotto ilman tryffeleitä todella edellyttää.

Kun olemme asentaneet älykkään sopimuksen Blockchainiin, joudumme asentamaan selaimessa web3.0-ilmentymän Javascriptilla aina, kun sovellus käynnistyy. Siten seuraava koodikappale sijoitetaan koodin alaosaan js/app.js. Huomaa, että käytämme web3.0-versiota 0.20.1.

Sinun ei tarvitse huolehtia liikaa, jos et ymmärrä tätä koodia. Tiedä vain, että tämä suoritetaan, kun sovellus käynnistyy, ja tarkistaa, onko selaimessasi jo Web3-esiintymä (Metamask). Jos ei ole, luomme vain sellaisen, joka puhuu localhost:9545, joka on tryffeli-kehityksen lohkoketju.

Jos käytät Ganachea, sinun on vaihdettava portti muotoon 7545. Kun instanssi on luotu, kutsumme startfunktion (määritän sen seuraavassa osassa).

3. Lisää toimintoja

Viimeinen asia, joka meidän on tehtävä, on kirjoittaa sovelluksen käyttöliittymä. Tämä sisältää minkä tahansa verkkosovelluksen olennaiset osat - HTML, CSS ja Javascript (Olemme jo kirjoittaneet hieman Javascriptista luomalla web3-ilmentymän). Luo ensin HTML-tiedosto.

Tämä on hyvin yksinkertainen sivu, jossa on käyttäjätunnuksen syöttölomake ja painikkeet äänestämiseen ja äänten laskemiseen. Kun näitä painikkeita napsautetaan, ne kutsuvat tiettyjä toimintoja, jotka äänestävät, ja löytävät ehdokkaiden äänten määrän.

On olemassa kolme tärkeää div elementtiä kuitenkin IDS: candidate-box, msgja vote-box, joka pitää valintaruudut kunkin ehdokkaan, viestin ja äänimäärä vastaavasti. Tuomme myös JQueryä, Bootstrapia ja app.js.

Nyt meidän on vain oltava vuorovaikutuksessa sopimuksen kanssa ja toteutettava äänestystoiminnot ja laskettava kunkin ehdokkaan äänimäärä. JQuery manipuloi DOM: ää, ja käytämme lupauksia, kun teemme tapahtumia tai puheluita Blockchainille. Alla on koodi app.js.

Huomaa, että myös koodi, jonka annoin edellisessä vaiheessa web3-esiintymän luomiseksi, on täällä. Ensin tuomme tarvittavat kirjastot ja verkkopaketit, mukaan lukien web3 ja tryffelisopimukset. Käytämme tryffelisopimuksia, jotka on rakennettu web3: n päälle vuorovaikutuksessa Blockchainin kanssa.

Käyttääksesi sitä, tartumme rakenteisiin, jotka rakennettiin automaattisesti, kun laadimme äänestyssopimuksen, ja käytämme niitä tryffelisopimuksen luomiseen. Lopuksi määritimme toiminnot globaalissa muuttujassa windowsovelluksen käynnistämiseksi, ehdokkaan äänestämiseksi ja äänten määrän löytämiseksi.

Jotta voisimme olla vuorovaikutuksessa Blockchainin kanssa, meidän on luotava tryffelisopimus esimerkiksi deployedfunktiota käyttämällä . Tämä puolestaan ​​palauttaa lupauksen, jonka ilmentymä on palautusarvona, jota käytät älypuhelimen toimintojen kutsumiseen.

Voit olla vuorovaikutuksessa näiden toimintojen kanssa kahdella tavalla: tapahtumat ja puhelut. Tapahtuma on kirjoitusoperaatio, ja se lähetetään koko verkkoon ja kaivostyöläiset käsittelevät sitä (ja siten maksavat Etherille). Sinun on suoritettava tapahtuma, jos muutat tilamuuttujaa, koska se muuttaa lohkoketjun tilaa.

Puhelu on lukuoperaatio, joka simuloi tapahtumaa, mutta hylkää tilan muutoksen. Eetterille se ei siis maksa. Tämä sopii erinomaisesti getter-toimintojen kutsumiseen (tutustu neljään getter-toimintoon, jotka kirjoitimme aiemmin älykkääseen sopimukseemme).

Tehdä transaktion Tryffeli Sopimukset, kirjoittaa instance.functionName(param1, param2), jossa instanceilmentymän joka palautti deployedtoiminto (Tarkista linja 36 on esimerkki). Tämä tapahtuma palauttaa lupauksen, jonka palautusarvona on tapahtuman tiedot. Jos palautat arvon älykkäässä sopimusfunktiossa, mutta suoritat tapahtuman samalla toiminnolla, se ei palauta kyseistä arvoa.

Siksi meillä on tapahtuma, joka kirjaa mitä haluat sen kirjoittavan palautettaviin tapahtumiin. Rivillä 36–37 teemme tapahtuman ehdokkaan lisäämiseksi. Kun ratkaisemme lupauksen, meillä on transaktiotiedot result.

Saadaksesi candidateIDettä me kirjautunut tapahtumaan AddedCandidate()(tarkista Smart sopimus nähdä sen 0), meidän täytyy käydä läpi tukkien ja hakea sitä näin: result.logs[0].args.candidateID.

Tulosta resultja tarkastele sen rakennetta Chrome-kehittäjätyökalujen avulla, jotta näet todella, mitä tapahtuu result.

Voit soittaa kirjoittamalla instance.functionName.call(param1,param2). Kuitenkin, jos toiminnolla on avainsana view, tryffelisopimukset luovat puhelun automaattisesti, joten sinun ei tarvitse lisätä .call.

Siksi getter-toiminnoillamme on viewavainsana. Toisin kuin tapahtuman tekeminen, palautetulla puhelulupauksella on paluuarvo riippumatta siitä, mitä älykäs sopimustoiminto palauttaa.

Selitän nyt kolme toimintoa lyhyesti, mutta tämän pitäisi olla hyvin tuttua, jos olet rakentanut sovelluksia, jotka hakevat / muuttavat tietoja tietovarastosta ja käsittelevät DOM: ää vastaavasti. Ajattele Blockchainia tietokantana ja tryffelisopimuksia API: na tietojen saamiseksi tietokannastasi.

App.start ()

Tätä toimintoa kutsutaan heti, kun olemme luoneet web3-instanssin. Jotta tryffelisopimukset toimisivat, meidän on asetettava palveluntarjoaja luotuun web3-ilmentymään ja asetettava oletusarvot (kuten mikä tili olet käyttämässäsi ja kuinka paljon kaasua haluat maksaa tapahtuman suorittamiseksi).

Koska olemme kehitystilassa, voimme käyttää mitä tahansa määrää kaasua ja mitä tahansa tiliä. Tuotannon aikana ottaisimme MetaMaskin tarjoaman tilin ja yrittäisimme selvittää pienimmän mahdollisen kaasumäärän, koska se on oikeaa rahaa.

Kun kaikki on määritetty, näytämme nyt valintaruudut jokaiselle ehdokkaalle, jotta käyttäjä äänestää. Tätä varten meidän on luotava esimerkki sopimuksesta ja hankittava ehdokkaan tiedot. Jos ehdokkaita ei ole, luomme ne. Jotta käyttäjä voi äänestää ehdokasta, meidän on annettava kyseisen ehdokkaan henkilötunnus. Siksi teemme jokaiselle valintaruutuelementille idehdokkaan tunnuksen (HTML element attribute). Lisäksi lisätään ehdokkaiden määrä globaaliin muuttujaan numOfCandidates, jota käytämme App.findNumOfVotes(). JQueryä käytetään liittämään kukin valintaruutu ja sen ehdokkaan nimi .candidate-box.

App. Ääni ()

Tämä toiminto äänestää tietyn ehdokkaan perusteella, mitä valintaruutua napsautetaan ja sen idmääritteen perusteella.

Ensinnäkin, tarkistamme, onko käyttäjä syöttänyt käyttäjätunnuksensa, mikä on heidän tunnuksensa. Jos he eivät, näytämme viestin, jossa heitä kehotetaan tekemään niin.

Kaksi tarkistamme, äänestääkö käyttäjä ehdokasta, tarkistamalla, onko napsautettu ainakin yksi valintaruutu. Jos yhtään valintaruutua ei napsautettu, näytämme myös viestin, jossa kehotetaan äänestämään ehdokasta. Jos jotakin valintaruutuista napsautetaan, tartumme idkyseisen valintaruudun määritteeseen, joka on myös linkitetyn ehdokkaan tunnus, ja äänestämme sitä ehdokkaan puolesta.

Kun kauppa on suoritettu, ratkaistamme palautetun lupauksen ja näytämme äänestetyn viestin.

App.findNumOfVotes ()

Tämä viimeinen toiminto löytää jokaisen ehdokkaan äänten määrän ja näyttää ne. Käymme läpi ehdokkaat ja kutsumme kaksi älykästä sopimusfunktiota getCandidateja totalVotes. Ratkaisemme nuo lupaukset ja luomme HTML-elementin kyseiselle ehdokkaalle.

Käynnistä sovellus ja näet sen //localhost:8080/!

npm run dev

Resurssit

Tiedän, se on paljon ... Saatat olla, että tämä artikkeli on auki jonkin aikaa, kun kehität hitaasti tätä sovellusta ja ymmärrät todella mitä tapahtuu. Mutta se on oppimista! Täydennä tätä opasta kaikilla Ethereumin, tryffelin asiakirjoilla ja jäljempänä antamillani asiakirjoilla. Olen yrittänyt osua moniin tämän artikkelin keskeisiin kohtiin, mutta se on vain lyhyt yleiskatsaus ja nämä resurssit auttavat paljon.

  • Kaikki vakavuudesta ja älykkäistä sopimuksista - tarkoitan kaikkea
  • Kaikki tryffelistä
  • Tryffelisopimusdokumentit
  • Web3 Javascript -sovellusliittymä- tämä on hienoa tietää ja viitata, mutta tryffelisopimukset tiivistävät monia osia tästä
  • Hyödyllisiä DApp-malleja
  • Ethereum Docs - katso sivupalkkiin ja siellä on paljon tavaraa
  • CryptoKitties-koodin selitys - Kirjoittaja käy läpi tärkeät osat CryptoKittiesin älykkäästä sopimuksesta
  • Älykkäät sopimusten parhaat käytännöt- täytyy lukea

Johtopäätös

Sovellusten rakentaminen Ethereumille on melko samanlainen kuin tavallinen sovellus, joka kutsuu backend-palvelua. Vaikeinta on kirjoittaa vankka ja täydellinen älykäs sopimus. Toivon, että tämä opas auttoi sinua ymmärtämään hajautettujen sovellusten ja Ethereumin perustiedot ja auttaa sinua aloittamaan kiinnostuksesi niiden kehittämiseen.

Jos haluat rakentaa rakentamastamme, tässä on joitain ideoita. Olen itse kirjoittanut älykkään sopimuksen siten, että se on helppo toteuttaa kaikella, mitä olen antanut sinulle tässä oppaassa.

  • Näytä kunkin ehdokkaan juhlat. Saamme ehdokkaan puolueen jo ehdottaessamme getCandidate(id).
  • Tarkista, onko käyttäjän antama tunnus yksilöllinen.
  • Kysy ja tallenna lisätietoja käyttäjästä, kuten käyttäjän syntymäaika ja kotiosoite.
  • Lisää vaihtoehto nähdäksesi, onko henkilö, jolla on tietty henkilötunnus, äänestänyt vai ei. Luot uuden lomakkeen syöttääksesi tunnuksen, jonka etsit sitten tietyn käyttäjän estoketjusta.
  • Kirjoita uusi älykäs sopimusfunktio, joka laskee molempien ehdokkaiden äänet kerralla. Tällä hetkellä meidän on tehtävä kaksi erillistä kutsua kahdelle ehdokkaalle, mikä edellyttää, että sopimus kulkee kaikkien käyttäjien läpi kahdesti.
  • Salli uusien ehdokkaiden lisääminen. Tämä tarkoittaa uuden lomakkeen lisäämistä ehdokkaiden lisäämiseksi, mutta myös vähän muutoksia siihen, miten näytämme ja äänestämme ehdokkaita käyttöliittymässä.
  • Vaadi käyttäjiltä äänestykseen Ethereum-osoite. Minun logiikkani ei sisällä käyttäjän osoitteita, koska äänestäjillä ei odoteta olevan Ethereumia osallistumaan tähän äänestysprosessiin. Monet DApps vaativat käyttäjiltä kuitenkin Ethereum-osoitteen.

Tässä on myös joitain vinkkejä, jotka voivat estää joitain esteitä:

  • Kaksinkertainen ja kolminkertainen tarkista älykkäät sopimusfunktiosi, kun jotain outoa tapahtuu. Vietin pari tuntia virheen selvittääkseni, että palautin väärän arvon yhdessä toiminnossani.
  • Tarkista, onko URL-osoitteesi ja porttisi oikein, kun muodostat yhteyden kehityksen estoketjuun. Muista: 7545on Ganachelle truffle developja 9545sitä varten. Nämä ovat oletusarvoja, joten jos et pysty muodostamaan yhteyttä blockchainiin, olet ehkä muuttanut niitä.
  • En käynyt läpi tätä, koska tämä opas olisi ollut liian pitkä, ja teen todennäköisesti uuden viestin tästä - mutta sinun tulee testata sopimuksesi! Se auttaa paljon.
  • Jos et tunne lupauksia, käy läpi, miten ne toimivat ja miten niitä käytetään. Tryffelisopimukset käyttävät lupauksia, ja web3: n beeta tukee myös lupauksia. Jos teet heille väärin, he voivat sekoittaa suuren osan hakemistasi tiedoista.

Kippis työskentelemään kohti hajautettua ja turvallista Internetiä - Web 3.0!

Toivon, että pidit tämän oppaan lukemisesta yhtä paljon kuin nautin sen kirjoittamisesta! Jos sinulla on ajatuksia ja kommentteja, voit jättää kommentin alle tai lähettää minulle sähköpostia osoitteeseen [email protected] tai twiittata minua (olen äskettäin luonut sellaisen)! Käytä koodiani vapaasti ja jaa se ystävillesi!