En guide til udvikling af et decentraliseret Ethereum-stemmeapplikation

Efter at hele kryptokurrencymarkedet havde passeret 700 milliarder dollars i markedsværdi, eksploderede kryptokurrencyområdet i løbet af de sidste par måneder. Men dette er kun begyndelsen. Da blockchain-systemer fortsætter med at udvikle sig og skalere, er en fantastisk måde at dyppe ind i dette nye rum og udnytte denne teknologi med decentrale applikationer, ellers kendt som dApps.

CryptoKitties, der er berømt for sin overbelastning af Ethereum Blockchain, er et godt eksempel på en dApp, der unikt kombinerer begreber opdrætbare og samlebare katte med blockchain. Dette sensationelle spil er kun et kreativt eksempel ud af et næsten ubegrænset antal muligheder.

Selvom det tilsyneladende er meget kompliceret, er der udviklet visse rammer og værktøjer til at abstrakte dine interaktioner med blockchain og smarte kontrakter. I dette blogindlæg vil jeg gå over en måde at oprette en decentral afstemningsapp på Ethereum. Jeg vil kort gå over Ethereum, men du burde sandsynligvis have forståelse for det for at bruge denne vejledning fuldt ud. Derudover forventer jeg, at du kender Javascript.

Hvorfor lave en decentral afstemningsapp?

I det væsentlige giver en stor decentral applikation, der bruger blockchain-teknologi, dig mulighed for at udføre de samme handlinger, som du ville i dag (som at overføre penge) uden en betroet tredjepart. De bedste dApps har et specifikt brugssag fra den virkelige verden, der udnytter de unikke egenskaber ved blockchain.

I det væsentlige er blockchain en delt, programmerbar, kryptografisk sikker og derfor betroet hovedbog, som ingen enkelt bruger kontrollerer, og som kan inspiceres af nogen. - Klaus Schwab

Selvom en stemmeapp muligvis ikke er en god app for forbrugerne, har jeg valgt at bruge den til denne vejledning, fordi de vigtigste problemer, blockchain løser - gennemsigtighed, sikkerhed, tilgængelighed, hørbarhed - er de største problemer, der plager de nuværende demokratiske valg.

Da en blockchain er en permanent registrering af transaktioner (stemmer), der distribueres, kan hver stemning uigenkaldeligt spores tilbage til nøjagtigt hvornår og hvor det skete uden at afsløre vælgerens identitet. Derudover kan tidligere stemmer ikke ændres, mens nutiden ikke kan hackes, fordi hver transaktion er verificeret af hver enkelt node i netværket. Og enhver udefra eller inde angriber skal have kontrol over 51% af noderne for at ændre posten.

Selvom angriberen var i stand til at opnå det, mens han forkert indtastede brugerstemmer med deres rigtige id'er under radaren, kunne afslutnings-til-slut-stemmesystemer give vælgerne mulighed for at kontrollere, om deres stemme var korrekt indtastet i systemet, hvilket gjorde systemet ekstremt sikkert.

Kernekomponenter i Ethereum

Jeg forventer, at du har en forståelse af Blockchain og Ethereum i resten af ​​denne vejledning. Her er en fantastisk guide om det, og jeg har skrevet en kort oversigt over kernekomponenterne, som jeg gerne vil have dig at vide.

  1. Smart Contracts fungerer som back-end-logik og -lagring. En kontrakt er skrevet på soliditet, et smart kontraktsprog, og er en samling af kode og data, der findes på en bestemt adresse på Ethereum blockchain. Det ligner meget en klasse i objektorienteret programmering, hvor den inkluderer funktioner og tilstandsvariabler. Smarte kontrakter sammen med Blockchain er grundlaget for alle decentrale applikationer. De er, ligesom Blockchain, uforanderlige og distribuerede, hvilket betyder at opgradere dem vil være en smerte, hvis de allerede er på Ethereum Network. Heldigvis er her nogle måder at gøre det på.
  2. Ethereum Virtual Machine (EVM) håndterer den interne tilstand og beregning af hele Ethereum-netværket. Tænk på EVM som denne massive decentrale computer, der indeholder “adresser”, der er i stand til at udføre kode, ændre data og interagere med hinanden.
  3. Web3.jser en Javascript API, der giver dig mulighed for at interagere med Blockchain, herunder foretage transaktioner og opkald til smarte kontrakter. Denne API opsummerer kommunikationen med Ethereum Clients, så udviklere kan fokusere på indholdet af deres applikation. Du skal have en web3-forekomst indlejret i din browser for at gøre det.

