---
title: "什麼是 Solidity？"
description: "Solidity 簡介：Web3 最受歡迎的程式語言"
---

# 什麼是 Solidity？

隨著 web3 產業的成長，開發者面臨更多[ web3 程式語言](https://www.alchemy.com/overviews/web3-programming-languages)的選擇。每種語言在設計上都有不同的優點與取捨，適用於編寫智能合約。語言之間的差異可能來自對特定區塊鏈的支援，或是速度、可讀性、安全性等不同特性。

[Solidity](https://www.alchemy.com/dapps/solidity) 是為 Ethereum 區塊鏈開發的智能合約語言，是一種功能強大的程式語言，用於為區塊鏈產業中最大的開發者生態系統建立[去中心化應用程式](https://www.alchemy.com/dapps/top/defi-dapps)。

在本文中，我們將透過 Solidity 的歷史、語言影響來源與用途，介紹 Solidity。最後，我們會提供一些最佳的開發者資源，讓你透過[免費的 Solidity 課程](https://www.alchemy.com/university/courses/solidity)以及[學習 web3 開發的資源](https://www.alchemy.com/overviews/learn-solidity)繼續學習。

## **什麼是 Solidity？**

**Solidity 於 2014 年提出，是一種物件導向的高階程式語言，用於實作在**[** Ethereum 虛擬機（EVM）**](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)**上執行的智能合約。**Solidity 的設計受到 C++ 和 JavaScript 等知名程式語言的啟發。身為 web3 開發者，學習使用 Solidity 對於學習[ web3 開發](https://www.alchemy.com/overviews/how-to-learn-web3-development)相當有幫助。

本節將介紹 Solidity 的歷史、說明 Solidity 與其他程式語言的相似之處，並解釋 Solidity 的主要用途。

### **Solidity 是誰創建的？**

**2014 年，Ethereum 的 CTO Gavin Wood 提出了 Solidity，作為一種能滿足 Ethereum 對圖靈完備程式語言需求的語言，用於編寫智能合約。**

Ethereum 的創辦人 **Vitalik Buterin** 提出將 Ethereum 作為一種協定，延伸由 Bitcoin 開創的區塊鏈功能，並加入[智能合約的功能](https://www.alchemy.com/overviews/solidity-smart-contract)。在他的構想中，Ethereum 能夠執行一套複雜的智能合約網路，這些合約是在分散的全球電腦網路上有條件執行的程式碼片段。智能合約讓開發者能夠建立新的加密貨幣、開發 DeFi 應用程式等等。

Solidity 專案團隊由 **Christian Reitwiessner** 領導，他們成功建立了一種圖靈完備、物件導向的程式語言，用於實作智能合約。作為一種高階語言，代表開發者在編寫智能合約時，不需要操作記憶體或位元組碼等系統層級的資訊來執行運算。

圖靈完備性指的是一種資料操作系統（在此指程式語言）能夠模擬圖靈機行為的能力。理論上，Solidity 需要能夠執行開發者所需的任何運算。

### **Solidity 是基於哪些程式語言的？**

Solidity 在開發過程中受到多種既有程式語言的影響，包括 C++、Python 和 JavaScript。

#### **Solidity 與 C++ 的相似之處**

Solidity 在變數宣告與 for 迴圈的語法上與 C++ 完全相同。此外，Solidity 也支援 C++ 風格的[函式多載](https://www.alchemy.com/overviews/solidity-functions)，這在兩個函式名稱相同但參數不同時是必要的功能。

最後，Solidity 允許隱式與顯式的型別轉換。這代表變數型別可以由開發者程式碼明確轉換，或是在運算需要時自動轉換。

#### **Solidity 與 JavaScript 的相似之處**

Solidity 過去深受 JavaScript 影響。現在，最明顯的相似之處在於 Solidity 使用 'function' 關鍵字來定義函式。

對於熟悉 Solidity 主要影響來源的開發者來說，學習 Solidity 相對容易上手。此外，Solidity 是靜態型別語言，支援使用函式庫，也能建立複雜型別。

#### **Solidity 與 Python 的相似之處**

Solidity 受 Python 影響在語法上較不明顯，不過與 Python 相同，Solidity 使用 C3 線性化、多重繼承，並保留了 'super' 關鍵字。

[Vyper 使用 Python 風格的語法，與 Solidity 相似](https://www.alchemy.com/overviews/solidity-vs-vyper)，其設計目的是提升在相容 EVM 的區塊鏈上使用的智能合約的安全性。

### **Solidity 如何被使用？**

作為區塊鏈編程語言，Solidity 的本質就是為了能在 Ethereum 虛擬機（EVM）上編譯而創建。因此，Solidity 能為任何相容 EVM 的區塊鏈編寫安全的、與 Ethereum 相容的智能合約。

這種廣泛的相容性，加上其易於理解與靈活的功能，使 Solidity 成為業界使用最廣泛的區塊鏈開發語言。

## **Solidity 如何運作？**

Solidity 開發者編寫的智能合約是在 EVM 上執行的程式。與其他語言中的類別類似，智能合約可以擁有多個函式、內部狀態與公開宣告。

Solidity 合約會[編譯成位元組碼](https://www.alchemy.com/overviews/solidity-compiler)，供 EVM 讀取。編譯完成後，Solidity 合約與其他 EVM 智能合約語言（如 Vyper 或 **Huff**）編寫的合約並無二致。

如同其他開發者工具，Solidity 也會定期進行版本更新。請注意，由於智能合約一旦部署並加入區塊鏈後便無法逆轉，Solidity 的版本限制只在建立當下有意義。

雖然[ Solidity 開發者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)理論上可以直接用位元組碼編寫 Ethereum 智能合約，但像 Solidity 這樣的高階語言能讓工程師更有效率地編寫合約，而不需要進行任何低階操作。

### **Solidity 如何與 EVM 互動？**

以下摘要說明 Solidity 如何改變 EVM 的狀態：

1. 使用 Solidity 編寫智能合約
1. Solidity 智能合約被編譯成位元組碼
1. 位元組碼被轉換成 EVM 操作碼（opcode）
1. EVM 操作碼改變 EVM 的狀態

EVM 是一台 _virtual state machine_，是 Ethereum「全球電腦」的記錄保存者。簡單來說，EVM 維護整個網路的全域狀態，包括地址、帳戶餘額與代幣持有情況。

Solidity 智能合約的編寫目的是為了改變 EVM 的全域狀態。EVM 的全域狀態會因鑄造代幣、發送與接收代幣，或釋放資產等動作而改變。

一系列編碼成[ EVM 操作碼](https://ethereum.org/en/developers/docs/evm/opcodes/)的 EVM 運算，會觸發這些對全域狀態的改變。每個 EVM 操作碼都被設計用來促使 EVM 執行特定種類的狀態變化，例如將代幣從一個地址發送到另一個地址、鑄造代幣，甚至銷毀智能合約。

在最後一步，EVM 會將智能合約的位元組碼翻譯成 EVM 操作碼，對區塊鏈進行必要的變更。

每個操作碼都會產生一定的 _gas fee_，以 ETH 計價收取，用以降低惡意行為者以大量請求堵塞網路的風險。因此，一筆交易的總 gas 成本，是由每單位 gas 的價格乘以該交易所有操作碼的總 gas 成本所計算出來的。

## **哪些相容 EVM 的區塊鏈支援 Solidity？**

Solidity 能為任何相容 EVM 的區塊鏈編寫智能合約，包括 Polygon、Arbitrum 和 Optimism 等 L2。由於 Solidity 靈活且易於使用，因此獲得許多其他區塊鏈的支援。以下是一些支援 Solidity 的最大專案：

### 1. Polkadot

Polkadot 是一條專注於將多個區塊鏈（即平行鏈）整合到一條使用中繼鏈的鏈上。Polkadot 的目標是讓平行鏈之間具備互通性，以提升可擴展性並增加頻寬。[ Astar](https://www.alchemy.com/astar) 就是一個由 Alchemy 支援的 Polkadot 平行鏈範例。

### **2. Avalanche**

Avalanche 是支援 Solidity 開發的 Ethereum 競爭者。Avalanche 的架構基於三條區塊鏈組成的網路：一條用於發行與交易資產（X Chain）、一條用於協調網路驗證者（P-Chain），以及一條允許建立智能合約（C Chain）。

### **3. BNB chain（前身為 Binance smart chain）**

[Binance](https://www.alchemy.com/dapps/binance) Smart Chain 最初是 Ethereum 上的一種 ERC-20 代幣，為了支援其日益成長的應用程式生態系統，Binance Smart Chain（BSC）網路因此誕生。BSC 及其代幣的智能合約使用 Solidity 編寫。如今，Binance Smart Chain 已更名為 BNB Chain。

## **Solidity 有多受歡迎？**

Solidity 是區塊鏈產業中最受歡迎的智能合約程式語言。Solidity 是建立相容 EVM 智能合約的原生語言。即使在 EVM 之外，也有專案內建對 Ethereum 虛擬機的支援，例如 Neon Labs 的[ Solana EVM](https://www.alchemy.com/overviews/solana-evm)。

由於區塊鏈產業仍在成長中，Solidity 相較於其他所有程式語言，可能看似使用較少。然而，在這個產業內，Solidity 是應用範圍最廣的智能合約語言。Solidity 在許多鏈以及成長最快的 web3 dApp 生態系統中都有強大的應用案例。

根據 **The Next Web’s Hard Fork** 的一份報告，在標記為區塊鏈的問題中，Solidity 出現的次數是排名第二的競爭語言的兩倍。JavaScript 的佔比僅為 4.8%，而 Solidity 則佔 9.5%。

## Solidity 在 Ethereum 上如何被使用？

看看 Solidity 在 Ethereum 中應用的一些範例，能讓你清楚感受到 Solidity 程式碼在建立靈活智能合約方面的簡潔性。官方[ Solidity 文件](https://docs.soliditylang.org/en/v0.8.16/)中的程式碼範例，是學習這門語言的絕佳入門。

### **智能合約**

以下是 Solidity 文件中的一個簡單程式碼範例，用於在 Ethereum 上建立一種簡單的貨幣。

<ImageBlock
  src="https://media.alchemy.com/1704182488-solidity-code-example.png"
  alt="在 Ethereum 上簡單貨幣智能合約的 Solidity 程式碼範例"
  width={836}
  height={1384}
  caption="這段程式碼會建立一種貨幣。"
/>

請注意合約中函式的宣告，以及私有與公開變數。函式讓合約能夠在鏈上執行不同的動作，在此範例中即是從一個地址發送代幣到另一個地址，以及鑄造代幣。

公開變數可以從合約外部存取，並會自動產生 **getter 函式** 用於取得這些變數的值。_event_ 關鍵字讓客戶端應用程式能夠[監聽合約引發的變化](https://www.alchemy.com/overviews/solidity-events)。

在此範例中，客戶端會看到 _sent_ 事件，這向監聽者表示地址 _msg.sender_ 向地址 _receiver_ 發送了一定 _amount_ 的代幣。

### **什麼是 Solidity ERC 標準？**

**Solidity 智能合約的設計基礎是 ERC（Ethereum Request for Comment）標準，這些標準旨在改善並統一不同類型 Ethereum 代幣的實作方式。**

ERC 標準由 EIP（Ethereum Improvement Proposals）提出。一旦 ERC 標準獲得核准並定案，就會成為編寫 Solidity 合約的標準，形成一套用於建立智能合約的通用[ Solidity 介面](https://www.alchemy.com/overviews/solidity-interface)範本。當 Solidity 開發者建立符合現有 ERC 標準的代幣時，他們就能清楚知道自己的代幣在區塊鏈上會如何正確運作。

以下是一些使用最廣泛的 ERC 標準：

- [ERC-20](https://www.alchemy.com/overviews/solidity-events) - 同質化代幣標準
- [ERC-721](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity) - 非同質化代幣標準
- [ERC-1155](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155) - 半同質化代幣標準
- [ERC-4626](https://www.alchemy.com/overviews/erc-4626) - 具收益能力的金庫標準

## **如何學習 Solidity 程式設計**

現在你知道什麼是 Solidity 了，但該如何開始學習呢？作為最受歡迎的智能合約語言，網路上有大量資源可供你開始學習 Solidity 開發。

學習 Solidity 最好的方式之一，就是參加 Alchemy University 的[為期 7 週的 Solidity 訓練營](https://university.alchemy.com/?a=0950a65be4)，該課程最初由領先的 web3 工程師團隊 ChainShot 建立，並在 Alchemy 於 2022 年 8 月收購 ChainShot 後重新設計。

這個 Ethereum 開發者訓練營原本是一堂價值 3,000 美元的認證課程，現在已完全免費。立即報名排隊加入 Alchemy University。

## **Solidity 資源**

本節提供一些線上學習 Solidity 開發的最佳資源。

1. 官方 Solidity 文件－將文件作為學習 Solidity 開發的主要資源。
1. Solidity by Example－從「Hello World」程式到錢包應用程式與 DeFi，涵蓋各種 Solidity 範例的彙整。
1. **Clean Contracts** － 指南說明如何搭配 Solidity 程式碼範例，撰寫安全且可預測的智能合約。
1. [OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin) 的 Ethernaut － 一款以智能合約為基礎的戰爭遊戲，每一關都需要破解一個智能合約。

## **開始使用 Solidity 進行開發**

本文為你介紹了 Solidity，並提供了開始學習 Solidity 開發的資源。Solidity 是一種極具彈性且功能強大的語言，可用於在 Ethereum 及相容 EVM 的區塊鏈上開發去中心化應用程式。

當你對自己的知識有足夠信心時，不妨在 Goerli 測試網上部署一個應用程式、參加 web3 黑客松，並開始嘗試建立自己的 web3 新創公司！
