Solidity高级理论(二):Gas
solidity高級理論(二):Gas
關(guān)鍵字:Gas、結(jié)構(gòu)體、節(jié)省小技巧
Gas是什么
在Solidity中,用戶想要執(zhí)行DApp都需要支付一定量的Gas,Gas可以用以太幣購買,所以,用戶每次使用DApp都會發(fā)費(fèi)以太幣。
一個 DApp 收取多少 gas 取決于功能邏輯的復(fù)雜程度。每個操作背后,都在計算完成這個操作所需要的計算資源,(比如,存儲數(shù)據(jù)就比做個加法運(yùn)算貴得多), 一次操作所需要花費(fèi)的 gas 等于這個操作背后的所有運(yùn)算花銷的總和。
由于運(yùn)行你的程序需要花費(fèi)用戶的真金白銀,在以太坊中代碼的編程語言,比其他任何編程語言都更強(qiáng)調(diào)優(yōu)化。同樣的功能,使用笨拙的代碼開發(fā)的程序,比起經(jīng)過精巧優(yōu)化的代碼來,運(yùn)行花費(fèi)更高,這顯然會給成千上萬的用戶帶來大量不必要的開銷。
gas是計算費(fèi)用的方式。不過,這些費(fèi)用仍然是以ether計算,這與gas不同。gas成本是工作量,如勞動時數(shù),而gas價格就像您為完成工作付出的小時工資。 兩者的組合決定了您的總交易費(fèi)用。如果您的gas價格太低,沒有人會處理您的交易。如果您的gas價格不錯,但交易的gas成本超過預(yù)算,交易失敗,但仍然被打包進(jìn)區(qū)塊,勞動者工作了,您不會獲得退款。這樣確保沒有任何東西永遠(yuǎn)運(yùn)行,而且人們會對他們運(yùn)行的代碼注意一點(diǎn)。 它使礦工和用戶都能安全避免錯誤的代碼!
節(jié)省Gas的小技巧
其實(shí)很多人覺得,使用uint變種會節(jié)省gas,如uin8,其實(shí)并不是,即使使用uint8,solidity還是會為它保留256位的存儲空間。
例如,使用uint8而不是使用uint256,消耗的gas是一樣的。
結(jié)構(gòu)封裝(Struct packing)
有一種辦法可以節(jié)省gas,那就是把uint綁定到struct里面。
如果一個struct中有多個uint,則盡可能使用較小的uint,solidity會將這些uint打包在一起,從而占用較小的存儲空間。例如:
struct da{
uint a;
uint b;
uint c;
}
strcut xiao{
uint32 a;
uint32 b;
uint c;
}
da normal = da(10, 20, 30);
xiao mini = xiao(10, 20, 30);
// 因?yàn)槭褂昧私Y(jié)構(gòu)打包,‘xiao’比‘da’占用的空間更少
這樣就符合大家的邏輯了,使用uint32比uint256節(jié)省了很多的gas。
所以,當(dāng) uint 定義在一個 struct 中的時候,盡量使用最小的整數(shù)子類型以節(jié)約空間。 并且把同樣類型的變量放一起(即在 struct 中將把變量按照類型依次放置),這樣 Solidity 可以將存儲空間最小化。例如,有兩個 struct:
uint c; uint32 a; uint32 b; 和 uint32 a; uint c; uint32 b;
前者比后者需要的gas更少,因?yàn)榍罢甙製int32放一起了。
總結(jié)
以上是生活随笔為你收集整理的Solidity高级理论(二):Gas的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离合器踏板是什么?
- 下一篇: 凯马的凯捷仪表盘这个黄灯亮了是什么意思?