---
title: "Solidity vs. Vyper：你需要知道的一切"
description: "Solidity 與 Vyper 的相似之處、差異與常見使用情境"
---

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

[apps](https://www.alchemy.com/dapps/top/defi-dapps) 底層的運作是持續執行 [smart contracts](https://www.alchemy.com/overviews/solidity-smart-contract)。智慧合約最初由電腦科學家暨密碼學家 **Nick Szabo** 提出，簡單來說，智慧合約是可程式化的程式碼與資料，用來規範區塊鏈上帳戶的行為。智慧合約程式碼存在於區塊鏈上，是改變 Ethereum 區塊鏈狀態的機制之一。

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

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

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

在 Ethereum 與相容於 [Ethereum Virtual Machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)（EVM）的區塊鏈上，有兩種常用的高階語言：**Solidity** 與 **Vyper**。

## **什麼是 Solidity？**

[**Solidity**](https://www.alchemy.com/overviews/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**——[可執行的程式碼行](https://www.alchemy.com/overviews/solidity-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](https://www.alchemy.com/overviews/solidity-modifier)，modifier 可在程式碼的其他地方定義，用來在智慧合約執行前後進行檢查、變更狀態等操作。

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

#### **3. 類別繼承（Class inheritance）**

要閱讀使用類別繼承的程式碼，必須查閱多個不同的程式碼檔案，才能理解合約的運作方式。此外，由於 Solidity 允許[多重繼承](https://www.alchemy.com/overviews/solidity-interface)，讀者還需要理解優先順序規則，才能知道衝突如何解決。

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

由於 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 程式碼讓[智慧合約安全](https://www.alchemy.com/overviews/smart-contract-security-best-practices)稽核人員能輕易讀懂並精確理解智慧合約的運作內容。這表示所有閱讀你智慧合約的人，都能快速辨識資產在區塊鏈上會如何被操作。

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

### **使用 Vyper 而非 Solidity 有哪些取捨？**

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

#### **1. 彈性**

[Vyper 的文件](https://www.alchemy.com/overviews/learn-solidity)指出，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 開發者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)：

### **Solidity 學習資源**

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

立即報名 [Alchemy University](https://docs.soliditylang.org/en/v0.8.20/) 的 Ethereum developer bootcamp，學習如何開發 Ethereum 應用程式。

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

- [**官方文件**](https://docs.soliditylang.org/en/v0.8.20/)——Solidity 文件詳細說明了從型別、智慧合約到編譯器的一切內容
- [**Solidity by Example**](https://solidity-by-example.org/)——一系列附有實用說明的 Solidity 程式碼範例
- [**Clean Contracts**](https://www.useweb3.xyz/guides/clean-contracts)——學習如何撰寫安全且行為可預測的 Solidity 智慧合約
- [**Ethernaut by OpenZeppelin**](https://ethernaut.openzeppelin.com/)——在這款以智慧合約為基礎的戰爭遊戲中，練習破解智慧合約

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

### **Vyper 學習資源**

當你透過訓練營[學完 Solidity](https://www.alchemy.com/overviews/solidity-bootcamp) 後，學習 Vyper 最好的方式，就是閱讀官方文件、跟著教學建置專案，並研究 GitHub 上的 .vy 檔案。

## **結論**

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