Andre værktøjer, vi vil bruge

  1. Trøffeler en populær testudviklingsramme for Ethereum. Det inkluderer en udvikling blockchain, kompilering og migrering scripts til at distribuere din kontrakt til Blockchain, kontrakt test og så videre. Det gør udviklingen lettere!
  2. Truffle Contracts er en abstraktion oven på Web3 Javascript API, så du nemt kan oprette forbindelse og interagere med din Smart Contract.
  3. Metamask bringer Ethereum til din browser. Det er en browserudvidelse, der giver en sikker web3-forekomst, der er knyttet til din Ethereum-adresse, så du kan bruge decentrale applikationer. Vi bruger ikke Metamask i denne vejledning, men det er en måde for folk at interagere med din DApp i produktionen. I stedet indsprøjter vi vores egen web3-forekomst under udviklingen. For mere information, se dette link.

Lad os begynde!

For enkelheds skyld bygger vi faktisk ikke det fulde afstemningssystem, som jeg beskrev tidligere. For at gøre det nemmere at forklare, vil det bare være en applikation på en side, hvor en bruger kan indtaste sit ID og stemme på en kandidat. Der vil også være en knap, der tæller og viser antallet af stemmer pr. Kandidat.

På denne måde vil vi være i stand til at fokusere processen med at skabe og interagere med de smarte kontrakter i en applikation. Kildekoden til hele denne applikation vil være i dette lager, og du skal have Node.js og npm installeret.

Lad os først installere Truffle globalt.

npm install -g truffle

For at bruge trøffelkommandoer skal du køre dem i et eksisterende projekt.

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

Dette lager er kun et skelet af en trøffelboks, som er kedelplader eller eksempler på applikationer, som du kan få i en kommando - truffle unbox [box name]. Truffelboksen med webpack opdateres dog ikke med de nyeste versioner og inkluderer et eksempel på en applikation. Således oprettede jeg denne repo (den der er linket i instruktionerne ovenfor).

2. Katalogstruktur

Din bibliotekstruktur skal indeholde disse:

  • contracts/- Mappe, der indeholder alle kontrakterne. SLET IKKEMigrations.sol
  • migrations/ - Mappe, der indeholder migrationsfiler, som hjælper dig med at implementere dine smarte kontrakter i Blockchain.
  • src/ - holder HTML / CSS- og Javascript-filer til applikationen
  • truffle.js - Truffelkonfigurationsfil
  • build/- Du ser først denne mappe, før du har kompileret dine kontrakter. Denne mappe indeholder build-artefakterne, så modificer ikke nogen af ​​disse filer! Byg artefakter beskriver din kontrakts funktion og arkitektur og giver trøffelkontrakter og web3-oplysninger om, hvordan du interagerer med din smarte kontrakt i Blockchain.

1. Skriv dine smarte kontrakter

Nok med opsætningen og introduktionen. Lad os komme ind i koden! Først og fremmest skriver vi vores smarte kontrakt, der er skrevet i soliditet (de andre sprog er ikke så populære). Det kan virke skræmmende, men det er det ikke.

For enhver applikation ønsker du, at dine smarte kontrakter skal være så enkle som muligt, endda dumt enkle. Husk, at du skal betale for hver beregning / transaktion, du foretager, og dine smarte kontrakter vil være på Blockchain for evigt. Så du vil virkelig have det til at fungere perfekt - hvilket betyder, at jo mere kompleks det er, jo lettere er det at lave en fejl.

Vores kontrakt vil omfatte:

  1. State Variables - variabler, der indeholder værdier, der er permanent gemt i Blockchain. Vi bruger tilstandsvariabler til at holde en liste og et antal vælgere og kandidater.
  2. Funktioner - Funktioner er eksekverbare filer af smarte kontrakter. Det er det, vi vil kalde for at interagere med Blockchain, og de har forskellige niveauer af synlighed, internt og eksternt. Husk, at når du vil ændre værdien / tilstanden af ​​en variabel, skal en transaktion forekomme - koster Ether. Du kan også gøre callsi Blockchain, hvilket ikke koster nogen Ether, fordi de ændringer, du har foretaget, vil blive ødelagt (mere om dette i afsnit 3, når vi rent faktisk foretager transactionsog calls).
  3. Begivenheder - Når en begivenhed kaldes, logges værdien, der overføres til begivenheden, i transaktionens log. Dette gør det muligt for Javascript-tilbagekaldsfunktioner eller løste løfter at se den bestemte værdi, du ønskede at give tilbage efter en transaktion. Dette skyldes, at hver gang du foretager en transaktion, returneres en transaktionslog. Vi bruger en begivenhed til at logge ID'et for den nyoprettede kandidat, som vi viser (tjek det første punkt i afsnit 3).
  4. Strukturtyper - Dette svarer meget til en C-struktur. Structs giver dig mulighed for at holde flere variabler og er fantastiske for ting med flere attributter. Candidateshar kun deres navn og fest, men du kan helt sikkert tilføje flere attributter til dem.
  5. Kortlægninger - Tænk på disse som hash-maps eller ordbøger, hvor det har et nøgleværdipar. Vi bruger to kortlægninger.

