交易所說資產補回來了,使用者能驗證什麼?

交易所公布資產回補比例,還不足以確認你帳上的幣是否足額、現在能否提出來。幣安這次的恢復公告,正好說明這些資料能查到哪裡。

準備金證明(PoR)能讓你核對自己的餘額是否算進總額,但漏掉別人的帳戶,你的證明仍可能通過。即使快照當時資產足夠,提款也得另查幣種與網路。

資產回補公告、PoR 快照與提款狀態各自的核對範圍:回補比例仍缺計價與分母,PoR 無法排除漏報或資產負擔,提款須查幣種與網路

回補比例要看涵蓋範圍

幣安 11 月 1 日的 Update #4 稱,已覆蓋約 95% 的受影響金額,BTC、ETH、USDT、BNB、SOL、USDC、XRP、USD1、RLUSD、ZEC 餘額已足額支持。剩餘約 5% 是這十種以外、較難買足的代幣,公告沒列出幣種。幣安另在 X 貼文稱已回補 60 億美元,Update #2 則將事件規模估為約 63 億美元,但這些概數沒有附上可重算 95% 的逐幣數量與計價明細,無法換算個別帳戶的覆蓋率。

Update #4 只寫使用公司資源,損失由幣安承擔。Update #3 已列出部分 SAFU、部分 Futures Insurance Fund 與公司庫存這幾種來源,但未提供逐項金額,仍無法對照這次增加的回補各用了多少。

SAFU 是幣安自設的緊急基金,幣安學院詞條只說安全事件造成損失時「可以」動用基金補償,未保證損失不會發生。存款保險是保障銀行存款人的制度,SAFU 不屬於存款保險,該詞條也沒有給出同樣的賠付承諾。

鏈上轉帳能確認到哪裡

Update #3 說,將動用部分 SAFU 購買尚未補足的資產。公開地址在 10 月 31 日有一筆 7,499 BTC 轉帳,可透過 mempool.space 核對,但轉帳紀錄看不出最後買了哪些代幣,無法證明缺少的幣已買齊。

凍結資金的數字也要留意用字。Update #2 稱凍結約 30 億美元,Elliptic 在 11 月 1 日約 05:50 UTC 的鏈上分析核對到凍結或扣押 28.5 億美元,TRM 則在 10 月 30 日 00:30 UTC 估計約 27 億美元。時點與口徑不同,不能相加,這幾份資料也沒提供已交回幣安的金額。

PoR 能核對的範圍

Merkle tree 把資料逐層做雜湊,最後得到代表整份資料的樹根,搭配驗證路徑,就能核對某筆資料是否納入同一份承諾。Vitalik Buterin 的償付能力文章說明了用於餘額的 Merkle sum tree:除了雜湊,還會逐層加總,使用者取得自己的驗證路徑後,就能檢查餘額是否算進公布的總額。要談償付能力,還得對照交易所能控制的資產與客戶負債。

下面的 merkle_sum_por.py 先用完整帳本建樹,再故意漏掉 dave,檢查其餘帳戶的證明,只作極簡示範,與幣安實作無關,也未與各交易所的正式程式碼逐一比對。

import hashlib

# 極簡 Merkle sum tree:每個節點帶 (雜湊, 子樹餘額總和)。
# 只示範納入證明怎麼驗,不是任何交易所的實作。

def leaf(user: str, balance: int) -> tuple[bytes, int]:
    return hashlib.sha256(f"{user}:{balance}".encode()).digest(), balance

def parent(left: tuple[bytes, int], right: tuple[bytes, int]) -> tuple[bytes, int]:
    total = left[1] + right[1]
    data = left[0] + left[1].to_bytes(8, "big") + right[0] + right[1].to_bytes(8, "big")
    return hashlib.sha256(data).digest(), total

def build(leaves):
    levels = [leaves]
    while len(levels[-1]) > 1:
        cur = levels[-1]
        if len(cur) % 2:
            cur = cur + [(hashlib.sha256(b"pad").digest(), 0)]
        levels.append([parent(cur[i], cur[i + 1]) for i in range(0, len(cur), 2)])
    return levels

