Web3:n ja DApp-sovellusten kehityksen perusteet · Oppitunti

Gas-kulutuksen optimointitekniikat

Opitte strategioita gas-tehokkaan Solidity-koodin kirjoittamiseen, transaktiokustannusten pienentämiseen ja DApp-sovellusten suorituskyvyn parantamiseen lohkoketjussa.

Oppitunti 3/311 vaihetta

Gas-kulutuksen optimointitekniikat on ilmainen Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Web3:n ja DApp-sovellusten kehityksen perusteet-kurssilla on yhteensä 3 oppituntia.

Miksi gas-optimointi on tärkeää

Tervetuloa DApp-sovellusten tietoturvaa ja auditointia käsittelevän kokonaisuuden viimeiseen oppituntiin! Tänään opitte hallitsemaan gas-optimointitekniikat.

Gas on maksu, joka maksetaan tapahtumien suorittamisesta Ethereum-verkossa. Se on kuin auton polttoaine.

  • Kustannusten pienentäminen: Pienemmät gas-maksut tarkoittavat käyttäjille edullisempia tapahtumia.
  • Suorituskyky: Optimoidut sopimukset suoritetaan nopeammin.
  • Käyttäjäkokemus: Parempi suorituskyky tekee käyttäjät tyytyväisemmiksi ja DApp-sovellusten käytöstä sujuvampaa.

Gas-kustannusten ymmärtäminen

Jokainen Ethereum Virtual Machinen (EVM) suorittama toiminto maksaa tietyn määrän gasia. Monimutkaisemmat toiminnot maksavat enemmän.

Kun otatte älysopimuksen käyttöön tai käytätte sitä, maksatte gasia seuraavista:

  • Tietojen tallentaminen lohkoketjuun (kalleinta).
  • Laskutoimitusten suorittaminen.
  • Etherin lähettäminen.

Tavoitteemme on kirjoittaa koodia, joka käyttää mahdollisimman vähän näitä kalliita toimintoja.

Tallennustila vs. muisti vs. calldata

Tietojen tallennuspaikan ymmärtäminen on olennaista gasin säästämiseksi. Jokaisella sijainnilla on erilaiset kustannukset:

  • Storage: Pysyvä tallennus ketjussa. Kallein lukea ja kirjoittaa (SSTORE/SLOAD).
  • Memory: Väliaikainen tallennus, joka on olemassa vain funktion suorituksen ajan. Edullisempi kuin storage.
  • Calldata: Muuttumaton, vain luettavissa ja väliaikainen. Sitä käytetään ulkoisten funktioiden argumenteille. Edullisin vaihtoehto ulkoisille syötteille.

Suosikaa muuttujille calldata- tai memory-sijaintia, jos niiden ei tarvitse säilyä ketjussa.

Tallennuskirjoitusten minimointi (SSTORE)

Tallennustilaan kirjoittaminen (SSTORE) on yksittäinen kallein toiminto Solidityssä. Kysykää aina: tarvitseeko tämä muuttuja todella tallentaa ketjuun?

Sen sijaan, että päivittäisitte tallennustilassa olevaa laskuria jokaisella iteraatiolla, laskekaa arvo kerran lopussa tai käyttäkää tapahtumia muutosten kirjaamiseen.

Tarkastellaan yksinkertaista esimerkkiä:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract StorageCostExample {
    uint256 public counter;

    // High gas cost: writes to storage every call
    function incrementBad() public {
        counter++;
    }

    // Lower gas cost: only reads state
    function getCounter() public view returns (uint256) {
        return counter;
    }
}

Tallennusmuuttujien pakkaaminen

Solidity tallentaa muuttujat 256-bittisiin (32-tavun) ”slotteihin”. Jos määrittelette useita muuttujia, jotka mahtuvat yhteen slottiin, ne voidaan ”pakata” yhteen, mikä säästää gasia.

Esimerkiksi kolme uint8-muuttujaa vie vähemmän tallennustilaa kuin kolme uint256-muuttujaa, jos ne määritellään peräkkäin. Tämä vähentää SSTORE-operaatioiden määrää.

  • Määritelkää mahdollisuuksien mukaan pienempiä tietotyyppejä (esim. uint8, bool).
  • Ryhmitelkää samankokoiset muuttujat yhteen.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract StoragePacking {
    // These will likely pack into one slot
    uint8 public value1;
    bool public isActive;
    uint8 public value2;

    // This will take a separate slot
    address public owner;

    function setValues(uint8 _v1, bool _active, uint8 _v2) public {
        value1 = _v1;
        isActive = _active;
        value2 = _v2;
    }
}

Ehtojen oikosulkuarviointi

Kun käytätte loogisia operaattoreita, kuten && (AND) tai || (OR), Solidity käyttää niin sanottua oikosulkuarviointia. Tämä tarkoittaa, että ehtojen arviointi lopetetaan heti, kun tulos on selvillä.

Voitte säästää gasia sijoittamalla ensin edullisemman, todennäköisemmin epäonnistuvan tai todennäköisemmin todeksi osoittautuvan ehdon.

  • &&-operaatiossa sijoittakaa ensin ehto, joka on todennäköisimmin false.
  • ||-operaatiossa sijoittakaa ensin ehto, joka on todennäköisimmin true.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ShortCircuitExample {
    uint256 public data = 100;

    function checkCondition(uint256 _input) public view returns (bool) {
        // Cheaper check (input) before more expensive check (storage read)
        return (_input > 0 && data > 50); 
    }
}

Tehokkaat silmukat ja iteraatiot

