跨區塊鏈原子交換

Ping Chen
Taipei Ethereum Meetup
7 min readApr 15, 2018

Atomic swap:不經由第三方完成的安全可靠的跨區塊鏈交易

因為加密貨幣交易所不時傳出被駭客攻擊、被凍結、甚至捲款倒閉的事情,人們開始意識到把錢放在交易所的大金庫其實是不太安全的,也有一些去中心化交易所的方案被提出來,試著在保障使用者資產安全的前提下交易。

然而,這些基於以太坊智慧合約實現的去中心化交易所,都有一個最大的侷限,就是它們只能交易 Ether 本身和存在以太坊主鏈上的 token,比起傳統交易所能處理 Bitcoin, Ethereum, Monero, Zcash… 之間的各種幣/幣交易,去中心化交易所的功能顯得陽春許多。

因為區塊鏈創造的安全交易機制,作用範圍終究只限於同一條鏈上,目前要做跨鏈交易就只能把錢交由第三方保管,完成互換後再發還給擁有者。所以我們想試著找到一個方法,能夠達成

只要雙方互相約定,就能安全的達成跨鏈的資產交易

這乍看之下好像很簡單,就是一手交錢一手交貨嘛。但實際上,我們在日常生活中之所以能實現所謂的付錢取貨,其實仰賴了很多東西,比方說信任,比方說法律,比方說監視器和防盜門。而場景一旦換到網路世界,事情就變得沒那麼單純。

比方說小時候玩的線上遊戲吧,有些人會用點數卡序號去跟其他玩家換遊戲幣,但永遠都存在一個無解的問題:先給點數還是先給幣?我怎麼知道如果先給了對方會不會直接跑掉?

加密貨幣交易也有同樣的問題,當你的交易對手是某個網路上不具名的人,你們要如何相信彼此能完成一筆交易而不被對方騙?或者說,怎麼保證只要對方只要拿了我的錢就一定會給我貨?

交易的原子性

所謂的原子性 (Atomic) 指的是一筆交易應該像原子一樣,被視為最小的,不可再分割 (雖然原子好像可以) 的單位。也就是說,我給你錢你給我貨這兩件事情呢,必須要同時發生,否則就同時不發生。

(後面有給非資訊領域人的白話文版本)
為了創造這樣的特性,我們會用上一些區塊鏈的神奇黑魔法,以 Bitcoin 來說是雜湊函數時間鎖;至於 Ethereum 的話就是智慧合約。

交易的過程大致上是這樣子的,假設我和一位匿名網友達成共識,要用我持有的 10 BTC 交換他的 100 ETH。首先我們需要知道彼此的收付款地址,為了後續說明方便,這裡假設它們分別是:
BTC_in
BTC_out
ETH_in
ETH_out

再來,為了完成這筆交易,我需要為這筆交易創造一個 祕密,具體來說會是一段只有我自己知道的字串,並算出這個祕密的雜湊值
這裡我選用的祕密是:早安我的朋友

SHA256 Hash of 早安我的朋友 = 46f347a3d5b192f561898ade4665f7c48e8803046094601576f7f608e06298f4

接著,我發送一筆交易,將我的 10 BTC 從 BTC_out 轉出到一個特殊的暫存位置(P2SH),並且規定這筆錢有兩種方式可以轉走:一種是如果出示那個可以被 Hash 變成 46f34…8f4 的祕密,就把錢交給 BTC_in;另一種是如果錢放了兩個小時還沒被領走,那 BTC_out 就可以把錢領回去。

對方也要做類似的事情,把 100 ETH 從 ETH_out 轉到暫存的智慧合約,規定只要 ETH_in 向合約出示能變成 46f34…8f4 的正確祕密就可以把錢領走,否則一小時後 ETH_out 可以把錢拿回去。

等這些設定都完成了之後,我就可以對合約說「早安我的朋友」,然後把對方的 100 ETH 領走,同時因為區塊鏈資料是公開的,對方看得到我用來領錢的祕密,當然也就來把我的 10 BTC 拿走,交易就算順利完成啦。

這裡有兩個值得注意的小細節,第一個是領錢的規則,並不是任何知道祕密的人都可以領,要是指定的交易對手說出祕密才可以。這是因為區塊鏈上的資訊人人可見,所以當我在廣播交易的同時,所有人都會看到早安我的朋友,甚至有可能搶先在我的交易被確認之前,用同個祕密去把錢偷走,所以不能只認祕密,要同時限制收款人才行。

