比特幣也能做智慧合約嗎?

比特幣也能做智慧合約嗎?的文章封面插畫

智慧合約常讓人想到在鏈上運作的交易所、遊戲或組織。比特幣的日常介面看起來只有收款與付款,因此「它沒有智慧合約」也成了常見印象。

可是,比特幣從一開始就不只核對金額。每筆資產都帶著可由網路共同檢查的花費條件;既然條件可以組合,為什麼比特幣沒有呈現出一般人熟悉的應用程式樣貌?

答案取決於如何界定智慧合約。比特幣確實能執行可程式化的合約條件,核心工作集中在判斷一筆既有資產「現在能否這樣花」。它使用的腳本語言刻意縮小能力範圍,以較少的彈性換取容易重複驗證的結果。

程式寫在資產的花費條件裡

比特幣底層以一筆筆 UTXO 記錄尚未花用的交易輸出。每個輸出除了金額,也附有鎖定條件;日後想花用它的人,要在新交易中提供足以滿足條件的資料。

最常見的情況,是錢包私鑰替交易產生數位簽章,驗證者再用對應的公鑰檢查授權。比特幣腳本(Bitcoin Script)會依固定順序處理這些資料與指令,最後得出通過或失敗。這已是一種小型程式,只是它回答的問題非常具體。

全節點收到交易後,會各自執行相同檢查。礦工可以挑選合格交易放進候選區塊,卻不能靠收錄動作讓失敗的腳本變有效;其他驗證者仍會拒絕不符合規則的內容。交易進入有效區塊後才開始累積交易確認,腳本的判定也因此成為共識規則的一部分。

簽章、時間與祕密可以組合

只有一把鑰匙能花,是最簡單的條件。比特幣也能要求指定群組中的多把鑰匙共同簽署,形成多重簽章;還能用時間鎖限制某條支出路徑最早何時開放。

另一種常見元件是雜湊鎖。建立條件的人先公開某份祕密資料的雜湊值,日後只有提出原始資料、而且計算結果吻合的人,才能通過該條路徑。雜湊鎖配合時間鎖與簽章,可以安排「在期限內揭露祕密即可領取,逾期後由另一方退款」之類的結果。

Lightning 支付通道便會組合多種鏈上條件,讓參與者平時在鏈下更新狀態,遇到關閉或爭議時再回到比特幣執行。鏈下協議可以很複雜,最終仍依賴有限而可驗證的鏈上出口。

合約不會自己醒來工作

「執行」這個詞容易製造另一個誤會。時間門檻到了,腳本不會主動建立交易;雜湊條件成立,也不會自動搜尋祕密並付款。必須有人或軟體建立、簽署及廣播一筆交易,驗證者才會檢查條件是否滿足。

腳本也無法直接知道包裹是否送達、球賽誰獲勝,或新台幣匯率是多少。這些現實事件若要影響付款,需要額外的資料提供者、簽署者或爭議處理安排。比特幣能核對鏈上可見的資料與密碼學證明,無法自行判斷外部陳述是真是假。

因此,合約減少的通常是某些環節對單一中介的依賴,沒有消除所有信任。若結果取決於外部世界,風險會轉移到資料來源、鑰匙管理與事前約定;規則只能忠實處理拿到的證據。

刻意受限,換來共同驗證

Bitcoin Script 採用堆疊式設計,沒有任意迴圈或跳躍,也不讓單次驗證維持一套可隨意擴張的全域程式狀態。這使它難以直接承載通用鏈上應用,卻讓每次檢查較容易在有限資源內結束,所有驗證者也較容易得到一致答案。

鏈上空間與計算仍有成本。條件愈複雜,交易可能需要攜帶更多資料,增加手續費與測試負擔。實務設計常把頻繁互動留在鏈下,只讓必要的建立、結算或爭議結果進入比特幣;這是能力、成本與可驗證性之間的取捨。

限制也不會替合約設計者保證安全。條件寫錯、備援路徑缺漏、鑰匙遺失,或兩方對條文理解不同,都可能造成無法挽回的結果。網路只判斷資料是否符合已部署的規則,不會追問程式是否表達了人的原意。

所以,若把智慧合約理解為「由分散式網路共同執行的可程式化條件」,比特幣的答案是肯定的;若期待一個能直接運行各式應用並感知現實事件的平台,它的設計範圍就明顯更窄。把比特幣腳本看成可組合、可公開驗證的資產安全鎖,最能同時看見它的用途與邊界。