比特幣腳本語言深度解析:圖靈不完備性與設計哲學完整分析

比特幣作為區塊鏈技術的開創者,其腳本語言是理解比特幣設計理念的關鍵。比特幣腳本是一種圖靈不完備的語言——這並非設計缺陷,而是刻意為之的安全選擇。本文深入分析比特幣腳本語言的技術特性、圖靈不完備性的具體實現、以及與以太坊 EVM 的根本差異,並探討這種設計選擇背後的安全與哲學考量。

比特幣 Script 語言:為什麼中本聰故意讓它「笨笨的」?

說到區塊鏈,大家第一個想到的通常是比特幣。但如果我告訴你,比特幣其實內建了一種程式語言,只是這語言被刻意設計得非常陽春,你會不會覺得意外?

今天就來聊聊比特幣的 Script 語言,以及它和以太坊 Solidity 之間那道看似無法跨越的鴻溝。

什麼是比特幣 Script?

簡單來說,Script 是比特幣用來驗證交易的腳本語言。每次你從某個位址轉錢給別人,比特幣網路並不是簡單地問「你有沒有足夠的餘額」,而是執行一段 Script,確認這筆交易確實經過你的授權。

這個設計有多聰明?想像一下,你設計了一套金庫系統,不是靠密碼,而是靠一套「解謎流程」。任何人只要能完成這套流程,就能開啟金庫——但這套流程是事先寫死在金庫裡的,沒有人能臨時修改。

比特幣的 Script 就是這套「解謎流程」。

基礎語法:OP_CODE 的世界

比特幣 Script 的語法跟我們熟悉的 Python、JavaScript 完全不一樣。它不是那種一行一行執行的命令式語言,而是所謂的「堆疊語言」(Stack Language)。

什麼意思?

想像你桌上有一疊文件。你只能把文件放到最上面(Push),或者把最上面的文件拿掉(Pop)。比特幣 Script 就是這樣運作的——資料進來,按順序堆疊,OP_CODE 運算子負責把資料拿出來處理,然後把結果塞回去。

常見的 OP_CODE 包括:

對,就這麼樸實無華。

標準交易類型:P2PKH 與 P2PK

讓我從最常見的「付錢給某人」說起。

P2PKH(Pay to Public Key Hash)

這是目前最廣泛使用的比特幣交易類型,中文叫「付款到公鑰雜湊值」。運作方式如下:

鎖定脚本(Locking Script)

OP_DUP OP_HASH160 <公鑰雜湊值> OP_EQUALVERIFY OP_CHECKSIG

解鎖脚本(Unlocking Script)

<簽名> <公鑰>

翻譯成人話就是:「我要证明我有這個公鑰對應的私鑰,於是我用私鑰簽名,然後把公鑰也附上。網路帮我驗證一下這簽名是不是真的。」

整個流程:

  1. 把簽名和公鑰 Push 到堆疊
  2. OP_DUP 把公鑰複製一份
  3. OP_HASH160 把公鑰 hash 成雜湊值
  4. 比對這個雜湊值是否跟鎖定脚本中的目標相符
  5. OP_EQUALVERIFY 如果不符,直接失敗
  6. OP_CHECKSIG 驗證簽名有效性

你看出來了嗎?這個流程完全是「一次性」的。驗證完就結束,沒有迴圈,沒有複雜的狀態變化。

P2SH(Pay to Script Hash)

後來比特幣社群覺得 P2PKH 不夠彈性,於是發明了 P2SH,簡單來說就是「付款到腳本雜湊」。

傳統的 P2PKH 是:「我要付款給持有這個私鑰的人。」

P2SH 則是:「我要付款給能滿足這個腳本的人。」

差別在於,誰來定義「腳本」?

在 P2PKH 中,腳本是由收款方決定的。但在 P2SH 中,付款方可以指定一個「腳本雜湊」,只有能提供正確贖回腳本(Redemption Script)的人才能領款。

這聽起來有點繞,但它的實際應用超級廣泛——多簽名錢包、時間鎖、智能合約概念,都可以用 P2SH 實現。

一個 2-of-3 多簽名錢包的鎖定脚本長這樣:

