3.3 比特幣腳本的應用

現在我們已經明白了比特幣腳本的工作機制,接下來我們看一下比特幣腳本語言的一些強大應用。你立刻就能明白,比特幣將指定公鑰變成複雜地指定腳本,是有實際意義的。

第三方支付交易

比如,愛麗絲用比特幣向鮑勃買東西,愛麗絲想貨到付款,而鮑勃想見款發貨。該如何處理?一個好的辦法是使用第三方支付交易(escrow transaction)。

第三方支付交易可以用「MULTISIG」(多重簽名)來輕易實現。愛麗絲並不直接付款給鮑勃,而是發起一個多重簽名的交易,並規定:三個人中有兩人簽名之後,資金才能被支取。這三個人是愛麗絲、鮑勃與第三方仲裁員朱迪(Judy)。朱迪負責調解可能發生的糾紛。因此,愛麗絲發起了一個2/3的多重簽名交易來付款,這個交易規定三個人中有兩人簽名之後,資金才能被支取。這個交易被納入區塊鏈後,資金被第三方監管,這三個人中的任意兩個人可以決定資金的去向。現在,鮑勃覺得可以給愛麗絲發貨了,通常情況下,如果愛麗絲和鮑勃都是有誠信的,鮑勃會按照愛麗絲要求發貨,愛麗絲收貨之後和鮑勃共同簽名,把資金轉給鮑勃。由於三個人中有兩人簽名即可完成支付,此時,由於沒有任何爭議,朱迪根本不需要參與。和愛麗絲直接付款給鮑勃相比,第三方支付交易並不會更複雜,只需在區塊鏈裡增加一筆交易即可。

但如果鮑勃其實並未發貨,或者貨物在路上被弄丟了,又或者鮑勃發的貨物並不是愛麗絲想要的,這時會出現什麼情況?愛麗絲覺得被騙了,所以不打算付款給鮑勃,而是想把比特幣從監管賬戶要回來。這種情況下,愛麗絲不會簽名真正完成付款,而鮑勃肯定也不會承認問題而主動放棄收款,這時,就需要朱迪判定資金到底該轉給誰。如果朱迪認為鮑勃欺騙愛麗絲,她就會跟愛麗絲一起簽名,把比特幣退還給愛麗絲,當然,如果她認為愛麗絲應該付款,那她就會和鮑勃一起簽名,完成資金的實際支付;所以,到底該完成支付或是撤銷支付,由朱迪決定。當然,這種情況也只有在發生糾紛時才出現。

綠色地址

另外一個很酷的應用叫作綠色地址(green addresses)。假如愛麗絲要轉賬給鮑勃,而鮑勃不在線(或者鮑勃在線但沒有時間),所以他無法通過查看區塊鏈的更新來確認轉賬是否完成。一般來說,一個交易需要獲得6次確認,我們才能確信它已經確實被加到區塊鏈中,但這需要大約一個小時。但是,想像一下,如果愛麗絲只是在鮑勃的店裡買一個熱狗,這麼長時間才確認交易,顯然是不可接受的;或者,如果鮑勃由於某些原因無法接入互聯網,那他就一直無法確認交易。加 入 會 員 微 信

為了解決這個問題,比特幣採用了第三方銀行的做法,實際上,「銀行」可能是一個交易所,或者是其他的金融媒介。如果愛麗絲要轉賬給鮑勃,愛麗絲會和她的銀行聯繫,「我要付給鮑勃這些幣,你能辦理嗎?」銀行會回答:「好的。我會從你的賬號扣錢,然後從我的綠色地址轉賬給鮑勃。」這樣,收款人就不需要實時查看區塊鏈來確認交易。

需要注意的是,款項並不是由銀行直接支付給鮑勃,實際上,部分款項,可能會通過其他地址回到銀行手中。但是,由於比特幣從銀行控制的某個賬戶——我們在此所稱的「綠色賬戶」直接轉給鮑勃,而且,銀行保證它不會雙重支持這個比特幣,如果鮑勃也相信這一點,當他看到銀行簽名的交易時,就可以確認自己遲早會收到這些比特幣——只要區塊鏈確認這筆交易。

請注意,這不是比特幣技術系統的保證,而是現實世界中銀行的保證,銀行為了保護它的聲譽,不會雙重支持比特幣。銀行可以向客戶證明,「我一直使用這個賬戶來支付,從始至終也沒有發生過雙重支付,我以前沒有這麼做,以後也不會這麼做。」如果鮑勃信任銀行不會進行雙重支付的承諾,他就無須信任愛麗絲——他對愛麗絲本來就瞭解不多。

當然,如果銀行出現了雙重支付事件,它就會自毀長城,人們不會再信任它。實際上,有兩個提供綠色地址的機構〔Instawallet和門頭溝公司(Mt.Gox的暱稱,位於日本東京,是全球最大的比特幣交易商)〕就是由於失信而倒閉的。目前,綠色地址使用得越來越少:最初,人們認為綠色地址可以實現快速支付,而且不需要通過查看區塊鏈來確認交易結果;但是現在,人們認為,對「銀行」過分信任是有風險的。

