如何確認轉賬已完成——區塊鏈原子性問題探索

買賣虛擬貨幣

作者:Geo Protocol   原文團隊:https://medium.com/@geoprotocol

原子性問題解決方案

假如你要操作一筆交易,但是你不能百分百確認交易是否完全執行併傳送到目的地,而且可能只有部分操作被記錄,也可能某一方會丟錢。如果出現諸如此類的情況,相信應該沒有人會再用這個網路了。

電源故障或事件故障可能會給資料庫造成嚴重影響。為了保證有效性,每個資料庫事務要滿足四大標準,也就是所謂的ACID模型,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)以及永續性(Durability)。本文主要圍繞原子性展開。

首先,什麼是原子交易?原子交易是指要麼完全執行要麼完全不執行的資料庫事務。那麼,為什麼要使用這些事務呢?

先來看下我們所處理的問題,以分散式資料庫為例。假設我們想要更改一些資料,而資料庫不支援原子更改,那麼可能會導致一部分資料與另一部分不一致。如果某位使用者不知道有過更改,他會看到替代資料,然後無法確定哪些資料是正確的。但是,如果資料庫支援原子交易,那麼任何更改都只能透過兩種方式執行:要麼全改要麼全不改。下面我們會深入研究最新的分散式資料庫所遇到的問題,然後分析鏈下實現方案。

傳統解決方案

考慮原子性的話,多階段提交是目前使用較多的。兩階段提交協議是最常見的,而一階段和三階段提交協議也廣為接受。

一階段提交是實現原子性最直接的方法,但也是較粗糙和低效的方法。更改由事務管理器發出、參與者執行指令來完成。顯然,這個模型有太多固有威脅和陷阱,比如參與者可能會掉線,然後回來的時候就錯過了提交。

兩階段提交更全面些,它將每個事務分成兩個階段。首先,事務管理器會查詢每個參與者以確定是否提交事務。他們會建立必要的臨時項(在多跳支付系統的情況下會進行分配)並投票提交。當管理器收到所有參與者回覆“是,我已準備好付款”,它會向他們發出提交請求,但只要有一個人回答“否”或沒回復,管理器都會撤銷付款。這個方案比一階段提交更穩健、更安全,但也不是無懈可擊。實際上,如果有參與者拒絕該事務,那麼這一項(分配)就會停留在那裡,在管理器發出回滾指令之前都無法刪除,從而導致網路鎖定。

為了解決這個問題,三階段提交方案面世,它將第一階段分為兩部分。事務管理器也是從查詢參與者的投票開始,但會推遲預備指令,直到收到所有參與者的肯定回覆。然後參與者建立項(即進行分配)並確認他們已為下一階段做好準備。 與兩階段提交一樣,最後階段僅在收到所有確認後執行。

三階段提交具體步驟

雖然三階段提交安全級別更高,但由於階段多,要交換的資訊多,它的表現也沒有那麼好。所以就這些傳統解決方案而言,很難確定哪個方案更好。

這裡有必要說一下單個資料庫節點的原子性問題。它是在前饋分類賬的幫助下實現的。一般來說,無論使用者什麼時候請求將事務反映到資料庫,第一步就是讓這一項持久存在(防止停電這類低階問題出現,確保恢復操作時更改仍舊存在),然後將其寫入磁碟分類賬。如果過程中出現系統故障,會出現兩種可能的結果。一,如果磁碟上的賬本項不見了,事務就會回滾;二,如果還在,那麼重啟時磁碟上的事務就可以恢復。

有四個本地資料庫的分散式資料庫,每個資料庫中關於Bob和Alice的餘額資訊都不同

鏈下網路中的原子交易

自2009年加密貨幣出現以來,比特幣使用者的數量呈指數級增長。相應的,交易佣金和交易延遲情況也在增加。因此,社羣積極地尋找著可擴充套件性解決方案。在他們的努力下,閃電網路成為第二層解決方案,實現了支付通道及多跳交易。為了防止因某人的過錯而損失資金,原子性也是需要的。下面是現有的各種解決方案。

