隨著新的指令和算法的引入,比特幣的多簽功能正在變得強(qiáng)大。多簽不僅是指多個(gè)人共同簽名,保管一筆比特幣資產(chǎn);它還可以是多個(gè)條件「共同簽名」,通過這些條件鎖定和解鎖比特幣。
用條件決定資產(chǎn)的使用,其實(shí)就是合約的功能。當(dāng)這個(gè)合約可以被代碼表達(dá)并無需信任地自動(dòng)執(zhí)行時(shí),我們稱其為智能合約。因此前比特幣核心主管維護(hù)人員Gavin Andresen說:比特幣的多簽功能已經(jīng)可以完成以太坊上大部分有用的功能。
那么,比特幣是如何實(shí)現(xiàn)智能合約的?比特幣與以太坊的智能合約又有何區(qū)別?我們采訪了對(duì)區(qū)塊鏈和智能合約有著深刻認(rèn)知的技術(shù)寫作者王淵命,他曾任新浪微博架構(gòu)師、QingCloud容器平臺(tái)負(fù)責(zé)人,現(xiàn)為某公鏈項(xiàng)目的首席架構(gòu)師,他也是BFTF區(qū)塊鏈技術(shù)聯(lián)盟的發(fā)起者。
一、比特幣是否需要智能合約
Q:比特幣需要智能合約嗎?
A:需要。智能合約能夠?yàn)楸忍貛畔到y(tǒng)帶來邏輯可擴(kuò)展性,在不改變現(xiàn)有基礎(chǔ)設(shè)施、基礎(chǔ)架構(gòu)的情況下,為系統(tǒng)增加新的功能,從而增強(qiáng)系統(tǒng)的能力。擴(kuò)展性不只是指TPS、容量和存儲(chǔ)等方面。
智能合約的另一個(gè)作用是它能實(shí)現(xiàn)具有約束力的合同功能。它是一個(gè)定義各方權(quán)利和義務(wù)關(guān)系的協(xié)議,只不過是數(shù)字化的,且它的執(zhí)行機(jī)制不依賴于現(xiàn)有的法律體系。
Q:比特幣作為一種加密貨幣,為什么需要合同功能?簡(jiǎn)單交易它不就可以嗎?
A:并沒有所謂的簡(jiǎn)單交易,你為什么給我轉(zhuǎn)賬?無論是購(gòu)物,或者是發(fā)工資或其他,背后其實(shí)都依賴于一個(gè)合同。在現(xiàn)實(shí)生活中,這個(gè)合同的執(zhí)行是依賴于司法體系的,一方違約,另外一方可以起訴。只有貨幣而沒有司法體系的約束,是沒辦法完成任何交易的。
那么在全球化的加密貨幣世界里,該如何構(gòu)建這種合同的約束力?依賴于智能合約。智能合約將規(guī)則/法律通過代碼表達(dá)并執(zhí)行,用代碼構(gòu)建出一套約束力體系。
Q:比特幣需要DeFi嗎?
A:廣義來說,所有的加密貨幣都屬于 DeFi 的應(yīng)用領(lǐng)域,因?yàn)?DeFi 的第一步是有貨幣。有了貨幣后,可以圍繞貨幣定義怎么跟其它資產(chǎn)或者貨幣交換,如何借貸等等,加密貨幣里的金融相對(duì)法幣體系的金融還比較早期,可探索的路還很長(zhǎng)。
二、比特幣如何實(shí)現(xiàn)智能合約
Q:為什么說比特幣系統(tǒng)是支持智能合約的?
A:合約就是當(dāng)我跟你做一個(gè)交易時(shí),它能保證這個(gè)交易達(dá)成,也就是說它能表達(dá)某種條件,當(dāng)條件滿足時(shí)我才給你付款。能把這個(gè)條件表達(dá)出來,就可以認(rèn)為它有智能合約表達(dá)能力。比特幣的腳本(Script)是有智能合約表達(dá)能力的,可以把比特幣的腳本理解成是一種智能合約。
那為什么比特幣要通過腳本而不是把功能固化在鏈上?因?yàn)槿绻袒阪溕?,?dāng)用戶/開發(fā)者需要某個(gè)功能時(shí),就需要比特幣開發(fā)團(tuán)隊(duì)去實(shí)現(xiàn),然后再發(fā)布,然后推動(dòng)整個(gè)鏈的升級(jí),但區(qū)塊鏈升級(jí)是個(gè)復(fù)雜的事情,弄不好就分叉了。
所以比特幣只提供最基礎(chǔ)的一些素材,相當(dāng)于給你提供面粉,但菜怎么做留給你自己,你可以利用這些素材,根據(jù)自己的場(chǎng)景組合出新的東西,不需要依賴于主鏈的升級(jí)。這也就是我前邊講過的通過智能合約來實(shí)現(xiàn)邏輯可擴(kuò)展性。未來是不確定的,智能合約可以看成是一種應(yīng)對(duì)不確定性的策略。
上邊是比特幣系統(tǒng)本身對(duì)智能合約的支持,它是通過腳本實(shí)現(xiàn)的;還有另一類支持/實(shí)現(xiàn)智能合約的方式,就是通過比特幣系統(tǒng)的側(cè)鏈,在側(cè)鏈上實(shí)現(xiàn)智能合約的方法跟在以太坊上類似。
Q:比特幣系統(tǒng)是如何通過腳本實(shí)現(xiàn)智能合約的?
A:以太坊上的智能合約是直接用代碼表達(dá)清楚的,什么條件下執(zhí)行 A,什么條件下執(zhí)行 B 等等,比特幣上的智能合約不像以太坊那樣直白。
比特幣上所有的智能合約都要被轉(zhuǎn)換成加鎖、解鎖的機(jī)制來實(shí)現(xiàn),也就是說在腳本中,通過「key」或者是「哈希條件」把資產(chǎn)鎖定,再加上一個(gè)「時(shí)間鎖」(TimeLock)。無論是閃電網(wǎng)絡(luò)還是Arwen協(xié)議,都是這樣的機(jī)制,比特幣將會(huì)推出的Schnoor簽名之類的,也都是為了更好地去表達(dá)這個(gè)機(jī)制。
因此,實(shí)現(xiàn)比特幣智能合約的核心就是怎么去加鎖和解鎖資產(chǎn)。
如果合約中所有的條件都能轉(zhuǎn)換成key、哈希條件、時(shí)間鎖這三者來加鎖和解鎖,那么這個(gè)合約就可以用比特幣系統(tǒng)實(shí)現(xiàn)。我把這三者分別稱為簽名鎖,哈希鎖,時(shí)間鎖,比特幣智能合約基本就是用這「三把鎖」來實(shí)現(xiàn)的。
比如你從我這兒買一個(gè)音樂,這個(gè)音樂通過密碼訪問,那么在交易合約中,我把音樂的訪問密碼也變成其中的一個(gè)key,如果要達(dá)成交易,這個(gè)key必須讓你知道;而一旦你知道(你拿到音樂),錢就支付給我了。
Q:哈希條件和key有什么不同?
A:你可以理解成一個(gè)東西,它們的作用是一樣的。哈希條件是我知道一個(gè)value,把value哈希之后得到一個(gè)哈希結(jié)果。那么在合約中,就是設(shè)置一個(gè)條件,誰能在寫交易的時(shí)候把這個(gè)哈希結(jié)果打進(jìn)來,這錢就歸誰。只要我有這個(gè)value,就有哈希結(jié)果,也可以理解成有一個(gè)key。
Q:簡(jiǎn)單而言,可不可以認(rèn)為比特幣的智能合約是通過多簽加上時(shí)間鎖來實(shí)現(xiàn)的?
A:可以,前邊講過用key、哈希條件、時(shí)間鎖實(shí)現(xiàn)智能合約,哈希條件也可以當(dāng)作多重簽名中的一個(gè)key來看待;時(shí)間鎖則是一個(gè)關(guān)于區(qū)塊高度的條件。
Q:時(shí)間鎖在實(shí)現(xiàn)智能合約中的重要性是什么?
A:時(shí)間鎖很重要,如果沒有時(shí)間約束的話,很多協(xié)議是沒法實(shí)現(xiàn)的。正是因?yàn)楝F(xiàn)在有了哈希條件、時(shí)間鎖,閃電網(wǎng)絡(luò)這種合約才能跑起來。
比如說閃電網(wǎng)絡(luò),我們兩個(gè)人共同出錢,把錢凍結(jié)到一個(gè)共管的賬號(hào)里,然后在鏈下互相支付,當(dāng)要去結(jié)算時(shí)一方不合作了怎么辦?假設(shè)我們吵架了,你的錢你不要了,但我的錢我也拿不到。有了時(shí)間鎖就好處理了,我設(shè)一個(gè)超時(shí)時(shí)間,過了超時(shí)時(shí)間錢就是我的,我就可以拿走了。
三、比特幣與以太坊智能合約的差別
Q:對(duì)應(yīng)于比特幣用腳本實(shí)現(xiàn)智能合約,以太坊是用什么實(shí)現(xiàn)智能合約的?
A:以太坊有一個(gè)智能合約語(yǔ)言。其實(shí)比特幣的腳本也可以理解成一種語(yǔ)言,只不過比較簡(jiǎn)單;比特幣腳本執(zhí)行也可以理解成有一個(gè)虛擬機(jī),只不過虛擬機(jī)的實(shí)現(xiàn)比較簡(jiǎn)單。既然都是虛擬機(jī)執(zhí)行指令,那么以太坊的改變?cè)谀睦铮?/p>
我總結(jié)以太坊帶來的主要改變有三點(diǎn):
1. 以太坊虛擬機(jī)指令的表達(dá)能力更強(qiáng)。簡(jiǎn)單理解的話,可以認(rèn)為以太坊提供的指令更低級(jí),用低級(jí)的指令組合成高級(jí)指令,而比特幣是直接提供高級(jí)指令,其指令是有限的。另外,以太坊支持跳轉(zhuǎn)等指令,能表達(dá)出循環(huán)等邏輯,也就是大家常說的圖靈完備。
2. 以太坊引入了 gas 機(jī)制。在以太坊上可以隨意寫合約邏輯,gas機(jī)制保證最后執(zhí)行的時(shí)候有一個(gè)上限限制,這除了解決停機(jī)問題外,還能限制浪費(fèi)資源,讓腳本的執(zhí)行成本跟付出的費(fèi)用間有個(gè)關(guān)系。
3. 以太坊上的合約有狀態(tài),而比特幣上的合約不能有自己的狀態(tài)。這代表著:第一,比特幣上的合約是不能自己生成自己的狀態(tài)的,比如說在這次腳本里輸出一個(gè)東西,在下次腳本中使用是不行的,比特幣的腳本都是一次性的,只對(duì)這個(gè)交易起作用;第二,比特幣上的腳本是不能直接讀取鏈上已有的狀態(tài)的,比如時(shí)間鎖依賴鏈上的區(qū)塊高度,需要特殊指令支持,嵌入到腳本里的其他狀態(tài)(通過 op_return 指令實(shí)現(xiàn))更無法讀取。
Q:圖靈完備會(huì)帶來什么差別?
A:其實(shí)以太坊也不是說真圖靈完備,因?yàn)樗術(shù)as的限制,不可能用太復(fù)雜的邏輯。
圖靈完備的好處是它的擴(kuò)展能力更強(qiáng),表達(dá)能力更強(qiáng)。因此以太坊提供的實(shí)驗(yàn)的自由度要遠(yuǎn)大于比特幣,這也是以太坊上各種實(shí)驗(yàn)項(xiàng)目多的原因。
比特幣是一種保守策略。我就這么多指令,我在別的地方先實(shí)驗(yàn),實(shí)驗(yàn)好了,覺得需要支持這個(gè)指令,就增加這個(gè)指令。比如說為了支持原子交換以及支付通道,增加了哈希時(shí)間鎖定協(xié)議,可以鎖定一個(gè)時(shí)間段。
比特幣為什么不擴(kuò)充那么多指令?因?yàn)椴煌噶畹馁Y源消耗是不一樣的,如果表達(dá)很復(fù)雜的腳本,執(zhí)行這個(gè)交易的成本就會(huì)很高,會(huì)消耗資源、影響整個(gè)網(wǎng)絡(luò)。
Q:合約狀態(tài)會(huì)帶來什么差別?
A:比特幣的狀態(tài)全是在鏈下生成的,就是說生成交易的時(shí)候就要把這個(gè)狀態(tài)寫好,鏈上只承載交易的數(shù)據(jù),其它額外的數(shù)據(jù)寫不進(jìn)去。
比如你很難在比特幣上發(fā)自己的幣。在比特幣上發(fā)的幣都是染色幣,染色幣是在腳本里嵌入一些自己的數(shù)據(jù)結(jié)構(gòu),但腳本不能讀嵌入的這個(gè)數(shù)據(jù)結(jié)構(gòu),所以也不能通過腳本對(duì)這個(gè)數(shù)據(jù)結(jié)構(gòu)做驗(yàn)證,需要再做一個(gè)網(wǎng)絡(luò)校驗(yàn),看寫進(jìn)去的這個(gè)數(shù)據(jù)是不是合法的。
所有的染色幣都是基于這個(gè)機(jī)制實(shí)現(xiàn)的,它不是像以太坊那樣直接發(fā)一個(gè)token,然后通過合約來校驗(yàn)。
比特幣之所以采用這種設(shè)計(jì),本質(zhì)在于它是不歡迎其他的數(shù)據(jù)寫上去的,因?yàn)閷?duì)比特幣網(wǎng)絡(luò)來說,承載額外的數(shù)據(jù)是有成本的,這種數(shù)據(jù)還得永久保存,而用戶只付費(fèi)一次。所以比特幣不提供自定義狀態(tài)的存儲(chǔ),這不是它的路線,通過 op_return 嵌入自定義數(shù)據(jù)可以理解為一種 hack 行為,并不是比特幣提供 op_return 的本來目標(biāo)。
其實(shí)這能夠看出比特幣和以太坊在設(shè)計(jì)思路上的區(qū)別:你可以把比特幣理解成一個(gè)中立的銀行,它只提供資產(chǎn)加鎖、解鎖的機(jī)制,誰有鑰匙資產(chǎn)歸誰,它對(duì)其他的條件都不關(guān)心;并且每一筆資產(chǎn)都是獨(dú)立的鎖,它也不關(guān)心資產(chǎn)之間的關(guān)系。比特幣的智能合約并不是一段代碼,而是一系列操作鎖的協(xié)議。
而以太坊的的設(shè)計(jì)思路是任何合約都可以表現(xiàn)為一系列的交易,后面的交易和前置交易的狀態(tài)是有關(guān)聯(lián)的,所以它提供一種通用的追蹤和更新歷史狀態(tài)的機(jī)制,而更新狀態(tài)的邏輯和條件就由用戶自己去創(chuàng)造。以太坊黃皮書里的世界狀態(tài)的公式很好的表達(dá)了這種思路。
這兩種思路其實(shí)各有優(yōu)劣,和設(shè)計(jì)者的目標(biāo)以及對(duì)世界的抽象有關(guān)系。
Q:比特幣和以太坊的智能合約還有其他不同嗎?
A:UTXO模型(未花費(fèi)交易輸出)與Account模型(賬戶)的不同,也會(huì)給兩者智能合約的實(shí)現(xiàn)帶來差異。
在 UTXO模型中,每一筆錢都有一個(gè)標(biāo)記,使用的時(shí)候需要明確知道使用的是哪一筆錢;Account模型則相當(dāng)于把用戶所有的UTXO合并成一個(gè)大的UTXO,使用的是這個(gè)默認(rèn)的UTXO。這帶來幾點(diǎn)不同:
1. 在Account模型下寫合約比較簡(jiǎn)單,只需要說轉(zhuǎn)多少錢,不需要指明轉(zhuǎn)的是哪一筆錢;
2. Account模型可以提前對(duì)未來的收益進(jìn)行約束,也就說這筆錢還沒到合約賬戶,但可以部署合約去約束它該怎么花;
3. 由于Account模型相當(dāng)于合并 UTXO,所以轉(zhuǎn)賬時(shí)不能直接設(shè)置解鎖條件,必須先部署一個(gè)合約。
當(dāng)然,UTXO模型和 Account 模型都是在演化的,有一些項(xiàng)目會(huì)對(duì)它們做出改變,有機(jī)會(huì)我會(huì)寫文章詳細(xì)分析。
四、比特幣智能合約案例
Q:怎么理解閃電網(wǎng)絡(luò)本身就是一種智能合約?
A:你可以說閃電網(wǎng)絡(luò)是一個(gè)協(xié)議,也可以說它是比特幣上的一種智能合約。閃電網(wǎng)絡(luò)的合約主要解決兩個(gè)人如何共同鎖錢,以及如果一方作弊、不合作等等情況下怎么辦的問題,它是通過前邊說的三把鎖來實(shí)現(xiàn)的。
Q:在閃電網(wǎng)絡(luò)上實(shí)現(xiàn)智能合約又是怎樣的一個(gè)過程?
A:閃電網(wǎng)絡(luò)實(shí)際上是兩個(gè)人之間的支付通道,現(xiàn)在只支持互相轉(zhuǎn)賬。我們嘗試在支付通道之上嵌入了一個(gè)虛擬機(jī),就可以執(zhí)行比較完備的智能合約,比如游戲。(注:王淵命在閃電網(wǎng)絡(luò)上實(shí)現(xiàn)的智能合約:https://github.com/starcoinorg/thor)
通道雙方可以壓一筆 BTC,然后去玩游戲,贏的一方得BTC;如果玩的有分歧,可通過仲裁系統(tǒng)去仲裁。仲裁系統(tǒng)相當(dāng)于一個(gè)法院,可以是一個(gè)側(cè)鏈,或是一個(gè)雙方信任的機(jī)構(gòu)運(yùn)行的節(jié)點(diǎn),或者是仲裁者市場(chǎng)等等。仲裁系統(tǒng)保留了雙方的解鎖鑰匙(哈希的 value),它仲裁之后把鑰匙給贏的一方。
由于閃電網(wǎng)絡(luò)的資產(chǎn)是定向的,所以仲裁者只能決定哪個(gè)用戶得到BTC,但自己不能拿走用戶的 BTC,即便是有聯(lián)合作弊的可能,但作弊成本要比托管模式高。
Q:通過閃電網(wǎng)絡(luò)實(shí)現(xiàn)智能合約,與通過類似Liquid的側(cè)鏈實(shí)現(xiàn)智能合約,有什么不同?
A:閃電網(wǎng)絡(luò)上的智能合約是通道雙方的鏈下節(jié)點(diǎn)執(zhí)行的,互相校驗(yàn),產(chǎn)生分歧時(shí)需要有一個(gè)仲裁系統(tǒng)來仲裁。而側(cè)鏈本身就有共識(shí)機(jī)制,有多個(gè)節(jié)點(diǎn)來執(zhí)行和校驗(yàn)合約,所以兩者在執(zhí)行機(jī)制上是不一樣的。
在側(cè)鏈實(shí)現(xiàn)智能合約的方式與在以太坊上實(shí)現(xiàn)智能合約的方式類似,但當(dāng)它與主鏈協(xié)同的時(shí)候,需要通過比特幣的加鎖、解鎖的機(jī)制。
結(jié)束語(yǔ)
作為加密貨幣,比特幣似乎有能力為DeFi的發(fā)展提供一個(gè)更好的空間,因?yàn)樗哿俗疃嗟墓沧R(shí),也承載著最高的價(jià)值和流動(dòng)性,它是最受信任的加密資產(chǎn)。
那么作為一種系統(tǒng),比特幣是否支持DeFi的實(shí)施?在本文中我們探討了比特幣智能合約的實(shí)現(xiàn)機(jī)制,并把它與以太坊智能合約進(jìn)行了一些比較。比特幣上的DeFi不僅是可能的,而且會(huì)隨著多簽功能的強(qiáng)大變得更加完備。
也許我們可以期待以比特幣為核心元素的去中心化金融服務(wù)的到來。
評(píng)論
查看更多