跳至內容
0%

Solidity vs. Vyper:你需要知道的一切

Alchemy team headshot

作者 Alchemy

發布於 2022年10月4日閱讀時間 2 分鐘

apps 底層的運作是持續執行 smart contracts。智慧合約最初由電腦科學家暨密碼學家 Nick Szabo 提出,簡單來說,智慧合約是可程式化的程式碼與資料,用來規範區塊鏈上帳戶的行為。智慧合約程式碼存在於區塊鏈上,是改變 Ethereum 區塊鏈狀態的機制之一。

智慧合約是讓 Ethereum 上的程式得以實現的關鍵元件。Vitalik Buterin 的原始白皮書將 Ethereum 描述為「next generation smart contract... platform」。雖然智慧合約通常被用來執行資產轉移,但其應用範圍遠不止於此,還包括代幣的創建、建構應用程式與 DeFi 產品,以及交易 NFT。

撰寫智慧合約有多種程式語言可選,選擇哪一種語言取決於使用情境,因為每種 web3 語言在需求、優勢與取捨上都經過不同的最佳化。

開發者首先要做的選擇通常是高階語言還是低階語言。高階語言將實作的細節抽象化,讓開發者不需理解位元組碼即可輕鬆建立智慧合約。

在 Ethereum 與相容於 Ethereum Virtual Machine(EVM)的區塊鏈上,有兩種常用的高階語言:SolidityVyper

什麼是 Solidity?

Solidity 是一種高階、圖靈完備的程式語言,用於在 Ethereum Virtual Machine 上撰寫智慧合約,適用於多種使用情境,包括去中心化金融(DeFi)、NFT 與錢包。

Solidity 深受 C++ 與 JavaScript 影響——這點從其語法即可看出——並使用與 Python 相同的多重繼承演算法。雖然 Solidity 最常與 Ethereum 連結在一起,但它也能在多個區塊鏈平台上執行,例如 Polkadot 與 Avalanche。

Solidity 由 Ethereum CTO Gavin Wood 提出,開發目的是為了滿足對彈性智慧合約開發平台的需求。有了 Solidity,開發者可以針對各種不同的使用情境撰寫智慧合約,打造出如今 Ethereum 上蓬勃發展的去中心化應用生態系。

什麼是 Vyper?

Vyper 是一種與 Solidity 相似的高階程式語言,其設計目的是提升 EVM 相容區塊鏈上智慧合約的安全性。

Vyper 使用 Python 風格的語法——這也是其蛇形命名的由來——程式碼優先考量可讀性,讓開發者能在部署合約前,輕易發現程式碼中的錯誤與漏洞。

為進一步強化智慧合約的安全性,Vyper 採用強型別與可判定性(computational decidability)。在 Vyper 中,每個宣告的變數都必須明確指定型別,而合約的可判定性讓開發者能在部署合約前,計算出 gas 消耗的上限。

Solidity vs. Vyper

Solidity 與 Vyper 都可用來建立相容於 EVM 的智慧合約,但由於這兩種 web3 程式語言各有獨特的設計原則,在決定哪一種語言最適合 dApp 開發時,需要權衡其優缺點。

為了更清楚地理解這種對比,我們先來看看 Solidity 與 Vyper 有哪些共通之處。

Solidity 與 Vyper 有哪些相似之處?

這兩種語言都是高階語言,Solidity 與 Vyper 的編譯器都會將程式碼轉譯為 EVM 可執行的系統層級位元組碼。這表示,部署之後,Solidity 與 Vyper 智慧合約會以相同的位元組碼語言執行。因此,Solidity 與 Vyper 合約可以在同一個應用程式中並行使用。

