Iespējams, esat saskāries ar dažiem Solidity padomiem, lai uzlabotu savas koda iemaņas, lai ietaupītu benzīnu, taču šodien es vēlos vairāk pievērsties tam, kā izpratne par Ethereum virtuālo mašīnu var efektīvi ietaupīt gāzes izmaksas jūsu viedajos līgumos.

Tā kā mēs iedziļināsimies Ethereum, es šeit atstāšu tā dzeltenā papīra fragmentu, kurā ir norādītas opkodu gāzes izmaksas, un raksta laikā mēs uz tiem atsauksimies.



Padoms Nr. 1: Aukstā piekļuve vs siltā piekļuve

Gcoldsload: 2100 gāze

Gwarmaccess: 100 gāzes

Šeit mums ir mūsu pirmie OPCODES, pirmais norāda, cik maksā piekļuve mainīgajam pirmo reizi (vai aukstā piekļuve), bet otrais norāda, cik maksā piekļuve mainīgajam otrreiz un turpmāk (siltā piekļuve). ). Kā redzat, cenu atšķirība ir diezgan liela, tāpēc to izpratne var būtiski mainīt jūsu viedā līguma darījumu izmaksas. Apskatīsim piemēru.





Datu saglabāšana kešatmiņā Solidity funkcijā var samazināt gāzes patēriņu, pat ja tai ir nepieciešams vairāk koda rindiņu. Šajā gadījumā tas notiek, mainot masīva atrašanās vietu un tā vietā, lai to izmantotu no krātuves un līdz ar to aukstā veidā piekļūtu ikreiz ciklā, bet gan saglabā masīvu atmiņā, kur tam ir lētāk piekļūt.

Padoms Nr. 2: nulles un nulles vērtības un gāzes atmaksa

Gsset = 20 000 gāzes

Rsclear = {atlaide izpildes cenai}

Vērtības maiņa no 0 uz nulles vērtību Ethereum blokķēdē ir dārga, kā redzams Gsset cenā, taču, mainot vērtību no nulles uz 0, jūs varat saņemt atmaksu gāzes vērtībā saskaņā ar opcode Rsclear. Lai neizmantotu atmaksu, ir noteikts, ka jūs varat saņemt atmaksu tikai līdz 20% no kopējām darījuma izmaksām.

Šādu scenāriju var atrast ļoti izplatītā scenārijā blokķēdē, kas atjaunina viedo līgumu adrešu līdzsvaru. Apskatīsim katra piemēru:





  • Pirmajā piemērā ZeroToNonZero līgums, no nulles līdz nullei (5000 gāzes*) + no nulles līdz nullei (20 000 gāzes) = 25 000 gāzes

  • Otrajā piemērā NonZeroToZero līgums, no nulles līdz nullei (5000 gāzes*) + no nulles līdz nullei (20 000 gāzes) — atmaksa (4800 gāzes) = 21 200 gāzes

*2100 (Gcolssload) + 2900 (Gsreset) = 5000 gāzes

Padoms Nr. 3. Svarīga ir stāvokļa mainīgo secība

Krātuve ir kā atslēgas vērtību datu struktūra, kurā ir Solidity viedā līguma stāvokļa mainīgo vērtības.

Varat domāt par krātuvi kā masīvu, kas palīdzēs to vizualizēt. Katru vietu šajā krātuves “masīvā” sauc par slotu, un tajā ir 32 baiti (256 biti) datu, un katrs viedajā līgumā deklarētais stāvokļa mainīgais aizņems slotu atkarībā no tā deklarācijas pozīcijas un veida.

Ne visi datu tipi aizņem visus 32 baitus no katra slota, jo ir daži datu tipi (bool, uint8, adrese…), kas aizņem mazāk.

Šeit triks ir tāds, ka, ja divi/trīs vai vairāk mainīgie kopā ir 32 baiti vai mazāk, solidity kompilators mēģinās tos iesaiņot vienā slotā, taču šie mainīgie ir jādefinē blakus.





Šeit mēs izmantojam datu tipus bool (1 baits), adrese (20 baiti) un uint256 (32 baiti). Tātad, zinot šo mainīgo lielumu, jūs varat viegli saprast, ka pirmajā TwoSlots līguma piemērā, jo mums ir bool un adrese kopā (1 + 20 = 21 baits, kas ir mazāks par 32 baitiem), tie aizņems vienu slotu. ThreeSlots līgumā, jo bool un uint256 nevar atrasties vienā slotā (1 + 32 = 33 baiti, kas ir lielāks par slota ietilpību), kopumā mēs izmantosim trīs slotus.

Tagad, kāpēc tas ir tik svarīgi?

SLOAD operācijas kods maksā 2100 gāzes, un tas tiek izmantots, lai nolasītu no atmiņas slotiem, tāpēc, ja varat saglabāt mainīgos lielumus mazākos laika nišos, jūs ietaupīsit nedaudz degvielas.

4. padoms: uint256 ir lētāks nekā uint8

3. padomā mēs uzzinājām, ka uint256 (256 biti = 32 baiti) pats par sevi aizņem slotu, un mēs esam arī uzzinājuši, ka uint8 ir mazāks par 32 baitiem. Tātad, lai gan ir diezgan vienkārši, ka 8 biti ir mazāki par 256 bitiem, kāpēc uint256 ir lētāks?

Lai saprastu, ka ir svarīgi zināt, ka gadījumā, ja mainīgais neaizpilda sevi visu slotu un ja šo slotu neaizpilda neviens cits mainīgais, EVM aizpildīs pārējos bitus ar “0” lai varētu ar to manipulēt.

Šī EVM veiktā “0” pievienošana maksās gāzi, kas nozīmē, ka, lai ietaupītu darījuma gāzi, labāk ir izmantot uint256, nevis uint8.

__________________

Cerams, ka, uzzinot par šiem padomiem, kā samazināt gāzes izmaksas savos viedajos līgumos, jūs uzzinājāt arī mazliet par to, kā darbojas EVM.

__________________

Twitter @TheBlockChainer, lai atrastu vairāk ikdienas atjauninājumu par viedajiem līgumiem, Web3 drošību, stabilitāti, viedo līgumu auditēšanu un daudz ko citu.

__________________