什麼是 Solidity?
作者 Alchemy
隨著 web3 產業的成長,開發者面臨越來越多的web3 程式語言選擇。每種語言在撰寫智慧合約時都有不同的優點與取捨。語言之間的差異可能來自於支援特定區塊鏈,或是具有不同的特性,例如速度、可讀性或安全性。
Solidity是作為 Ethereum 區塊鏈的智慧合約語言而開發的,是一種強大的程式語言,用於為區塊鏈產業中最大的開發者生態系統建立去中心化應用程式。
在本文中,我們會透過 Solidity 的歷史、語言影響來源及其用途,介紹 Solidity。文末,我們會提供一些最佳的開發者資源,讓你可以繼續透過免費 Solidity 課程以及web3 開發學習資源來學習。
什麼是 Solidity?
Solidity 於 2014 年提出,是一種物件導向的高階程式語言,用於實作在Ethereum Virtual Machine(EVM)上執行的智慧合約。 Solidity 受到 C++ 和 JavaScript 等知名程式語言的啟發。身為 web3 開發者,學習 Solidity 對於學習web3 開發很有幫助。
本節將為你介紹 Solidity 的歷史,說明 Solidity 與其他程式語言之間的相似之處,並解釋 Solidity 的主要使用情境。
Solidity 是誰創造的?
2014 年,Ethereum 的技術長 Gavin Wood 提出了 Solidity,作為滿足 Ethereum 對於撰寫智慧合約所需的圖靈完備程式語言的方案。
Ethereum 的創辦人 Vitalik Buterin 提出將 Ethereum 作為一種協議,擴展 Bitcoin 所開創的區塊鏈功能,並加入智慧合約的功能。在他的構想中,Ethereum 能夠執行一個複雜的智慧合約網路,這些智慧合約是在分散式的全球電腦網路上運行的、有條件執行的程式碼片段。智慧合約讓開發者能夠建立新的加密貨幣、建構 DeFi 應用程式等等。
Solidity 專案團隊由 Christian Reitwiessner 領導,他們成功建立了一種圖靈完備、物件導向的程式語言,用於實作智慧合約。作為一種高階語言,意味著開發者建立智慧合約時,不需要操作記憶體或位元組碼等系統層級的資訊來執行運算。
圖靈完備性是指一個資料操作系統(在此指程式語言)能夠模擬圖靈機行為的能力。理論上,Solidity 需要能夠執行開發者可能需要的任何運算。
Solidity 是基於哪些程式語言設計的?
在開發過程中,Solidity 受到多種既有程式語言的基礎與影響,包括 C++、Python 以及 JavaScript。
Solidity 與 C++ 的相似之處
Solidity 在變數宣告和 for 迴圈方面,使用與 C++ 相同的語法。此外,Solidity 也支援 C++ 風格的函式多載,這在兩個函式名稱相同但參數不同時是必要的功能。
最後,Solidity 允許隱式與顯式的型別轉換。這表示變數型別可以透過開發者明確撰寫的程式碼進行轉換,或是在運算需要時自動轉換。
Solidity 與 JavaScript 的相似之處
Solidity 過去深受 JavaScript 的影響。如今,最明顯的相似之處在於 Solidity 使用「function」關鍵字來定義函式。
對於熟悉 Solidity 部分重要影響來源的開發者來說,認識 Solidity 會相對容易。此外,Solidity 是靜態型別語言,允許使用函式庫,也能建立複雜的型別。
Solidity 與 Python 的相似之處
Solidity 受到 Python 的影響在語法上較不明顯,不過與 Python 相同的是,Solidity 使用 C3 線性化、多重繼承,並保留「super」關鍵字。
Vyper 使用 Pythonic 語法,與 Solidity 類似,其設計目的是為了提升在相容 EVM 的區塊鏈上使用之智慧合約的安全性。
Solidity 如何被使用?
由於其作為區塊鏈程式語言的本質,Solidity 被設計為專門在 Ethereum Virtual Machine(EVM)上編譯。因此,Solidity 能夠為任何相容 EVM 的區塊鏈撰寫安全的、與 Ethereum 相容的智慧合約。
這種廣泛的相容性,加上易於理解及靈活的功能,使得 Solidity 成為業界使用最廣泛的區塊鏈開發語言。
Solidity 是如何運作的?
Solidity 開發者撰寫的智慧合約,是在 EVM 上運行的程式。與其他語言中的類別類似,智慧合約可以擁有多個函式、內部狀態以及公開宣告。
Solidity 合約會被編譯為位元組碼,供 EVM 讀取。編譯完成後,Solidity 合約看起來與使用 Vyper 或 Huff 等其他 EVM 智慧合約語言撰寫的合約並無不同。
如同其他開發者工具,Solidity 也會定期更新版本。請注意,由於智慧合約一經部署並加入區塊鏈後即不可逆,Solidity 的版本限制只會在建立當下有影響。
雖然Solidity 開發者理論上可以直接用位元組碼撰寫 Ethereum 智慧合約,但像 Solidity 這樣的高階語言,讓工程師能夠更有效率地撰寫合約,而不需要進行任何低階操作。
Solidity 如何與 EVM 互動?
以下摘要說明 Solidity 如何改變 EVM 的狀態:
- 使用 Solidity 撰寫智慧合約
- Solidity 智慧合約被編譯為位元組碼
- 位元組碼被轉換為 EVM opcode
- EVM opcode 改變 EVM 的狀態
EVM 是一個 虛擬狀態機,也是 Ethereum「全球電腦」的記錄保存者。簡單來說,EVM 維護著網路的全域狀態,其中包括地址、帳戶餘額以及代幣持有情況。
Solidity 智慧合約是為了對 EVM 的全域狀態進行變更而撰寫的。EVM 的全域狀態會因鑄造代幣、傳送與接收代幣,或釋放資產等動作而改變。
一系列編碼為EVM opcode的 EVM 操作,會觸發這些對全域狀態的變更。每個 EVM opcode 都被設計用來讓 EVM 執行特定類型的狀態變更,例如將代幣從一個地址傳送到另一個地址、鑄造代幣,甚至銷毀智慧合約。
在最後一步,EVM 會將智慧合約的位元組碼轉換為 EVM opcode,進而對區塊鏈進行必要的變更。
每個 opcode 都伴隨著一定的 gas 費用,以 ETH 計價收取,目的是降低惡意行為者以大量請求堵塞網路的風險。因此,一筆交易的總 gas 成本,是由每單位 gas 的價格乘以該交易所有 opcode 的總 gas 成本計算而得。
哪些相容 EVM 的區塊鏈支援 Solidity?
Solidity 能夠為任何相容 EVM 的區塊鏈撰寫智慧合約,包括 Polygon、Arbitrum 和 Optimism 等 L2。由於 Solidity 靈活且易於使用,因此獲得許多其他區塊鏈的支援。以下是一些支援 Solidity 的最大專案:
1. Polkadot
Polkadot 是一條專注於使用中繼鏈(relay chain)將多條區塊鏈(即 parachain)整合為一條鏈的鏈。Polkadot 的目標是讓 parachain 之間能夠互通,以提升可擴展性並增加頻寬。Astar是 Polkadot parachain 的一個例子,由 Alchemy 提供支援。
2. Avalanche
Avalanche 是 Ethereum 的競爭對手,支援 Solidity 開發。Avalanche 的架構基於三條區塊鏈組成的網路:一條用於發行與交易資產(X Chain)、一條用於協調網路驗證者(P-Chain),以及一條允許建立智慧合約(C Chain)。
3. BNB chain(前身為 Binance smart chain)
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。
由於區塊鏈產業仍在成長中,Solidity 相較於其他所有程式語言,可能看起來使用率較低。然而,在該產業內,Solidity 是應用範圍最廣的智慧合約語言。Solidity 在許多鏈上,以及在成長最快的 web3 dApp 生態系統中,都有強大的使用案例。
根據 The Next Web 旗下 Hard Fork 的報告,在標記為區塊鏈的問題中,Solidity 出現的次數是第二名競爭者的兩倍。JavaScript 的出現量僅為 4.8%,相較之下 Solidity 為 9.5%。
Solidity 在 Ethereum 上如何被使用?
看看 Solidity 在 Ethereum 上使用的一些範例,可以讓你充分了解 Solidity 程式碼在建立靈活智慧合約方面的簡潔性。官方Solidity 文件中的程式碼範例,是認識這門語言的絕佳入門。
智慧合約
以下是 Solidity 文件中一個簡單的程式碼範例,用於在 Ethereum 上建立一種簡單的貨幣。