Der er et par flere typer, der ikke er anført her, men nogle af dem er lidt mere komplicerede. Disse fem omfatter mange af de strukturer, en smart kontrakt generelt vil bruge. Disse typer forklares mere detaljeret her.

Som reference er her Smart Contract's kode. Bemærk, at denne fil skal kaldes, Voting.solmen jeg ville have Github-kernen at have styling, så jeg gav den en .jsudvidelse. Ligesom resten af ​​denne vejledning vil jeg give kommentarer inden for koden, der forklarer, hvad den laver, og jeg forklarer det store billede bagefter, mens jeg påpeger visse forbehold og logik.

Dybest set har vi to Structs (typer, der indeholder flere variabler), der beskriver en vælger og en kandidat. Med Structs er vi i stand til at tildele dem flere egenskaber, såsom e-mails, adresse osv.

For at holde styr på vælgerne og kandidaterne sætter vi dem i separate kortlægninger, hvor de er heltal indekseret. En kandidats eller vælgers indeks / nøgle - lad os kalde det ID - er den eneste måde for funktioner at få adgang til dem .

Vi holder også styr på antallet af vælgere og kandidater, som vil hjælpe os med at indeksere dem. Derudover skal du ikke glemme begivenheden i linje 8, som logger kandidatens ID, når det tilføjes. Denne begivenhed vil blive brugt af vores interface, da vi er nødt til at holde styr på en kandidats ID for at stemme på en kandidat.

  1. Jeg ved, i modsætning til hvad jeg sagde tidligere om at gøre kontrakter superenkle, gjorde jeg denne kontrakt lidt mere kompliceret i forhold til hvad denne applikation faktisk gør. Jeg gjorde det imidlertid, så det ville være meget lettere for jer at foretage redigeringer og tilføje funktioner til denne applikation bagefter (mere om det i slutningen). Hvis du vil lave en endnu enklere stemmeapplikation, kan den smarte kontrakt fungere i mindre end 15 linjer kode.
  2. Bemærk, at tilstandsvariablerne numCandidatesog numVotersikke erklæres offentlige. Som standard har disse variabler en synlighed af internal, hvilket betyder, at de kun kan tilgås direkte af den nuværende kontrakt eller afledte kontrakter (skal du ikke bekymre dig om det, vi bruger det ikke).
  3. Vi bruger 32bytestil strenge i stedet for at bruge stringtypen. Vores EVM har en ordstørrelse på 32 byte, så den er "optimeret" til at håndtere data i stykker på 32 byte. (Compilere, såsom Solidity, skal udføre mere arbejde og generere mere bytecode, når data ikke er i stykker på 32 byte, hvilket effektivt fører til højere gasomkostninger.)
  4. Når en bruger stemmer, Voteroprettes en ny struktur og føjes til kortlægningen. For at tælle antallet af stemmer, en bestemt kandidat har, skal du løbe igennem alle vælgerne og tælle antallet af stemmer. Kandidater arbejder på samme adfærd. Således vil disse kortlægninger indeholde historien for alle kandidater og vælgere.

2. Instantiate web3 og kontrakter

Når vores Smart Contract er afsluttet, er vi nu nødt til at køre vores test blockchain og distribuere denne kontrakt på Blockchain. Vi har også brug for en måde at tale med det på, hvilket sker via web3.js.

Før vi starter vores test blockchain, skal vi oprette en fil, der hedder 2_deploy_contracts.jsinde i mappen, /contractsder fortæller, at den skal omfatte din Voting Smart Contract, når du migrerer.

For at starte udviklingen af ​​Ethereum blockchain skal du gå til din kommandolinje og køre:

truffle develop

Dette vil leve på din kommandolinje. Da soliditet er et kompileret sprog, skal vi først kompilere det til bytekode for EVM at udføre.

