本篇原文(標題:Solidity for Swift Developers: File Structure and Functions)刊登於作者 Medium,由 Kristaps Grinbergs 所著,並授權翻譯及轉載。
Solidity 是一種物件導向語言,用來撰寫適用於區塊鏈 (blockchain) 的智能合約 (smart contracts),比如說 Ethereum。Solidity 的語法與 Javascript 類似,但語義就比較接近 C++。在這篇文章中,我們會從 Swift 開發者的角度深入探究 Solidity 的語言結構和函式。
Pragma 和 sfile 副檔名
在了解 Solidity 的語言結構之前,我們首先要知道 pragma
keyword 的用處和意思。
與 Objective-C 的 #pragma
和 Swift 的 MARK
不同,Solidity 的 pragma
keyword 是用來描述使用哪個版本的編譯器。pragma
keyword 會指示編譯器檢查版本是否匹配,但不會打開或關閉任何語言功能。
舉個例子,如果我們想告訴 Solidity 編譯器使用 0.8x 版本,就可以如此編寫第一行程式碼:
pragma solidity ^0.8.0;
我們也可以使用大於或小於的操作,來描述版本的範圍,非常方便。
雖然 pragma
keyword 還有其他用法,但我們不會在這篇文章研究。
Solidity 源文件的副檔名是 .sol
。
一切都從 Contract 開始
Solidity 語言中的 Contract 就類似 Swift 的 Class。Contract 包括狀態變數 (state variable)、函式 (function)、函式修飾符 (function modifier)、事件 (event)、錯誤 (error)、結構 (struct) 和列舉 (enum)。這次我們只會研究函式結構。
和 Class 一樣,我們需要為 Contract 命名,並以大括號開始和結束。
contract HelloSwiftFromSolidity {
}
狀態變數
狀態變數是在 contract
內宣告的變數。請注意,我們部署了這個信息之後,它就會儲存在區塊鏈的 contract storage 中。Solidity 編譯器會幫我們創建 getter 和 setter,所以我們不用費心這個部分。
contract HelloSwiftFromSolidity {
string hello;
}
現在,你應該注意到 Solidity 的每行語句都是以分號 ;
作結,這一點與 Swift 語言不同。
函式
像 Swift 一樣,我們在 contract
裡面或外面都可以宣告函式。函式可以執行一段程式碼。
contract HelloSwiftFromSolidity {
// visibility = public because access from outside
string public hello = "Hello Swift";
// visibility = public because access from outside
// view = just view the data
function helloSwift() public view returns(string memory) {
return hello;
}
}
讓我們逐句拆解以上的程式碼。如果我們想從外面存取狀態變數,我們就需要將 visibility 型別設置為 public
,而函式也要執行相同的操作。在這個範例中,如果函式回傳一些東西,我們可以將它標記為 view
。它回傳一個字串,字串就會被儲存在記憶體中,並在完成執行後被移除。
可以儲存函式變數及回傳資料的地方包括:
memory
:變數的生命週期僅限於函式範圍,而不會保存於任何地方。storage
:資料會被儲存在區塊鏈的智能合約 storage 中。calldata
:資料會被儲存在呼叫函數的外面,我們之後會再深入討論如何使用它。
函式型別
Solidity 中的函數可以執行指令及查看資料。當我們查看資料時,它可以是 view
或 pure
。view
和 pure
的不同之處,在於 pure
不會修改或讀取狀態變數。
function helloWorld() public pure returns(string memory) {
return "Hello World";
}
在以上的程式碼中,我們沒有讀取或修改區塊鏈的任何東西,只是回傳了一些資料。
總結
Solidity 語言可以用來撰寫適用於區塊鏈的智能合約,目前最流行的區塊鏈是 Ethereum。從 Swift 開發者的角度來看,兩者的語法非常相似,但語義卻非常不同。Solidity 每行語句都要以分號結尾。Solidity 的 Contract 與 Swift 的 Class 相似,兩者都可以包含狀態變數、函式和其他結構。