Ethereum Solidity: Memorija u odnosu na pohranu i kako inicijalizirati niz unutar strukture

U Telegramu tvrtke Loom Network (koji broji oko 8000 članova!) Ljudi postavljaju pitanja o raznim temama kao što su Loomova mapa puta, teorijska pitanja o blockchain-u i Ethereumu i rješavanje problema Solidity-a.

Postavljeno je određeno pitanje koje je uključivalo inicijalizaciju niza u strukturi. Osoba koja ga je tada zatražila, dostavila im je šifru, pitajući se zašto to ne radi. Nisam se mogao sjetiti odgovora od vrha glave pa sam odlučio da o ovoj temi kratko porazgovaram u postu.

Neradni kod možete pronaći u nastavku. Preporučujem vam da pokušate sami pronaći rješenje (vi ste sve vrijeme vježbali na CryptoZombies-u, zar ne?).

Pročitajte da biste pronašli odgovor.

Treba napomenuti da je u gornjoj rečenici potrebna memorija ključnih riječi pri proglašenju varijable. Ako je proglašena kao Soba soba, prevodilac će vratiti sljedeću pogrešku:

TypeError: Type struktura StructArrayInitWrong.Room memorija ne može se implicitno pretvoriti u očekivani tip strukture StructArrayInitWrong.Room pokazivač za pohranu.

Neka teorija

Varijable za pohranu u ugovoru su one koje definiraju stanje vašeg ugovora i mijenjaju se samo pozivom sendTransaction [1].

memorijske varijable su privremene varijable koje postoje samo unutar pozivne funkcije (ne mogu se deklarirati izvan jedne). Oni se brišu nakon što funkcija prestane i općenito ih je jeftinije od varijabli skladištenja - više detalja o troškovima plina možete pronaći ovdje.

Pogledajmo primjer kako bismo razumjeli kako se varijabla za pohranu može upotrijebiti u funkciji kako bi utjecala na stanje ugovora.

U nastavku, kopija x će se proslijediti u g (), a time će i varijabla stanja x nakon izvršenja ostati nepromijenjena (zato koristimo čistu ključnu riječ.

S druge strane, y in h () je deklariran kao skladištenje, što znači da je x proslijeđen referencom. Kao rezultat toga, varijabla stanja x se mijenja nakon poziva na h ().

Rezultat možete testirati pozivanjem f () i zatim uvidom u vrijednost y [2]. Iako se g () poziva nakon h (), ne mijenja vrijednost varijable stanja.

Dovoljno teoretiziramo, dođimo do odgovora na početno pitanje.

Kako nismo u mogućnosti pokrenuti niz igrača prilikom inicijalizacije strukture, prisiljeni smo na to u koracima:

  1. Inicijalizirajte strukturu sobe na zadane vrijednosti s praznim nizom igrača - kao što je opisano ovdje i u ovom slovima.
  2. Potisnite sobu na niz soba.
  3. Pritisnite msg.sender na niz igrača igrača zadnje sobe (rooms.length-1 uvijek se odnosi na posljednji element u nizu).

Skripta radnog koda dolje:

Trik je u tome što nova adresa [] (0) dodjeljuje memoriju za prazan niz adresa. Nakon inicijalizacije, soba se dodaje sobama i sada je dio varijable za pohranu. To nam omogućava rad s array igračima i pritiskom na njih vrijednosti.

Napomena: Ako smo napravili novu uint [] (8), dobili bismo niz od 8 nula. Možete ga testirati u ovoj zagonetki.

To je sve za danas, nadam se da smo riješili neke nesporazume u vezi s pohranom / memorijom i kako ih koristiti u svojim funkcijama. Obavijestite nas o vašim pitanjima na našem Telegram kanalu, a ako na njih ne možete odgovoriti u nekoliko poruka, posvetit ćemo vam post (ili možda lekciju CryptoZombies!)

Loom Network je blockchain platforma izbora za ozbiljne programere dapp - Universal Layer 2 koji programerima pruža alate potrebne za izgradnju funkcionalnih dapova koji su okrenuti korisniku danas.

Novo je za Loom? Započni ovdje.

Želite uložiti svoje LOOM tokene i pomoći u sigurnoj mreži Loom-a? Saznajte kako.

A ako ste uživali u ovom članku i želite ostati u petlji, nastavite i prijavite se za našu privatnu poštu.