阿Han
阿Han

文字是留下記錄的一種媒介,將知識吸收轉化後輸出成文字進行保存。 ☕️ https://liker.land/willhanchen/civic

【開發智能合約 — Solidity系列】實作篇Ep.7 — 狀態的可變性限制(State Mutability)

一起動動手來玩玩智能合約吧

圖片來源

這次的篇章主要在介紹狀態的可變性,透過約束來限制狀態,避免隨意更改狀態導致錯誤的合約出現,如果對於Solidity開發有興趣的朋友不妨參考「📚 更多關於Solidity的文章請看這裡…」,讓我們一起動動手學習開發智能合約吧!

我們都知道狀態在智能合約中扮演著非常重要的角色,經過什麼事件之後變化為什麼狀態,甚至某些特定狀態是不可被修改的,又或者是某些功能開放給外部使用時,不可以讀取到合約內狀態…,都圍繞在可變與不可變之間,而Solidity也提供了幾個特定的識別字,讓我們可以在開發特定功能時,限制該功能對於可變程度的約束。

重要的約束關鍵字,分別是: pure、view,而none的部分是沒有限制的意思,故使用none表述,但官方並未具有none這個關鍵字,特此聲明。

pure

顧名思義就是非常「純」的意思,也就是我們在功能開發上一但約束為pure,就不能對狀態進行修改,甚至連窺探也不行,這種函式通常用來計算沒有任何依賴的式子,因此過程中不會改變到任何狀態,也不會依賴狀態來進行演算。

因此假設我們在pure的function內讀取或修改狀態,在編譯階段時就會被檢查出錯誤,也無法順利編譯。

contract Example {
    string private state  = "start";
    function pureFunc(uint a, uint b) public pure returns(uint) {
        // ❌ 無法讀取狀態
        // assert(bytes(state).length > 0);
        // ❌ 無法修改狀態
        // state = "doing";
        return a + b;
    }
}

view

view的部分就是想像成唯讀模式,僅能讀取狀態,但不能修改狀態,因此可以藉由狀態來進行一些判斷後運算。

contract Example {
    string private state  = "start";
    function viewFunc(uint a, uint b) public view returns(uint) {
        // ✔️ 可以讀取狀態
        assert(bytes(state).length > 0);
        // ❌ 無法修改狀態
        // state = "doing";
        return a + b;
    }
}

none

沒有任何約束的function,可以讀取也可以修改狀態,除非必要,否則不建議隨意修改狀態。

function func(uint a, uint b) public returns(uint) {
        // ✔️ 可以讀取狀態
        assert(bytes(state).length > 0);
        // ✔️ 無法修改狀態
        state = "doing";
        return a + b;
 }

結語

剛接觸Solidity時不免會閱讀許多大神們的程式碼,過程中發現時不時就有個pure、view,但只知道有這兩個關鍵字卻不曾想進一步去了解,直到一步步學習時,發現編譯的過程有些警告,貼心的編譯器會建議我們,當沒有進行狀態的讀取時就使用pure…,當時也沒有深究其因,就照著IDE的警告進行修正,而透過這次的深入學習之後,才發現原來pure及view的設計是有其意義的,而我們也應該瞭解限制與用法之後,才能更進一步的開發智能合約。

今天的範例都在這裡「📦 solidity-remix-toturial/Ep7」歡迎自行取用。

📚 更多關於Solidity的文章請看這裡…


喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?

 歡迎加入一起練習寫作,賺取知識,累積財富!

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

第一个支持了这篇作品
加载中…
加载中…

发布评论