第二個是兩人的提款時限是不一樣的,因為即便雙方都用同一組雜湊,一開始卻只有我單方面知道祕密,所以當前面的設置完成之後,什麼時候執行交易的主動權握在我手上。若是兩邊的時限一樣,我就可以在到期前不久打出領 ETH 的指令,並趁對方來得及反應之前把本來的 BTC 抽走。所以通常對方會把時限訂得比擁有祕密的人設定的時限再早一點,確保就算被壓死線也還有足夠的時間拿到應得的錢。

(白話文的版本在這裡)
所以說,整個換手的過程,就是我選了一支密碼學鑰匙,並構造了一個可以被這支鑰匙解開的鎖。基於神奇的數學魔法,鎖是沒辦法回推鑰匙的形狀的。所以我安心的把自己的錢鎖起來,並給對方一個一模一樣的鎖,對方也安心的把他的錢用這個鎖給鎖起來,因為他知道,只要我亮出鑰匙來取他的錢,他絕對可以用同一把鑰匙拿走我的錢。

不同區塊鏈上的兩筆交易,用同一個雜湊鎖,產生了關聯

於是跨鏈交易的原子性就得到了保證,只有可能兩邊都給對方錢,否則就是兩邊都取回本來的錢,(理論上) 絕對不會有某一方拿了就跑的情況。而且更重要的是,這整個過程完全沒有第三方介入,雖然也需要把錢暫時鎖定,但這和放進交易所的大金庫有著根本的不同。藉由區塊鏈本身的鎖定機制,錢的控制權還是在擁有者手上,不會沒事就被盜。

拒絕付款攻擊

原子交換保證了兩個相依的交易會同時發生或同時不發生,卻不保證交易會發生,所以它仍然存在著一些待解的問題。這和第三方託管的場外交易有點類似,因為交易從設置到完成並不是及時的,所以我們一定要為彼此保留一個緩衝的時間,讓付款流程可以被完成,但這個時間差有被利用的可能。

因為設置好的交易不見得會被執行,對於有心人來說,這就成了絕佳的套利機會。我可以找人假意提出交易,待對手鎖定資產之後,自己不急著按下同意付款的按鈕,而是好整以暇的盯盤,一旦發現市場上的匯率出現波動,就立刻完成交易,並同時在另一邊以市價對沖,套取中間的價差。而如果時間到還沒有出現套利的機會,就拒絕付款,再找人發起交易,重複攻擊。

以 BTC:ETH = 1:10,鎖定時間 2小時/1小時 為例,攻擊者有 1 小時的機會可以故意拖延。如果是雙方都鎖定,在這段時間內匯率變成 1:9,本來的 BTC 方可以零風險套走 10% 利潤。

我們假設有交易的意思表示就代表對當前的匯率滿意,也就是被攻擊的人心胸寬大不計較中間的匯差,這仍然會造成些許損失。首先是機會成本,儘管當事人給了一段緩衝期,但他本來不預期會被鎖定到最後一刻,這段時間如果有更好的交易機會出現,這筆錢也沒辦法參與,潛在的獲利即是損失。

再來是區塊鏈的使用成本,雖然交易前的設置階段還沒有真的轉帳,但是對於處理它的礦工而言,這仍然是一筆交易,也要收取一定數量的手續費,所以如果對方根本沒有誠意跟你做交易,其實這手續費就是白花了。

面對這些潛在的道德危機,完全去中心化的原子互換技術上還無法克服,在人人自危的情況下,願意和陌生人使用這種交易方式的人勢必很少。固然有些變通方法,比方說縮短鎖定期,但伴隨而來的卻是不方便和失竊風險。至於其他的解決方案,比方說建立外源的評價系統,或者用支付通道之類的第二層架構,則又會帶來程度不一的中心化。這可能也算是某種易用性與安全性與去中心化的三難吧。

噢,不過如果你也相信我大以太神教終將一統江湖,未來所有的區塊鏈資產總有一天會都搬家到 Ethereum 上面,那就沒有跨鏈的問題了。

https://fb.me/artistichorn

BTC:
1HUHtZ2mTLZgJai35msRfj6jupULP2kc6N
ETH:
pingchen.eth
Musicoin:
0x6746b0b11f2c723ae85a016744481b00cb13a007

--

--