def proof(levels, index):
    path = []
    for level in levels[:-1]:
        if len(level) % 2:
            level = level + [(hashlib.sha256(b"pad").digest(), 0)]
        sibling = index ^ 1
        path.append((level[sibling], sibling < index))
        index //= 2
    return path

def verify(user, balance, path, root):
    node = leaf(user, balance)
    for sibling, sibling_is_left in path:
        node = parent(sibling, node) if sibling_is_left else parent(node, sibling)
    return node == root

ledger = {"alice": 50, "bob": 30, "carol": 20, "dave": 100}

# 交易所照實建樹
full = build([leaf(u, b) for u, b in ledger.items()])
root = full[-1][0]
print("full root total:", root[1])
print("alice included:", verify("alice", 50, proof(full, 0), root))

# 交易所漏掉 dave 再建樹:負債總額變小,其他人的證明照樣過
shown = {u: b for u, b in ledger.items() if u != "dave"}
partial = build([leaf(u, b) for u, b in shown.items()])
proot = partial[-1][0]
print("partial root total:", proot[1])
print("alice included:", verify("alice", 50, proof(partial, 0), proot))
print("bob included:  ", verify("bob", 30, proof(partial, 1), proot))
print("dave can find a proof:", "dave" in shown)
full root total: 200
alice included: True
partial root total: 100
alice included: True
bob included:   True
dave can find a proof: False

原本總額是 200,漏掉 dave 後只剩 100,留在樹裡的帳戶仍各自驗得過,輸出列出了 alice 和 bob 的結果。少掉的是 dave 那 100,其他人只查自己的路徑,看不出缺口。最後一行只表示 dave 不在公開帳本裡,程式沒有替他執行 verify。

幣安 PoR 頁公布的 zk-SNARK 電路約束,涵蓋帳戶餘額納入總和、帳戶淨餘額非負,以及葉節點更新後樹根變化有效。這些檢查針對送進證明的資料,不能順帶保證沒有漏報。

Provisions 論文依賴客戶檢查自己的餘額是否納入,2026 年的負債證明(PoL)論文《Mitigating Collusion in Proofs of Liabilities》也指出,既有方案的加總證明不保證總額反映全體使用者的當下餘額。

幣安 PoR 頁把錢包所有權列入驗證流程,但控制錢包無法排除借入資產,抵押或其他負擔也要另查。PCAOB 投資人倡議辦公室 2023 年的提醒指出,PoR 程序很可能未涵蓋負債與借入資產等事項,PoR 工作也不等同審計。Vitalik 也提到,法幣餘額仍需銀行或稽核者等提供證明,無法單靠這類密碼學證明核對。

快照與提款要分開看

Provisions 把快照限定在特定比特幣區塊,幣安自驗文件也提醒,報告可能與目前資產數量不同。定期重做有助於持續觀察,但上次驗過,不代表資產之後沒有移走。

提款還得核對幣種與網路,Update #4 就是按這兩者的組合安排恢復。

擠兌與 Diamond–Dybvig 模型說明了銀行存款與資產的期限差異:存款可隨時提領,放款卻可能要更久才能收回,集中提款因此可能造成支付困難。本文只借這個銀行模型區分資產與流動性,不據此推論幣安會發生擠兌。

幣安現況

查詢截至 2026-11-01 14:15 UTC,台北時間同日 22:15。這次查到的編號公告仍到 Recovery Update #4,未找到可核實的 Update #5;後續進度改由 官方 X 逐批公布。

已公布的進度

提款:12:36 UTC(台北時間 20:36)的官方 X 更新新增 ZEC、TON、SUI,連同先前的清單,共列出以下 15 個網路與資產組合。這是幣安宣布已恢復的範圍,本文未實測提款,也不能由網路名稱推論該鏈所有代幣都已開放。