Vyper 與 Solidity 智慧合約在結構上有以下幾點相似之處:

  • Version pragma——version pragma 是每個智慧合約預期的編譯器版本或版本範圍
  • State variables——永久儲存在智慧合約儲存空間中的數值
  • Structs——可自訂定義,將多個變數組合成單一型別
  • Functions——可執行的程式碼行,能在合約內外執行狀態變更
  • Events——透過 EVM 記錄動作,發出後可有效率地被搜尋
  • Overflow Checking——透過檢查陣列存取與算術運算,防止資料型別意外溢位,確保變數儲存安全

Solidity 與 Vyper 智慧合約的核心結構有很大部分是共通的。然而,Solidity 與 Vyper 在讓 web3 開發者撰寫智慧合約的方式上,仍有很大的不同。

Solidity 與 Vyper 有何不同?

Vyper 與 Solidity 之間的關鍵差異,源自於 Vyper 將安全性作為底層設計原則,包括可判定性,以及不支援 modifiers、繼承、內嵌組合語言、函式多載與遞迴呼叫。

Vyper 藉由增加特定功能,同時省略 Solidity 部分較具風險的特性,來實現相對於 Solidity 更高的安全性。

1. 可判定性(Decidability)

透過可判定性,開發者可以計算出每個合約 gas 消耗的上限,藉此防範 gas limit attack。gas limit attack 是一種阻斷服務攻擊(DoS),惡意攻擊者透過合約發送交易,使區塊 gas 上限超出,導致所有其他交易失敗或還原(revert)。

2. Modifiers

在 Solidity 中,函式定義前可加上 modifier,modifier 可在程式碼的其他地方定義,用來在智慧合約執行前後進行檢查、變更狀態等操作。

由於 modifiers 的特性,程式碼很容易寫得具有誤導性,看似無害的函式 modifier,實際上可能執行會產生漏洞的操作。Vyper 不支援 modifiers,以提升可讀性並協助偵測危險程式碼。

3. 類別繼承(Class inheritance)

要閱讀使用類別繼承的程式碼,必須查閱多個不同的程式碼檔案,才能理解合約的運作方式。此外,由於 Solidity 允許多重繼承,讀者還需要理解優先順序規則,才能知道衝突如何解決。

如果同名的多個函式被繼承,合約實際上使用的是哪一個?

由於 Vyper 不允許繼承,程式碼更容易被稽核,因為需要稽核的檔案較少。

4. 內嵌組合語言(Inline assembly)

Vyper 排除了內嵌組合語言機制,也就是將 Solidity 程式碼轉換為機器碼的能力,因此可以透過搜尋變數名稱,找到程式碼中所有讀取或修改該變數的地方。

5. 函式多載(Function overloading)

由於在 Solidity 中對函式進行多載,可能讓有害程式碼被隱藏起來,因此 Vyper 不支援此功能。舉例來說,函式 \{sendToken(address)\} 可能是安全的,而 \{sendToken(address, “Hello!”)\} 卻會把你錢包裡的資產轉走。

透過省略函式多載,Vyper 讓人更容易準確理解哪些函式在何時被呼叫。

6. 遞迴呼叫與無限長度迴圈

遞迴呼叫與無限長度迴圈會讓計算 gas 上限變得不可能,這與 Vyper 的可判定性特性相衝突,這也是為什麼 Vyper 不支援遞迴呼叫。

使用 Vyper 而非 Solidity 有哪些好處?

Vyper 的六項主要差異,讓 Vyper 相較於 Solidity 具備兩項明顯優勢:安全性與可稽核性。

1. 安全性

憑藉眾多安全特性,Vyper 能保護開發者,避免寫出可能讓錯誤與可被利用的攻擊面未被察覺的脆弱程式碼。

2. 可稽核性

Vyper 程式碼讓智慧合約安全稽核人員能輕易讀懂並精確理解智慧合約的運作內容。這表示所有閱讀你智慧合約的人,都能快速辨識資產在區塊鏈上會如何被操作。

最後,隨著你學習 Vyper,其可讀性也將有助於你日後閱讀其他應用程式既有的智慧合約。

