跳至主要內容
高級

Discreet Log Contracts (DLC)

DLC 是一種在比特幣上建立智能合約的方式,使用預言機(Oracle)簽章來決定合約結果,同時保持交易隱私,預言機無法得知合約內容或參與者身份。

30 分鐘

什麼是 DLC?

Discreet Log Contracts(離散對數合約)由 Tadge Dryja 在 2017 年提出, 是一種利用預言機簽章來執行條件支付的比特幣智能合約協議。

DLC 核心特點

  • * 隱私保護:預言機不知道合約存在或內容
  • * 無需託管:資金鎖定在 2-of-2 多簽,沒有第三方控制
  • * 鏈上隱私:執行後的交易看起來像普通支付
  • * 可擴展:可處理複雜的多結果合約

運作原理

基本概念

DLC 利用 Schnorr 簽章的數學特性,結合預言機的預先承諾(commitment)來建立合約:

關鍵角色

參與者:
┌─────────────────────────────────────────────────┐
│ Alice(合約方 A)                                │
│ * 提供資金                                       │
│ * 建構和簽署 CET(Contract Execution Tx)        │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ Bob(合約方 B)                                  │
│ * 提供資金                                       │
│ * 建構和簽署 CET                                 │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ Oracle(預言機)                                 │
│ * 發布事件公告和承諾點                           │
│ * 事件發生後發布簽章                             │
│ * 不知道有合約使用其簽章                         │
└─────────────────────────────────────────────────┘

Adaptor Signatures(適配器簽章)

DLC 的核心技術是 Adaptor Signatures,這是一種「不完整」的簽章, 需要額外的秘密值才能變成有效簽章:

Adaptor Signature 原理

// Schnorr 簽章:s = k + H(R||P||m) * x
// 其中 k 是 nonce,x 是私鑰,R = k*G

// Adaptor Signature 加入一個「適配點」T = t*G
// 預簽章:s' = k + H(R+T||P||m) * x

// 完整簽章需要秘密 t:
// s = s' + t

驗證流程:
┌─────────────────────────────────────────────────┐
│ 1. 預言機發布承諾點 R_oracle                     │
│    R_oracle = k_oracle * G(k_oracle 保密)      │
│                                                 │
│ 2. 預言機為每個可能結果 i 計算:                 │
│    T_i = R_oracle + H(R_oracle||i) * P_oracle    │
│                                                 │
│ 3. Alice 和 Bob 使用 T_i 建立適配器簽章          │
│                                                 │
│ 4. 預言機發布結果 i 的簽章 s_oracle              │
│    此簽章揭露了秘密 t_i                          │
│                                                 │
│ 5. 知道 t_i 的一方可以完成交易簽章               │
└─────────────────────────────────────────────────┘

合約執行流程

完整流程

階段 1:預言機公告
┌─────────────────────────────────────────────────┐
│ Oracle 發布事件公告:                            │
│ * 事件 ID                                       │
│ * 可能結果列表 [outcome_1, outcome_2, ...]       │
│ * 承諾點 R_oracle                               │
│ * 預計公告時間                                   │
└─────────────────────────────────────────────────┘
         ↓
階段 2:合約建立
┌─────────────────────────────────────────────────┐
│ Alice 和 Bob 協商:                              │
│ * 選擇預言機和事件                               │
│ * 確定每個結果的支付分配                         │
│ * 各自投入的資金數量                             │
└─────────────────────────────────────────────────┘
         ↓
階段 3:Funding Transaction
┌─────────────────────────────────────────────────┐
│ 建立 Funding Tx:                                │
│ * 輸入:Alice 的 UTXO + Bob 的 UTXO             │
│ * 輸出:2-of-2 多簽(Alice + Bob)              │
│                                                 │
│ 注意:先建立 CET,再廣播 Funding Tx             │
└─────────────────────────────────────────────────┘
         ↓
