什麼是雙重支出?

雙重支出是數位現金系統中的一個潛在問題,即相同的資金同時發送給兩個接收者。如果沒有任何適當的對策,無法解決問題的協議就會從根本上受到破壞——用戶無法驗證他們收到的資金是否已經被花在其他地方。

就數位現金而言,確保特定單位無法複製至關重要。如果 Alice 可以收到 10 個單位,複製貼上 10 次,然後發現自己擁有 100 個單位,那麼整個系統就會受到破壞。同樣,如果她可以同時向鮑勃和卡羅爾發送相同的 10 個單位,則這種方案就行不通。因此,爲了使數位貨幣發揮作用,必須有適當的機制來防止這種行爲。


如何防止雙重支付?

集中式方法

中心化路線比去中心化路線更容易實現。這通常需要一名監督者管理系統並控制單位的發行和分配。解決雙重支付問題的一個很好的中心化解決方案是 David Chaum 的 eCash。

爲了向用戶發行模仿現金的數字資產(能夠匿名和點對點交換),銀行可以使用盲簽名——正如密碼學家 David Chaum 在其 1982 年的論文《不可追蹤支付的盲簽名》中詳細介紹的那樣。

在這種情況下,如果用戶(我們稱他爲丹)希望收到 100 美元的數字現金,他需要先通知銀行。假設他的賬戶中有餘額,他將生成一個隨機數(對於較小的面額,可以生成多個)。假設他生成了五個數字,每個數字的值都是 20 美元。爲了防止銀行追蹤特定單位,丹通過爲每個隨機數添加盲因子來混淆隨機數。

然後,他將這些數據交給銀行,銀行從他的賬戶中扣除 100 美元,並簽署消息證明這五條信息中的每一條都可以兌換 20 美元。丹現在可以花掉銀行發放的資金了。他去了艾琳的餐廳,買了一頓花了 40 美元的飯。

丹可以移除盲因子,從而顯示與每張數字現金“鈔票”相關聯的隨機數,該隨機數可作爲每個單位的唯一標識符(非常類似於序列號)。他向艾琳展示了其中兩張,艾琳現在必須立即向銀行兌換,以防止丹將其花在其他商家那裏。銀行將檢查簽名是否有效,如果一切正常,它將向艾琳的賬戶存入 40 美元。

現在使用的鈔票基本上已經被燒燬了,如果艾琳希望以同樣的方式花掉她的新餘額,就必須發行更多的鈔票。

Chaumian eCash 的設置可能對私人轉賬很有價值。但是,由於銀行是失敗的中心點,因此它的彈性很差。發行的鈔票本身毫無價值,因爲其價值完全取決於銀行將其兌換成美元的意願。客戶只能聽天由命,必須依靠銀行的善意才能運作。這正是加密貨幣旨在解決的問題。


分散式方法

在沒有監管者的生態系統中,確保資金不會被雙重使用更具挑戰性。同等權力的參與者必須圍繞一套防止欺詐的規則進行協調,並激勵所有用戶誠實行事。

比特幣白皮書中提出的最大創新是解決雙重支付問題。雖然沒有提及,但中本聰提出了現在廣爲人知的區塊鏈數據結構。

區塊鏈實際上只是一個具有一些獨特屬性的數據庫。網絡上的參與者(稱爲節點)運行專門的軟件,使他們能夠將自己的數據庫副本與同行同步。結果是整個網絡可以審計可追溯到創世塊的交易歷史記錄。通過公開查看區塊鏈,可以輕鬆檢測和防止欺詐活動,例如試圖雙重支付的交易。

當用戶廣播交易時,交易不會立即添加到區塊鏈中——必須先通過挖礦將其包含在區塊中。因此,接收者應僅在其區塊添加到鏈中後才認爲交易有效。否則,他們可能會失去資金,因爲發送者可能會在其他地方花費相同的硬幣。

一旦交易得到確認,這些代幣就無法被雙重使用,因爲所有權被分配給了新用戶——整個網絡都可以驗證這一點。正是出於這個原因,許多人建議等待多次確認後再接受付款。每個後續區塊都會大大增加修改或重寫鏈所需的工作量(這可能發生在 51% 攻擊期間)。

讓我們回顧一下餐廳的場景。丹回到餐廳,這次注意到窗戶上貼着一張“這裏接受比特幣”的標籤。他很喜歡上次喫的那頓飯,所以又點了一次。花了他 0.005 比特幣。

Erin 向他提供了一個公共地址,他必須將資金髮送到該地址。Dan 廣播了這筆交易,這實際上是一條簽名消息,表明 Dan 擁有的 0.005 BTC 現在歸 Erin 所有。無需過多贅述,任何看到 Dan 簽名交易的人都可以驗證他確實擁有這些代幣,因此有權發送它們。

不過,如上所述,交易只有包含在已確認的區塊中才有效。接受未確認的交易就像接受上例中的 40 美元 eCash,但不立即將其存入銀行——它允許發送者在其他地方消費。因此,建議 Erin 等待至少 6 個區塊確認(大約一小時)後再接受 Dan 的付款。


比特幣的雙重支付

比特幣經過精心設計,至少在協議按預期使用時可以防止雙重支付攻擊。也就是說,如果個人等待交易在區塊中得到確認,那麼發送者沒有簡單的方法可以撤銷交易。要做到這一點,他們需要“逆轉”區塊鏈,這需要不切實際的哈希算力。

然而,有少數雙重支付攻擊針對的是接受未確認交易的各方。例如,對於低價值購買,商家可能不想等待交易被納入區塊。繁忙的快餐店可能無法承受在網絡處理每筆購買時都袖手旁觀的代價。因此,如果企業啓用“即時”支付,他們就有可能遭受雙重支付。有人可能會訂購一個漢堡,付款後立即將相同的資金髮送到自己的地址。由於費用較高,這筆新交易很可能會先得到確認,因此會使之前的交易無效。

執行雙重支付有三種流行的方法:

  • 51% 攻擊:當單個實體或組織設法控制超過 50% 的哈希率時,他們就可以排除或修改交易順序。這種攻擊在比特幣上不太可能發生,但在其他網絡中確實發生過。

  • 競爭攻擊:兩筆相互衝突的交易連續廣播,使用相同的資金 - 但只有一筆交易得到確認。攻擊者的目標是通過僅驗證對他有利的交易(例如,將相同的資金髮送到他控制的地址)來使付款無效。競爭攻擊要求收件人接受未經確認的交易作爲付款。

  • 芬尼攻擊:攻擊者預先將一筆交易挖礦到區塊中,但不立即將其廣播到網絡。相反,他在另一筆交易中使用相同的貨幣,然後才廣播他之前挖礦的區塊,這可能會使付款無效。芬尼攻擊需要發生特定事件序列,並且還取決於接收者是否接受未經確認的交易。

我們可以看出,等待區塊確認的商家將大大降低成爲雙重支付受害者的風險。


結束語

雙重支付允許用戶利用電子現金系統獲取經濟利益,多次使用同一筆資金。傳統上,缺乏足夠的解決方案來解決這個問題阻礙了該領域的發展。

但幸運的是,盲簽名的使用爲中心化金融方案提供了一個有趣的解決方案。後來,工作量證明機制和區塊鏈技術的誕生催生了比特幣,成爲一種強大的去中心化貨幣形式——這反過來又激發了數千個其他加密貨幣項目的誕生。