Pastaraisiais metais Ethereum virtualios mašinos (EVM) tinklai įgavo didelį trauką. Kiekvieną dieną prie šių tinklų prisijungia vis daugiau naujų vartotojų, kurie atlieka daugybę operacijų. Tačiau dėl šios išaugusios veiklos didėja operacijų mokesčiai, o tai skatina susidomėjimą sumažinti šiuos mokesčius, kad Web3 programos taptų prieinamesnės ir patogesnės vartotojui.
Vienas daug žadantis sprendimas yra optimizuoti išmaniųjų sutarčių vykdymą dujomis. Naudodami tinkamą diegimo metodą, kūrėjai gali sukurti efektyvesnes išmaniąsias sutartis sumažinti mokesčius už dujas. Šis optimizavimas ne tik atpigina sandorius, bet ir pagerina bendrą vartotojo patirtį EVM tinkluose. Tęsiant šiuos patobulinimus, Web3 programų ateitis atrodo vis perspektyvesnė.
Solidumo vystymasis
Solidity yra plačiausiai naudojama programavimo kalba kuriant išmaniąsias sutartis Ethereum virtualiosios mašinos (EVM) grandinėse. Išmaniosios sutartys vykdomos grandinėje, o kiekvienas sutarties sandorio veiksmas patiria dujų sąnaudas. Natūralu, kad sudėtingos arba daug išteklių reikalaujančios operacijos sunaudoja daugiau dujų.
Daugiausiai dujų sunaudojama su sandėliavimu. Duomenų pridėjimas ir skaitymas iš saugyklos gali tapti pernelyg brangus, jei nebus tinkamai tvarkomas, naudojant visas turimas saugojimo vietas. Nagrinėjant EVM kodus, akivaizdu, kad STORE operacijų kodai, skirti saugojimui, yra žymiai brangesni nei atminties naudojimo kodai. Tiksliau, jie yra 33 kartus brangesni.
Opkodas |
Dujos |
Aprašymas |
KRAUTI |
100 |
Įkelti žodį iš saugyklos |
PARDUOTUVĖ |
100 |
Išsaugokite žodį saugykloje |
MSTORE |
3 |
Įkelti žodį iš atminties |
MLOAD |
3 |
Išsaugokite žodį atmintyje |
Sandėliavimo zonos
EVM siūlo penkias saugojimo sritis: saugyklą, atmintį, skambučių duomenis, krūvą ir žurnalus. Solidity kodas pirmiausia sąveikauja su pirmaisiais trimis, nes jis neturi tiesioginės prieigos prie kamino. Stekelyje vyksta EVM apdorojimas, o norint jį pasiekti, reikia žemo lygio programavimo metodų. „Solidity“ naudoja žurnalus įvykiams, tačiau sutartys negali pasiekti žurnalo duomenų, kai jie yra sukurti.
Sandėliavimas
- Raktų verčių saugykla, susiejanti 256 bitų žodžius į 256 bitų žodžius;
- Saugo visus išmaniosios sutarties būsenos kintamuosius, kurie yra kintamas (konstantos yra sutarties baito kodo dalis);
- Apibrėžiamas pagal sutartį diegimo metu.
Atmintis
Skambinimo duomenys
- Laikina vieta, kurioje saugomi funkcijų argumentai;
- Jis negali būti rašomas ir naudojamas tik skaitymui.
Dujų optimizavimo metodai
Norėdami sumažinti su saugykla susijusias degalų sąnaudas, pirmenybę teikite atminčiai, o ne saugyklai. Apsvarstykite šią išmaniąją sutartį, kurioje naudojama tik saugojimo vieta:
contract GasCostComparison {
uint256() private s_numbers;
uint256 private s_sum;
function numberSum()public returns(uint256) {
for(uint i=0; i
Jeigu s_numeriai inicijuojamas skambinant initNumbers su n = 10dujų suvartojimas skaičiusSuma būtų 53 010 dujų.
Venkite per dažnai skaityti iš saugyklos
Teiginyje „už“ palyginame indeksą i su s_numeriai.ilgis. Nors galime manyti, kad masyvo ilgis iš saugyklos nuskaitomas tik vieną kartą, jis skaitomas kiekvieną kartą, kai vyksta palyginimas. Norėdami optimizuoti, perskaitykite ilgį tik vieną kartą iš saugyklos:
function numberSum()public returns(uint256) {
uint256 l = s_numbers.length;
for(uint i=0; i
Iš saugyklos nuskaitytą ilgį saugome l kintamasis, kuris saugomas naujojo atminties srityje skaičiusSuma() funkcija.
Tai sumažina dujų suvartojimą iki 51 945 dujų, sutaupyti 1 065 dujų.
Venkite per dažnai rašyti saugykloje
Panašiai, saugoti galutinę sumą tik pabaigoje už pareiškime s_sum būsenos kintamasis (kuris yra saugykloje) yra efektyvesnis. Sukurkite laikiną kintamąjį suma atmintyje:
function numberSum()public view returns(uint256) {
uint256 l = s_numbers.length;
uint256 sum = 0;
for(uint i=0; i
Dujų vykdymas šį kartą yra 27 770 dujų, beveik pusė ankstesnių atvejų.
Tinkamo saugojimo tipo pasirinkimas gali žymiai sumažinti blokų grandinės dujų mokesčiuskaip parodyta aukščiau pateiktuose pavyzdžiuose. Duomenų saugojimo ir prieigos optimizavimas yra labai svarbus siekiant sumažinti išlaidas ir pagerinti išmaniųjų sutarčių „Ethereum“ virtualiosios mašinos (EVM) grandinėse efektyvumą.
Teikdami pirmenybę atminčiai, o ne kintamų duomenų saugojimui ir suprasdami su įvairiomis operacijomis susijusių dujų sąnaudų niuansus, kūrėjai gali žymiai pagerinti savo taikomųjų programų našumą ir ekonomiškumą Web3 ekosistemoje.
Tvirtumo dokumentacija