Grundlæggende udvikling af Web3- og DApp-programmer · Lektion

Konstanter og immutables

Gas-effektive værdier

Lektion 4 af 413 trin

Konstanter og immutables er en gratis Grundlæggende udvikling af Web3- og DApp-programmer-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Grundlæggende udvikling af Web3- og DApp-programmer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Grundlæggende udvikling af Web3- og DApp-programmer-kurset indeholder 4 lektioner i alt.

Faste værdier sparer gas

Nogle værdier ændres aldrig, efter at en kontrakt er deployet. Til disse værdier tilbyder Solidity nøgleordene constant og immutable, som gemmer værdien i kontraktens bytekode i stedet for i dyre storage-slots.

Brug af dem reducerer gasforbruget og tydeliggør hensigten for læserne.

Deklaration af konstanter

En constant skal tildeles på deklarationstidspunktet og være kendt ved kompilering. Dens værdi kan aldrig ændres.

Efter konvention bruger konstanter navne med STORE_BOGSTAVER.

<code>uint256 public constant MAX_SUPPLY = 1000000;
string public constant NAME = 'MyToken';</code>

Sådan fungerer konstanter

En constant optager ikke en storage-slot. Compileren indsætter dens værdi alle de steder, hvor den bruges, så det næsten ikke koster noget at læse den.

Det gør konstanter ideelle til konfiguration som antal decimaler, grænser og faste gebyrer.

<code>uint8 public constant DECIMALS = 18;

function unit() public pure returns (uint256) {
    return 10 ** DECIMALS; // inlined at compile time
}</code>

Deklaration af immutable-værdier

En immutable-variabel sættes én gang, enten ved deklarationen eller i konstruktøren, og kan derefter aldrig ændres.

I modsætning til konstanter kan dens værdi afhænge af runtime-data som deployeringsargumenter.

<code>address public immutable owner;

constructor() {
    owner = msg.sender; // set at deploy time
}</code>

Constant kontra immutable

Den afgørende forskel er hvornår værdien fastlægges:

  • constant – fastlægges på kompileringstidspunktet og skal være et bogstaveligt udtryk
  • immutable – fastlægges på implementeringstidspunktet og kan bruge input fra konstruktøren

Begge gemmes i bytekoden og ikke i lagerpladser.

Immutable med konstruktørargumenter

Immutables er særligt nyttige, når hver implementering har brug for forskellige faste parametre, f.eks. et tokens samlede udbud eller adressen på en tilknyttet kontrakt.

<code>uint256 public immutable cap;

constructor(uint256 _cap) {
    cap = _cap; // unique per deployment
}</code>

Gasbesparelser

Hvis du læser en almindelig tilstandsvariabel, kræver det en SLOAD (læsning fra lageret), hvilket er dyrt. Konstanter og immutables læses direkte fra bytekoden, hvilket er langt billigere.

At konvertere fast konfiguration, der læses ofte, til constant/immutable er en nem optimering.

<code>// Expensive: storage read each call
uint256 public feeStorage = 100;

// Cheap: read from bytecode
uint256 public constant FEE = 100;</code>

Hvad kan ikke være constant

En constant må ikke afhænge af noget, der beregnes under kørsel. Værdier som block.timestamp, msg.sender eller læsninger fra lageret er ikke tilladt for konstanter.

Brug i stedet immutable til disse værdier.

<code>// ERROR: not compile-time known
// uint256 constant T = block.timestamp;

// OK as immutable
uint256 immutable deployedAt;
constructor() { deployedAt = block.timestamp; }</code>

Immutables er skrivebeskyttede

Når konstruktøren er færdig, kan en immutable aldrig tildeles en ny værdi. Ethvert forsøg på at skrive til den uden for konstruktøren giver en kompileringsfejl.

<code>address public immutable factory;
constructor(address f) { factory = f; }

function change(address x) public {
    // factory = x; // ERROR: cannot assign
}</code>

Almindelige anvendelser

Typiske mønstre:

  • constant til tokens decimaler, grænser for maksimalt udbud og faste gebyrsatser
  • immutable til ejeren, implementeringstidspunktet og adresser på tilknyttede kontrakter

Begge forbedrer tydeligheden og reducerer gasforbruget sammenlignet med foranderlig tilstand.

<code>uint8 public constant DECIMALS = 18;
address public immutable deployer;
constructor() { deployer = msg.sender; }</code>

Navngivningskonvention

Efter en udbredt konvention skrives navne på constant med UPPER_SNAKE_CASE, mens navne på immutable ofte bruger almindelig camelCase eller en indledende understregning for konstruktørparametre.

Konsekvent navngivning gør audits hurtigere.

<code>uint256 public constant MAX_HOLDERS = 500;
address public immutable treasury;</code>

Hurtig kontrol

Test din forståelse af konstanter og immutables.

Opsummering

Du har lært om gasbesparende faste værdier:

  • constant – bogstavelig værdi på kompileringstidspunktet, indsat direkte i bytekoden, UPPER_CASE
  • immutable – angives én gang på implementeringstidspunktet (ofte i konstruktøren) og er derefter skrivebeskyttet
  • Begge undgår dyre læsninger fra lageret (SLOAD)

Brug konstanter til kendte bogstavelige værdier og immutables til konfiguration, der varierer fra implementering til implementering.

Gratis at komme i gang

Lær Grundlæggende udvikling af Web3- og DApp-programmer med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
29
Lektioner
105

Ofte stillede spørgsmål

Er lektionen “Konstanter og immutables” gratis?

Ja — alle 3 lektioner i læringssporet Grundlæggende udvikling af Web3- og DApp-programmer, inklusive “Konstanter og immutables”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Grundlæggende udvikling af Web3- og DApp-programmer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Konstanter og immutables”?

Gas-effektive værdier Du øver dig i Grundlæggende udvikling af Web3- og DApp-programmer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Grundlæggende udvikling af Web3- og DApp-programmer?

Der kræves ingen tidligere erfaring. Grundlæggende udvikling af Web3- og DApp-programmer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Konstanter og immutables”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Grundlæggende udvikling af Web3- og DApp-programmer-lektion?

Ja. Alle Grundlæggende udvikling af Web3- og DApp-programmer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Værdityper
  2. Referencetyper
  3. Storage kontra memory
  4. Konstanter og immutables
← Tilbage til Grundlæggende udvikling af Web3- og DApp-programmer