compile

Du skal se en build/mappe inde i din mappe nu. Denne mappe indeholder bygningsgenstande, som er kritiske for Truffles indre funktion, så rør ikke ved dem!

Dernæst skal vi migrere kontrakten. Migrations er et trøffelscript, der hjælper dig med at ændre tilstanden for din applikations kontrakt, mens du udvikler dig. Husk, at din kontrakt er distribueret til en bestemt adresse i Blockchain, så når du foretager ændringer, vil din kontrakt være placeret på en anden adresse. Migrationer hjælper dig med at gøre dette og hjælper dig også med at flytte data rundt.

migrate

Tillykke! Din smarte kontrakt er nu på Blockchain for evigt. Nå, ikke rigtig…. fordi truffle developopdateres hver gang du stopper det.

Hvis du gerne vil have en vedvarende blockchain, skal du overveje Ganache, som også er udviklet af Truffle. Hvis du bruger Ganache, behøver du ikke ringe truffle develop. I stedet løber du truffle compileog truffle migrate. For at forstå, hvad der virkelig kræves for at implementere en kontrakt uden Truffle, skal du tjekke dette blogindlæg.

Når vi har implementeret den smarte kontrakt i Blockchain, bliver vi nødt til at konfigurere en web3.0-instans med Javascript i browseren, når applikationen starter. Således placeres det næste stykke kode i bunden af js/app.js. Bemærk, at vi bruger web3.0 version 0.20.1.

Du behøver ikke rigtig bekymre dig for meget, hvis du ikke forstår denne kode. Bare ved, at dette køres, når applikationen starter, og vil kontrollere, om der allerede er en web3-forekomst (Metamask) i din browser. Hvis der ikke er det, opretter vi bare en, der taler med localhost:9545, hvilket er Truffle-udvikling blockchain.

Hvis du bruger Ganache, skal du ændre porten til 7545. Når en instans er oprettet, kalder vi startfunktionen (jeg definerer den i næste afsnit).

3. Tilføj funktionalitet

Den sidste ting, vi skal gøre er at skrive grænsefladen til applikationen. Dette involverer det væsentlige for enhver webapplikation –– HTML, CSS og Javascript (vi har allerede skrevet lidt af Javascript med oprettelse af en web3-forekomst). Lad os først oprette vores HTML-fil.

Dette er en meget enkel side med en inputformular til bruger-ID og knapper til at stemme og tælle stemmer. Når der klikkes på disse knapper, kalder de bestemte funktioner, der stemmer, og finder antallet af stemmer for kandidaterne.

Der er tre vigtige div elementer dog med id'er: candidate-box, msgog vote-box, som vil holde afkrydsningsfelter for hver kandidat, en meddelelse, og det antal stemmer, hhv. Vi importerer også JQuery, Bootstrap og app.js.

Nu skal vi bare interagere med kontrakten og implementere funktionerne til at stemme og tælle antallet af stemmer for hver kandidat. JQuery vil manipulere DOM, og vi bruger løfter, når vi foretager transaktioner eller opkald til Blockchain. Nedenfor er koden til app.js.

Bemærk, at koden, jeg angav i det forrige trin til oprettelse af en web3-forekomst, også er her. Først importerer vi de nødvendige biblioteker og webpack-ting, herunder web3 og trøfelkontrakter. Vi bruger Truffle Contracts, som er bygget oven på web3 til at interagere med Blockchain.

For at bruge det, vil vi hente de byggegenstande, der blev bygget automatisk, da vi udarbejdede den smarte afstemningsaftale og bruge dem til at oprette trøffelkontrakten. Endelig oprettede vi funktionerne i den globale variabel windowtil at starte appen, stemme på en kandidat og finde antallet af stemmer.

For faktisk at interagere med Blockchain skal vi oprette en forekomst af trøffelkontrakten ved hjælp af deployedfunktionen. Dette vil til gengæld returnere et løfte med forekomsten som den returværdi, som du vil bruge til at ringe til funktioner fra den smarte kontrakt.

Der er to måder at interagere med disse funktioner på: transaktioner og opkald. En transaktion er en skriveoperation, og den sendes til hele netværket og behandles af minearbejdere (og koster således Ether). Du skal udføre en transaktion, hvis du ændrer en tilstandsvariabel, da den vil ændre blockchain-tilstanden.

Et opkald er en læsning, der simulerer en transaktion, men kasserer ændringen i tilstand. Således koster det ikke Ether. Dette er fantastisk til at ringe til getter-funktioner (tjek de fire getter-funktioner, vi skrev tidligere i vores smarte kontrakt).