Silmukat voivat kuluttaa paljon gasia, etenkin jos niissä käydään läpi suuria storageen tallennettuja taulukoita. Välttäkää mahdollisuuksien mukaan rajoittamattomia silmukoita tai storagessa olevien dynaamisten taulukoiden läpikäyntiä.

  • Käsitelkää tiedot ketjun ulkopuolella, jos mahdollista.
  • Käyttäkää kiinteän kokoisia taulukoita dynaamisten sijaan, jos koko on tiedossa.
  • Muokatkaa logiikkaa niin, että silmukoita ei tarvita tai iteraatioiden määrä vähenee.
  • Harkitkaa nostopyyntöihin perustuvaa järjestelmää sen sijaan, että maksut lähetettäisiin monille vastaanottajille yhdessä tapahtumassa.

`view`- ja `pure`-funktioiden käyttäminen

view- tai pure-merkityt funktiot eivät muuta lohkoketjun tilaa. Ulkoisesti kutsuttuina ne eivät kuluta lainkaan gasia!

  • view: Lukee tilamuuttujia, mutta ei muuta niitä.
  • pure: Ei lue eikä muuta tilamuuttujia.

view- ja pure-funktioiden sisäiset kutsut kuluttavat edelleen gasia (osana laajempaa tapahtumaa), mutta niiden oikea käyttö ulkoisiin kyselyihin säästää käyttäjiltä huomattavasti gasia.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ViewPureExample {
    uint256 public myNumber = 42;

    // Costs no gas for external calls
    function getNumber() public view returns (uint256) {
        return myNumber;
    }

    // Costs no gas for external calls
    function add(uint256 a, uint256 b) public pure returns (uint256) {
        return a + b;
    }
}

Virheenkäsittelyn gas-kustannukset

Solidity tarjoaa useita tapoja käsitellä virheitä: require(), revert() ja assert().

  • require(): Käytetään syötteiden ja ehtojen tarkistamiseen. Epäonnistuessaan palauttaa käyttämättä jääneen gasin. (Suositeltava useimmissa tarkistuksissa)
  • revert(): Vastaa toimintaperiaatteeltaan require-funktiota ja palauttaa myös käyttämättä jääneen gasin.
  • assert(): Käytetään sisäisten invarianttien tarkistamiseen, eikä sen pitäisi *koskaan* epäonnistua. Epäonnistuessaan kuluttaa kaiken jäljellä olevan gasin. (Käyttäkää säästeliäästi kriittisiin sisäisiin tarkistuksiin)

assert-funktion epäonnistuminen on paljon kalliimpaa kuin require-funktion epäonnistuminen, joten valitkaa virheenkäsittelytapanne harkiten.

Kysymys: gas-optimointi

Tarkastelkaa seuraavaa Solidity-koodikatkelmaa. Mikä muutos todennäköisesti säästäisi KAIKKEIN eniten gasia käyttäjältä, joka kutsuu funktiota updateStatus?

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract GasPuzzle {
    uint256 public statusId;
    string public statusName;
    address public owner;

    constructor() {
        owner = msg.sender;
        statusId = 1;
        statusName = "Initial";
    }

    function updateStatus(uint256 _newId, string memory _newName) public {
        require(msg.sender == owner, "Not owner");
        statusId = _newId;
        statusName = _newName;
    }
}

Kertaus: gas-optimoinnin hallinta

Olette oppineet keskeiset strategiat gas-tehokkaan Solidity-koodin kirjoittamiseen!

Muistakaa nämä periaatteet:

  • Minimoikaa tallennuskirjoitukset: Kultainen sääntö.
  • Paketoikaa muuttujat: Ryhmitelkää pienemmät muuttujat niin, että ne mahtuvat slotteihin.
  • Käyttäkää tehokkaita datasijainteja: Suosikaa calldata- ja memory-sijainteja storage-sijainnin sijaan.
  • Optimoikaa silmukat: Välttäkää rajoittamattomia tai suuria iteraatiomääriä.
  • Hyödyntäkää view- ja pure-funktioita: Käyttäkää niitä kaasuttomiin ulkoisiin lukuoperaatioihin.
  • Käsitelkää virheet järkevästi: Käyttäkää käyttäjän syötteiden tarkistamiseen require- ja revert-funktioita, älkää assert-funktiota.

Näiden tekniikoiden soveltaminen tekee DApp-sovelluksista edullisempia, nopeampia ja käyttäjäystävällisempiä. Jatkakaa harjoittelua!

Aloita maksutta

Opi Web3:n ja DApp-sovellusten kehityksen perusteet tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
29
Oppitunnit
105

Usein kysytyt kysymykset

Onko oppitunti ”Gas-kulutuksen optimointitekniikat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolun 3 oppituntia, myös oppitunnin “Gas-kulutuksen optimointitekniikat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Web3:n ja DApp-sovellusten kehityksen perusteet-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Gas-kulutuksen optimointitekniikat”?

Opitte strategioita gas-tehokkaan Solidity-koodin kirjoittamiseen, transaktiokustannusten pienentämiseen ja DApp-sovellusten suorituskyvyn parantamiseen lohkoketjussa. Harjoittelet Web3:n ja DApp-sovellusten kehityksen perusteet-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Web3:n ja DApp-sovellusten kehityksen perusteet-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/3.

Kuinka kauan ”Gas-kulutuksen optimointitekniikat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunnilla?

Kyllä. Jokainen Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Yleiset älysopimusten haavoittuvuudet
  2. Tietoturvatyökalut ja auditoinnit
  3. Gas-kulutuksen optimointitekniikat
← Takaisin: Web3:n ja DApp-sovellusten kehityksen perusteet