什麼是 Solidity?
Solidity 是一種高階程式語言,用於編寫可在 Ethereum 與其他支援 Ethereum Virtual Machine 的區塊鏈網路上運行的智能合約。官方 Solidity 網站將 Solidity 描述為一種靜態型別、使用大括號的程式語言,旨在開發於 Ethereum 上運行的智能合約。
智能合約是儲存於區塊鏈上的程式,無須傳統伺服器即可持有資產、執行規則、運行邏輯並回應交易。官方 Ethereum 智能合約文件說明,智能合約是在 Ethereum 區塊鏈上運行的程式。
在加密貨幣領域中,Solidity 可用於建構代幣、DeFi 協議、NFT 系列、DAO、質押系統、借貸市場、跨鏈橋、託管系統、治理合約,以及許多其他鏈上應用程式。人類使用者不會直接執行 Solidity 程式碼。開發者會先編寫 Solidity 原始碼,再將其編譯為 Ethereum Virtual Machine 可執行的位元組碼。官方 Solidity 文件說明,Solidity 是一種物件導向的高階語言,用於實作智能合約。
簡單來說,Solidity 是許多開發者用來在以 EVM 為基礎的區塊鏈上建立可程式化加密貨幣應用程式的主要程式語言。為何 Solidity 對加密貨幣很重要
Solidity 很重要,因為它為加密貨幣生態系中使用者互動的許多智能合約提供支援。當使用者兌換代幣、鑄造 NFT、參與 DAO 投票、存入抵押品、領取獎勵或使用 DeFi 應用程式時,Solidity 智能合約可能正在處理其中一部分操作。Solidity 協助讓可程式化數位資產得以實際應用,因為開發者能編寫可重複使用的所有權、轉移、權限、費用、流動性與治理規則。同質化資產與 NFT 等代幣,通常依賴以 Solidity 實作的智能合約標準。官方 ERC-20 代幣標準定義了智能合約中同質化代幣的通用介面。
官方 ERC-721 代幣標準定義了非同質化代幣的通用介面。
官方 ERC-1155 代幣標準定義了一種多代幣標準,可在同一套合約系統中支援同質化與非同質化資產。
這些標準很重要,因為錢包、瀏覽器、應用程式與協議能更容易支援通用的代幣行為。Solidity 也很重要,因為智能合約錯誤可能影響使用者的真實資金。Solidity 程式碼中的小錯誤,可能導致代幣遺失、權限失效、帳務錯誤、升級失敗,或可被利用的 DeFi 邏輯漏洞。Solidity 如何運作
Solidity 可讓開發者以人類可讀的原始碼描述智能合約規則。程式碼接著會透過 Solidity 編譯器編譯成 EVM 位元組碼;該編譯器通常稱為 solc。官方 Solidity 編譯器文件說明,編譯器可產生二進位檔、ABI 資料、組合語言、Gas 估算與抽象語法樹等輸出。
完成編譯後,部署位元組碼會透過區塊鏈交易送出,以建立合約帳戶。部署後,合約會擁有一個可供使用者與其他合約呼叫的地址。使用者通常不會透過編寫原始位元組碼來呼叫智能合約。使用者通常會透過錢包、應用程式、腳本或介面互動,並使用合約 ABI 編碼函式呼叫。合約接收交易資料後,會依 EVM 規則執行;若獲允許則更新儲存資料,若程式碼指定則發出事件,並回傳資料或錯誤。每項會改變狀態的操作都需要區塊鏈交易,且交易發送者必須支付費用。因此,Solidity 開發必須同時考量正確性與 Gas 成本。Solidity 與 Ethereum Virtual Machine
Ethereum Virtual Machine,或 EVM,是執行已編譯智能合約位元組碼的執行環境。官方 Solidity 智能合約簡介說明,EVM 是 Ethereum 智能合約的執行環境,且與周遭系統隔離。
Solidity 的設計目標是 EVM,這表示 Solidity 程式碼會被編譯成 EVM 能理解的指令。這種設計讓智能合約能在眾多節點上以確定性的方式執行。確定性執行意指,在相同鏈上狀態下處理相同交易時,每個誠實節點都應得到相同結果。這一點至關重要,因為區塊鏈需要就餘額、所有權、合約儲存資料與交易結果達成共識。EVM 也建立了沙箱環境,限制合約可執行的操作。Solidity 合約無法直接呼叫任意網站、讀取私有伺服器資料,或存取鏈下資訊,除非該資訊透過交易或預言機系統帶到鏈上。此限制提升了確定性,但也迫使開發者針對外部資料需求進行審慎設計。因此,Solidity 並非一般的網頁程式語言,因為它是在具有嚴格規則的區塊鏈執行模型中運行。Solidity 與智能合約
Solidity 智能合約是在部署後存在於某個區塊鏈地址上的程式碼與儲存資料集合。程式碼定義可呼叫的函式,以及這些函式執行的工作。儲存資料保存長期狀態,例如餘額、擁有者地址、設定值、映射、投票、債務、儲備與代幣中繼資料。合約可接收由使用者控制的外部擁有帳戶所發送的交易。合約也可呼叫其他合約,藉此建立可組合的鏈上系統。可組合性是 Solidity 最重要的加密貨幣特性之一,因為一個協議可建立在另一協議的合約介面之上。代幣合約可供借貸協議、兌換協議、質押合約與治理系統使用。這使 Solidity 功能強大,但也會帶來風險,因為一份合約的漏洞可能影響許多已連接的應用程式。智能合約在完成驗證後通常具備透明度,但透明度並不自動代表安全。使用者應將每一次合約互動視為具有技術與金融風險的交易。Solidity 語法
Solidity 使用大括號、函式宣告、變數、型別、結構、映射、事件、修飾器與繼承模式;熟悉 JavaScript、C++、Java 或類似語言的開發者可能會感到熟悉。官方 Solidity 文件指出,該語言受到 C++、Python 與 JavaScript 影響。Solidity 檔案通常以授權識別碼與 pragma 陳述式開頭。pragma 陳述式會告知工具該原始檔預期使用的編譯器版本。合約定義接著包含狀態變數、事件、錯誤、建構函式、函式、修飾器,以及有時包含巢狀型別。Solidity 是靜態型別語言,表示變數與函式參數都具有已宣告的型別。常見型別包括 bool、uint256、int256、address、bytes、string、陣列、結構、列舉與映射。開發者必須審慎考量儲存區、記憶體、calldata、可見性、可變性與存取控制。這些細節很重要,因為 Solidity 程式碼會控制資產,且部署後可能難以變更。看似簡單的語法仍可能產生複雜的鏈上行為。合約
合約是 Solidity 的主要建構單元。合約可儲存資料、定義函式、發出事件、繼承其他合約,並與其他合約互動。代幣合約可儲存餘額與授權額度。借貸合約可儲存抵押品、債務、利息指數與強制平倉設定。治理合約可儲存提案、投票、法定人數規則與執行延遲。質押合約可儲存存入資產、獎勵費率、提領規則與領取資料。每一份已部署合約都會在區塊鏈上取得自己的地址。使用者可呼叫該地址,以與合約函式互動。合約程式碼只會在交易或呼叫觸發時運行。合約不會像一般伺服器應用程式一樣持續運作。狀態變數
狀態變數是永久儲存在合約儲存區中的變數。它們用於必須在多筆交易之間持續可用的資料。範例包括代幣餘額、擁有者地址、總供應量、費用設定、協議儲備、投票數與使用者倉位。儲存資料的成本很高,因為區塊鏈節點必須保存並驗證這些資料。開發者應避免在鏈上儲存不必要的資料。開發者也應仔細設計儲存區配置,尤其是在可升級合約中。儲存區配置錯誤可能在升級時破壞重要的合約狀態。Solidity 可透過編譯器輸出儲存區配置資訊,協助開發者與稽核人員檢視升級風險。除非合約已驗證,或區塊鏈瀏覽器提供可讀取的呼叫功能,否則使用者很少會直接看到狀態變數。然而,這些變數通常決定使用者資金與權限的處理方式。函式
函式定義 Solidity 合約能執行的動作。函式可讀取資料、更新儲存區、轉移代幣、呼叫其他合約、發出事件,或在條件未達成時回復交易。函式可見性控制誰可以呼叫函式,以及可如何存取函式。常見的可見性關鍵字包括 public、external、internal 與 private。函式可變性表示函式會讀取或修改狀態。常見的可變性關鍵字包括 view、pure 與 payable。view 函式可以讀取狀態而不改變狀態。pure 函式不應讀取或改變合約狀態。payable 函式在以 value 呼叫時可接收該鏈的原生資產。函式設計很重要,因為許多智能合約漏洞來自遺漏檢查、錯誤權限、不安全的外部呼叫或不正確的帳務處理。事件
事件是 Solidity 合約在執行期間發出的日誌。事件可協助錢包、區塊鏈瀏覽器、索引器與應用程式追蹤交易中發生的事項。依據常見代幣標準實作時,代幣轉移通常會發出 Transfer 事件。DeFi 協議可能會針對存入、提領、借款、還款、強制平倉、兌換、投票或設定變更發出事件。事件很有用,因為其儲存成本低於完整合約儲存資料,且容易供鏈下系統建立索引。然而,事件不等同於合約狀態。合約只有在程式碼指定時才會發出事件。應用程式不應在不了解合約邏輯的情況下盲目信任事件日誌。事件非常適合用於透明度與分析,但必須連同底層程式碼一併解讀。對使用者而言,事件通常會支援錢包與區塊鏈瀏覽器中顯示的可讀交易紀錄。修飾器
修飾器是可重複使用的 Solidity 邏輯片段,可改變或限制函式行為。常見修飾器會在允許函式運行前,檢查呼叫者是否為擁有者、管理員、治理者或經授權角色。修飾器可減少重複程式碼,並讓存取控制更容易閱讀。但若過度使用或撰寫不清楚,修飾器也可能隱藏重要邏輯。函式表面上可能很簡單,但修飾器可能在背景執行重大檢查或狀態變更。開發者應讓修飾器保持清晰且專注。稽核人員應仔細檢查修飾器,因為它們通常保護敏感函式。檢視已驗證程式碼的使用者,不應只根據函式可見主體判斷函式。使用者也應檢查繼承的修飾器與存取控制條件。遺漏或失效的修飾器可能造成嚴重安全風險。映射
映射是一種常用於 Solidity 合約的鍵值資料結構。代幣餘額通常會儲存在由地址映射至數量的映射中。授權額度可儲存在由擁有者映射至支出者再映射至數量的巢狀映射中。治理系統可使用映射追蹤某個地址是否已投票。借貸系統可使用映射追蹤各使用者的抵押品與債務。映射可有效率地依鍵查詢值。但映射不容易直接在鏈上進行迭代。當需要讓鏈下系統列出映射項目時,開發者通常會使用事件或額外資料結構。映射功能強大,但需要審慎的帳務處理。錯誤的映射更新可能導致餘額錯誤、權限失效或資金遺失。介面
介面定義另一份合約可呼叫的函式簽章。介面很重要,因為智能合約經常需要與其他智能合約互動。代幣介面可告知 DeFi 合約如何呼叫 transfer、transferFrom、approve、balanceOf 或 allowance。預言機介面可告知借貸協議如何讀取價格資料。治理介面可讓其他合約檢查提案狀態或投票權。介面可提升可組合性,因為合約能依賴通用的函式形式。但介面只描述預期的呼叫與回傳值。它無法證明某個地址背後的合約行為誠實或安全。開發者在整合外部合約前,應驗證對其所作的假設。使用者應記得,合約可組合性可能在連接系統間擴散風險。函式庫
函式庫是可重複使用的 Solidity 程式碼單元,可協助開發者避免重寫常見邏輯。函式庫可提供數學函式、地址工具、安全轉移輔助函式、陣列工具、字串工具或資料結構操作。部分函式庫會在編譯期間嵌入合約位元組碼中。其他函式庫可另行部署,並透過地址連結。若函式庫經過充分測試與廣泛檢視,使用函式庫可提升程式碼品質。若函式庫已過時、具惡意、連結錯誤或使用方式不當,使用函式庫也可能增加風險。開發者應固定相依套件版本,並檢查匯入程式碼。稽核人員應將函式庫視為完整程式碼庫的一部分進行檢查。使用者應了解,已驗證合約可能依賴匯入函式庫與繼承程式碼。合約的安全性取決於所有影響其行為的完整程式碼集合。繼承
繼承可讓 Solidity 合約重複使用並擴充其他合約的程式碼。這對共用擁有權邏輯、代幣行為、存取控制、暫停控制、升級模式與可重複使用模組很有幫助。若謹慎使用,繼承可讓程式碼更容易組織。若許多被繼承合約以複雜方式互動,也可能使程式碼更難檢視。子合約可以覆寫父合約函式。多重繼承可能產生細微的順序與覆寫問題。開發者應盡可能讓繼承結構保持簡單。稽核人員應檢查完整繼承樹,而非只檢查最終合約。閱讀已驗證程式碼的使用者應檢查匯入的父合約,而不僅是頁面上顯示的合約名稱。繼承功能強大,但若忽略隱藏的繼承邏輯,可能相當危險。ABI
ABI 是 Application Binary Interface 的縮寫。官方 Solidity ABI 規格說明,ABI 是在 Ethereum 生態系中與合約互動的標準方式。
ABI 告訴軟體如何編碼函式呼叫及解碼回傳值。錢包、腳本、應用程式與區塊鏈瀏覽器使用 ABI 顯示可讀的函式名稱與參數欄位。若沒有 ABI,使用者將需要處理原始 calldata,這會更難理解。ABI 可包含函式、事件、錯誤、輸入、輸出與型別資訊。ABI 無法證明合約安全。它只描述如何呼叫合約公開的介面。惡意合約仍可能擁有看似正常的 ABI。使用者應將 ABI 資料視為可用性層,而非信任保證。Solidity 編譯器
Solidity 編譯器或 solc,會將 Solidity 原始碼轉換為 EVM 位元組碼與支援成品。Solc 也可產生 ABI 資料、中繼資料、Gas 估算、儲存區配置、警告、錯誤與中間輸出。確切的編譯器版本與設定十分重要,因為它們會影響最終位元組碼。官方 Solidity 0.8.35 發布公告指出,0.8.35 版引入 erc7201 內建函式、頂層實驗性旗標,以及實驗性的 SSA CFG 程式碼產生器。
編譯器版本很重要,因為 Solidity 會隨時間演進,包含新功能、錯誤修正、警告與 EVM 目標變更。使用某個版本編譯的合約,可能不會與使用另一版本編譯相同原始碼的結果相符。最佳化工具狀態、最佳化執行次數、EVM 版本、via-IR 與函式庫地址等編譯器設定,也會影響輸出。因此,已驗證合約通常會顯示用於比對已部署位元組碼的編譯器版本與設定。開發者應為正式環境部署固定編譯器版本。使用者應了解,已驗證原始碼仰賴相符的編譯設定,而不只是文字相同。位元組碼
位元組碼是 Solidity 合約完成編譯與部署後,EVM 所執行的低階程式碼。部署位元組碼用於建立合約。執行期位元組碼是部署後保留在合約地址上的程式碼。區塊鏈執行的是位元組碼,而不是原始 Solidity 原始碼文字。因此,原始碼驗證相當重要。驗證顯示可見原始碼與編譯器設定能重現已部署位元組碼。官方 Ethereum 智能合約驗證文件說明,驗證會比較原始碼與編譯後的位元組碼。
多數使用者難以直接閱讀位元組碼。已驗證原始碼可讓位元組碼更容易理解。但即使位元組碼已驗證,在使用者將資金交給合約前,仍須進行安全檢視。Gas
Gas 是用於衡量執行交易與智能合約操作所需運算工作量的單位。Solidity 開發者必須重視 Gas,因為昂貴的程式碼可能讓合約使用成本過高或不切實際。寫入儲存區的成本通常高於讀取記憶體或 calldata。若大型資料集上的迴圈需要過多 Gas,可能變得危險。外部呼叫可能增加成本與安全風險。合約部署也需要 Gas,因為位元組碼必須儲存在鏈上。Solidity 最佳化工具有時可降低 Gas 成本或位元組碼大小,但必須仔細設定與測試。Gas 最佳化不應以不清楚或不安全的邏輯為代價。在加密貨幣領域中,使用成本過高的合約可能在網路壅塞時使使用者操作失敗。良好的 Solidity 開發會在安全性、清晰度與效率間取得平衡。Solidity 與代幣
Solidity 廣泛用於建立與管理代幣合約。同質化代幣合約可追蹤餘額、授權額度、總供應量、轉移、批准、鑄造、銷毀與存取控制。NFT 合約可追蹤唯一代幣 ID、擁有者、批准、中繼資料連結與轉移規則。多代幣合約可在單一合約系統內管理多種代幣類型。代幣標準很重要,因為它們讓錢包、區塊鏈瀏覽器與應用程式更容易支援代幣。ERC-20、ERC-721 與 ERC-1155 是 Ethereum 生態系中最重要的應用層代幣標準之一。然而,以 Solidity 編寫或遵循標準的代幣,並不代表其安全或具有價值。代幣合約可能包含鑄幣權限、黑名單邏輯、費用、暫停控制、可升級性或危險的管理員權限。使用者在信任代幣前,應檢查代幣權限、持有人分布、流動性、供應規則與已驗證原始碼。Solidity 讓代幣建立成為可能,但代幣品質取決於設計與治理。Solidity 與 DeFi
Solidity 是許多去中心化金融應用程式的核心。DeFi 合約可管理兌換、流動性池、借貸市場、金庫、衍生品、質押、收益策略與治理系統。這些系統通常持有大量使用者資產,因此 Solidity 的安全性極為重要。DeFi 協議可能因程式碼漏洞、預言機問題、不良帳務模型、有缺陷的強制平倉規則、不安全升級或治理攻擊而失敗。Solidity 允許合約彼此呼叫,使 DeFi 具備高度可組合性。可組合性能建立實用的金融建構單元。當一個協議仰賴另一協議的行為時,可組合性也可能產生相依性風險。開發者應在各種市場條件與失敗情境下測試整合。使用者應了解,DeFi 智能合約可以同時具備透明度與風險。高收益率或高交易量並不能證明 Solidity 程式碼安全。Solidity 與 NFT
Solidity 常用於建立 NFT 合約,以定義獨特數位資產的所有權與轉移規則。NFT 智能合約可分配代幣 ID、儲存所有權紀錄、管理批准並連結中繼資料。NFT 中繼資料通常指向圖片、屬性、描述或外部檔案。智能合約可能不會直接將所有媒體儲存在鏈上,因為在鏈上儲存大型資料成本可能很高。使用者應檢查 NFT 中繼資料是否位於鏈上、去中心化、可變更,或受專案方控制。已驗證的 Solidity NFT 合約可顯示鑄造規則、供應限制、版稅行為、轉移限制與管理員權限。然而,許多 NFT 風險不只是程式碼風險。NFT 風險還包括假冒系列、抄襲藝術品、流動性不足、中繼資料失效、誤導性承諾與市場操縱。Solidity 提供所有權邏輯,但不保證文化價值或未來需求。NFT 買家應結合合約檢查、系列驗證與流動性分析。Solidity 與 DAO
Solidity 常用於建構 DAO 治理合約。DAO 合約可管理提案、投票權、委託、時間鎖、金庫執行與角色權限。治理合約可讓代幣持有人或成員對協議變更進行投票。它們也可控制升級、金庫轉移、參數變更與緊急暫停等敏感操作。DAO 合約需要謹慎設計,因為治理攻擊可能影響真實資產。設計不良的投票系統可能容易受到低投票率、買票、閃電貸投票、巨鯨控制或倉促執行影響。時間鎖可讓使用者在已批准的變更生效前有時間作出反應。緊急控制可降低損害,但也可能引入中心化權力。Solidity 為 DAO 提供可程式化治理工具,但治理安全性取決於程式碼與人為協調。使用者應檢查誰可以變更協議,以及變更可多快發生。Solidity 安全風險
Solidity 安全性是加密貨幣開發中最重要的主題之一。官方 Solidity 安全考量文件涵蓋重入、Gas 限制、Ether 發送與接收、tx.origin、細節問題與編譯器相關疑慮等風險。
當合約在安全更新自身狀態前呼叫外部合約時,可能發生重入。存取控制漏洞可能讓未授權使用者呼叫敏感函式。整數與帳務錯誤可能造成餘額錯誤或費用邏輯失效。預言機錯誤可能造成不正確價格與不公平的強制平倉。升級錯誤可能以不安全邏輯取代安全邏輯。未檢查的外部呼叫可能建立非預期的執行路徑。簽章驗證錯誤可能允許重放攻擊或偽造批准。智能合約安全需要威脅建模、測試、檢視、稽核、監控與保守設計。重入
重入是一種廣為人知的智能合約漏洞;外部呼叫可讓另一份合約在第一份合約完成狀態更新前回呼。這可能允許重複提領、帳務失效或非預期的控制流程。Solidity 安全文件建議使用 Checks-Effects-Interactions 模式,作為降低重入風險的方法之一。此模式指合約應先檢查條件,接著更新內部狀態,最後才與外部合約互動。重入保護也可包括鎖定機制、提取付款設計,以及仔細檢查外部呼叫。開發者不應假設發送資產毫無風險。外部呼叫可執行程式碼並改變控制流程。使用者應謹慎對待具有未經稽核提領邏輯或複雜回呼路徑的協議。重入不是唯一的 Solidity 風險,但它是智能合約邏輯與一般軟體不同的重要例子之一。若狀態更新順序錯誤,看似安全的轉移也可能變得危險。存取控制
存取控制決定誰可以呼叫敏感的 Solidity 函式。重要函式可能包括鑄造代幣、暫停轉移、升級合約、變更費用、設定預言機、提領金庫資金或授予角色。存取控制可基於擁有者地址、角色、多重簽章錢包、治理合約、時間鎖或自訂權限系統。薄弱的存取控制可能讓攻擊者或內部人員改變合約行為。過度中心化的存取控制也可能為使用者帶來信任風險。即使合約技術上正常運作,若一把私鑰可抽走資金或立即變更規則,合約仍可能不安全。開發者應依最小權限原則、清楚的角色分離與復原計畫設計權限。使用者在將資金存入協議前,應檢查管理員權力。若原始碼可用,已驗證的 Solidity 程式碼可揭露權限邏輯。即使沒有程式碼漏洞,管理員風險仍屬於智能合約風險。整數安全性
整數運算在 Solidity 中很重要,因為合約經常處理餘額、份額、價格、費用、利息與獎勵。較舊的 Solidity 版本需要更手動地處理整數溢位與下溢問題。Solidity 0.8.x 預設引入檢查算術;除非使用 unchecked 區塊,否則大多數溢位與下溢情況會回復交易。這項安全性改善並未消除所有數學風險。開發者仍可能在四捨五入、精度、縮放因子、小數位差異、費用順序與份額帳務上犯錯。unchecked 區塊在特定情況下可提高 Gas 效率,但必須謹慎使用。DeFi 合約通常使用定點數學與代幣小數位,這可能造成細微錯誤。稽核人員應檢查數學假設與邊界情況。使用者應了解,安全算術不自動代表安全的經濟模型。正確公式與溢位保護同樣重要。預言機與外部資料
Solidity 合約本身無法直接存取鏈下資料。官方 Ethereum 預言機文件說明,預言機會將外部世界的資料提供給智能合約。
預言機可提供價格、隨機性、證明資料、天氣資料、運動資料、身分資訊或其他鏈下輸入。在 DeFi 中,價格預言機尤其重要,因為它們可能決定抵押品價值、強制平倉、鑄造、贖回與結算。即使 Solidity 程式碼正確編寫,不良的預言機設計仍可能造成重大損失。開發者應避免依賴流動性不足市場中容易被操縱的現貨價格。開發者也應考量更新頻率、備援行為、資料延遲與斷路器。使用者在存入抵押品或借入資產前,應檢查協議使用的預言機來源。Solidity 可執行以預言機為基礎的規則,但無法讓不良資料變得可靠。外部資料是許多智能合約系統中最大的信任假設之一。可升級性
Solidity 合約常被描述為不可變,但許多專案使用升級模式在部署後變更邏輯。可升級合約通常會將代理合約與實作合約分離。代理合約保留地址與儲存資料,而實作合約包含可透過升級函式替換的邏輯。可升級性可修正漏洞並新增功能。但也可能建立信任風險,因為管理員或治理方可在使用者存入資金後變更規則。儲存區配置必須謹慎處理,因為不正確的升級可能破壞狀態。使用者應檢查合約是否可升級、誰控制升級、是否存在時間鎖,以及升級是否公開公告。開發者應清楚記錄升級權限。稽核人員應同時檢查目前實作與升級控制機制。可升級性很有用,但它會改變 Solidity 合約的信任模型。原始碼驗證
原始碼驗證可協助使用者確認已發布的 Solidity 原始碼是否與已部署位元組碼相符。Ethereum 驗證文件說明,驗證會比較合約原始碼與建立合約時使用的已編譯位元組碼。驗證通常需要完全相同的原始檔、編譯器版本、編譯器設定、建構函式引數、函式庫地址與中繼資料設定。已驗證原始碼可提升透明度,因為使用者可閱讀合約背後的邏輯。它也能協助錢包與區塊鏈瀏覽器解碼函式呼叫與事件。然而,原始碼驗證不等同於稽核。已驗證合約仍可能包含漏洞、不安全的管理員控制、升級風險或不良經濟設計。未驗證合約較難取得信任,因為使用者無法輕易比較人類可讀程式碼與已部署位元組碼。當網站要求使用者對未驗證合約進行批准或存入資金時,使用者應保持謹慎。驗證是盡職調查的起點,而非終點。Solidity 版本
Solidity 版本很重要,因為該語言會隨時間改變。新版本可能引入功能、改善警告、變更預設值、修正編譯器漏洞,並支援新的 EVM 行為。官方 Solidity 發布公告會公布編譯器版本與語言變更的詳細資訊。
根據 2026 年可取得的官方發布資訊,Solidity 0.8.35 是具備新功能與實驗性編譯器功能的近期編譯器版本。正式環境專案不應輕易升級編譯器版本。每次編譯器升級都應進行測試,因為位元組碼、Gas 行為、警告與建置輸出可能改變。開發者在變更編譯器版本前應閱讀發布說明。稽核人員應檢查經稽核建置所使用的編譯器版本。檢視已驗證合約的使用者應檢查瀏覽器中顯示的編譯器版本。Solidity 版本選擇是智能合約安全性與可重現性的一部分。Solidity 編譯器漏洞
編譯器漏洞雖然罕見,卻很重要,因為編譯器會將原始碼轉換為實際在鏈上運行的位元組碼。官方 Solidity 已知漏洞文件會追蹤已知編譯器漏洞及受其影響的版本。
即使原始碼看起來正確,合約仍可能受編譯器問題影響。開發者在部署正式環境合約前,應檢查已知編譯器漏洞。稽核人員應在流程中納入編譯器版本檢查。當合約在沒有明確理由下使用非常舊的編譯器版本時,使用者應保持謹慎。並非每個舊編譯器版本都一定不安全,但舊版本可能缺少較新的檢查與修正。智能合約團隊應將編譯器視為可信賴軟體供應鏈的一部分。可重現建置與已記錄的編譯器設定有助於辨識已知漏洞是否可能適用。編譯器風險也是應保存部署成品的另一個原因。Solidity 開發工具
Solidity 開發者通常會使用工具編寫、編譯、測試、部署、驗證與監控合約。官方 Remix IDE是以瀏覽器為基礎的環境,常用於學習、編寫、編譯與測試 Solidity 合約。
命令列框架與本機開發環境可自動化編譯、測試、部署、分叉測試與驗證。靜態分析工具可掃描 Solidity 程式碼中的常見漏洞與高風險模式。模糊測試工具可產生大量輸入,以找出非預期行為。形式化驗證工具可在明確假設下證明選定特性。沒有任何單一工具可以保證安全。專業 Solidity 開發通常結合單元測試、整合測試、模糊測試、程式碼檢查、稽核、部署腳本、監控與事件應變規劃。初學者應從小型合約與測試網開始,再接觸真實資金。進階團隊應使用可重現的建置流程與嚴格的發布控制。測試 Solidity 合約
測試至關重要,因為已部署的智能合約可能控制具有價值的資產。單元測試會檢查個別函式與預期行為。整合測試會檢查多份合約如何共同運作。分叉測試會在本機環境中,依複製而來的真實鏈上狀態模擬合約行為。模糊測試會嘗試大量隨機或結構化輸入,以找出邊界情況。不變量測試會檢查重要規則是否在多項操作後仍維持成立。測試應包括正常流程、失敗流程、權限檢查、邊界情況與惡意使用者情境。開發者應以真實的代幣小數位、不尋常代幣行為、高數值、零值與邊界條件進行測試。測試無法證明每種可能行為都安全,但能大幅減少可避免的錯誤。未經測試的 Solidity 程式碼不應被託付具有實質價值的資金。稽核
智能合約稽核是由專家進行的安全檢視,檢查 Solidity 程式碼、架構、權限、測試與風險假設。稽核可發現漏洞、設計缺陷、存取控制問題、經濟風險、升級問題與文件缺口。稽核不保證合約安全。它是降低風險的流程,不是完美的防護罩。稽核品質取決於範圍、時間、稽核人員技能、測試覆蓋率、文件,以及團隊如何修正發現事項。使用者應閱讀稽核發現事項是否已修正或被接受。使用者也應檢查已部署合約是否與經稽核的提交版本及編譯器設定相符。專案可能已完成稽核,卻仍在之後部署未經稽核的升級。稽核與公開驗證、漏洞獎勵、監控及保守的上線限制結合時最有用。管理大量價值的 Solidity 合約,應在主網部署前接受嚴格檢視。Solidity 與錢包互動
錢包協助使用者簽署呼叫 Solidity 合約的交易。錢包可能顯示合約地址、函式名稱、參數、資產批准、Gas 費與警告訊息。錢包不一定知道合約是否安全。部分惡意網站可要求使用者簽署危險交易,以有害方式呼叫真實 Solidity 函式。代幣批准尤其重要,因為批准可允許合約在指定額度內支出錢包中的代幣。使用者應在簽署前檢查批准額度與合約地址。使用者應避免簽署不了解的交易。當介面隱藏 calldata 或要求無限額度批准時,使用者應保持謹慎。Solidity 實現可程式化互動,但使用者仍透過錢包控制簽章。交易簽章可能永久移動資金或授予權限。Solidity 與代幣批准
代幣批准是一種常見 Solidity 模式,可讓一個地址代表另一個地址支出代幣。在 ERC-20 類型代幣中,approve 會設定授權額度,而 transferFrom 會使用該額度。此設計讓 DeFi 兌換、存入、付款與自動化操作成為可能。但它也會產生風險,因為惡意或已遭入侵的支出者可在批准限額內移動代幣。無限額度批准雖然方便,但會增加曝險。在實際可行情況下,使用者應只批准所需額度。使用者應透過可信賴的錢包或安全工具撤銷未使用的批准。開發者應設計能清楚說明批准內容的介面。稽核人員應檢查授權額度處理中的競態條件、遺漏檢查與不安全假設。批准是一般使用者最常接觸 Solidity 風險的方式之一。Solidity 與形式化驗證
形式化驗證使用數學方法,在定義的假設下證明選定的合約特性成立。這對高價值系統、金融協議、跨鏈橋、治理模組與核心帳務邏輯很有幫助。某項特性可能規定總供應量永遠不超過限額,或使用者無法提領超過其餘額的資產。形式化驗證無法取代測試與稽核。它只能證明實際指定的特性。若規格不完整或有誤,證明可能遺漏現實世界中的風險。形式化方法可能成本高昂,且需要專業知識。將其應用於規則清楚的關鍵邏輯時,效果最強。對 Solidity 而言,形式化驗證是成熟安全流程的一部分。當合約故障可能造成重大損失時,它尤其有用。Solidity 的優點
Solidity 的第一項優點是生態系採用度。許多智能合約工具、教學資源、稽核、標準、函式庫與開發者社群都支援 Solidity。第二項優點是 EVM 相容性。在網路規則與部署設定相容時,Solidity 合約可針對 Ethereum 與其他支援 EVM 的環境部署。第三項優點是可組合性。Solidity 合約可呼叫其他合約,並建立在既有代幣標準與協議介面之上。第四項優點是表達能力。開發者可建構代幣、DeFi 系統、DAO、遊戲、NFT 與自動化金融邏輯。第五項優點是透明度,因為使用者與稽核人員可閱讀及檢視已驗證的 Solidity 原始碼。這些優點說明了為何 Solidity 仍是加密貨幣領域最重要的智能合約語言之一。Solidity 的風險與限制
第一項風險是,部署後的漏洞可能成本高昂且難以修正。第二項風險是,任何找到弱點的使用者都可能利用智能合約邏輯。第三項風險是,Solidity 合約通常與其他合約互動,因此產生相依性風險。第四項風險是,Gas 成本可能讓某些設計不切實際。第五項風險是,可升級性可能產生管理員或治理信任風險。第六項風險是,已驗證原始碼仍可能具惡意或設計不良。第七項風險是,開發者可能誤解 EVM 行為、儲存區配置、重入或外部呼叫。第八項風險是,使用者可能在不了解 Solidity 合約會執行何種操作的情況下簽署有害交易。第九項風險是,即使語法正確,預言機與經濟設計問題仍可能使協議失效。第十項風險是,編譯器設定與相依套件版本可能改變最終部署的位元組碼。Solidity 的常見錯誤
常見錯誤之一是編寫無法保護敏感函式的存取控制。另一項錯誤是在安全更新內部狀態前進行外部呼叫。第三項錯誤是使用 tx.origin 進行授權,而 Solidity 安全文件警告不應這麼做。第四項錯誤是在計算中忽略代幣小數位與精度問題。第五項錯誤是假設每種 ERC-20 類型代幣的行為都完全相同。第六項錯誤是在未保留儲存區配置的情況下使用可升級合約。第七項錯誤是部署時使用與經稽核建置不同的編譯器設定。第八項錯誤是忽略編譯器警告。第九項錯誤是賦予單一管理員金鑰過多權力。第十項錯誤是在未測試邊界情況與失敗情境前推出合約。如何評估 Solidity 合約
首先檢查合約原始碼是否已驗證。接著檢查編譯器版本、最佳化工具設定、建構函式引數與已連結函式庫。檢查合約是否可升級,以及誰控制升級。檢查管理員角色、擁有者權限、多重簽章控制、時間鎖與緊急函式。評估代幣合約時,請檢查代幣鑄造、銷毀、暫停、黑名單、費用與轉移限制。評估 DeFi 合約時,請檢查預言機來源、抵押品規則、強制平倉邏輯與帳務處理。檢查是否存在稽核,以及稽核發現事項是否已修正。將已部署合約地址與專案官方來源進行比對。檢查近期交易與事件,以了解合約如何被使用。Solidity 合約應從程式碼、基礎設施、治理與經濟設計整體評估。開發者最佳實務
閱讀發布說明並測試行為後,使用近期穩定的 Solidity 編譯器版本。為正式環境建置固定編譯器版本與相依套件版本。將編譯器警告視為檢視項目,而非無害雜訊。使用清楚的存取控制與最小權限原則。在適用時遵循 Checks-Effects-Interactions 等安全外部呼叫模式。為正常路徑、失敗路徑、邊界情況與惡意使用者行為編寫測試。對管理具實質價值的合約使用靜態分析、模糊測試與稽核。記錄管理員權力、升級權力、預言機假設與緊急控制措施。部署後使用完全相同的編譯器設定驗證原始碼。在推出前監控已部署合約並準備事件應變計畫。使用者最佳實務
與合約互動前,請檢查其是否已驗證。請將合約地址與專案官方來源比對,而非信任隨機訊息中的連結。簽署交易前檢查代幣批准。謹慎對待無限額度批准,並在實際可行時撤銷未使用權限。檢查合約是否可升級,以及誰控制升級。不要假設已驗證合約已經稽核或安全。不要將資金存入您無法理解或獨立信任的合約。對高價值互動使用硬體錢包或強大的錢包安全措施。請謹慎對待新的、未經稽核的、高收益或匿名 Solidity 合約。請記住,區塊鏈交易一經確認通常無法撤銷。常見問題
Solidity 用於什麼?
Solidity 用於為 Ethereum 與其他 EVM 相容區塊鏈環境編寫智能合約。Solidity 是加密貨幣嗎?
不是,Solidity 是程式語言,不是加密貨幣或代幣。Solidity 僅適用於 Ethereum 嗎?
Solidity 是為 Ethereum 設計,但也用於其他支援 Ethereum Virtual Machine 或相容執行環境的區塊鏈網路。什麼是 Solidity 智能合約?
Solidity 智能合約是定義資料儲存、交易處理、資產管理,以及與使用者或其他合約互動規則的區塊鏈程式碼。什麼是 Solidity 編譯器?
名為 solc 的 Solidity 編譯器會將 Solidity 原始碼轉換為 EVM 位元組碼、ABI 資料、中繼資料與其他建置輸出。Solidity 中的 ABI 是什麼?
ABI 是 Application Binary Interface,可告知錢包、應用程式與腳本如何呼叫合約函式及解碼其回應。Solidity 安全嗎?
Solidity 可以安全使用,但智能合約安全性取決於安全設計、測試、稽核、編譯器設定、存取控制與謹慎部署。Solidity 合約能在部署後變更嗎?
基本已部署合約通常不可變,但若存在升級權限,可升級代理模式可讓合約邏輯變更。為何 Solidity 合約需要稽核?
Solidity 合約經常控制具有價值的資產,因此稽核有助於在部署前或部署後發現漏洞、權限問題、經濟缺陷與不安全假設。使用者如何檢查 Solidity 合約?
使用者可檢查原始碼驗證、編譯器設定、合約地址、稽核、管理員權限、可升級性、代幣批准、交易歷史與專案官方文件。結論
Solidity 是加密貨幣生態系中最重要的程式語言之一,因為它為代幣、DeFi、NFT、DAO、質押系統及許多其他鏈上應用程式實現智能合約。它可讓開發者編寫人類可讀的規則,並將其編譯為由區塊鏈節點執行的 EVM 位元組碼。Solidity 的優勢來自其龐大生態系、智能合約標準、可組合性、工具與廣泛的 EVM 支援。其風險在於已部署程式碼可控制真實資產,且部署後可能難以修正。良好的 Solidity 開發需要審慎的編譯器設定、測試、稽核、存取控制、升級規劃、Gas 意識與安全檢視。良好的 Solidity 使用方式要求使用者驗證合約地址、閱讀權限、管理批准、檢查稽核,並避免未知或未驗證合約。對初學者而言,Solidity 最適合理解為開發者用來編寫區塊鏈程式的語言。對進階使用者而言,Solidity 是一種智能合約語言,其安全性取決於程式碼品質、EVM 行為、編譯器設定、外部相依性、治理與經濟設計。在加密貨幣詞彙表的語境中,Solidity 指用於建構及部署智能合約的主要高階語言,這些合約可在 Ethereum 類型區塊鏈環境中執行。重點是,Solidity 讓可程式化加密貨幣成為可能,但每一份 Solidity 合約都應被視為需要驗證、安全檢視與使用者審慎判斷的高風險軟體。您可能也喜歡
WhatsMiner M30S++
Web3 網域
Web3 專案
熱門
目前熱門備受市場關注的加密貨幣
最高成交量
按交易量計算交易量最大的加密貨幣

