Sådan opretter du en notar på Ethereum blockchain - Del 2

Du opbygger en decentral app, der udsender officielle certifikater til Ethereum i denne tutorial

I del 1 oprettede vi en smart kontrakt til at repræsentere certifikater.

Lad os afslutte fabrikskontrakten med ansvar for implementering og styring af dine certifikatkontrakter. Til sidst bruger vi Next.js til at indpakke en enkel frontend for at gøre det muligt for enhver at oprette et certifikat på din DApp via en formular-brugergrænseflade:

Se en live demo af det endelige produkt på https://www.forevermore.io/

Lad os komme igang! Her er en grafisk gengivelse af, hvad vi gør.

Se del 1 om, hvordan man opretter certifikatkontrakter.

Trin 1 - Opret fabrikskontrakten

  1. Opret en MarriageNotary (eller MarriageFactory) kontrakt i den samme Marriage.sol-fil som din certifikatkontrakt:
pragma-soliditet ^ 0,4,19;
kontrakt ÆgteskabNotary {
    // AT GØRE
}
kontrakt ægteskab {...}

Specifikt vil denne fabrikskontrakt:

  • Opret ny certifikat smart kontrakt
  • Hold styr på en liste over tidligere oprettede certifikater

2. Lad os gemme listen over tidligere oprettede kontrakter i en række adresser. Denne arrayvariabel skal kunne ses offentligt af enhver, dvs. en frontindpakning, der giver tidligere certifikater.

adresse [] offentligt registreret ægteskaber;

Tip til bedste praksis:

  • Arrays er gode til indekserede opslag. I dette tilfælde er det nok til vores simple brugssag.
  • Hvis du har brug for at lukke over dine poster, er matriser dyre og ikke den bedste praksis. Hvis du har brug for et standard nøgleværdipar, skal du erstatte dine arrays med med kortlægninger i stedet.
  • Til sidst, i soliditet, kan du ikke få array.length. Så hvis du har brug for at tælle de samlede certifikater, som brugerne har oprettet, skal du oprette en ny global lagrings uint-variabel til at spore længden på arrays.

3. Derefter erklærer du en funktion til at oprette fremtidige ægteskabsbeviser. Brugere kalder selv denne funktion med detaljer som parretets navne og løfter.

funktion createMarriage (string _leftName, string _leftVows, string _rightName, string _rightVows, uint _date) offentlig {
}

4. Instant din nye ægteskabskontrakt, og gem adressen på den nyoprettede smarte kontrakt. Husk at skubbe adressen til dit antal registrerede mægteskaber.

funktion createMarriage (...) offentlig {
    adresse newMarriage = nyt Ægteskab (msg.sender, _leftName, _leftVows, _rightName, _rightVows, _date);
    
    // gemme adressen, så en front-end klient kan finde den
    registeredMarriages.push (newMarriage);
}

Lad os tænke på front-end-interaktionen et minut her. Når du opretter en ny ægteskabskontrakt, tager det tid, før den nye certifikatkontrakt skrives til blockchain.

Bemærk: createMarriage er en send () til blockchain, der "lover" at returnere sandt eller forkert, afhængigt af transaktionens succes. Det returnerer ingen værdier, som den nye kontraktadresse, til front-end-klienten. Din webklient kender således ikke øjeblikkeligt adressen efter at have sendt anmodningen createMarriage.
Da vi vil omdirigere brugere til denne nyoprettede kontrakt (via dens adresse), har vi brug for en (billig) måde for fabrikskontrakten at kommunikere til din klient, når dette "løfte" er løst.

5. Lad os få denne kontrakt til at udsende en begivenhed for at videresende denne meddelelse.

begivenhed ContractCreated (adresse contractAddress);
funktion createMarriage (...) offentlig {
    ...
    udsende ContractCreated (newMarriage);
    ...
}

Tip til bedste praksis:

  • Brug begivenheder som en "billig" form for opbevaring. Dette er nyttigt i Ethereum, hvor opbevaring er kostbar.
  • Brug begivenheder til at spore brugerhistorik eller bemærkelsesværdige øjeblikke, f.eks. Resultatet af et bud, eller det tilfælde, hvor nogle poster ændres på blockchain.
  • Begivenheder logges på netværket og kan frit ses af front-end. Dvs. se denne evigt begivenhed, hvor nogen ringede til min bryllupsklokke.
  • Selvom kontrakter udsender begivenheder, kan begivenheder ikke læses inde fra kontrakten. Det er beregnet til en ekstern klient.

