什麼是智能合約?
智能合約是部署在區塊鏈網路上、由交易或其他程式呼叫後按程式碼規則運行的程式。它可以讀取輸入和鏈上資料,檢查預設條件,並在執行成功後更新區塊鏈保存的資料。
「智能」不表示它會自行思考,「合約」也不保證它在法律上構成契約。這個名稱強調的是:參與者可以把一組操作規則寫成程式碼,由運行區塊鏈軟體並檢查交易的節點按協議處理,而不必由某一台伺服器單獨決定結果。
先分清程式碼、狀態和呼叫
程式碼規定程式可以執行哪些操作,以及每項操作需要滿足什麼條件。狀態是程式目前保存在鏈上的資料,例如餘額、所有者、參數或授權關係。交易或呼叫則提供這次執行的發起者、函式和輸入,並觸發程式讀取或改變狀態。
同一段程式碼收到不同輸入,或面對不同的目前狀態,可能產生不同結果。因此,「按程式碼執行」不表示合約每次都返回同一個答案,而是表示在相同的鏈規則、目前狀態、交易輸入和執行上下文下,驗證者應得出一致結果。執行上下文包括呼叫者、區塊時間或協議提供的其他本次執行資訊。
合約本身也不會主動醒來查看時間、價格或現實事件。它通常要等交易或協議訊息觸發。如果程式需要市場價格、天氣或比賽結果等鏈外資訊,還要由預言機這類資料機制把資訊提交到鏈上。合約只能按收到的資料執行,不能單獨證明外部資訊真實。
智能合約解決的問題
一般應用的核心邏輯通常運行在開發者或服務商控制的伺服器上。使用者向伺服器發送請求,再由伺服器讀取資料庫、執行規則並返回結果。伺服器營運者可以更新程式、修改資料庫權限,也可能停止服務。
智能合約把部分程式邏輯和狀態放到區塊鏈的共同執行環境中。符合條件的交易被網路確認後,節點按照同一套規則計算結果,並把有效的狀態變化寫入帳本。參與者可以獨立核對交易和結果,不必只相信某個應用後台提供的紀錄。
這不表示應用完全不再需要營運者或伺服器。網頁、行動應用、資料索引、通知和客服等部分仍可能由中心化系統提供;合約也可能保留管理員權限。判斷一個應用的控制方式時,需要分別查看鏈上程式、不在區塊鏈上運行的鏈下服務,以及能夠使用管理權限的金鑰。
從部署到執行
不同區塊鏈對智能合約的名稱和處理流程並不完全相同,但通常會經歷部署、呼叫、執行和記錄四個環節。
把程式部署到網路
開發者先用網路支援的語言編寫程式,再把程式碼轉換成該網路執行環境能夠處理的形式。部署通常透過一筆特殊交易完成;網路確認後,程式會取得可供其他帳戶或程式呼叫的鏈上識別碼。
部署者可以在程式中設定初始資料和權限,例如誰可以暫停某項功能、修改參數或批准升級。這些權限不是所有合約都具備,也不會因為程式碼被稱為「智能合約」而自動消失。
使用者或程式發起呼叫
使用者通常透過錢包或應用介面發起交易,指定要呼叫的函式和輸入資料。另一個智能合約也可以在執行過程中呼叫它,從而把多個程式組合成一項操作。
呼叫前看到的按鈕名稱或錢包提示只是介面對交易的解釋。真正提交的是經過編碼的資料;如果介面顯示不完整、連接到錯誤地址或隱藏了額外權限,使用者簽署的實際效果可能與自己以為的操作不同。
節點執行並驗證結果
不同網路對「誰先執行、誰再驗證」的安排並不相同。在許多執行型公鏈中,驗證節點會按照相同規則重現或核對合約執行,確認交易產生的狀態變化。程式會讀取目前狀態和輸入,依次檢查條件並計算結果。
以 Ethereum 為例,智能合約由交易呼叫並在以太坊虛擬機中執行。在 Hyperledger Fabric 中,類似程式稱為 chaincode(鏈碼):滿足背書策略的節點先模擬執行並簽署結果,隨後由通道中的各 peer 節點檢查背書簽章和讀寫紀錄,只有通過驗證的交易才更新目前狀態。背書策略就是網路成員事先規定「哪些組織的節點必須認可結果」的規則。這些差異說明「智能合約」是一類程式,不等於某一條公鏈的單一實作。
寫入狀態或返回讀取結果
會改變鏈上狀態的呼叫需要經過交易確認。例如,程式可以更新某個代幣餘額、記錄一項授權,或改變數位物品的持有者。交易執行失敗時,預期的狀態變化通常不會生效,但發起者仍可能承擔網路已經消耗的處理費用;具體規則由網路決定。
讀取現有狀態通常不需要建立新的鏈上交易。應用可以向節點查詢餘額、參數或紀錄,由節點在本地返回結果;因為沒有改變共同狀態,這類讀取不需要整個網路重新確認。不過,不同網路和服務商可能對查詢方式或費用另有安排。
智能合約與一般契約的區別
智能合約首先是程式,一般契約首先是當事人之間的法律安排。兩者可能有關聯,例如當事人用程式完成付款或記錄履約狀態,但名稱相似不代表二者天然相同。
程式能夠判斷的,是程式碼可以讀取的資料和明確條件。它不一定能理解當事人的真實意圖、處理含糊條款、判斷詐欺或決定現實世界中的補救方式。鏈上執行結果是否對應法律權利,以及發生爭議時如何處理,取決於具體安排和適用規則,不能僅從程式碼名稱得出結論。
反過來,一份法律契約也不一定使用智能合約。它可以由傳統系統記錄和履行。判斷兩者關係時,應分別問:程式碼實際上做了什麼,以及當事人之間另有怎樣的法律或服務安排。
智能合約與去中心化應用的區別
智能合約通常只是去中心化應用的一部分。去中心化應用(decentralized application,DApp)還可能包括網頁或行動介面、錢包連接、鏈下資料庫、檔案儲存和資料服務。
使用者透過網頁點擊「交換」時,介面負責展示資產和參數,錢包負責讓使用者核對並簽署,智能合約負責執行鏈上規則,節點負責驗證交易。任何一層出現錯誤,都可能影響最終結果。
因此,合約部署在區塊鏈上,不等於整個應用都去中心化。前端網域可以被關閉,資料服務可以返回錯誤資訊,管理員也可能保留升級或暫停權限。評價應用時,需要看具體元件及其控制者。
合約能否修改或升級
有些區塊鏈會讓已部署的合約程式碼保持不變,但這不等於應用邏輯永遠不能升級。開發者可以部署新合約,再讓使用者遷移;也可以使用代理結構,讓一個固定入口把呼叫轉給可替換的邏輯合約。
升級能力可以用於修復漏洞或增加功能,同時也意味著某些帳戶、多重簽章安排或治理流程可能有權改變程式行為。是否存在升級權、誰能使用、是否有等待期,以及使用者能否退出,需要查看目前合約結構和權限設定。
即使程式碼本身不能修改,管理員仍可能透過參數、白名單、暫停開關或外部資料來源改變運行結果。相反,沒有升級權限也不等於更安全:無法修改的漏洞可能長期存在。
常見用途
智能合約可以把鏈上資產和資料按統一規則組合起來。常見用途包括:
- 按統一規則記錄代幣的發行、餘額、轉帳和授權;
- 根據程式中的數量和價格規則交換資產;
- 管理資產的抵押、借出、償還,以及條件不足時的自動處置;
- 記錄數位物品的識別碼與持有關係;
- 按多個簽章或角色權限管理資產;
- 根據鏈上投票結果執行參數變更。
這些用途只是程式類型,不代表具體合約安全、合理或適合任何人。同類程式可能採用完全不同的權限、資料來源和升級方式。
智能合約的限制與風險
智能合約把規則寫成可執行程式碼,也把程式碼錯誤和權限設計帶到鏈上。常見限制包括:
- 程式碼缺陷:條件、計算或權限檢查錯誤可能導致資產或資料被錯誤處理。
- 管理權限:管理員、升級帳戶或多重簽章參與者可能暫停或改變程式。
- 外部資料:預言機提供錯誤、延遲或被操縱的資料時,合約可能按錯誤輸入正常執行。
- 組合依賴:一個合約呼叫其他合約時,上游程式的故障、升級或可用資產變化可能傳導過來。
- 交易順序:待確認交易可能先被網路中的其他參與者看到,對方可能搶先提交相關操作,改變原交易最終面對的條件。
- 介面與簽署:惡意網頁、錯誤地址或不清楚的授權請求,可能誘使使用者簽署並非自己預期的操作。
- 執行成本:複雜計算和鏈上儲存可能需要較高費用;費用不足或條件不滿足時,交易可能失敗。
程式碼公開也不等於容易理解。區塊鏈上實際執行的可能是編譯後的位元組碼,也就是供執行環境讀取的低階指令;即使專案公布了人類較易閱讀的原始碼,一般讀者也難以確認它是否與鏈上程式一致、是否經過充分測試,或目前是否由代理指向另一份邏輯。
安全審計可以發現部分問題,但不能證明合約沒有漏洞,也不能消除管理員、外部資料、市場條件或使用者簽署帶來的風險。判斷具體程式時,不能只看「已審計」標籤。
常見問題
智能合約會自動運行嗎?
它會按程式碼執行,但通常仍需要交易、另一個合約或協議訊息觸發。僅僅部署合約,不表示它會主動監控現實世界並自行發起所有操作。
所有智能合約都公開嗎?
不一定。公開區塊鏈上的執行程式碼和交易資料通常可被節點讀取,但原始碼未必發布或驗證;許可型網路還可能限制哪些成員能查看資料和呼叫程式。
部署後就不能修改嗎?
不一定。原合約程式碼可能保持不變,但應用可以遷移到新合約,或透過代理和管理權限更換邏輯。需要檢查具體升級結構,而不是只看「不可變」宣傳。
智能合約可以直接讀取網頁資料嗎?
通常不能直接把一般網頁內容當作可信鏈上輸入。它需要預言機、授權參與者或其他機制提交資料,而這些資料來源會形成額外依賴。
程式碼執行成功就說明操作安全嗎?
不是。執行成功只說明交易滿足了目前程式碼和網路規則,不證明程式碼符合使用者意圖、外部資料正確、權限設定合理或程式沒有經濟與安全缺陷。
相關詞條
繼續了解區塊鏈、區塊鏈節點、區塊和Gas 費,或返回加密貨幣術語表。
參考來源
- NISTIR 8202:區塊鏈技術概述——智能合約的通用定義、程式碼與狀態以及節點執行要求。
- Ethereum.org:智能合約簡介——Ethereum 合約的部署、呼叫、狀態、組合和鏈外資料限制。
- Ethereum.org:與智能合約互動——讀取狀態與提交狀態變更的區別。
- Ethereum.org:升級智能合約——不可變程式碼與代理升級結構的區別。
- Hyperledger Fabric:智能合約與鏈碼——許可型網路中的鏈碼、背書、驗證和狀態更新流程。




