跳至主要內容
Change page

智能合約語言

以太坊的一大優勢在於,可以使用對開發者相對友善的語言來編寫智能合約。如果你對 Python 或任何大括號語言 (curly-bracket language) (opens in a new tab) 有經驗,你可以找到語法熟悉的語言。

兩個最活躍且持續維護的語言是:

  • Solidity
  • Vyper

Remix IDE 提供了一個全面的開發環境,用於建立和測試 Solidity 與 Vyper 合約。嘗試使用瀏覽器中的 Remix IDE (opens in a new tab) 開始編寫程式碼。

更有經驗的開發者可能也會想使用 Yul(一種用於以太坊虛擬機 (EVM) 的中介語言),或是 Yul 的擴充語言 Yul+。

如果你很好奇,並且喜歡協助測試仍在積極開發中的新語言,你可以嘗試使用 Fe,這是一種目前仍處於起步階段的新興智能合約語言。

先決條件

具備程式語言(特別是 JavaScript 或 Python)的基礎知識,有助於你理解智能合約語言之間的差異。我們也建議你在深入探討語言比較之前,先了解智能合約的概念。智能合約簡介

Solidity

  • 用於實作智能合約的物件導向高階語言。
  • 受 C++ 影響最深的大括號語言。
  • 靜態型別(變數的型別在編譯時就已確定)。
  • 支援:
    • 繼承(你可以擴充其他合約)。
    • 函式庫(你可以建立可重複使用的程式碼,並從不同的合約中呼叫——就像其他物件導向程式語言中靜態類別裡的靜態函式)。
    • 複雜的使用者自訂型別。

範例合約

這個範例應該能讓你對 Solidity 合約語法有初步的了解。如需函式與變數的更詳細說明,請參閱文件 (opens in a new tab)

Vyper

  • 具備 Python 風格的程式語言
  • 強型別
  • 編譯器程式碼精簡且易於理解
  • 高效的位元組碼生成
  • 刻意減少功能(相較於 Solidity),旨在讓合約更安全且更容易稽核。Vyper 不支援:
    • 修飾符 (Modifiers)
    • 繼承
    • 行內組合語言 (Inline assembly)
    • 函式多載 (Function overloading)
    • 運算子多載 (Operator overloading)
    • 遞迴呼叫
    • 無限長度迴圈
    • 二進位定點數 (Binary fixed points)

如需更多資訊,請閱讀 Vyper 的設計理念 (opens in a new tab)

範例

這個範例應該能讓你對 Vyper 合約語法有初步的了解。如需函式與變數的更詳細說明,請參閱文件 (opens in a new tab)

Yul 與 Yul+

如果你是以太坊的新手,且尚未用智能合約語言編寫過任何程式碼,我們建議從 Solidity 或 Vyper 開始。只有在你熟悉智能合約安全最佳實務以及使用 EVM 的具體細節後,再考慮研究 Yul 或 Yul+。

Yul

  • 以太坊的中介語言。
  • 支援 EVMEwasm (opens in a new tab)(一種以太坊風格的 WebAssembly),其設計目的是成為這兩個平台皆可使用的共同基礎。
  • 適合用於高階最佳化階段,能同時為 EVM 與 Ewasm 平台帶來同等效益。

Yul+

  • Yul 的低階、高效率擴充語言。
  • 最初是為樂觀 Rollup 合約所設計。
  • Yul+ 可以被視為 Yul 的實驗性升級提案,為其新增了多項功能。

範例合約

以下簡單範例實作了一個次方函式。可以使用 solc --strict-assembly --bin input.yul 進行編譯。該範例應儲存在 input.yul 檔案中。

如果你對智能合約已經非常有經驗,可以在這裡 (opens in a new tab)找到以 Yul 實作的完整 ERC-20 範例。

Fe

  • 用於以太坊虛擬機 (EVM) 的靜態型別語言。
  • 受到 Python 與 Rust 的啟發。
  • 旨在易於學習——即使是對以太坊生態系不熟悉的開發者也能輕鬆上手。
  • Fe 的開發仍處於早期階段,該語言於 2021 年 1 月發布了 Alpha 版本。

範例合約

以下是以 Fe 實作的簡單合約。

如何選擇

就如同其他程式語言一樣,這主要取決於為合適的工作選擇合適的工具,以及個人的偏好。

如果你還沒有嘗試過任何一種語言,以下是一些可以考慮的因素:

Solidity 有什麼優點?

  • 如果你是初學者,市面上有許多教學與學習工具。詳情請見透過寫程式學習章節。
  • 具備良好的開發者工具。
  • Solidity 擁有龐大的開發者社群,這意味著你通常能很快找到問題的解答。

Vyper 有什麼優點?

  • 對於想編寫智能合約的 Python 開發者來說,這是一個很好的入門方式。
  • Vyper 的功能較少,非常適合用來快速建立想法的原型。
  • Vyper 旨在易於稽核,並盡可能提高人類可讀性。

Yul 與 Yul+ 有什麼優點?

  • 簡單且功能強大的低階語言。
  • 允許更接近原生的 EVM,這有助於最佳化合約的燃料 (gas) 使用量。

語言比較

關於基本語法、合約生命週期、介面、運算子、資料結構、函式、控制流程等方面的比較,請查看這份 Auditless 備忘單 (opens in a new tab)

延伸閱讀