跳至主要內容
Change page

智能合約語言

以太坊的一大優勢在於,可以使用對開發者相對友善的語言來編寫智能合約。如果你對 Python 或任何大括號語言 (在新分頁開啟)有經驗,你可以找到語法熟悉的語言。

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

  • Solidity
  • Vyper

Remix 整合開發環境 (IDE) 提供了一個全面的開發環境,用於建立和測試 Solidity 與 Vyper 合約。嘗試使用瀏覽器內的 Remix IDE (在新分頁開啟) 開始編寫程式碼。

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

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

先決條件

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

Solidity

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

範例合約

這個範例應該能讓你對 Solidity 合約的語法有所了解。如需函式和變數的更詳細說明,請參閱文件 (在新分頁開啟)。

Vyper

  • 類 Python 的程式語言
  • 強型別
  • 小巧且易於理解的編譯器程式碼
  • 高效的位元組碼生成
  • 刻意減少了比 Solidity 更多的功能,目的是讓合約更安全且更容易稽核。Vyper 不支援:
    • 修飾符 (Modifiers)
    • 繼承 (Inheritance)
    • 內聯組合語言 (Inline assembly)
    • 函式多載 (Function overloading)
    • 運算子多載 (Operator overloading)
    • 遞迴呼叫 (Recursive calling)
    • 無限迴圈 (Infinite-length loops)
    • 二進位定點數 (Binary fixed points)

自 v0.4.0 起,Vyper 支援模組系統 (在新分頁開啟)。程式碼的重複使用是透過組合而非類別繼承來實現。

如需更多資訊,請閱讀 Vyper 的設計理念 (在新分頁開啟)。

範例

這個範例應該能讓你對 Vyper 合約的語法有所了解。如需函式和變數的更詳細說明,請參閱文件 (在新分頁開啟)。

Yul 與 Yul+

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

Yul

  • 以太坊的中介語言。
  • 支援 EVM 和 Ewasm (在新分頁開啟)(一種以太坊風格的 WebAssembly),並被設計為這兩個平台可用的共同基礎。
  • 適合高階最佳化階段的目標語言,能為 EVM 和 Ewasm 平台帶來同等的好處。

Yul+

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

範例合約

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

如果你對智能合約已經非常有經驗,可以在這裡 (在新分頁開啟)找到 Yul 的完整 ERC-20 實作。

Fe

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

範例合約

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

如何選擇

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

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

Solidity 有什麼優點?

  • 如果你是初學者,市面上有許多教學和學習工具。請在透過寫程式學習章節中查看更多相關資訊。
  • 具備良好的開發者工具。
  • Solidity 擁有龐大的開發者社群,這意味著你很可能可以快速找到問題的答案。

Vyper 有什麼優點?

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

Yul 和 Yul+ 有什麼優點?

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

語言比較

有關基本語法、合約生命週期、介面、運算子、資料結構、函式、控制流程等方面的比較,請查看這份 Auditless 備忘單 (在新分頁開啟)。

延伸閱讀