Solidity高級理論(二):Gas

solidity高級理論(二):Gas

關鍵字:Gas、結構體、節省小技巧

Gas是什麼

在Solidity中,用戶想要執行DApp都需要支付一定量的Gas,Gas可以用以太幣購買,所以,用戶每次使用DApp都會發費以太幣。

一個 DApp 收取多少 gas 取決於功能邏輯的複雜程度。每個操作背後,都在計算完成這個操作所需要的計算資源,(比如,存儲數據就比做個加法運算貴得多), 一次操作所需要花費的 gas 等於這個操作背後的所有運算花銷的總和。

由於運行你的程序需要花費用戶的真金白銀,在以太坊中代碼的編程語言,比其他任何編程語言都更強調優化。同樣的功能,使用笨拙的代碼開發的程序,比起經過精巧優化的代碼來,運行花費更高,這顯然會給成千上萬的用戶帶來大量不必要的開銷。

gas是計算費用的方式。不過,這些費用仍然是以ether計算,這與gas不同。gas成本是工作量,如勞動時數,而gas價格就像您爲完成工作付出的小時工資。 兩者的組合決定了您的總交易費用。如果您的gas價格太低,沒有人會處理您的交易。如果您的gas價格不錯,但交易的gas成本超過預算,交易失敗,但仍然被打包進區塊,勞動者工作了,您不會獲得退款。這樣確保沒有任何東西永遠運行,而且人們會對他們運行的代碼注意一點。 它使礦工和用戶都能安全避免錯誤的代碼!

節省Gas的小技巧

其實很多人覺得,使用uint變種會節省gas,如uin8,其實並不是,即使使用uint8,solidity還是會爲它保留256位的存儲空間。
例如,使用uint8而不是使用uint256,消耗的gas是一樣的。

結構封裝(Struct packing)

有一種辦法可以節省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);
    // 因爲使用了結構打包,‘xiao’比‘da’佔用的空間更少

這樣就符合大家的邏輯了,使用uint32比uint256節省了很多的gas。

所以,當 uint 定義在一個 struct 中的時候,儘量使用最小的整數子類型以節約空間。 並且把同樣類型的變量放一起(即在 struct 中將把變量按照類型依次放置),這樣 Solidity 可以將存儲空間最小化。例如,有兩個 struct:

uint c; uint32 a; uint32 b; 和 uint32 a; uint c; uint32 b;

前者比後者需要的gas更少,因爲前者把uint32放一起了。

知識星球二維碼380.png

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章