開啟比特幣智慧合約的「三把鎖」

買賣虛擬貨幣
隨著新的指令和演算法的引入,比特幣的多籤功能正在變得強大。多籤不僅是指多個人共同簽名,保管一筆比特幣資產;它還可以是多個條件「共同簽名」,透過這些條件鎖定和解鎖比特幣。用條件決定資產的使用,其實就是合約的功能。當這個合約可以被程式碼表達並無需信任地自動執行時,我們稱其為智慧合約。因此前比特幣核心主管維護人員Gavin Andresen說:比特幣的多籤功能已經可以完成以太坊上大部分有用的功能。

那麼,比特幣是如何實現智慧合約的?比特幣與以太坊的智慧合約又有何區別?我們採訪了對區塊鏈和智慧合約有著深刻認知的技術寫作者王淵命,他曾任新浪微博架構師、QingCloud容器平臺負責人,現為某公鏈專案的首席架構師,他也是BFTF區塊鏈技術聯盟的發起者。

一、比特幣是否需要智慧合約

Q:比特幣需要智慧合約嗎?

A:需要。智慧合約能夠為比特幣系統帶來邏輯可擴充套件性,在不改變現有基礎設施、基礎架構的情況下,為系統增加新的功能,從而增強系統的能力。擴充套件性不只是指TPS、容量和儲存等方面。

智慧合約的另一個作用是它能實現具有約束力的合同功能。它是一個定義各方權利和義務關係的協議,只不過是數字化的,且它的執行機制不依賴於現有的法律體系。

Q:比特幣作為一種加密貨幣,為什麼需要合同功能?簡單交易它不就可以嗎?

A:並沒有所謂的簡單交易,你為什麼給我轉賬?無論是購物,或者是發工資或其他,背後其實都依賴於一個合同。在現實生活中,這個合同的執行是依賴於司法體系的,一方違約,另外一方可以起訴。只有貨幣而沒有司法體系的約束,是沒辦法完成任何交易的。

那麼在全球化的加密貨幣世界裡,該如何構建這種合同的約束力?依賴於智慧合約。智慧合約將規則/法律透過程式碼表達並執行,用程式碼構建出一套約束力體系。

Q:比特幣需要DeFi嗎?

A:廣義來說,所有的加密貨幣都屬於 DeFi 的應用領域,因為 DeFi 的第一步是有貨幣。有了貨幣後,可以圍繞貨幣定義怎麼跟其它資產或者貨幣交換,如何借貸等等,加密貨幣裡的金融相對法幣體系的金融還比較早期,可探索的路還很長。

二、比特幣如何實現智慧合約

Q:為什麼說比特幣系統是支援智慧合約的?

A:合約就是當我跟你做一個交易時,它能保證這個交易達成,也就是說它能表達某種條件,當條件滿足時我才給你付款。能把這個條件表達出來,就可以認為它有智慧合約表達能力。比特幣的指令碼(Script)是有智慧合約表達能力的,可以把比特幣的指令碼理解成是一種智慧合約。

那為什麼比特幣要透過指令碼而不是把功能固化在鏈上?因為如果固化在鏈上,當使用者/開發者需要某個功能時,就需要比特幣開發團隊去實現,然後再發布,然後推動整個鏈的升級,但區塊鏈升級是個複雜的事情,弄不好就分叉了。

所以比特幣只提供最基礎的一些素材,相當於給你提供麵粉,但菜怎麼做留給你自己,你可以利用這些素材,根據自己的場景組合出新的東西,不需要依賴於主鏈的升級。這也就是我前邊講過的透過智慧合約來實現邏輯可擴充套件性。未來是不確定的,智慧合約可以看成是一種應對不確定性的策略。

上邊是比特幣系統本身對智慧合約的支援,它是透過指令碼實現的;還有另一類支援/實現智慧合約的方式,就是透過比特幣系統的側鏈,在側鏈上實現智慧合約的方法跟在以太坊上類似。

Q:比特幣系統是如何透過指令碼實現智慧合約的?

A:以太坊上的智慧合約是直接用程式碼表達清楚的,什麼條件下執行 A,什麼條件下執行 B 等等,比特幣上的智慧合約不像以太坊那樣直白。

比特幣上所有的智慧合約都要被轉換成加鎖、解鎖的機制來實現,也就是說在指令碼中,透過「key」或者是「雜湊條件」把資產鎖定,再加上一個「時間鎖」(TimeLock)。無論是閃電網路還是Arwen協議,都是這樣的機制,比特幣將會推出的Schnoor簽名之類的,也都是為了更好地去表達這個機制。

因此,實現比特幣智慧合約的核心就是怎麼去加鎖和解鎖資產。

如果合約中所有的條件都能轉換成key、雜湊條件、時間鎖這三者來加鎖和解鎖,那麼這個合約就可以用比特幣系統實現。我把這三者分別稱為簽名鎖,雜湊鎖,時間鎖,比特幣智慧合約基本就是用這「三把鎖」來實現的。