For at foretage en transaktion med trøflekontrakter skriver du instance.functionName(param1, param2)med instancesom den forekomst, der blev returneret af deployedfunktionen (Tjek linje 36 for et eksempel). Denne transaktion returnerer et løfte med transaktionsdataene som returværdi. Således, hvis du returnerer en værdi i din smarte kontraktfunktion, men du udfører en transaktion med den samme funktion, returnerer den ikke den værdi.

Dette er grunden til, at vi har en begivenhed, der logger, hvad du vil have den til at skrive i transaktionsdataene, der returneres. I tilfælde af linie 36–37 foretager vi en transaktion for at tilføje en kandidat. Når vi løser løftet, har vi transaktionsdataene inde result.

For at få den candidateIDat vi er logget med begivenheden AddedCandidate()(tjek smart kontrakt for at se det 0), må vi gå gennem logfiler og hente det på denne måde: result.logs[0].args.candidateID.

For virkelig at se, hvad der sker, skal du bruge Chrome-udviklerværktøjerne til at udskrive resultog se gennem dets struktur af result.

For at foretage et opkald skriver du instance.functionName.call(param1,param2). Men hvis en funktion har nøgleordet view, opretter trøffelkontrakter automatisk et opkald, og du behøver således ikke tilføje .call.

Derfor har vores getter-funktioner viewnøgleordet. I modsætning til at foretage en transaktion, vil det returnerede løfte om et opkald have en returværdi på det, der returneres af smart kontraktfunktionen.

Jeg vil nu forklare de 3 funktioner kort, men dette skal være meget velkendt, hvis du har bygget applikationer, der henter / ændrer data fra et datalager og manipulerer DOM i overensstemmelse hermed. Tænk på Blockchain som din database og Truffle Contracts som API for at få data fra din database.

App.start ()

Denne funktion kaldes straks efter vi opretter en web3-forekomst. For at få trøffelkontrakter til at fungere, skal vi indstille udbyderen til den oprettede web3-forekomst og indstille standardindstillinger (som hvilken konto du bruger og den mængde gas, du vil betale for at foretage en transaktion).

Da vi er i udviklingstilstand, kan vi bruge enhver mængde gas og enhver konto. Under produktionen tog vi den konto, der blev leveret af MetaMask, og forsøgte at finde ud af den mindste mængde gas, du kunne bruge, da det faktisk er rigtige penge.

Når alt er indstillet, viser vi nu afkrydsningsfelterne for hver kandidat, som brugeren kan stemme. For at gøre dette skal vi oprette en instans af kontrakten og få kandidatens oplysninger. Hvis der ikke er nogen kandidater, opretter vi dem. For at en bruger skal stemme på en kandidat, skal vi angive id for den pågældende kandidat. Således får vi hvert afkrydsningsfeltelement til at have en id(HTML-elementattribut) af kandidatens ID. Derudover tilføjer vi antallet af kandidater til en global variabel numOfCandidates, som vi vil bruge i App.findNumOfVotes(). JQuery bruges til at tilføje hvert afkrydsningsfelt og dets kandidatnavn til .candidate-box.

App.vote ()

Denne funktion stemmer for en bestemt kandidat baseret på hvilken afkrydsningsfelt der klikkes på og dens idattribut.

En, vi vil kontrollere, om brugeren har indtastet deres bruger-id, hvilket er deres identifikation. Hvis de ikke gjorde det, viser vi en besked, der beder dem om at gøre det.

To, vi vil kontrollere, om brugeren stemmer på en kandidat, kontrollere, om der er mindst et afkrydsningsfelt, der er klikket på. Hvis der ikke blev klikket på nogen af ​​afkrydsningsfelterne, viser vi også en besked, der beder dem om at stemme på en kandidat. Hvis der klikkes på en af ​​afkrydsningsfelterne, griber vi idattributten for det afkrydsningsfelt, som også er den sammenkædede kandidats ID, og ​​bruger det til at stemme på kandidaten.

Når transaktionen er gennemført, løser vi det returnerede løfte og viser en “Stemt” besked.

App.findNumOfVotes ()

Denne sidste funktion finder antallet af stemmer for hver kandidat og viser dem. Vi vil gennemgå kandidaterne og kalde to smarte kontraktfunktioner, getCandidateog totalVotes. Vi løser disse løfter og opretter et HTML-element til den pågældende kandidat.

Start nu applikationen, så ser du den på //localhost:8080/!