6. Til sidst skal du levere en hjælperfunktion, så din webklient nemt kan hente alle certifikater oprettet af denne fabrik.

funktion getDeployedMarriages () returnerer offentlig visning (adresse []) {
 vende tilbage registreret;
}

Varsel:

  • Soliditet giver dig visningsfunktioner gratis til statiske datatyper. Dette er grunden til at du kan se et globalt uint uden en getUint () getter-funktion.
  • Dette gælder ikke for matriser. Du skal erklære din egen hentningsfunktion i dette tilfælde. Dette bør også hæve flag, som getArrays () muligvis ikke er en bedste praksis for arrays, der vil vokse eksponentielt.

Du har afsluttet den smarte kontraktprogrammeringsdel af denne tutorial! Godt klaret.

Trin 2 - Test og implementer dine kontrakter i Remix

Remix er en online IDE, der udarbejder, tester og distribuerer dine kontrakter til testnet gratis.

  1. Kopier og indsæt din kode på IDE.
  2. Skift til fanen Compiler, og løs eventuelle kompilationsfejl. Remix er fantastisk ved at pege både på problemet og lærer dig, hvordan du løser det. Hvis du er usikker på din kode på dette tidspunkt, bedes du henvise til dette snyderis.
  3. Skift til Run-tabellen, og sørg for, at miljøet er indstillet til Javascript VM. Dette distribuerer din kontrakt til en virtuel maskine i din browser i stedet for hovednet eller et testnetværk (som tager længere tid og kan koste penge).
  4. Vælg MarriageNotary i rullemenuen. Klik på distribution. Husk at du er afhængig af en fabrik for at oprette certifikaterne og ikke oprette dem for hånd!
  5. Se implementeringen lykkes :)
  6. Se alle tilgængelige metoder under MarriageNotary, inklusive funktionen til at oprette nye certifikater.

Din notar er nu på den virtuelle blockchain! Få det til at oprette et certifikat ved at skrive inde i createMarriage-funktionen:

"Rick", "Få shwiftayyy", "Morty", "Ingen findes med vilje", 1532706206

Varsel:

  • Dato gemmes med et uint, så brug en epok-konverter
  • Glem ikke at strenge tekstinput, Remix er strengt om dette
  1. Find contractAddress i konsollen, som du bekvemt udsendte i WeddingNotarys begivenheder
  2. Vælg Ægteskab i rullemenuen
  3. Indsæt kontraktadressen, og klik på Adresse for at hente forekomsten af ​​din nyoprettede Ægteskabskontrakt
  4. Rul ned for at se en liste over tilgængelige funktioner og data i Ægteskabskontrakt
  5. Hvis du klikker på LeftVows, skal du nu "få shwiftayyy"

Din notar har indsendt et certifikat til den virtuelle blockchain!

Trin 3 - Distribuer din DApp til Ethereum

Næste UI-udgivelse til Forevermore.io - nogen bidragydere?

Hvis du vil distribuere dine kontrakter til Ethereum uden UI, kan du bare bruge Remix. Dette anbefales til en hurtig, kontrakt kun implementering. Skift blot dit miljø til Injiceret Web3 og sørg for, at din Metamask-konto har nok Ether til at gennemføre implementeringstransaktionen.

For at implementere din kontrakt med et ledsagende websted er der et par muligheder:

  1. Brug trøfle: anbefales til fuld DApp-installation uden for mange configs
  2. Brug codebase forevermore: anbefales, hvis du vil tilpasse denne DApp yderligere og gøre den til din egen. Det indeholder et brugerdefineret compile script og implementering af README.

Bemærk:

Forevermore er på Next.js, som er en React-ramme, der håndterer server-rendering. Next.js betragtes som meget kompatibel med Web3, de-facto Ethereum javascript API.

De fulde instruktioner til opsætning af den fulde DApps afhængigheder findes i denne README. Venligst gaffel det og indsend eventuelle problemer til dets open source bidragydere her.

Ønsker mere?

  • Vi begynder en serie, der underviser i Ethereum-sikkerhed og de bedste designprincipper næste. Følg os og hold dig tunet.

credits

  • Tjek den endelige app her og det komplette open source-projekt her.
  • Kreditter: Daniel (par-koder), Stephen (selvstudier)