比如你從我這兒買一個音樂,這個音樂透過密碼訪問,那麼在交易合約中,我把音樂的訪問密碼也變成其中的一個key,如果要達成交易,這個key必須讓你知道;而一旦你知道(你拿到音樂),錢就支付給我了。

Q:雜湊條件和key有什麼不同?

A:你可以理解成一個東西,它們的作用是一樣的。雜湊條件是我知道一個value,把value雜湊之後得到一個雜湊結果。那麼在合約中,就是設定一個條件,誰能在寫交易的時候把這個雜湊結果打進來,這錢就歸誰。只要我有這個value,就有雜湊結果,也可以理解成有一個key。

Q:簡單而言,可不可以認為比特幣的智慧合約是透過多籤加上時間鎖來實現的?

A:可以,前邊講過用key、雜湊條件、時間鎖實現智慧合約,雜湊條件也可以當作多重簽名中的一個key來看待;時間鎖則是一個關於區塊高度的條件。

Q:時間鎖在實現智慧合約中的重要性是什麼?

A:時間鎖很重要,如果沒有時間約束的話,很多協議是沒法實現的。正是因為現在有了雜湊條件、時間鎖,閃電網路這種合約才能跑起來。

比如說閃電網路,我們兩個人共同出錢,把錢凍結到一個共管的賬號裡,然後在鏈下互相支付,當要去結算時一方不合作了怎麼辦?假設我們吵架了,你的錢你不要了,但我的錢我也拿不到。有了時間鎖就好處理了,我設一個超時時間,過了超時時間錢就是我的,我就可以拿走了。

三、比特幣與以太坊智慧合約的差別

Q:對應於比特幣用指令碼實現智慧合約,以太坊是用什麼實現智慧合約的?

A:以太坊有一個智慧合約語言。其實比特幣的指令碼也可以理解成一種語言,只不過比較簡單;比特幣指令碼執行也可以理解成有一個虛擬機器,只不過虛擬機器的實現比較簡單。既然都是虛擬機器執行指令,那麼以太坊的改變在哪裡?

我總結以太坊帶來的主要改變有三點:

1. 以太坊虛擬機器指令的表達能力更強。簡單理解的話,可以認為以太坊提供的指令更低階,用低階的指令組合成高階指令,而比特幣是直接提供高階指令,其指令是有限的。另外,以太坊支援跳轉等指令,能表達出迴圈等邏輯,也就是大家常說的圖靈完備。

2. 以太坊引入了 gas 機制。在以太坊上可以隨意寫合約邏輯,gas機制保證最後執行的時候有一個上限限制,這除了解決停機問題外,還能限制浪費資源,讓指令碼的執行成本跟付出的費用間有個關係。

3. 以太坊上的合約有狀態,而比特幣上的合約不能有自己的狀態。這代表著:第一,比特幣上的合約是不能自己生成自己的狀態的,比如說在這次指令碼里輸出一個東西,在下次指令碼中使用是不行的,比特幣的指令碼都是一次性的,只對這個交易起作用;第二,比特幣上的指令碼是不能直接讀取鏈上已有的狀態的,比如時間鎖依賴鏈上的區塊高度,需要特殊指令支援,嵌入到指令碼里的其他狀態(透過 op_return 指令實現)更無法讀取。

Q:圖靈完備會帶來什麼差別?

A:其實以太坊也不是說真圖靈完備,因為它有gas的限制,不可能用太複雜的邏輯。

圖靈完備的好處是它的擴充套件能力更強,表達能力更強。因此以太坊提供的實驗的自由度要遠大於比特幣,這也是以太坊上各種實驗專案多的原因。

比特幣是一種保守策略。我就這麼多指令,我在別的地方先實驗,實驗好了,覺得需要支援這個指令,就增加這個指令。比如說為了支援原子交換以及支付通道,增加了雜湊時間鎖定協議,可以鎖定一個時間段。

比特幣為什麼不擴充那麼多指令?因為不同指令的資源消耗是不一樣的,如果表達很複雜的指令碼,執行這個交易的成本就會很高,會消耗資源、影響整個網路。

Q:合約狀態會帶來什麼差別?

A:比特幣的狀態全是在鏈下生成的,就是說生成交易的時候就要把這個狀態寫好,鏈上只承載交易的資料,其它額外的資料寫不進去。

比如你很難在比特幣上發自己的幣。在比特幣上發的幣都是染色幣,染色幣是在指令碼里嵌入一些自己的資料結構,但指令碼不能讀嵌入的這個資料結構,所以也不能透過指令碼對這個資料結構做驗證,需要再做一個網路校驗,看寫進去的這個資料是不是合法的。

