Gas-kulutuksen optimointitekniikat
Opitte strategioita gas-tehokkaan Solidity-koodin kirjoittamiseen, transaktiokustannusten pienentämiseen ja DApp-sovellusten suorituskyvyn parantamiseen lohkoketjussa.
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 toimintaperiaatteeltaanrequire-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- jamemory-sijaintejastorage-sijainnin sijaan. - Optimoikaa silmukat: Välttäkää rajoittamattomia tai suuria iteraatiomääriä.
- Hyödyntäkää
view- japure-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- jarevert-funktioita, älkääassert-funktiota.
Näiden tekniikoiden soveltaminen tekee DApp-sovelluksista edullisempia, nopeampia ja käyttäjäystävällisempiä. Jatkakaa harjoittelua!
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
- Yleiset älysopimusten haavoittuvuudet
- Tietoturvatyökalut ja auditoinnit
- Gas-kulutuksen optimointitekniikat