階段 4:Contract Execution Transactions (CET)
┌─────────────────────────────────────────────────┐
│ 為每個可能結果建立 CET:                         │
│                                                 │
│ CET_outcome_1:                                  │
│   輸入:Funding Tx 輸出                          │
│   輸出:Alice 得 X BTC,Bob 得 Y BTC            │
│   需要:adaptor_sig_1 + oracle_sig_1            │
│                                                 │
│ CET_outcome_2:                                  │
│   輸入:Funding Tx 輸出                          │
│   輸出:Alice 得 A BTC,Bob 得 B BTC            │
│   需要:adaptor_sig_2 + oracle_sig_2            │
│                                                 │
│ ... 更多結果 ...                                │
└─────────────────────────────────────────────────┘
         ↓
階段 5:事件發生
┌─────────────────────────────────────────────────┐
│ Oracle 發布結果簽章:                            │
│ * 觀察真實世界事件                               │
│ * 發布對應結果的簽章 s_oracle                    │
│ * 不知道有 DLC 使用此簽章                        │
└─────────────────────────────────────────────────┘
         ↓
階段 6:合約執行
┌─────────────────────────────────────────────────┐
│ 任一方可以:                                     │
│ 1. 取得 oracle 簽章                             │
│ 2. 計算完整的 CET 簽章                          │
│ 3. 廣播對應的 CET                               │
│ 4. 根據結果分配資金                              │
└─────────────────────────────────────────────────┘

實際範例:BTC/USD 價格合約

價格對賭合約

場景:Alice 和 Bob 對 BTC 價格打賭
* 目前價格:$50,000
* 到期日:30 天後
* Alice 認為會漲,Bob 認為會跌
* 各投入 1 BTC

結果定義(簡化為 5 個區間):
┌─────────────────────────────────────────────────┐
│ 結果      │ 價格區間        │ Alice │ Bob    │
│───────────│─────────────────│───────│────────│
│ outcome_1 │ < $40,000       │ 0 BTC │ 2 BTC  │
│ outcome_2 │ $40,000-$50,000 │ 0.5   │ 1.5    │
│ outcome_3 │ $50,000-$60,000 │ 1     │ 1      │
│ outcome_4 │ $60,000-$70,000 │ 1.5   │ 0.5    │
│ outcome_5 │ > $70,000       │ 2 BTC │ 0 BTC  │
└─────────────────────────────────────────────────┘

Oracle 公告:
{
  "event_id": "btc_usd_2024_01_30",
  "outcomes": ["<40k", "40k-50k", "50k-60k", "60k-70k", ">70k"],
  "maturity": "2024-01-30T00:00:00Z",
  "oracle_pubkey": "02abc...",
  "nonce_point": "03def..."
}

30 天後,BTC = $65,000
Oracle 發布 outcome_4 的簽章
Alice 可以廣播 CET_4,獲得 1.5 BTC

數值結果處理

對於連續數值(如價格),為每個可能值建立 CET 不切實際。 DLC 使用數字分解技術來處理:

數字分解(Digit Decomposition)

// 假設價格範圍 0-99999,精度為 1 美元
// 直接方式需要 100,000 個 CET!

// 數字分解:使用 base-10 表示
// 價格 65432 = [6, 5, 4, 3, 2]
// 只需要 5 個 Oracle 簽章點,每個 10 種可能

Oracle 為每個數字位發布承諾:
┌─────────────────────────────────────────────────┐
│ digit_0 (萬位): R_0, outcomes [0,1,2,3,4,5,6,7,8,9]
│ digit_1 (千位): R_1, outcomes [0,1,2,3,4,5,6,7,8,9]
│ digit_2 (百位): R_2, outcomes [0,1,2,3,4,5,6,7,8,9]
│ digit_3 (十位): R_3, outcomes [0,1,2,3,4,5,6,7,8,9]
│ digit_4 (個位): R_4, outcomes [0,1,2,3,4,5,6,7,8,9]
└─────────────────────────────────────────────────┘

CET 數量計算:
* 5 位數字 x 10 種值 = 50 個 adaptor points
* 使用區間優化後可進一步減少
* 比 100,000 個 CET 高效得多!

