Solidity 0.6新特性解析

買賣虛擬貨幣
Solidity是一門為實現智慧合約而建立的高階程式語言,在區塊鏈領域非常流行。FISCO BCOS從開始就支援使用Solidity進行合約開發,在FISCO BCOS v2.6.0中,社羣使用evmone替換了原有的EVM直譯器以獲得更好的效能表現,同時也實現了對Solidity 0.6版本支援。本文將簡要解讀Solidity 0.6版本中的新特性和重要變更,以便社羣開發者瞭解。新特性解析本節重點介紹Solidity 0.6版本中新加入的特性。1. 引入新的try/catch特性Solidity 0.6版本引入了新的try/catch特性,能夠捕獲外部函式呼叫或者合約建立時候的錯誤。下面是一個例子。
建立CharitySplitter合約物件時,需要傳入owner的地址,如果傳入全0的地址,就會出現錯誤。如果錯誤出現在try後邊的表示式中或者是表示式涉及的內部函式中,則不能夠被捕獲。另一個需要注意的點是catch語句後的引數區別:· catch Error(string memory reason)用於捕獲revert("reasonString") 和 require(false, "reasonString") · catch (bytes memory lowLevelData)用於捕獲除上一種情況之外的異常,例如assert()或者除以0或者異常沒有錯誤資訊的情況· catch { ... }用於不關心異常資訊的情況/
/ SPDX-License-Identifier: MITpragma solidity ^0.6.1;contract CharitySplitter {    address public owner;    constructor(address _owner) public {        require(_owner != address(0), "no-owner-provided");
        owner = _owner;    }}contract CharitySplitterFactory {    mapping(address => CharitySplitter) public charitySplitters;    uint256 public errorCount;
    event Log(string reason);    event LogBytes(bytes reason);    function createCharitySplitter(address charityOwner) public {        try new CharitySplitter(charityOwner) returns (            CharitySplitter newCharitySplitter) {
            charitySplitters[msg.sender] = newCharitySplitter;        } catch Error(string memory reason) {            // catch failing revert() and require()            errorCount++;            emit Log(reason);        } catch (bytes memory reason) {
            // catch failing assert()            errorCount++;            emit LogBytes(reason);        }    }}
2. struct和enum現在可以在合約檔案中宣告,不再限制在contract或library中// SPDX-License-Identifier: MITpragma solidity ^0.6.1;enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill 3. 陣列切片可以作為calldata陣列,例如abi.decode(msg.data[4:], (uint, uint))
4.註釋描述規範了Natspec在開發文件中支援多返回值,並強制執行與@param同名的檢查5. Yul和內聯彙編有一個名為 leave 的新語句,該語句退出當前函式6. 現在可以透過 payable(x) 把 address 轉換為 address payable ,  x 需要為地址型別需要明確指定的更改本節列出了該版本中需要更明確顯示程式碼的更改。· 僅當函式被標記為 virtual 或在介面中定義,才可以被override,在介面外部沒有實現的函式必須標記為 virtual,覆蓋函式或修飾符時,必須使用新關鍵字 override 標註,當覆蓋的函式或修飾符在多個基類定義時,需要在override關鍵字後的括號中列出,例如override(Base1, Base2) 。
· 陣列的長度現在是隻讀的,即便是storage 型別的陣列,不再能透過修改陣列length來調整陣列的大小,請使用 push(), push(value) 或 pop() 替代,或者賦值一個新的陣列給原陣列。 · 新關鍵字 abstract 用來標記一個抽象合約,如果一個合約有未實現的函式, 需要使用abstract標記,抽象合約不能透過 new 建立,並且編譯時不會生成位元組碼。· 庫需要實現所有的函式,不再僅僅是內部函式。· 內聯彙編中宣告的變數名可以不再以 _slot 或 _offset 結尾。· 內聯彙編中的變數宣告可能不會遮蔽在內聯彙編程式碼塊之外宣告的變數,如果變數名包含一個點,則該點之前的字首可能與內聯彙編塊外部的任何宣告都沒有衝突。· 子類合約不能遮蔽父類的狀態變數,如果父類宣告瞭非private的變數x,那麼子類不能再宣告同名狀態變數。
語義和句法變化本節描述了該版本中必須要修改程式碼的變更。· 禁止從外部函式型別到 address 的轉換,外部函式型別從這個版本起具有address 的成員,類似於現有的 selector 成員。· 對於動態storage型別的陣列, 函式 push(value) 不再返回新的長度。· 未命名的函式通常稱為 fallback 函式 ,被拆分為一個使用 fallback 關鍵字定義的回撥函式和使用關鍵字 receive 定義的接受以太函式。1. 如果有receive函式,每當呼叫資料為空時,該函式會被呼叫,無論是否有以太接收, receive 函式隱含帶有 payable。
2. 當沒有其他函式匹配時,新的回撥函式會被呼叫 (如果不存在 receive 函式,則當呼叫資料為空時,也會呼叫回退函式)。回撥函式可以選擇是否標記為 payable,如果沒有 payable 那麼附加以太且匹配不到其他函式的呼叫會回滾。只有在實現升級或代理模式的合約時,才需要實現新的回撥函式。 小結為了實現對國密的支援,FISCO BCOS對FISCO-BCOS/solidity專案做了部分更改,主要是在國密模式將雜湊演算法替換為SM3。當前FISCO-BCOS/solidity專案有0.4.25、0.5.2、0.6.10三個版本,支援win、mac、Linux-generic64和Linux-aarch64四種平臺,分別提供國密和非國密的solc編譯器,相應的console專案也提供0.4、0.5和0.6三個版本的釋出包。

FISCO BCOS開源社羣會持續關注Solidity的進展,及時新增對新特性的支援,目前FISCO BCOS開發工作仍在持續進行,新版本需求也在持續收集規劃中,歡迎大家共同探討交流。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;