所有的染色幣都是基於這個機制實現的,它不是像以太坊那樣直接發一個token,然後透過合約來校驗。

比特幣之所以採用這種設計,本質在於它是不歡迎其他的資料寫上去的,因為對比特幣網路來說,承載額外的資料是有成本的,這種資料還得永久儲存,而使用者只付費一次。所以比特幣不提供自定義狀態的儲存,這不是它的路線,透過 op_return 嵌入自定義資料可以理解為一種 hack 行為,並不是比特幣提供 op_return  的本來目標。

其實這能夠看出比特幣和以太坊在設計思路上的區別:你可以把比特幣理解成一箇中立的銀行,它只提供資產加鎖、解鎖的機制,誰有鑰匙資產歸誰,它對其他的條件都不關心;並且每一筆資產都是獨立的鎖,它也不關心資產之間的關係。比特幣的智慧合約並不是一段程式碼,而是一系列操作鎖的協議。

而以太坊的的設計思路是任何合約都可以表現為一系列的交易,後面的交易和前置交易的狀態是有關聯的,所以它提供一種通用的追蹤和更新歷史狀態的機制,而更新狀態的邏輯和條件就由使用者自己去創造。以太坊黃皮書裡的世界狀態的公式很好的表達了這種思路。

這兩種思路其實各有優劣,和設計者的目標以及對世界的抽象有關係。

Q:比特幣和以太坊的智慧合約還有其他不同嗎?

A:UTXO模型(未花費交易輸出)與Account模型(賬戶)的不同,也會給兩者智慧合約的實現帶來差異。

在 UTXO模型中,每一筆錢都有一個標記,使用的時候需要明確知道使用的是哪一筆錢;Account模型則相當於把使用者所有的UTXO合併成一個大的UTXO,使用的是這個預設的UTXO。這帶來幾點不同:

1. 在Account模型下寫合約比較簡單,只需要說轉多少錢,不需要指明轉的是哪一筆錢;
2. Account模型可以提前對未來的收益進行約束,也就說這筆錢還沒到合約賬戶,但可以部署合約去約束它該怎麼花;
3. 由於Account模型相當於合併 UTXO,所以轉賬時不能直接設定解鎖條件,必須先部署一個合約。

當然,UTXO模型和 Account 模型都是在演化的,有一些專案會對它們做出改變,有機會我會寫文章詳細分析。

四、比特幣智慧合約案例

Q:怎麼理解閃電網路本身就是一種智慧合約?

A:你可以說閃電網路是一個協議,也可以說它是比特幣上的一種智慧合約。閃電網路的合約主要解決兩個人如何共同鎖錢,以及如果一方作弊、不合作等等情況下怎麼辦的問題,它是透過前邊說的三把鎖來實現的。

Q:在閃電網路上實現智慧合約又是怎樣的一個過程?

A:閃電網路實際上是兩個人之間的支付通道,現在只支援互相轉賬。我們嘗試在支付通道之上嵌入了一個虛擬機器,就可以執行比較完備的智慧合約,比如遊戲。(注:王淵命在閃電網路上實現的智慧合約:https://github.com/starcoinorg/thor)

通道雙方可以壓一筆 BTC,然後去玩遊戲,贏的一方得BTC;如果玩的有分歧,可透過仲裁系統去仲裁。仲裁系統相當於一個法院,可以是一個側鏈,或是一個雙方信任的機構執行的節點,或者是仲裁者市場等等。仲裁系統保留了雙方的解鎖鑰匙(雜湊的 value),它仲裁之後把鑰匙給贏的一方。

由於閃電網路的資產是定向的,所以仲裁者只能決定哪個使用者得到BTC,但自己不能拿走使用者的 BTC,即便是有聯合作弊的可能,但作弊成本要比託管模式高。

Q:透過閃電網路實現智慧合約,與透過類似Liquid的側鏈實現智慧合約,有什麼不同?

A:閃電網路上的智慧合約是通道雙方的鏈下節點執行的,互相校驗,產生分歧時需要有一個仲裁系統來仲裁。而側鏈本身就有共識機制,有多個節點來執行和校驗合約,所以兩者在執行機制上是不一樣的。

在側鏈實現智慧合約的方式與在以太坊上實現智慧合約的方式類似,但當它與主鏈協同的時候,需要透過比特幣的加鎖、解鎖的機制。

結束語

作為加密貨幣,比特幣似乎有能力為DeFi的發展提供一個更好的空間,因為它凝聚了最多的共識,也承載著最高的價值和流動性,它是最受信任的加密資產。

那麼作為一種系統,比特幣是否支援DeFi的實施?在本文中我們探討了比特幣智慧合約的實現機制,並把它與以太坊智慧合約進行了一些比較。比特幣上的DeFi不僅是可能的,而且會隨著多籤功能的強大變得更加完備。

也許我們可以期待以比特幣為核心元素的去中心化金融服務的到來。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;