Tillståndsvariabler och lagringslayout
Förstå skillnaden mellan storage, memory och calldata samt hur tillståndsvariabler bevaras på blockkedjan.
Tillståndsvariabler och lagringslayout är en gratis lektion i Smarta blockkedjekontrakt med Solidity på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Smarta blockkedjekontrakt med Solidity, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Smarta blockkedjekontrakt med Solidity innehåller totalt 4 lektioner.
Vad är tillståndsvariabler?
Välkommen till en genomgång av hur data lagras på blockkedjan! I Solidity är tillståndsvariabler särskilda variabler vars värden lagras permanent i kontraktets lagring på blockkedjan.
Tänk på dem som det smarta kontraktets beständiga minne. Värdena sparas även efter att en funktion har slutfört sin körning och mellan olika transaktioner.
Datalägen i Solidity
Solidity använder olika datalägen för att hantera var information lagras under kontraktets körning. Dessa lägen påverkar gaskostnaderna och hur variablerna fungerar.
storage: Permanent tillstånd på blockkedjan.memory: Tillfälliga data för funktionskörning.calldata: Skrivskyddade data för externa funktionsargument.
Fördjupning i `storage`
Variabler som deklareras på kontraktsnivå (utanför alla funktioner) tilldelas automatiskt storage. Dessa är kontraktets tillståndsvariabler.
Data i storage är dyr att ändra eftersom varje förändring skrivs till blockkedjan, vilket gör den permanent och oföränderlig (i den meningen att historiken inte kan ändras).
`storage` i praktiken
Det här kontraktet lagrar ett tal i en tillståndsvariabel. Observera hur myNumber behåller sitt värde mellan anropen till setNumber och getNumber.
pragma solidity ^0.8.0;
contract StorageExample {
uint public myNumber; // This is a state variable, lives in storage
function setNumber(uint _num) public {
myNumber = _num;
}
function getNumber() public view returns (uint) {
return myNumber;
}
}Förstå `memory`
memory är ett tillfälligt dataläge. Det används för variabler som bara existerar under ett funktionsanrop och kasseras när funktionskörningen är klar.
Det är billigare än storage för tillfälliga data, vilket gör det idealiskt för arrayer, strängar eller structs som skapas och används i en enda funktion.
`memory` i praktiken
Den här funktionen skapar en sträng i memory, ändrar den och returnerar den. Strängen finns bara under tiden funktionsanropet pågår.
pragma solidity ^0.8.0;
contract MemoryExample {
function greet(string memory _name) public pure returns (string memory) {
string memory greeting = "Hello, ";
// Use abi.encodePacked for simple string concatenation
return string(abi.encodePacked(greeting, _name, "!"));
}
}Introduktion till `calldata`
calldata är en särskild skrivskyddad dataplats som endast används för parametrar till externa funktioner. Den är till och med billigare än memory, eftersom data inte kopieras till minnet utan endast refereras.
Ni kan inte ändra calldata. Den används vanligtvis för stora datamängder som skickas till externa funktioner och sparar gas genom att undvika kopior.
`calldata` i praktiken
Den här externa funktionen tar emot en sträng som calldata. Observera att den är skrivskyddad och effektiv vid externa anrop.
pragma solidity ^0.8.0;
contract CalldataExample {
// This function can only be called externally
function processData(bytes calldata _data) external pure returns (uint) {
// You cannot modify _data directly, but can read its properties
return _data.length; // Returns the byte length of the data
}
// Another example returning calldata directly
function echoString(string calldata _message) external pure returns (string calldata) {
return _message;
}
}Jämförelse av datalokationer
Det är avgörande att välja rätt dataplats för att optimera gasförbrukningen och få kontraktet att fungera korrekt:
- Storage: Permanent, dyr och används för kontraktets tillstånd.
- Memory: Tillfällig, billigare och används för variabler inom en funktion.
- Calldata: Skrivskyddad, billigast och används för argument till externa funktioner.
Använd alltid det mest begränsade och billigaste alternativet som är möjligt.
Så är storage organiserat
Solidity packar tillståndsvariabler i 256-bitars (32-byte) storage-slots för att spara utrymme och gas. Mindre typer, till exempel uint8 och bool, kan packas tillsammans i samma slot.
Den här packningen kan dock vara komplex och beror på ordningen på variabeldeklarationerna. Genom att förstå den kan ni optimera gaskostnaderna, särskilt för structs och arrayer.
Frågesport om datalokationer
Vilken dataplats används för permanent lagring av ett kontrakts tillståndsvariabler på blockkedjan?
Sammanfattning av datalokationer
Bra jobbat! Ni har lärt er om de grundläggande datalokationerna i Solidity: storage, memory och calldata.
- Tillståndsvariabler lagras i
storage, vilket gör dem beständiga. memoryanvänds för tillfälliga data under körningen av en funktion.calldataanvänds för effektiva, skrivskyddade argument till externa funktioner.
Genom att förstå detta kan ni skriva effektivare och mer korrekta smarta kontrakt. Nästa steg är att utforska komplexa datastrukturer som Mappings och Dynamic Arrays!
Lär dig Smarta blockkedjekontrakt med Solidity med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Tillståndsvariabler och lagringslayout” gratis?
Ja – hela texten till ”Tillståndsvariabler och lagringslayout” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Smarta blockkedjekontrakt med Solidity, kan Ni uppgradera till CoddyKit PRO. Kursen i Smarta blockkedjekontrakt med Solidity innehåller totalt 4 lektioner.
Vad lär jag mig i ”Tillståndsvariabler och lagringslayout”?
Förstå skillnaden mellan storage, memory och calldata samt hur tillståndsvariabler bevaras på blockkedjan. Ni övar på Smarta blockkedjekontrakt med Solidity med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Smarta blockkedjekontrakt med Solidity?
Du behöver inga förkunskaper. Utbildningen i Smarta blockkedjekontrakt med Solidity på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Tillståndsvariabler och lagringslayout”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Smarta blockkedjekontrakt med Solidity-lektionen?
Ja. Varje Smarta blockkedjekontrakt med Solidity-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Tillståndsvariabler och lagringslayout
- Mappings och dynamiska arrayer
- Händelser och dataloggning
- Lagringsplatser och gasoptimering