Možná jste narazili na několik tipů Solidity, jak zlepšit své dovednosti s kódem, abyste ušetřili plyn, ale dnes se chci více zaměřit na to, jak vám pochopení virtuálního stroje Ethereum může efektivně ušetřit náklady na plyn na vašich chytrých smlouvách.
Protože se ponoříme do Etherea, nechám zde úryvek jeho žluté knihy, který specifikuje náklady na plyn u operačních kódů, a během článku na ně budeme odkazovat.
Tip #1: Studený přístup VS teplý přístup
Gcoldsload: 2100 plyn
Gwarmaccess: 100 plyn
Zde máme naše první OPCODY, první určuje, kolik stojí přístup k proměnné poprvé (nebo studený přístup), zatímco druhý určuje, kolik stojí přístup k proměnné podruhé a dále (teplý přístup ). Jak vidíte, rozdíl v ceně je poměrně velký, takže pochopení toho může mít velký rozdíl v nákladech na transakce vaší chytré smlouvy. Podívejme se na příklad.
Ukládání dat do mezipaměti uvnitř funkce v Solidity může vést k nižší spotřebě plynu, i když to vyžaduje více řádků kódu. V tomto případě je to tak, že přepne umístění pole a místo jeho použití z úložiště a tedy studeného přístupu k němu pokaždé ve smyčce uloží pole do paměti, kde je levnější k němu přistupovat.
Tip č. 2: Nulové vs nenulové hodnoty a vrácení plynu
Gsset = 20 000 plyn
Rsclear = {sleva na realizační cenu}
Změna hodnoty z 0 na nenulovou na blockchainu Ethereum je drahá, jak vidíme na ceně Gsset, ale změna hodnoty z nenulové na 0 vám může poskytnout vrácení hodnoty plynu podle operačního kódu Rsclear. Abychom nevyužili výhodu vrácení peněz, je stanoveno, že vám může být vráceno pouze maximálně 20 % celkových transakčních nákladů.
Takový scénář můžete najít ve velmi běžném scénáři na blockchainu, což je aktualizace zůstatku adres v chytrých kontraktech. Podívejme se na příklad každého:
V prvním příkladu kontrakt ZeroToNonZero, nenulový až nenulový (5 000 plyn*) + nula až nenula (20 000 plyn) = 25 000 plyn
Ve druhém příkladu smlouvy NonZeroToZero: Nenulová až nula (5 000 benzínu*) + nula až nenula (20 000 benzínu) – Vrácení platby (4 800 benzínu) = 21 200 benzínu
*2 100 (Gcolssload) + 2 900 (Gsreset) = 5 000 plyn
Tip č. 3: Na pořadí stavových proměnných záleží
Úložiště je jako datová struktura klíč-hodnota, která obsahuje hodnoty stavových proměnných inteligentní smlouvy Solidity.
Úložiště si můžete představit jako pole, které vám to pomůže vizualizovat. Každý prostor v tomto „pole“ úložiště se nazývá slot a obsahuje 32 bajtů (256 bitů) dat a každá stavová proměnná deklarovaná v inteligentní smlouvě bude zabírat slot v závislosti na své deklarační pozici a typu.
Ne všechny datové typy zabírají všech 32 bajtů každého slotu, protože některé datové typy (bool, uint8, adresa…), které zabírají méně než to.
Trik je v tom, že pokud mají dvě/tři nebo více proměnných dohromady 32 bajtů nebo méně, kompilátor solidity se je pokusí zabalit do jednoho slotu, ale tyto proměnné musí být definovány vedle sebe.
Zde používáme datové typy bool (1 bajt), adresa (20 bajtů) a uint256 (32 bajtů). Když tedy znáte velikost těchto proměnných, můžete snadno pochopit, že v prvním příkladu ve smlouvě TwoSlots, protože máme bool a adresu dohromady (1 + 20 = 21 bajtů, což je méně než 32 bajtů), budou zabírat jeden slot. Na základě smlouvy ThreeSlots, protože bool a uint256 nemohou být ve stejném slotu (1 + 32 = 33 bajtů, což je větší než kapacita slotu), budeme používat celkem tři sloty.
Proč je to tak důležité?
Operační kód SLOAD stojí 2 100 plynu a používá se ke čtení ze slotů úložiště, takže pokud můžete uložit proměnné do méně slotů, ušetříte trochu plynu.
Tip #4: uint256 je levnější než uint8
V tipu č. 3 jsme se dozvěděli, že uint256 (256 bitů = 32 bajtů) sám o sobě zabírá slot, a také jsme se dozvěděli, že uint8 je méně než 32 bajtů. Takže i když je docela jednoduché, že 8 bitů je menších než 256 bitů, jak to, že je uint256 levnější?
Abychom pochopili, že je důležité vědět, že pokud proměnná sama nevyplní celý slot a pokud tento slot není vyplněn žádnou jinou proměnnou, EVM vyplní zbytek zbývajících bitů „0“ aby s ním bylo možné manipulovat.
Toto přidání „0“ provedené EVM bude stát plyn, což znamená, že za účelem úspory transakčního plynu je lepší použít uint256 místo uint8.
___________________
Doufejme, že při zjišťování těchto tipů ke snížení nákladů na plyn ve vašich chytrých smlouvách jste se také dozvěděli něco o tom, jak funguje EVM.
___________________
Twitter @TheBlockChainer, kde najdete další denní aktualizace o Smart Contracts, Web3 Security, Solidity, Auditing Smart Contracts a dalších.
___________________