OP_2 <公鑰A> <公鑰B> <公鑰C> OP_3 OP_CHECKMULTISIG

意思是:「需要至少 2 個人簽名才能解鎖,總共有 3 把公鑰。」

圖靈不完備:這是設計,不是缺陷

好,終於要進入正題了。

比特幣 Script 是「圖靈不完備」(Turing Incomplete)的語言。什麼意思?

圖靈不完備意味著,這個語言無法模擬任何圖靈機可以計算的問題。用人話說就是:它沒有迴圈(Loop),沒有跳轉(Goto/Jump),也沒有遞迴(Recursion)。

OP_LOOP?不存在。OP_GOTO?不存在。

這意味著什麼?

意味著比特幣 Script 無法執行「不知道要跑多少次」的計算。假設你要做一個「把所有偶數加起來」的程式,在 Solidity 裡你可以用個 while 迴圈搞定;但在比特幣 Script 裡,對不起,你得預先把次數寫死,例如「加總 100 次」。

中本聰為什麼要這樣設計?

中本聰的天才設計:故意的限制

很多人以為比特幣 Script 這麼陽春是因為 2009 年的技術限制。但如果你仔細讀過比特幣白皮書,會發現中本聰的設計哲學非常清楚:安全 > 彈性

試想,如果比特幣 Script 支援迴圈,會發生什麼事?

攻擊者可以部署一個包含無窮迴圈的腳本,然後廣播到網路中。礦工節點執行這個脚本時會陷入無限迴圈——CPU 耗盡、記憶體爆炸、網路癱瘓。這就是所謂的「停止問題」(Halting Problem)的實際威脅。

圖靈完備的語言無法在執行前確定會不會當機。你只能跑跑看,然後祈禱它會停下來。

比特幣 Script 沒有這個問題。每一段脚本執行多少次、消耗多少資源,在執行前就可以計算出來。這叫做「可預測的資源消耗」或「靜態分析友好」。

用密碼學術語來說,比特幣選擇了「同步執行模型」(Synchronous Execution Model),放棄了「非同步執行模型」的彈性,換來了可證明的安全性。

圖靈不完備的實際影響

好,既然比特幣 Script 這麼受限,那它到底能做什麼?

它能做的

  1. 多簽名錢包:2-of-3、3-of-5,随便你配。这是目前最广泛的应用之一。
  1. 時間鎖(Time Lock):你可以設定比特幣在「未來某個區塊高度」或「未來某個時間點」之後才能動用。常見的應用包括遺產規劃、分期釋放的 VC 資金等。
  1. 雜湊時間鎖合約(HTLC):這是閃電網路和跨鏈原子交換的核心技術。簡單來說就是:「如果你能提供正確的 Secret(並廣播到鏈上),就能領走這筆錢;否則,經過一定時間後,錢會退還給我。」
  1. Proof of Burn:把比特幣發送到一個「無法花費」的位址,證明你「燒掉」了這些幣。這個機制被用於 Counterparty、Rootstock 等側鏈的代幣鑄造。
  1. SegWit 隔離見證:嚴格來說這不是 Script 的擴展,而是交易格式的改進,但確實讓更複雜的脚本成為可能(因為 witness data 的費用計算方式不同)。

它不能做的

  1. 任意狀態儲存:比特幣 UTXO 模型根本沒有「帳戶」的概念,所以也無所謂「狀態」。每筆交易都是獨立的,不會影響其他交易的執行結果。
  1. 複雜的借貸邏輯:你沒辦法寫一個「當抵押率低於 150% 時自動觸發清算」的合約。這是 Compound、Aave 這類 DeFi 協議的核心需求,在比特幣上無法原生實現。
  1. 圖片 NFT:Ordinals 出現之前,比特幣根本無法原生儲存任意資料(現在可以透過 witness data 嵌入,但只是「附加上去」,不是「區塊鏈原生」)。
  1. 去中心化交易所:比特幣上的 Bisq、RoboSats 都是透過 HTLC 實現的「有限功能」交易所,無法做到以太坊 Uniswap 那種「任何 ERC-20 代幣對任何 ERC-20 代幣」的任意組合交換。

比特幣有沒有嘗試擴展 Script?

有的,而且嘗試過很多次。

