Quando si guardano i contratti di esempio, a volte gli array vengono dichiarati in metodi con "memoria" e talvolta non lo sono. Qual è la differenza?In Ethereum Solidity, qual è lo scopo della parola chiave "memoria"?
risposta
Senza la memoria parola chiave , Solidità cerca di dichiarare le variabili in stoccaggio.
Lead Solidity dev chriseth: "Si può pensare allo storage come a un array di grandi dimensioni che ha una struttura virtuale ... una struttura che non è possibile modificare in fase di esecuzione, è determinata dalle variabili di stato nel contratto".
In altre parole, la struttura della memoria viene impostata su pietra al momento della creazione del contratto in base alle dichiarazioni delle variabili a livello di contratto e non può essere modificata da future chiamate di metodo. MA - il contenuto di tale archivio può essere modificato con le chiamate sendTransaction. Tali chiamate cambiano "stato", motivo per cui le variabili a livello di contratto sono chiamate "variabili di stato". Quindi una variabile uint8 storagevar; dichiarato a livello di contratto può essere cambiato in qualsiasi valore valido di uint8 (0-255) ma quello "slot" per un valore di tipo uint8 sarà sempre lì.
Se si dichiarano variabili in funzioni senza la parola chiave memoria, la solidità proverà a utilizzare la struttura di archiviazione, che attualmente compila, ma può produrre risultati imprevisti. memoria dice solidity per creare un blocco di spazio per la variabile al runtime del metodo, garantendo le sue dimensioni e la struttura per l'utilizzo futuro in tale metodo.
memoria non può essere utilizzato a livello di contratto. Solo nei metodi.
Vedere lo the entry "What is the memory keyword? What does it do?" nelle Domande frequenti. Lo cito qui:
La macchina virtuale di Ethereum ha tre aree in cui è possibile memorizzare gli articoli.
Il primo è "archiviazione", dove risiedono tutte le variabili di stato del contratto. Ogni contratto ha una propria memoria ed è persistente tra le chiamate di funzione e piuttosto costoso da usare.
Il secondo è "memoria", utilizzato per contenere valori temporanei. Viene cancellato tra chiamate di funzione (esterne) ed è più economico da usare.
Il terzo è lo stack, utilizzato per contenere piccole variabili locali. È quasi gratis da usare, ma può contenere solo una quantità limitata di valori.
Per quasi tutti i tipi, non è possibile specificare dove devono essere memorizzati, poiché vengono copiati ogni volta che vengono utilizzati.
I tipi in cui la cosiddetta posizione di memoria è importante sono le strutture e gli array. Se ad es. passare tali variabili nelle chiamate di funzione, i loro dati non vengono copiati se possono rimanere in memoria o rimanere in memoria. Ciò significa che è possibile modificare il loro contenuto nella funzione chiamata e queste modifiche saranno comunque visibili nel chiamante.
Ci sono predefiniti per la posizione di memoria a seconda del tipo di variabile riguarda:
- variabili di stato sono sempre in deposito
- argomenti della funzione sono sempre in memoria
- variabili locali di struct, matrice o l'archiviazione di riferimento del tipo di riferimento per impostazione predefinita
- le variabili locali di tipo valore (ovvero né matrice, né struct né mapping) vengono memorizzate nello stack
- 1. Qual è lo scopo della parola chiave `external` in Kotlin?
- 2. Qual è lo scopo della parola chiave volatile in C#?
- 3. Qual è lo scopo della parola chiave "base" in C#?
- 4. Qual è lo scopo della parola chiave 'volatile' in C#
- 5. Qual è lo scopo della parola chiave SQL "AS"?
- 6. Scala: qual è lo scopo dell'override
- 7. Qual è lo scopo della lente unita?
- 8. Qual è lo scopo della serratura?
- 9. Qual è lo scopo della classe Expression?
- 10. Qual è lo scopo della dichiarazione anticipata?
- 11. Qual è l'uso della parola chiave volatile?
- 12. Qual è lo scopo della finalizzazione in Java?
- 13. ruby: qual è il significato della parola chiave "in"
- 14. Qual è lo scopo della denominazione dei vincoli
- 15. Scopo della parola chiave 'instancetype' nei metodi 'objectWith'?
- 16. Qual è lo scopo di. * \\?
- 17. Qual è lo scopo di ClassName.questo oltre la disambiguazione?
- 18. Qual è lo scopo della tabella di collegamento della procedura?
- 19. Qual è lo scopo della Tupla (T1)/Singleton in .net?
- 20. Qual è lo scopo della classe Applicaton in Android
- 21. Qual è lo scopo della proprietà "privato" in package.json?
- 22. Qual è lo scopo della trasmissione in tipo "oggetto"?
- 23. Java: Qual è lo scopo della setDoInput in URLConnection
- 24. Qual è lo scopo della serializzazione in Java?
- 25. Qual è lo scopo della struttura delle bandiere in iOS?
- 26. Qual è lo scopo della classe TestExecution in MSTest?
- 27. Qual è l'uso della parola chiave `default` in C#?
- 28. Qual è l'equivalente VB.NET della parola chiave C# "è"?
- 29. Qual è lo scopo di :: in C#?
- 30. Qual è lo scopo di $ in XSLT
Hai qualche link ai documenti che lo spiegano? Mi piacerebbe leggere un po 'di più su come funziona lo storage. – Acapulco
@Acapuclo È nelle domande frequenti "Qual è la parola chiave della memoria? Che cosa fa?" – bortzmeyer