Oracle 發布:
s_0 = sign(6)  // 萬位
s_1 = sign(5)  // 千位
s_2 = sign(4)  // 百位
s_3 = sign(3)  // 十位
s_4 = sign(2)  // 個位
// 組合得到 65432

多預言機支援

為了降低單一預言機風險,DLC 支援多種多預言機配置:

N-of-N

所有預言機必須同意。提供最高安全性,但任一預言機離線會導致合約無法執行。

K-of-N

需要 K 個預言機同意。例如 2-of-3 提供容錯能力,同時維持去中心化。

多預言機實作

// 2-of-3 預言機配置
oracles = [Oracle_A, Oracle_B, Oracle_C]

// 建立 CET 需要任意兩個預言機的簽章組合
combinations = [
  (Oracle_A, Oracle_B),
  (Oracle_A, Oracle_C),
  (Oracle_B, Oracle_C)
]

// 每個結果需要 3 組 adaptor signatures
// CET 可以用任意一組完成

// 容錯:即使一個預言機離線或作惡,
// 合約仍可用其他兩個執行

應用場景

金融衍生品

期貨、期權、差價合約(CFD)。用戶可以對資產價格進行對沖或投機, 無需信任交易對手或中央清算所。

預測市場

對選舉、體育賽事、天氣等事件結果進行預測。 預言機報告結果,資金自動分配給正確預測者。

保險合約

參數化保險,如航班延誤、天氣災害保險。 當觸發條件發生時自動理賠,無需傳統保險流程。

託管服務

條件託管,當預言機確認條件滿足時釋放資金。 可用於跨境交易、里程碑付款等。

與其他方案比較

特性 DLC 傳統託管 以太坊智能合約
託管風險 無 高 智能合約風險
隱私性 高 低 低
預言機知情 否 是 是
鏈上足跡 最小 中等 大
靈活性 中等 高 最高
預先定義結果 必須 不需要 不需要

實作工具

rust-dlc

Rust 實作的 DLC 函式庫,提供完整的協議支援。

github.com/p2pderivatives/rust-dlc

bitcoin-s

Scala 比特幣函式庫,包含 DLC 支援和錢包功能。

github.com/bitcoin-s/bitcoin-s

DLC.Link

提供 DLC 基礎設施,簡化開發者整合。

dlc.link

標準規格

DLC 有一套正在發展的標準規格,類似閃電網路的 BOLT:

DLC 規格列表

  • * DLC Spec 0:介紹和術語定義
  • * DLC Spec 1:Oracle 公告和簽章格式
  • * DLC Spec 2:合約協商協議
  • * DLC Spec 3:交易結構(Funding, CET, Refund)
  • * DLC Spec 4:P2P 訊息格式
  • * DLC Spec 5:數值結果處理

規格文件:github.com/discreetlogcontracts/dlcspecs

挑戰與限制

目前挑戰

  • 1. 預言機可用性:需要可靠的預言機服務,且預言機必須在預定時間發布簽章
  • 2. 資本效率:資金在合約期間被鎖定,無法用於其他用途
  • 3. CET 數量:複雜合約可能需要大量 CET,增加協商時間
  • 4. 用戶體驗:需要雙方同時在線進行協商
  • 5. 預言機審查:預言機可能拒絕發布簽章(但無法知道合約內容)

未來發展

Taproot 整合

使用 Taproot 可以大幅減少 CET 的鏈上足跡, 讓 DLC 交易看起來完全像普通支付。

閃電網路 DLC

在閃電網路通道內執行 DLC, 實現即時結算和更高的資本效率。

總結

DLC 代表了比特幣智能合約的重要進展。透過巧妙運用密碼學, 它實現了無需信任的條件支付,同時保護所有參與方(包括預言機)的隱私。

雖然 DLC 不如以太坊智能合約靈活,但它提供了更強的安全性和隱私保障。 隨著工具和基礎設施的成熟,DLC 有望成為比特幣生態系統中重要的金融基礎設施。

已複製連結

討論

已複製到剪貼簿