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

Han
阿Han的圖文解字筆記
Oct 14, 2022
圖片來源

這次的篇章主要在介紹狀態的可變性,透過約束來限制狀態,避免隨意更改狀態導致錯誤的合約出現,如果對於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系列】實作篇Ep.8 — 與交易有關的功能(Fallback & Receive)

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

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

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!

--

--