注意這個合約中的函式宣告,以及私有與公開變數。函式讓合約能夠在鏈上執行不同的動作,在此例中為將代幣從一個地址傳送到另一個地址,以及鑄造代幣。
公開變數可以從合約外部存取,並會自動產生 getter 函式,用於取得這些變數的值。event 關鍵字讓客戶端應用程式能夠監聽合約引發的變更。
在此範例中,客戶端會看到 sent 事件,這表示地址 msg.sender 傳送了一定 amount 的代幣給地址 receiver。
什麼是 Solidity ERC 標準?
Solidity 智慧合約設計的基礎,是 ERC(Ethereum Request for Comment)標準,這些準則旨在改善並標準化不同類型 Ethereum 代幣的實作方式。
ERC 標準是由 EIP(Ethereum Improvement Proposal)提出的。一旦 ERC 標準獲得核准並定案,就會成為撰寫 Solidity 合約的標準。這讓建構智慧合約時能有一個共通的Solidity 介面範本可用。當 Solidity 開發者建立的代幣遵循既有的 ERC 標準時,他們就能知道自己的代幣在區塊鏈上會如何正確運作。
以下是一些使用最廣泛的 ERC 標準:
如何學習 Solidity 程式設計
你已經知道什麼是 Solidity 了,但該如何開始學習 Solidity 呢?作為最受歡迎的智慧合約語言,網路上有豐富的資源可供你開始學習 Solidity 開發。
學習 Solidity 的最佳方式之一,是參加 Alchemy University 的為期 7 週的 Solidity 訓練營,該課程最初由頂尖 web3 工程師團隊 ChainShot 建立,並在 Alchemy 於 2022 年 8 月收購 ChainShot 後重新設計。
這個 Ethereum 開發者訓練營原本是一門價值 3,000 美元的認證課程,現在則完全免費。快把握機會,加入 Alchemy University 的候補名單。
Solidity 資源
本節提供一些學習 Solidity 開發的網路上最佳資源。
- 官方 Solidity 文件 - 將此文件作為學習 Solidity 開發的主要資源。
- Solidity by Example - 匯集了從「Hello World」程式到錢包應用程式及 DeFi 的各種 Solidity 範例。
- Clean Contracts - 介紹如何撰寫安全且行為可預期的智慧合約的指南,並附有 Solidity 程式碼範例。
- OpenZeppelin 的 Ethernaut - 一款以智慧合約為基礎的戰爭遊戲,每個關卡都需要駭入一個智慧合約。
開始使用 Solidity 進行開發
本文向你介紹了 Solidity,並提供了開始學習 Solidity 開發的資源。Solidity 是一種極具靈活性且強大的語言,可用於在 Ethereum 以及相容 EVM 的區塊鏈上開發去中心化應用程式。
一旦你對自己的知識感到有信心,不妨在 Sepolia 測試網上部署一個應用程式、參加 web3 黑客松,並開始嘗試建立一個 web3 新創事業!
相關總覽

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