網路該則公告列出的資產
BTCBTC
Ethereum(ETH)ETH、USDT、USDC
BNB Smart Chain(BSC)BNB、USDT、USDC
XRPXRP
BaseETH、USDC
DOGEDOGE
Optimism(OP)ETH、USDT、USDC
ArbitrumARB、ETH、USDT、USDC
TRON(TRX)TRX、USDT
Solana(SOL)SOL、USDT、USDC
Polygon(MATIC)POL、USDT、USDC
Avalanche C-Chain(AVAXC)AVAX、USDT、USDC
Zcash(ZEC)ZEC
TONUSDT、GRAM
Sui(SUI)SUI

回補:本次查到的最新比例仍是 Update #4 所稱約 95%,另有 03:04 UTC 的官方貼文稱已回補 60 億美元。未找到更高比例的官方更新,這些是平台的回補說法,不代表追回同等金額的贓款。

PoR:Update #3 稱已公布 10 月 31 日 00:00 UTC 的快照;06:53 UTC 的官方 X 貼文另稱 PoR 地址清單已加入新錢包,之後提款將由新地址處理。地址更新本身無法證明完整零知識證明已產出。

凍結與歸還:本次查到的官方凍結總額仍為約 30 億美元,出自 10 月 30 日的官方貼文及 Update #2;未找到可核實的更新總額或已歸還幣安的金額,不能把凍結款項加進回補數字。

預告與尚未驗證的部分

  • 第二階段:未找到確定日期。Yi He 的貼文仍說其他錢包要完成安全檢查;crypto.news 與 BusinessToday 也轉述尚無固定時程。Update #4 的 06:00–09:00 UTC 是第一階段原定啟動時窗,不能當成所有網路都在 09:00 前完成。
  • 完整 PoR 證明:Update #3 預估於 11 月 3 日 UTC 產出,這仍是預估。本次讀取英文 PoR 頁及簡體中文頁,都未取得當期快照欄位、樹根與比率,無法確認是否已有更新快照或完整證明可驗證。

提款狀態頁此次回傳的表格沒有幣種紀錄,無法用來獨立核對即時狀態;上表依官方公告記錄。

交易所應公開的驗證資料

使用者需要各期資料與驗證方法,才能重做檢查。幣安文件已有自驗步驟,常規快照在每月 1 日 00:00:00 UTC 取得、同月 7 日前公布,證明旁也應列明快照日期與對應區塊,讓人知道查的是哪一期。

交易所也應說明未涵蓋的幣種與無法自行核對的項目,讓使用者知道自己的資產是否在範圍內,還缺哪些驗證資料。

簽署授權另見〈保住私鑰之後,誰有權要求系統簽章:從 2019 年幣安事件看託管簽署的授權邊界〉,供應鏈則見〈簽章都正確,交易為何還是錯的:Bybit 與 Safe 的簽署供應鏈〉。

尚未釐清的事

截至上述查詢時間,幣安雖已公布約 95% 與 60 億美元的回補說法,仍缺計價時點、分母明細及剩餘幣種的逐幣對照,本文不據此估算缺口。各來源的實際回補金額、凍結款項歸還金額與第二階段確定日期,本次也未查到可核實的資料;完整 PoR 證明是否已可取得,仍無法確認。

下一篇想談的是,交易所該公開哪些資料,才能讓外部持續核對資產、負債與交付能力。本文整理公開資料,不構成財務建議。

補充筆記

  • 整體回補比例不能換算成個別帳戶的覆蓋率,SAFU 詞條也沒有給出存款保險式的賠付承諾。
  • 轉帳與凍結紀錄,分別不等於採購完成與資金歸還。
  • 自己的餘額驗證通過,仍可能有其他帳戶被漏掉,資產是否另有負擔也要另外查。
  • 官方已宣布恢復 15 個網路所列資產的提款,第二階段仍未查到確定日期。
  • PoR 已宣布更新快照與錢包地址,完整證明仍待核實,11 月 3 日是官方預估日期。

延伸閱讀

想法與技術判斷出自 Sheng,和 Claude 一起起草 · 範例在 Linux 上以 Python 3.13.18 實測。