使用 Vyper 而非 Solidity 有哪些取捨?

雖然看起來開發者用 Vyper 幾乎能做到 Solidity 所能做的一切,還多了額外的安全防護,但選擇 Vyper 而非 Solidity 仍伴隨兩項主要取捨:彈性與社群。

1. 彈性

Vyper 的文件指出,Vyper 並不打算完全取代 Solidity,因為 Solidity 能做到的某些事情,在 Vyper 中是明確被禁止的。因此,選擇 Vyper 而非 Solidity,就意味著犧牲智慧合約的彈性,限縮應用範圍。

2. 開發者社群

單就數量而言,Solidity 是比 Vyper 更受歡迎的 web3 程式語言。在 GitHub 上快速搜尋所有以 Vyper 撰寫的檔案(.vy)與所有以 Solidity 撰寫的檔案(.sol),可以大致了解使用各語言的開發者人數。截至撰文當時,GitHub 上約有 10,300 個 Vyper 檔案,相較之下 Solidity 檔案則多達 830 萬個。

因此,針對 Vyper 撰寫的指南與資源相對較少。除了官方指南外,你會較難找到針對 Vyper 開發過程中可能遇到的困難所展開的社群討論。

Solidity 或 Vyper——我該選擇哪種語言?

雖然 Vyper 與 Solidity 之間具備相容性,代表選擇單一語言並非非此即彼的問題,但較基本、需要彈性的智慧合約應以 Solidity 撰寫,而需要嚴格安全保證的應用程式則應選擇 Vyper。

沒有哪一種語言絕對優於另一種,因為兩者各有不同的使用情境。由於缺乏彈性,也沒有龐大的開發者社群,Vyper 最適合用在需要最高安全性的場合,而剛入門 web3 的開發者則應從學習 Solidity 開始。

如何開始學習 Solidity 與 Vyper

雖然 Vyper 的開發者社群較不健全,但要學習這兩種程式語言,仍有不少豐富且實用的資源——無論正式或非正式。以下資源將協助你成為 Solidity 開發者

Solidity 學習資源

學習 Solidity 最好的方式是報名 Solidity 訓練營,而 Alchemy University 的 Ethereum Developer Bootcamp,由來自 ChainShot 的頂尖 web3 工程師團隊帶領,是目前最完整的七週線上 Solidity 課程。隨著 Alchemy 近期收購 ChainShot,Alchemy 將原本要價 3,000 美元的 ChainShot 訓練營完全免費開放。

立即報名 Alchemy University 的 Ethereum developer bootcamp,學習如何開發 Ethereum 應用程式。

除了訓練營之外,以下是學習 Solidity 的其他方式:

  • 官方文件——Solidity 文件詳細說明了從型別、智慧合約到編譯器的一切內容
  • Solidity by Example——一系列附有實用說明的 Solidity 程式碼範例
  • Clean Contracts——學習如何撰寫安全且行為可預測的 Solidity 智慧合約
  • Ethernaut by OpenZeppelin——在這款以智慧合約為基礎的戰爭遊戲中,練習破解智慧合約

如果開發者對開發領域完全陌生,Alchemy 的三週 JavaScript 速成課程是開始 Ethereum 訓練營前很好的先修課程。

Vyper 學習資源

當你透過訓練營學完 Solidity 後,學習 Vyper 最好的方式,就是閱讀官方文件、跟著教學建置專案,並研究 GitHub 上的 .vy 檔案。

結論

大多數開發者會發現 Solidity 足以滿足其智慧合約需求,但對於需要極高安全性的人來說,Vyper 是絕佳選擇。由於 Vyper 與 Solidity 都是充分實現在 Ethereum 區塊鏈上建構各種可能性的工具,兩者並無明確的優劣之分。Vyper 與 Solidity 是兩種互補、且對 Ethereum 開發者而言都必須學習的程式語言

Background gradient

打造區塊鏈魔法

Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。