跳到正文

智慧合約

了解智慧合約是什麼、區塊鏈節點如何執行它、外部資料與升級權限如何進入系統,以及互動前應核驗哪些事項。

更新於

僅供教育用途,不構成投資建議。智慧合約交易可能造成不可逆的損失。

直接答案

智慧合約是部署在區塊鏈或類似分散式執行網路上的程式。它包含程式碼,並且在許多平台上還包含持久狀態。交易或其他合約可以呼叫其函式;網路節點執行相同規則,並透過網路的驗證與共識流程接受由此產生的狀態變化。

「智慧」不表示程式能理解意圖,「合約」也不會自動使它成為具有法律強制力的協議。這個術語描述的是一種程式碼:它可以在執行環境所具備的能力與資料範圍內強制執行特定條件。

智慧合約可以:

  • 按照程式設定的條件持有或轉移數位資產;
  • 記錄和更新應用狀態;以及
  • 與其他合約組合,建構交易所、借貸系統、遊戲、治理工具及其他鏈上應用。

它的可預測性只限於已實作的程式碼與輸入。合約即使完全按程式碼執行,也可能因缺陷、惡意設計、權限失陷或錯誤的外部資料而產生不希望出現的結果。

運作原理

典型互動遵循以下步驟:

  1. 開發者編寫並測試原始碼,在平台要求時進行編譯,再透過一筆交易部署生成的程式。
  2. 部署為程式分配鏈上識別符或地址,並可能初始化其狀態和管理角色。
  3. 使用者、應用或另一個合約傳送呼叫,其中包含函式選擇器、參數,有時還包含資產。
  4. 每個驗證節點按照相同的虛擬機器與協議規則執行呼叫。如果必要條件不成立,呼叫可能回復,但交易費仍可能被收取。
  5. 如果呼叫成功並被網路納入,產生的狀態變化與事件日誌就會成為區塊鏈紀錄的一部分。

執行的確定性只適用於約定執行環境內可用的資訊。合約無法自行從網際網路取得天氣、市場價格或銀行付款資訊。需要鏈外事實的應用會使用預言機、簽名訊息、橋或特權操作員,這會在合約程式碼之外增加新的信任與故障假設。

已部署的程式碼並不總是整個系統。有些合約不可變,而代理與治理模式可以把呼叫轉向新邏輯或修改參數。因此,使用者除了查看可見的應用介面,還要檢查升級金鑰、管理員權力、暫停控制、預言機設計和關聯的合約。

簽署互動前,請核驗:

  • 透過獨立可信來源確認網路與完整合約地址;
  • 解碼後的函式、參數、資產數量和接收方;
  • 呼叫建立的代幣額度或操作員權限;
  • 合約是否已驗證、可升級、已暫停或由特權帳戶控制;以及
  • 在可行時,用小額測試涵蓋預期的進入與退出路徑。

範例

設想一個用於數位服務的託管合約。買方存入 1,000 USDC,合約記錄買方、賣方、金額和結算條件。如果買方確認交付,合約就把資金釋放給賣方。如果條件在 24 小時內沒有滿足,預設的退款路徑就會開放。

除非設計向合約提供相關事實,否則合約並不知道服務是否令人滿意。如果批准由買方金鑰發出,金鑰失陷就可能授權放款。如果由預言機或管理員決定結果,該方就成為信任模型的一部分。存取控制或代幣處理中的缺陷也可能破壞預期的託管規則。自動執行減少了部分人工處理,但不會免除對每項依賴的評估。

風險與控制措施

  • 程式碼缺陷:重入、錯誤記帳、不安全的外部呼叫或邊界情況可能導致資產遺失或鎖定。優先選擇精簡且經過充分測試的設計,並檢查已部署程式碼,而不要只依賴審計標識。
  • 權限與升級風險:管理員可能暫停系統、替換邏輯、修改費用或轉移資產。檢查每個角色由誰控制、是否使用時間鎖或多簽,以及哪些內容可以改變。
  • 預言機與整合風險:正確的程式碼也可能根據過時、受操縱或單位換算錯誤的資料行動;代幣、橋或其他合約的故障還會透過組合性擴散。
  • 交易與授權風險:惡意介面可能展示錯誤的地址、函式、接收方或無限額度。解碼請求,並把權限限制在所需範圍。
  • 經濟設計風險:有效交易仍可能觸發清算、價格操縱、激勵失效或有限流動性擠兌。程式碼正確不等於經濟上有償付能力。
  • 運作風險:擁塞、鏈重組、排序器中斷或前端不可用,都可能在合約仍已部署時延誤操作。
  • 不可逆性:公鏈交易通常沒有拒付機制。如果資金透過錯誤函式傳送或進入惡意合約,可能無法追回。

審計只是關於特定程式碼版本和範圍的證據,並非保證。應核對已部署位元組碼或已驗證原始碼是否與受審版本一致,並確認後續升級、依賴或設定變化是否超出審計範圍。

常見誤解

  • 「程式碼無需交易就會自動執行。」大多數狀態變更函式需要交易或另一次鏈上呼叫;按時間觸發的操作可能還需要外部執行者。
  • 「程式碼無法改變。」不可變合約不能重寫自身已部署的位元組碼,但代理、治理和遷移設計可以改變使用者最終存取的邏輯。
  • 「程式碼公開就安全。」公開有助於審查,卻不能證明程式碼正確、管理者誠實或經濟設計穩健。
  • 「審計保證安全。」審查受到時間和範圍限制,可能遺漏缺陷,也可能不涵蓋運作與經濟風險。
  • 「交易成功就表示預期操作已發生。」成功只表示被呼叫程式碼沒有回復;使用者仍須檢查目標地址、解碼事件、資產變化和最終權限。

相關主題

來源

導覽

搜尋知識庫...