Soliditate Ethereum: memorie vs spațiu de stocare și modul de inițializare a unui tablou în cadrul unei structuri

În Telegramul rețelei de loom (care are aproximativ 8.000 de membri!), Oamenii pun întrebări pe diverse teme, cum ar fi foaia de parcurs a lui Loom, întrebări teoretice și blocuri Ethereum și soluționarea problemelor de soliditate.

A fost pusă o întrebare specifică, care a implicat inițializarea unui tablou în cadrul unei structuri. Persoana care l-a întrebat a furnizat apoi codul său, întrebându-se de ce nu funcționează. Nu mă puteam gândi la un răspuns din partea de sus a capului, așa că am decis să vorbesc pe scurt despre acest subiect într-o postare.

Codul care nu funcționează poate fi găsit mai jos. Vă încurajez să încercați să găsiți o soluție singură (ați practicat pe CryptoZombies tot timpul acesta, nu-i așa?).

Citiți mai departe pentru a găsi răspunsul.

Trebuie remarcat faptul că în fișa de mai sus, memoria de cuvinte cheie este necesară la declararea camerei variabile. Dacă ar fi declarat cameră cameră, compilatorul va returna următoarea eroare:

TypeError: Type struct StructArrayInitWrong.Room memoria nu este implicit convertibilă la tipul de structură tip StructArrayInitWrong.Room indicatorul de stocare.

Unele teorii

Variabilele de stocare ale unui contract sunt cele care definesc starea contractului dvs. și sunt modificate numai prin apeluri de tranzacție send [1].

variabilele de memorie sunt variabile temporare care există doar în interiorul funcției de apelare (nu pot fi declarate în afara uneia). Se șterg după ieșirea funcției și sunt în general mai ieftine de utilizat decât variabilele de stocare - mai multe detalii despre costurile de gaz aici.

Să parcurgem un exemplu pentru a înțelege modul în care o variabilă de stocare poate fi utilizată într-o funcție pentru a afecta starea unui contract.

În fiddle de mai jos, o copie a lui x este trecută în g () ca și astfel variabila de stare x va rămâne nemodificată după executare (de aceea folosim cuvântul cheie pur.

Pe de altă parte, y în h () este declarat ca stocare, ceea ce înseamnă că x este trecut de referință. Ca urmare, variabila de stare x este modificată după apelul la h ().

Puteți testa rezultatul apelând f () și apoi inspectând valoarea y [2]. Chiar dacă g () este numit după h (), nu modifică valoarea variabilei de stat.

Teoretizând suficient, să trecem la răspunsul la întrebarea inițială.

Întrucât nu reușim să inițializăm tabloul de jucători la inițializarea structurii, suntem obligați să facem acest lucru în pași:

  1. Inițializează structura camerei la valori implicite cu un tablou de jucători goi - așa cum este descris aici și în acest joc.
  2. Împingeți camera spre gama de camere.
  3. Apăsați msg.sender la tabloul de jucători din ultima cameră (rooms.length-1 se referă întotdeauna la ultimul element dintr-un tablou).

Cod de lucru Fiddle de mai jos:

Trucul aici este faptul că noua adresă [] (0) alocă memorie pentru o gamă goală de adrese. După inițializare, camera este adăugată în camere și acum face parte dintr-o variabilă de stocare. Acest lucru ne permite să acționăm pe jucătorii matrice și să împingem valori către acesta.

Notă: Dacă am face un nou uint [] (8) am primi o serie de 8 zerouri. Îl poți testa în acest joc.

Asta este totul pentru ziua de azi, sperăm că am eliminat unele neînțelegeri cu privire la stocare / memorie și cum să le utilizăm în funcțiile tale. Vă rugăm să ne informați despre întrebările dvs. de pe canalul nostru Telegram și dacă acestea nu pot fi răspuns la câteva mesaje, vom dedica o postare asupra lui (sau poate o lecție CryptoZombies!)

Loom Network este platforma blockchain la alegere pentru dezvoltatorii serioși de dapp - Universal Layer 2 care oferă dezvoltatorilor instrumentele de care au nevoie pentru a construi dapps-uri funcționale pentru utilizatori astăzi.

Nou pentru Loom? Începe aici.

Doriți să vă mizați tokenele LOOM și să ajutați la securizarea rețelei de loom? Afla cum.

Și dacă v-a plăcut acest articol și doriți să rămâneți la curent, mergeți mai departe și înscrieți-vă pe lista noastră de mailuri private.