HTLC

為了實現原子性,目前用的最多的就是HTLC(雜湊鎖合同),即在預設鎖定時間前呈現初始金鑰可以花費資金。為了深入瞭解這一方案,我們先來看下基於閃電網路的事務流程。首先,接收方節點生成金鑰並計算雜湊值。之後,將該雜湊值傳送到傳送方節點作為HTLC生成的基礎。傳送方生成合約並將其傳送到節點1,即路徑上下一個節點,該節點用遞減的時間鎖建立新合同(使用相同的雜湊值)。這個新生成的合同由節點1沿著路徑傳送到節點2,然後節點2重複相同操作並繼續縮短時間鎖。合約一路前進到接收方,由接收方透過自己一開始就生成的金鑰簽名釋放資金(解鎖支付),然後從發出合約的節點處獲得資金。反過來,這一動作向最靠近傳送發的節點揭示金鑰,並授權解鎖支付並接收資金,然後再向前一節點出示金鑰。整個路徑重複這一過程後,每個節點都收到了付款,至此支付完成。所以,造成節點丟錢的唯一因素就是它無法趕在時間鎖的時限內簽名釋放資金,比如在接收到金鑰後就離線。

使用HTLC進行的Alice到Eric的支付(中間經過三個中間人Bob, Carol以及Diana)

該方案的缺點是,在不利情況發生的同時,偶爾會出現關於合同到期時間及客戶資金損失方面的分歧。

HTLA

Ripple的Interledger協議是一個開放協議套件,用於各類賬本間轉賬(跨鏈交易)。該專案白皮書中提出了“公證人”這一概念。為了實現原子性,最初建議使用通用模式(Universal Mode)和原子模式。

在通用模式下,Interledger的原子性透過HTLA(雜湊時間鎖定協議)實現——HTLA本質上是HTLC的改良版,兩者的不同在於,HTLA能夠在區塊鏈不支援HTLC的情況下支援各類連線,包括有條件支付通道(透過HTLC更新實現)、On-Ledger持有/託管(使用HTLC)、簡單支付通道、Trustline等等。

Interledger跨賬本支付框架

換句話說,如果跨鏈支付要透過不支援HTLC的區塊鏈,那麼聯結器(負責傳送路線的特殊Interledger節點)可以使用其他方法複製,以便滿足所有合約條款,例如支付時間、金額、支付解鎖條件等。

PM

Sprite通道的目標是開發新的支付通道,解決閃電網路原子性、部分存款與通道資金登出等問題。

透過新增原始合約管理器(PM),HTLC得到了顯著升級。開發者是想讓PM成為HTLC的仲裁人,然後將任何單個節點的合約到期決策權委託給相應的軟體,防治有參與者離線並丟失錢財。仲裁人應該是常規的以太坊智慧合約(或任意其他區塊鏈),登記類似'H雜湊的X 原值已於到期前在區塊鏈上釋出'這樣的宣告。

Sprite通道也應該有統一的合約到期時間。如果原值在合約到期前及時釋出了,那麼就受理所有爭議。邏輯會排除有人收到了錢而另一人指出所有人的到期時間都一樣的情況。但是,如果原值釋出時間無效,那麼這筆付款就無爭議。

SpriteChannel爭議解決過程

HTLR

Celer Network是針對公鏈可擴充套件性並透過離線技術實現效能最大化的解決方案。 在這個體系中,PM(原值管理器)變成了一個雜湊時間鎖登錄檔(HTLR),但大部分功能仍舊保留。HTLR有兩個依賴端點,即IsFinalized和QueryResult。前者返回的結果是原值是否先於區塊數字完成註冊;而後者返回的是原值是否已註冊。這兩個功能最終可以實現合併。需要注意的是,HTLR始終是鏈上的。

Notaries

