以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads

DIT:Solidity 技巧:如何減少字節碼大小及節省 gas

Author:

Time:1900/1/1 0:00:00

譯文出自:登鏈翻譯計劃

譯者:翻譯小組

校對:Tiny熊

Solidity是一種特殊的語言,有許多的奇怪巧。由于Solidity被創建為可在EVM上使用其有限的函數集,因此許多函數在Solidity中的行為與大多數其他語言不同。幾個月前我寫了一篇博客文章,通過有十個技巧來節省Solidity中的gas消耗,但是收到了很大的反響。

10個技巧是:

合并打包變量

uint8不總是比uint256便宜

Mappings大部分時候比Arrays便宜

Solana將定期更新其區塊鏈網絡碳排放數據:金色財經報道,Solana 基金會今天宣布, Solana現在正在實時測量與其碳排放有關的數據。智能合約持有為去中心化應用程序(dapps) 和NFT項目提供支持的代碼。從今天開始,Solana 將定期更新專用儀表板,其中包含監控網絡關鍵環境指標的統計數據:能源消耗、碳足跡和網絡功率強度等數據。它從安裝在 Solana 驗證器節點上的軟件中提取實時數據,但儀表板每兩周更新一次。碳排放數據來源為與碳數據平臺Trycarbonara合作開發的排放跟蹤器從鏈上數據以及直接從 Solana 驗證器的代表性樣本中收集的數據。[2023/4/21 14:19:01]

不是所有的元素可以被打包

安全公司 Dedaub 發現 Solidity 編譯器存在漏洞,多數已部署合約中的死代碼極大增加 Gas 費成本:2月11日消息,安全公司 Dedaub 團隊發現以太坊編程語言 Solidity 編譯器存在漏洞,導致已部署的合約字節碼中包括死代碼(dead code),致使部署和操作智能合約時極大地增加了 Gas 費成本。Dedaub 表示,團隊在評估開源二進制分流器 Gigahorse 時發現了這個錯誤。當庫方法只被合約的構造器調用時,該漏洞就會出現。

通過 Gigahorse 分析,Dedaub 發現至少 35% 合約上存在一些死代碼,其中 33% 占據其運行的大部分字節碼。這些結果以 NFT 代理為主導,但其他代理合約也有同樣問題。對于大型合約,該問題可以被忽略,但大多數已部署的合約都是小型合約。Dedain 團隊在去年 11 月就已經發現了這個錯誤,并提醒 Solidity 團隊確認該問題。[2023/2/11 12:00:31]

用bytes32而不是string/bytes

Solana生態P2E鏈游Elumia完成新一輪融資:4月14日消息,Solana 生態 P2E 鏈游 Elumia 宣布完成新一輪融資,本輪融資由 Alameda Research 和 Animoca Brands 領投,Cryptology AG、Guilds YGG SEA、GuildFi、Ancient 8、Good Games Guild、PathDAO、Unix Gaming 以及戰略合作伙伴 Spartan Group、Cryptocom Capital、Kyros Ventures、Infinity Ventures Crypto、Spark Digital、Forward Analytics、Master Ventures、Maven Capital、Metavest 和 Solar Eco Fund 參投,具體金額暫未披露。Elumia 將于 2022 年第 2 季度推出首個 Alpha 版本。[2022/4/14 14:23:24]

少使用外部調用

Solana 生態借貸協議 Jet Protocol 完成 480 萬美元種子輪融資:據官方消息,Solana 生態借貸協議 Jet Protocol 完成 480 萬美元種子輪融資,投資方包括 MGNR、Sino Global Capital、CMS Holdings、Alameda Research、ParaFi Capital、Robot Ventures、Defiance Capital、Kenetic Capital、Stablenode。本輪融資將用于提供流動性、社區建設以及治理等方面。[2021/6/11 23:29:34]

使用外部函數修改器

刪除不需要的變量

使用短電路規則

盡量避免修改存儲變量

在我的專欄:智能合約開發-打通Solidity任督二脈,有更多的文章深入介紹如何介紹GAS,訂閱超值。

從那篇文章起,我又收集了更多的技巧與大家分享,再次分享給大家:

函數修飾器可能效率低下

添加函數修飾器時,將提取修飾器的代碼并替換函數內出現的_符號。這也可以理解為函數修飾器是內聯的。在普通的編程語言中,內聯小代碼更高效,并且不有任何實際的缺點,但Solidity不同。在Solidity中,EIP170將合約的最大大小限制為24KB,如果同一代碼多次內聯,則加起來就會很容易達到24KB大小限制。