Rootstock(RSK)

Rootstock 是比特幣的側鏈,透過「錨定」(Pegging)機制與比特幣主鏈連接。它有自己的虛擬機,叫 RSKVM,支援 Solidity——是的,Solidity!所以理論上以太坊的智能合約可以直接部署到 RSK 上。

但這帶來一個根本問題:它是側鏈,不是主鏈。RSK 的安全性依賴於「合併挖礦」(Merged Mining),即比特幣礦工同時挖 RSK 區塊。雖然這聽起來優雅,但實際上 RSK 的去中心化程度和比特幣主鏈相差甚遠。

截至 2026 年第一季度,RSK 的 TVL 約為 1.2 億美元,而以太坊 DeFi 生態的 TVL 超過 500 億美元。差距不是技術問題,是網路效應信任模型的問題。

Stacks(原 Blockstack)

Stacks 採用的是「clarity」語言,這是一種圖靈不完備但「可靜態分析」的智能合約語言。Clarity 的設計哲學跟比特幣 Script 一脈相承——你寫的程式不會做出你没預料的事

Clarity 的優點:

缺點也很明顯:開發者體驗很差。如果你習慣了 Solidity 的靈活性,Clarity 會讓你崩潰。

RGB 和 Lightning Network

RGB 是建立在比特幣和 Lightning Network 之上的「第三層」協議。它將智能合約的狀態保存在客戶端,通過比特幣交易作為「承諾機制」(Commitment Mechanism)。

換句話說,比特幣區塊鏈只負責「見證」有這麼一個合約存在,以及「懲罰」作弊者;真正的邏輯計算發生在鏈外。

這種設計的好處是比特幣主鏈不需要承擔額外的計算負擔,缺點是開發複雜度極高,且難以實現跨客戶端的通用合約。

對比以太坊 Solidity:兩個世界的碰撞

說到這裡,必須聊聊以太坊的 Solidity 了,不然這篇文章就太不公平了。

Solidity 是圖靈完備的語言。換句話說,從理論上講,Solidity 能做的計算,Solidity 都能做——包括「不知道要跑多少次」的計算。

以太坊的 EVM(以太坊虛擬機)透過 Gas 機制來解決「停止問題」:每個操作都有成本,帳戶裡的 ETH 就是「預算」。當預算用完,執行就終止。

這個設計很聰明,但也有代價。

第一,Gas 估算很困難。開發者需要預估合約執行需要多少 Gas,否則交易可能失敗。這就是為什麼 DeFi 攻擊事件中常見「Out of Gas」導致的意外。

第二,合約漏洞的後果更嚴重。在比特幣上,如果一個合約有漏洞,攻擊者最多只能竊取那筆交易的資金。但在以太坊上,一個有漏洞的合約可能影響整個協議——DAO Hack、The Merge 前的各種 Flash Loan 攻擊,都是血淋淋的例子。

結語:不同的世界,不同的選擇

說到底,比特幣 Script 和 Solidity 代表了兩種截然不同的哲學:

比特幣選擇了保守:寧可犧牲彈性,也要確保每一行代碼都是可預測的。每一個礦工執行同一段脚本,都會得到完全相同的結果。

以太坊選擇了開放:給開發者最大的自由度,讓創新不受語言語法限制,代價是需要更嚴格的審計和更複雜的經濟模型來維護安全。

哪個選擇更好?

這問題沒有答案。就像有人偏愛靜態語言(安全、可預測),有人偏愛動態語言(彈性、表現力強),各有各的使用場景。

重要的是理解為什麼比特幣 Script 要這樣設計。不是因為中本聰不會做複雜的語言,而是因為他認為比特幣的核心價值——去中心化、抗審查、不可竄改——需要一個「可證明安全」的執行環境。

記住,比特幣是「結算層」,以太坊是「計算層」。兩者的定位本來就不同。

下次有人問你「比特幣怎麼不做一個 XXX 功能」時,你可以笑著回答:「因為那不是比特幣該做的事。」


延伸閱讀與參考來源

一級來源(官方文件)

二級來源(核心研究)

三級來源(學術論文)


本網站內容僅供教育與資訊目的,不構成任何投資建議或技術建議。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!