Interledger的原子模式應該就用到了“公證人”這個角色。透過公證人完成的支付和透過閃電網路HTLC進行的支付很相似,兩者唯一的區別是,在出示金鑰之前,接收方節點會將合約轉交給公證人,即從其通用地址列表中隨機選擇的特殊實體。 公證人的設定是允許傳送方設定驗證支付的實體數量及可接受的惡意公證人數量(30%以內)。公證人必須在拜占庭容錯(BFT)共識的基礎上,對批准付款進行投票。如果一切正常,他們將“標記”交易,使接收方節點能夠解鎖資金。這個概念在白皮書中看起來不錯,但很難實現跨鏈交易。此外,它要求使用者信任公證人。

Observers

這一角色在Geo協議中出現,該概念為原子性問題提供了獨特的解決方案。目前專案團隊在建立一個去中心化的點對點鏈下網路來進行資產交換。

只要事務參與者在執行期間遇到問題,觀察者就會介入。觀察者既不會影響事務方向也不會改變任何內容。他們不是用來驗證每一個事務的,只是用來干涉使用者請求的。Geo採用類似二階段提交的框架來處理常規事務。首先,所有參與者簽名表示已準備好付款。其次,如果每個人都有簽名列表(即“檔案”),則執行付款。如果有參與者說“檔案”不存在,那麼觀察者會在兩個階段間採取行動。這種情況下,他們會從任意節點處拿到簽名列表併傳送給所有參與者,如果無法完成就不執行任何操作,然後交易會按時到期失效。

GEO協議觀察者工作流程

原子跨鏈支付

原子交換是目前實現跨鏈支付最常用的方式。透過原子交換進行的跨鏈交易無需託管服務或第三方介入。它使用時間鎖合同且必須是由執行事務的區塊鏈支援的。在現實生活中,使用者在區塊鏈上按預先設定的時間鎖定想要交換的金額(如1個 BTC),然後生成一個原值、計算雜湊,再宣告另一個使用者只有呈現出這個原值才能獲得這筆錢。時間鎖和雜湊可以在區塊鏈上看到(但不是原值)。這時,另一位使用者想用3個萊特幣換這個比特幣。為此,他使用和第一個使用者一樣的雜湊值將3個萊特幣鎖在合約上——他可以在另一條區塊鏈上看到這個雜湊值。而第一個使用者要想從第二個使用者的合約裡拿到幣,就必須透露他的原值,然後第二個使用者再用這個公佈了的原值從第一個使用者的智慧合約裡拿到他的幣。要想完成交易,第一個使用者就必須透露他的原值。如果他不這樣做,交易就無法結束。在這種情況下,為避免出現兩位使用者的資金同時被阻攔的情況,合同有效性有一定時限。

原子交易各階段展示

多路徑

閃電網路的設計者提出了多路徑原子支付技術,但尚未實現。這個技術旨在將大額支付分解為多筆小額支付以緩解網路流動性問題。其原子性透過改進後的HTLC實現。接收方建立一個基礎原值(BP)以用於之後建立每筆小額支付的部分原值。一旦接收方收到部分付款,就可以透過這個基礎原值解鎖資金,無論款項到達順序如何。

在Geo協議裡,多路徑原子性的提供方式與單路徑原子性完全相同(包括分配、簽名集合、簽名傳播列表以及在遇到問題時提供解決方案的觀察者)

結論

在去中心化網路中,原子性的開發受到了很多新概念的影響。

第一個出現的是雜湊時間鎖合同(HTLC),其優勢在於節點掉線時減少損失並且保障傳送方和接收方的安全。而其問題在於資金必須凍結在通道中,參與者必須保持線上以避免損失。

然後是在HTLC基礎上改良後的HTLA和HTLR。前者可以實現在各種登錄檔中使用HTLC,甚至是那些不支援相應合同的登錄檔。後者則解決了節點離線的問題。

之後的新方案中出現了觀察者和公證人。雖然在使用這些方案時我們要非常小心,因為觀察者/公證人的中心化可能會損害網路,但是一個設計得當的系統可以幫助這兩個角色維持去中心化狀態。

我們會繼續進行研究,也歡迎大家一起加入分散式系統的開發與問題的解決。

本文及配圖均為趣頭條自媒體使用者上傳,不代表平臺觀點。

免責聲明:

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

推荐阅读

;