另一方面,內部函數不是內聯的,而是稱為獨立函數。這意味著它們在運行時gas要稍微貴一點,但是在部署中可以節省很多冗余字節碼。內部函數還可以幫助避免可怕的“堆棧太深錯誤”,因為在內部函數中創建的變量與原始函數不會共享相同的堆棧,但是在修飾器中創建的變量共享相同的堆棧。

通過這種技巧,我將一份合約的大小從23

要設置或清除布爾值,可使用:

functionsetBoolean(uint256_packedBools,uint256_boolNumber,bool_value)publicviewreturns(uint256){if(_value)return_packedBools|uint256(1)<<_boolNumber;elsereturn_packedBools&~(uint256(1)<<_boolNumber);}

使用這種技術,你可以在一個存儲槽中存儲256個布爾值。如果你嘗試正常打包bool(如在結構體中)變量,一個插槽中則只能在裝入32個布爾型。

注意:僅當你要存儲32個以上的布爾值時才使用此技巧。

使用庫節省字節碼

當你調用庫的公共函數時,該函數的字節碼不會包含在合約內,因此可以把一些復雜的邏輯放在庫中,這樣減小合約的大小。不過你得清楚,調用庫會花費一些gas和使用一些字節碼。對庫的調用是通過委托調用的方式進行的,這意味著庫可以訪問合約擁有的數據,并且具有相同的權限。因此對于簡單任務不值得這樣做。

另外,你還需要知道,庫的內部函數,solc編譯器則把器內聯到了合約內。內聯有其自身的優點,但是需要字節碼空間。

本文收錄于專欄《智能合約開發-打通Solidity任督二脈》掃碼進入專欄獲取智能合約大師秘籍

無需使用默認值初始化變量

如果未設置/初始化變量,則變量具有默認值(0,false,0x0等,取決于數據類型)。如果你使用默認值對其進行顯式初始化,那只會浪費gas。

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/9558545.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

幣安為何推出第三條鏈?這對BNB意味著什么?

Tags:SOLLIDOLADITsolana幣今日價格行情BLID價格solana幣最新消息Vendit

幣安app官網下載
加密貨幣:新加坡日本香港加密貨幣監管政策簡介 誰更有優勢

日本、新加坡、香港加密交易所監管框架各有千秋。哪一個對散戶更友好?哪一個監管更加嚴格?三個不同框架都有哪些獨到之處?總結而言:日本雖然法規最完善,但具體實施中對1CO和衍生品幾乎是嚴厲遏制狀態,

1900/1/1 0:00:00
ETH:采用延時喂價還被黑?Warp Finance 被黑詳解

By:慢霧安全團隊 背景 2020年12月18日,據慢霧區情報DeFi項目WarpFinance遭受閃電貸攻擊。以下是慢霧安全團隊對整個攻擊流程的詳細分析.

1900/1/1 0:00:00
ETH2.0:ETH 2.0 的宏大敘事 | BlockArk 觀點

宏大敘事的意義 **** 著名的心理學家馬斯洛總結了一個人類的需求層次表。人的需求是分層次的,從生理需求,到安全需求,到社交需求,到尊重需求,到自我實現.

1900/1/1 0:00:00
USDT:庫幣上線MoneySwap (MSWAP) !

親愛的庫幣用戶: 我們很高興的宣布,庫幣將上線MoneySwap(MSWAP)項目并支持交易對MSWAP/USDT和MSWAP/BTC.

1900/1/1 0:00:00
加密貨幣:為什么 Fortnite 這樣的游戲公司不會擁抱加密技術?

Pass這個通行證的概念在游戲行業流行已久,卻一直如雞肋。battle與之的結合,也仍名不副實。想要通過讓玩家購買Pass,從而通過日常戰斗完成任務來獲得成就,這一初衷被無端扭曲.

1900/1/1 0:00:00
BSV:評論:大連慘案警示“合約賭場”

比特幣攀上2萬4千美金眾生歡呼,而這個三歲女孩的生命似乎已被遺忘。6月這場驚人的殺女后攜妻自殺案件,隨著庭審直播公開,我們發現這位大連男子鄭大偉是一位比特幣合約賭徒.

1900/1/1 0:00:00
ads