基于安全可靠的跨區(qū)塊鏈交易機制Atomic swap介紹
Atomic swap:不經(jīng)由第三方完成的安全可靠的跨區(qū)塊鏈交易
因為加密貨幣交易所不時傳出被駭客攻擊、被凍結(jié)、甚至卷款倒閉的事情,人們開始意識到把錢放在交易所的大金庫其實是不太安全的,也有一些去中心化交易所的方案被提出來,試著在保障使用者資產(chǎn)安全的前提下交易。
然而,這些基于以太坊智慧合約實現(xiàn)的去中心化交易所,都有一個最大的局限,就是它們只能交易Ether本身和存在以太坊主鏈上的token,比起傳統(tǒng)交易所能處理Bitcoin, Ethereum, Monero, Zcash之間的各種幣/幣交易,去中心化交易所的功能顯得陽春許多。
因為區(qū)塊鏈創(chuàng)造的安全交易機制,作用范圍終究只限于同一條鏈上,目前要做跨鏈交易就只能把錢交由第三方保管,完成互換后再發(fā)還給擁有者。所以我們想試著找到一個方法,能夠達(dá)成
只要雙方互相約定,就能安全的達(dá)成跨鏈的資產(chǎn)交易
這乍看之下好像很簡單,就是一手交錢一手交貨嘛。但實際上,我們在日常生活中之所以能實現(xiàn)所謂的付錢取貨,其實仰賴了很多東西,比方說信任,比方說法律,比方說監(jiān)視器和防盜門。而場景一旦換到網(wǎng)路世界,事情就變得沒那么單純。
比方說小時候玩的線上游戲吧,有些人會用點數(shù)卡序號去跟其他玩家換游戲幣,但永遠(yuǎn)都存在一個無解的問題:先給點數(shù)還是先給幣?我怎么知道如果先給了對方會不會直接跑掉?
加密貨幣交易也有同樣的問題,當(dāng)你的交易對手是某個網(wǎng)路上不具名的人,你們要如何相信彼此能完成一筆交易而不被對方騙?或者說,怎么保證只要對方只要拿了我的錢就一定會給我貨?
交易的原子性
所謂的原子性(Atomic) 指的是一筆交易應(yīng)該像原子一樣,被視為最小的,不可再分割(雖然原子好像可以) 的單位。也就是說,我給你錢你給我貨這兩件事情呢,必須要同時發(fā)生,否則就同時不發(fā)生。
為了創(chuàng)造這樣的特性,我們會用上一些區(qū)塊鏈的神奇黑魔法,以Bitcoin來說是雜湊函數(shù)和時間鎖;至于Ethereum的話就是智慧合約。
交易的過程大致上是這樣子的,假設(shè)我和一位匿名網(wǎng)友達(dá)成共識,要用我持有的10 BTC交換他的100 ETH。首先我們需要知道彼此的收付款地址,為了后續(xù)說明方便,這里假設(shè)它們分別是:
BTC_in
BTC_out
ETH_in
ETH_out
再來,為了完成這筆交易,我需要為這筆交易創(chuàng)造一個秘密,具體來說會是一段只有我自己知道的字串,并算出這個秘密的雜湊值。
這里我選用的秘密是:早安我的朋友
接著,我發(fā)送一筆交易,將我的10 BTC從BTC_out轉(zhuǎn)出到一個特殊的暫存位置( P2SH ),并且規(guī)定這筆錢有兩種方式可以轉(zhuǎn)走:一種是如果出示那個可以被Hash變成46f34 …8f4的秘密,就把錢交給BTC_in;另一種是如果錢放了兩個小時還沒被領(lǐng)走,那BTC_out就可以把錢領(lǐng)回去。
對方也要做類似的事情,把100 ETH 從ETH_out 轉(zhuǎn)到暫存的智慧合約,規(guī)定只要ETH_in 向合約出示能變成46f34…8f4 的正確秘密就可以把錢領(lǐng)走,否則一小時后ETH_out 可以把錢拿回去。
等這些設(shè)定都完成了之后,我就可以對合約說「早安我的朋友」,然后把對方的100 ETH 領(lǐng)走,同時因為區(qū)塊鏈資料是公開的,對方看得到我用來領(lǐng)錢的秘密,當(dāng)然也就來把我的10 BTC 拿走,交易就算順利完成啦。
這里有兩個值得注意的小細(xì)節(jié),第一個是領(lǐng)錢的規(guī)則,并不是任何知道秘密的人都可以領(lǐng),要是指定的交易對手說出秘密才可以。這是因為區(qū)塊鏈上的資訊人人可見,所以當(dāng)我在廣播交易的同時,所有人都會看到早安我的朋友,甚至有可能搶先在我的交易被確認(rèn)之前,用同個秘密去把錢偷走,所以不能只認(rèn)秘密,要同時限制收款人才行。
第二個是兩人的提款時限是不一樣的,因為即便雙方都用同一組雜湊,一開始卻只有我單方面知道秘密,所以當(dāng)前面的設(shè)置完成之后,什么時候執(zhí)行交易的主動權(quán)握在我手上。若是兩邊的時限一樣,我就可以在到期前不久打出領(lǐng)ETH 的指令,并趁對方來得及反應(yīng)之前把本來的BTC 抽走。所以通常對方會把時限訂得比擁有秘密的人設(shè)定的時限再早一點,確保就算被壓死線也還有足夠的時間拿到應(yīng)得的錢。
所以說,整個換手的過程,就是我選了一支密碼學(xué)鑰匙,并構(gòu)造了一個可以被這支鑰匙解開的鎖。基于神奇的數(shù)學(xué)魔法,鎖是沒辦法回推鑰匙的形狀的。所以我安心的把自己的錢鎖起來,并給對方一個一模一樣的鎖,對方也安心的把他的錢用這個鎖給鎖起來,因為他知道,只要我亮出鑰匙來取他的錢,他絕對可以用同一把鑰匙拿走我的錢。
不同區(qū)塊鏈上的兩筆交易,用同一個雜湊鎖,產(chǎn)生了關(guān)聯(lián)
于是跨鏈交易的原子性就得到了保證,只有可能兩邊都給對方錢,否則就是兩邊都取回本來的錢,(理論上) 絕對不會有某一方拿了就跑的情況。而且更重要的是,這整個過程完全沒有第三方介入,雖然也需要把錢暫時鎖定,但這和放進(jìn)交易所的大金庫有著根本的不同。藉由區(qū)塊鏈本身的鎖定機制,錢的控制權(quán)還是在擁有者手上,不會沒事就被盜。
拒絕付款攻擊
原子互換保證了兩個相依的交易會同時發(fā)生或同時不發(fā)生,卻不保證交易會發(fā)生,所以它仍然存在著一些待解的問題。這和第三方托管的場外交易有點類似,因為交易從設(shè)置到完成并不是及時的,所以我們一定要為彼此保留一個緩沖的時間,讓付款流程可以被完成,但這個時間差有被利用的可能。
因為設(shè)置好的交易不見得會被執(zhí)行,對于有心人來說,這就成了絕佳的套利機會。我可以找人假意提出交易,待對手鎖定資產(chǎn)之后,自己不急著按下同意付款的按鈕,而是好整以暇的盯盤,一旦發(fā)現(xiàn)市場上的匯率出現(xiàn)波動,就立刻完成交易,并同時在另一邊以市價對沖,套取中間的價差。而如果時間到還沒有出現(xiàn)套利的機會,就拒絕付款,再找人發(fā)起交易,重復(fù)攻擊。
以BTC:ETH = 1:10,鎖定時間2小時/1小時為例,攻擊者有1 小時的機會可以故意拖延。如果是雙方都鎖定,在這段時間內(nèi)匯率變成1:9,本來的BTC 方可以零風(fēng)險套走10% 利潤。
我們假設(shè)有交易的意思表示就代表對當(dāng)前的匯率滿意,也就是被攻擊的人心胸寬大不計較中間的匯差,這仍然會造成些許損失。首先是機會成本,盡管當(dāng)事人給了一段緩沖期,但他本來不預(yù)期會被鎖定到最后一刻,這段時間如果有更好的交易機會出現(xiàn),這筆錢也沒辦法參與,潛在的獲利即是損失。
再來是區(qū)塊鏈的使用成本,雖然交易前的設(shè)置階段還沒有真的轉(zhuǎn)帳,但是對于處理它的礦工而言,這仍然是一筆交易,也要收取一定數(shù)量的手續(xù)費,所以如果對方根本沒有誠意跟你做交易,其實這手續(xù)費就是白花了。
面對這些潛在的道德危機,完全去中心化的原子互換技術(shù)上還無法克服,在人人自危的情況下,愿意和陌生人使用這種交易方式的人勢必很少。固然有些變通方法,比方說縮短鎖定期,但伴隨而來的卻是不方便和失竊風(fēng)險。至于其他的解決方案,比方說建立外源的評價系統(tǒng),或者用支付通道之類的第二層架構(gòu),則又會帶來程度不一的中心化。這可能也算是某種易用性與安全性與去中心化的三難吧。