Smarta blockkedjekontrakt med Solidity · Lektion

Tillståndsvariabler och lagringslayout

Förstå skillnaden mellan storage, memory och calldata samt hur tillståndsvariabler bevaras på blockkedjan.

Lektion 1 av 412 steg

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.
  • memory används för tillfälliga data under körningen av en funktion.
  • calldata anvä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!

Gratis att börja

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

  1. Tillståndsvariabler och lagringslayout
  2. Mappings och dynamiska arrayer
  3. Händelser och dataloggning
  4. Lagringsplatser och gasoptimering
← Tillbaka till Smarta blockkedjekontrakt med Solidity