2023-05-12|閱讀時間 ‧ 約 5 分鐘

【開發智能合約 — 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」歡迎自行取用。
喜歡撰寫文章的你,不妨來了解一下:
歡迎加入一起練習寫作,賺取知識,累積財富!
分享至
成為作者繼續創作的動力吧!
主軸圍繞於軟體科技, 除了過往經驗成章以外也持續學習新技能, 並將學習心法記錄與分享, 以期幫助相同道路之夥伴。 裡面包含著各種程式語言的疑難雜症解題技巧, 也提供資料庫、AI、認證與授權、工具庫...等技巧, 讓您自由找出您想要的解答, 如果您想要系統化的教學課程也歡迎至「🔒 阿Han的軟體心法實戰營」。
© 2024 vocus All rights reserved.