npm run dev

Ressourcer

Jeg ved, det er meget ... Du kan have denne artikel åben i et stykke tid, da du langsomt udvikler denne applikation og virkelig forstår, hvad der foregår. Men det er læring! Suppler denne vejledning med al dokumentation fra Ethereum, Truffle og hvad jeg har angivet nedenfor. Jeg har forsøgt at ramme mange af de vigtigste punkter i denne artikel, men det er bare en kort oversigt, og disse ressourcer vil hjælpe meget.

  • Alt om soliditet og smarte kontrakter - jeg mener alt
  • Alt om trøffel
  • Trøfelkontrakter Dokumenter
  • Web3 Javascript API- dette vil være dejligt at kende og henvise til, men trøfelkontrakter opsummerer mange dele af dette
  • Nyttige DApp-mønstre
  • Ethereum Docs - se på sidelinjen, og der er masser af ting
  • Forklaring til CryptoKitties-kode - Forfatteren gennemgår de vigtige dele af CryptoKitties 'smarte kontrakt
  • Bedste praksis for smart kontrakt- en skal læse

Konklusion

Bygning af applikationer på Ethereum ligner stort set en almindelig applikation, der kalder en backend-service. Den sværeste del er at skrive en robust og komplet smart kontrakt. Jeg håber, at denne guide hjalp dig med at forstå kerneviden om decentrale applikationer og Ethereum og vil hjælpe dig med at starte din interesse i at udvikle dem.

Hvis du gerne vil bygge videre på det, vi har bygget, er der nogle ideer. Jeg har faktisk skrevet den smarte kontrakt på en sådan måde, at den let implementeres med alt, hvad jeg har givet dig i denne vejledning.

  • Vis partiet for hver kandidat. Vi får allerede en kandidats parti, når vi kører getCandidate(id).
  • Kontroller, om det brugerindtastede id er unikt.
  • Spørg og gem flere oplysninger om en bruger, såsom deres fødselsdato og hjemmeadresse.
  • Tilføj en mulighed for at se, om en person med et bestemt id har stemt eller ej. Du opretter en ny formular til at indtaste et ID, som du derefter vil søge efter den bestemte bruger i blockchain.
  • Skriv en ny smart kontraktfunktion, der tæller stemmerne for BEGGE kandidater på én gang. I øjeblikket er vi nødt til at foretage to separate opkald til to kandidater, der kræver, at kontrakten løber gennem alle brugerne to gange.
  • Tillad, at nye kandidater tilføjes. Det betyder at tilføje en ny form for at tilføje kandidater, men også ændre lidt på, hvordan vi viser og stemmer på kandidater i frontend.
  • Kræv, at brugerne har en Ethereum-adresse for at stemme. Min logik for ikke at medtage brugeradresser er, at vælgere ikke forventes at have Ethereum til at deltage i denne afstemningsproces. Imidlertid vil mange DApps kræve, at brugerne har en Ethereum-adresse.

Her er også nogle tip, der kan forhindre, at nogle vejspærringer sker:

  • Dobbelt og tredobbelt tjek dine smarte kontraktfunktioner, når der sker noget underligt. Jeg brugte et par timer på en fejl for at finde ud af, at jeg returnerede den forkerte værdi i en af ​​mine funktioner.
  • Kontroller, om din URL og port er korrekte, når du opretter forbindelse til din udvikling blockchain. Husk: 7545er til truffle developog 9545er til Ganache. Disse er standardindstillinger, så hvis du ikke kan oprette forbindelse til din blockchain, har du muligvis ændret dem.
  • Jeg gik ikke over dette, fordi denne vejledning ville have været for lang, og jeg vil sandsynligvis lave et nyt indlæg om dette - men du bør teste dine kontrakter! Det vil hjælpe meget.
  • Hvis du ikke er fortrolig med løfter, skal du gennemgå, hvordan de fungerer, og hvordan du bruger dem. Truffle Contracts bruger løfter, og betaen til web3 understøtter også løfter. De kan, hvis du gør dem forkert, ødelægge en masse af de data, du henter.

Skål for at arbejde hen imod et decentralt og sikkert internet - Web 3.0!

Jeg håber du nød at læse denne vejledning lige så meget som jeg nød at skrive den! Hvis du har nogle tanker og kommentarer, er du velkommen til at efterlade en kommentar nedenfor eller e-maile mig på [email protected] eller tweet mig (jeg har for nylig oprettet en)! Du er velkommen til at bruge min kode og dele den med dine venner!