高效小額支付(efficient micro-payments)

我們再舉一個比特幣腳本應用的例子。假設愛麗絲是鮑勃的客戶,需要持續向鮑勃支付小額費用,例如,鮑勃是愛麗絲的手機流量提供商,根據愛麗絲每分鐘使用的流量計費。但是,每分鐘支付一次是不現實的:即使技術上做得到,交易手續費也讓人吃不消。

我們希望可以把每分鐘的費用累積起來,最後一次性支付。為了實現這種想法,愛麗絲先發起一個MULTISIG交易,把可能花費的最大金額轉到MULTISIG地址,但這個交易需要愛麗絲與鮑勃兩個人的簽名才能生效。愛麗絲在使用流量的時候,每隔一分鐘就簽名一次,向鮑勃支付這分鐘所產生的流量費用,然後把剩餘的錢轉給自己,每分鐘重複一次,直到掛機為止。請注意,這些交易只有愛麗絲的簽名,還沒有鮑勃的簽名,因此,交易還沒被放進區塊鏈裡。愛麗絲掛機之後,會告訴鮑勃「我用好了,你可以切斷我的服務了」,此時,愛麗絲將不再支付費用,鮑勃也將切斷服務,然後在愛麗絲發送的最後一個交易裡簽名,把它放入區塊鏈裡。

隨著每個交易付給鮑勃的幣越來越多,愛麗絲的幣就會越來越少。最後一個交易會一次性向鮑勃支付所有的流量費,然後把剩餘的幣還給愛麗絲。整個過程中,愛麗絲單獨簽名的交易不會進入區塊鏈(上面沒有鮑勃的簽名),最後它們都會被丟棄掉。

從技術上講,所有這些交易都是雙重支付。在介紹綠色地址時,我們特別提到防止雙重支付的重要性,但在本例中,我們卻主動創造了大量的雙重支付。實際上,如果雙方都是正常運作的話,鮑勃只會在最後一個交易上簽名,所以我們在區塊鏈上看不到中間產生的那些雙重支付交易。

還有一個微妙的細節:如果鮑勃沒有在最後一個交易上簽名呢?他可能會說,「就讓那些幣待在第三方托管地址裡吧。」這樣一來,愛麗絲就會失去她一開始轉到MULTISIG地址的所有比特幣。但我們有一個聰明的辦法來解決這個問題,那就是我們前面看到的一個代碼——鎖定時間。

鎖定時間

為了避免上面說的這個問題,在小額支付協議開始之前,愛麗絲與鮑勃要簽訂一個交易,約定向愛麗絲退還所有的比特幣,但是這個「退款」行為被上了鎖,直到鎖定時間到了為止。愛麗絲發起MULTISIG交易把比特幣轉入第三方托管之後,在向網絡宣佈這筆交易之前,她會從鮑勃那裡要求這個退款交易。這樣,如果過了t時間鮑勃還沒有在最後一個交易上簽名的話,她可以通過這個退款交易收回所有的比特幣。

退款交易被鎖定t時間是什麼意思呢?還記得我們在第3章3.2節提到元數據的時候,有一個參數是「lock_time」,當時我們還沒有解釋。在此參數後面填上非零數值t, 這個值告訴礦工在記賬的時候,要等待t時間之後才能把這筆交易記入區塊鏈。這個交易在放入區塊後,經過確定的區塊數或者時間才生效。通過這個方式,人們可以發起一筆未來交易,當然,只有資金在未來時間點之前未被花費掉,這筆未來交易才會被執行。這在小額支付的例子裡非常有效,它是愛麗絲的定心丸,能夠確保在鮑勃最後沒有簽字的情況下她能拿回自己的比特幣。

通過上面的例子,我們展示了比特幣腳本可以輕易實現很多功能。我們雖然只討論了三個例子,但其實人們研究過許多其他的功能。比如多人彩票系統,這個系統涉及一些十分複雜的多步操作協議,以及不同的鎖定時間和第三方托管賬戶,來防止玩家作弊。還可以通過腳本語言實現多人混幣,使得比特幣更難被追蹤。我們會在第6章展開討論。

智能合約

所謂智能合約(smart contracts),就是那些不同於需要通過法律或者仲裁機構來保護執行的普通合約,智能合約是比特幣系統裡可以用技術手段來強制執行的合約,我們已經看到,比特幣有非常好的特性讓我們可以用腳本、礦工和交易驗證——而不是通過中心化權威機構——來實現第三方托管協議或是小額支付。

智能合約的研究目前已經非常深入,能夠實現非常多很複雜的功能,但比特幣腳本語言的設計也有很多缺陷,還是有很多現實需要的智能合約無法用比特幣的工作控制語言來實現[1]。不過這裡我們就不一一細談了。

[1] 但已經有很多有意義的探索,比如以太坊等實現了圖靈完備的智能合約。——譯者注

《區塊鏈:技術驅動金融》