📢 Gate廣場 #NERO发帖挑战# 秀觀點贏大獎活動火熱開啓!
Gate NERO生態周來襲!發帖秀出NERO項目洞察和活動實用攻略,瓜分30,000NERO!
💰️ 15位優質發帖用戶 * 2,000枚NERO每人
如何參與:
1️⃣ 調研NERO項目
對NERO的基本面、社區治理、發展目標、代幣經濟模型等方面進行研究,分享你對項目的深度研究。
2️⃣ 參與並分享真實體驗
參與NERO生態周相關活動,並曬出你的參與截圖、收益圖或實用教程。可以是收益展示、簡明易懂的新手攻略、小竅門,也可以是行情點位分析,內容詳實優先。
3️⃣ 鼓勵帶新互動
如果你的帖子吸引到他人參與活動,或者有好友評論“已參與/已交易”,將大幅提升你的獲獎概率!
NERO熱門活動(帖文需附以下活動連結):
NERO Chain (NERO) 生態周:Gate 已上線 NERO 現貨交易,爲回饋平台用戶,HODLer Airdrop、Launchpool、CandyDrop、餘幣寶已上線 NERO,邀您體驗。參與攻略見公告:https://www.gate.com/announcements/article/46284
高質量帖子Tips:
教程越詳細、圖片越直觀、互動量越高,獲獎幾率越大!
市場見解獨到、真實參與經歷、有帶新互動者,評選將優先考慮。
帖子需原創,字數不少於250字,且需獲得至少3條有效互動
乙太坊最流行的智慧合約開發語言Solidity新版本發佈
編譯:登鏈翻譯計劃; 來源:soliditylang.org
Solidity 編譯器的最新版本 v0.8.22的發佈。 0.8.22版本的編譯器包含了一系列的語言和編譯器改進,例如檔級事件定義、unchecked 迴圈增量優化、支援導入 EVM 彙編 JSON 等等。
重要提示
本次發佈廢棄了對低於 Constantinople(君士坦丁堡) 版本的 EVM 的支持,這些版本越來越難以維護。 這些古老的版本在乙太坊主網和測試網路上早已過時,我們懷疑它們對其他網路也不再相關。 複雜的代碼路徑和解決方案會減慢針對新版本的功能開發和測試的速度,因此我們希望在未來的編譯器版本中停止支持它們。 如果你依賴這些 EVM 版本的支援,請與我們聯繫[6] 。
新功能亮點
unchecked 迴圈增量
在增加迴圈計數器時使用 unchecked 算術運算是為了 gas 優化[7] 的常見做法。 讓我們以以下迴圈和計數器 i 的示例來說明:
for (uint i = 0; i < array.length; ++i) { acc += 陣列[i] ;i 未被循環體修改 }
在許多情況下(詳見下文的精確條件),比較操作將確保 i 永遠不會達到其類型的最大值,因此可以安全地假設在達到最大值之前迴圈將停止。 在這種情況下,對計數器進行安全檢查將是多餘的,也是一種 gas 的浪費。 這就會鼓勵使用者使用冗長的 unchecked 模式,將計數器增量包裝在迴圈體內的unchecked算術塊中,繞過檢查:
for (uint i = 0; i < array.length;){ acc += 陣列[i] ; unchecked { i++; } -- 我在沒有溢出檢查的情況下遞增 -- 使用的 gas 更少 }
Solidity 0.8.22 引入了一種溢出檢查優化,自動生成了對於迴圈計數器的 unchecked 算術增量。 這個新的優化消除了在迴圈體中使用類似前面示例中的冗長 unchecked 增量模式的需要。
相比之下,新的優化使用戶能夠在不犧牲gas效率的情況下返回到原始的、更易讀的代碼。
新優化避免溢出檢查的精確條件如下:
為了澄清第二個條件,考慮以下代碼片段:
for (uint8 i = 0; in < UINT16(1000); ++I) { 環體 }
在這種情況下, i 在比較之前被轉換為 uint16,並且條件實際上永遠不會為假,因此無法刪除遞增的溢出檢查。
另外,請注意, < 是唯一會觸發該優化的比較運算符。 故意排除了運算子 <= 和其他運算符。 此外,該運算符必須是內置的 - 用戶定義的 < 不符合條件。
該優化是直接的且總是有益的,因此即使使用通用設置 settings.optimizer.enabled 禁用了優化器的其餘部分,它也會被啟用。 可以通過在標準 JSON 輸入中將 settings.optimizer.details.simpleCounterForLoopUncheckedIncrement 設置為 false 來明確關閉它。 無法使用命令列介面禁用它。
調整Yul優化器以重新生成零字面量
新版本在 0.8.20 版本引入的 PUSH0 操作碼的支持基礎上進行了構建,通過將 Rematerialiser[8] [9] 優化步驟擴展為始終重新生成零字面量而不是將其存儲為變數引用,從而允許使用 PUSH0 而不是 DUP 來降低gas成本。 為確保有效執行此操作,將 Rematerialiser 和 UnusedPruner 步驟添加到了Yul優化器的預設清理序列中。
添加對導入 EVM 彙編 JSON 的支持(實驗性)
這個新版本添加了對導入 EVM 彙編的實驗性支援,為外部工具在位元組碼生成之前執行超級優化提供了可能性。 此功能的主要目的是定義一種低級 EVM 彙編的序列化格式,使編譯器生成的彙編可以被導出、修改和重新導入,從而恢復正常的編譯過程。
重要提示:這是一個實驗性功能,目前不適用於生產環境。 我們在此版本中提供此功能,以便你嘗試並提供反饋。
允許在檔案級別定義事件
Solidity 0.8.22 允許你在文件級別定義事件。 現在,事件定義可以放在合約範圍之外。 這為代碼組織提供了另一種選擇,無需人為地將事件包裝在庫中。
此外,此版本還修復了一個錯誤,該錯誤導致在為代碼發出在外部合約或介面中定義的事件時生成 NatSpec 時出錯。 在上一個版本(0.8.21)中,Solidity編譯器添加了對在當前合約未繼承的合約和介面中定義的事件的限定訪問的支援,但該錯誤阻止了該功能的完全使用。
通過此錯誤修復和允許文件級別事件定義,Solidity的最新版本使用戶能夠編譯以下範例而不會出現任何錯誤:
接口 I { 事件 ForeignEvent(); } 合約 C { 事件 ForeignEvent(); } 事件 E(); 合約 D { 函數 f() public { 發出外部事件將在 0.8.21 上觸發內部錯誤 發出 I.ForeignEvent(); 發出 C.ForeignEvent(); 發出檔級事件。新功能。 發出 E(); } }
完整的更改紀錄
語言特性
編譯器特性
Bug 修復